なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AndroidでBluetooth2

なかなかうまくいかなかったAndroidBluetootuプログラミング。
しかし今日は進展を見せた。

google がAndroidでのBluetooth公式APIの紹介のために公開しているサンプルプログラム。
とりあえずこれと、PyBluezでPC Android間Bluetooth通信を実現させたかったわけだが、なかなかうまくいかずにいたが、今日進展した。

まずアプリはAndroidMarketでBluetoothTalkという名前でサンプルコードをビルドしたものがあるのでそれを使っていた。
このプログラムはBluetoothでチャットができる。アプリが起動するとアプリはサーバーとして稼動して、クライアントが接続できるようになる。また、メニューからデバイスを探せば逆にクライアントとして機能する。

確かに、良サンプルではあるのだが、少しばかりコードが長く、もっと簡潔にして欲しかった。普通にチャットプログラムとして利用できる完成度である。

えーと、とにかく、このアプリを起動した後に、PyBluezの対話シェルとかで、ClientとしてAndroid端末にまずは接続してみようと思っていたわけです。で、まあうまくいかないことが6時間ほど続いて、他のサンプルを探し回ったりしたけど見つからなくて悩んだあげく気づいたことが、

通常のsocketプログラムでは接続にアドレスとポート番号、もしくはポート番号だけ使うことが多いのだけと、Androidのサンプルコードではポートが一切でてこない。代わりにUUIDなるものがでてきて、これを利用してポートを決定するようだ。
なぜわざわざUUIDを迂回して決まるのかはっきりとは知らないが、多分セキュリティ向上のためであろう。

とりあえず動く、をモットーとしているへっぽこプログラマな私にには不要である。


と、まあ、UUIDが接続に重要であることがわかったのでAndroid側のサンプルコードに記載されているUUIDの文字列をPyBluezのサンプルコードにコピーしたのが以下のコード


import bluetooth
import sys

uuid = "fa87c0d0-afac-11de-8a39-0800200c9a66"
sm = bluetooth.find_service(uuid=uuid)
if len(sm) == 0:
print "Servie couldn't find"
sys.exit(0)

fm = sm[0]
port = fm["port"]
name = fm["name"]
host = fm["host"]
sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.connect((host, port))
while True:
sock.send("hello")

で、実際これを実行すると、Android側に hello が連呼されて おおー! ってなったよ。

それで
このコードのみそはfind_service指定したUUIDと同じUUIDを持つサーバーを探すして、そこから
port番号とかをgetしていること、あとは普通にsocketプログラム感覚でいける。


少し寝るか。
スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/138-da79ad1f

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。