BTPROTO_RFCOMM

Linux側に戻る。
スキャンは出来たので、今度はLinux側のサーバと、Android側のクライアントで、SPP通信をする。
サーバ側はBlueZでRFCOMM通信をするわけなので、BTPROTO_RFCOMMを指定する。

./bluetooth/rfcomm.txt
http://people.csail.mit.edu/albert/bluez-intro/x502.html

BTPROTO_RFCOMM.cで、

socketにAF_BLUETOOTHとBTPROTO_RFCOMMを指定。
まずはsocが出来ればいい。

$ pwd
/home/bg1/project/cloud/github.com/Sample/bluez/BTPROTO_RFCOMM/BTPROTO_RFCOMM/src/BTPROTO_RFCOMM
$ vi BTPROTO_RFCOMM.c
$ ls
BTPROTO_RFCOMM.c
$ gcc -o BTPROTO_RFCOMM BTPROTO_RFCOMM.c -lbluetooth
$ ls
BTPROTO_RFCOMM  BTPROTO_RFCOMM.c
$ ./BTPROTO_RFCOMM
soc = 3
$

socは3。
とりあえずソケットは作成できた。

Sample/bluez/BTPROTO_RFCOMM/BTPROTO_RFCOMM/src/BTPROTO_RFCOMM at master · bg1bgst333/Sample · GitHub

BluetoothSocket.connect

BluetoothSocket.connectで、接続する。

BluetoothSocket  |  Android Developers

MainActivity.javaで、

引数とかいらないので、ちょっと接続してみる。

Essential Phoneを押してみる
Essential Phoneを押してみる

Essential Phoneを押してみる。

socは出来たとして
socは出来たとして

socは出来たとして、connectでしばらくした後に、

Essential Phone側でSPPの準備をしてないので、当然失敗する。
Essential Phone側でSPPの準備をしてないので、当然失敗する。

Essential Phone側でSPPの準備をしてないので、当然失敗する。

Sample/android/BluetoothSocket/connect/src/BluetoothSocket at master · bg1bgst333/Sample · GitHub

BluetoothSocket

作成したBluetoothのクライアントソケットは、BluetoothSocketに格納しておく。

BluetoothSocket  |  Android Developers

MainActivity.javaで、

soc.toStringで、中身を見るだけ。

まあこういうオブジェクトのこういうハッシュコードしかわからないけど。
まあこういうオブジェクトのこういうハッシュコードしかわからないけど。

まあこういうオブジェクトのこういうハッシュコードしかわからないけど。

Sample/android/BluetoothSocket/BluetoothSocket/src/BluetoothSocket at master · bg1bgst333/Sample · GitHub

BluetoothDevice.createRfcommSocketToServiceRecord

BluetoothDevice.createRfcommSocketToServiceRecordで、指定されたUUIDのサービス用のRFCOMMソケットを作成する。

BluetoothDevice  |  Android Developers

Bluetoothバイスを見つけたら、これでソケット作って接続して通信する。
また、構成がちょっと変わる。
CustomAdapter.javaで、

ArrayListのアイテムがBluetoothDeviceになってる。
こいつ自体が必要なので。
getNameとgetAddressで取得したnameとaddressを反映するlist_item.xmlは変わらない。
CustomReceiver.javaで、

ACTION_DISCOVERY_FINISHEDで、アダプタセットじゃなくて、最初からでいいとおもうので、ACTION_DISCOVERY_FINISHED自体をカット。
MainActivity.javaで、

onCreateの時点で既にアダプタセットしてる。
アイテムが選択された時に、uuidにSPP用の"00001101-0000-1000-8000-00805F9B34FB"をセットして、createRfcommSocketToServiceRecordに渡して、socを作成して閉じる。
例外起きなければ作成には成功してる。

Desire側でEssential Phoneが見えたので押す
Desire側でEssential Phoneが見えたので押す

Desire側でEssential Phoneが見えたので押す。

問題なく作成できたっぽい。
問題なく作成できたっぽい。

問題なく作成できたっぽい。

Sample/android/BluetoothDevice/createRfcommSocketToServiceRecord/src/BluetoothDevice at master · bg1bgst333/Sample · GitHub

BluetoothAdapter.ACTION_DISCOVERY_STARTED

探索を開始した時に、BluetoothAdapter.ACTION_DISCOVERY_STARTEDが呼ばれる。

BluetoothAdapter  |  Android Developers

CustomReceiver.javaで、

ACTION_DISCOVERY_STARTEDの時に、アダプタ側でclearしてる。

1回目
1回目

1回目。

2回目
2回目

2回目。
という感じで再度スキャンするごとにクリアしてるので、溜まっていかない。

Sample/android/BluetoothAdapter/ACTION_DISCOVERY_STARTED/src/BluetoothAdapter at master · bg1bgst333/Sample · GitHub

BluetoothAdapter.ACTION_DISCOVERY_FINISHED

探索が終了した時に、BluetoothAdapter.ACTION_DISCOVERY_FINISHEDが呼ばれる。

BluetoothAdapter  |  Android Developers

ACTION_DISCOVERY_FINISHEDしたら、Bluetooth機器リストをリストビューにセットするようにしてみる。
構成を大幅に変える必要がある。
AndroidManifest.xmlで、

CustomReceiverのintent-filterのところは削除。
activity_main.xmlで、

Buttonの下にListViewを追加。
list_item.xmlで、

リストのアイテムのレイアウトは2つのTextViewで構成。
ListItem.javaで、

ListItemはnameとaddressを持つ。
CustomAdapter.javaで、

それぞれのTextViewにListItemのnameとaddressをセットするように。
CustomReceiver.javaで、

ACTION_FOUNDでアイテムを追加。
ACTION_DISCOVERY_FINISHEDでアダプタをセット。
MainActivity.javaで、

最初から利用可能な場合でもstartDiscoveryするようにしてる。
あと、先程AndroidManifest.xmlから削除したIntentFilter登録はstartDiscoveryの前にしてる。

開始してしばらく待つ
開始してしばらく待つ

開始してしばらく待つ。

たくさんの機器が出てきた
たくさんの機器が出てきた

たくさんの機器が出てきた。

どんどん溜まっていく
どんどん溜まっていく

ただ、もう1回押すと削除されないからどんどん溜まっていく。

Sample/android/BluetoothAdapter/ACTION_DISCOVERY_FINISHED/src/BluetoothAdapter at master · bg1bgst333/Sample · GitHub

BluetoothDevice.getAddress

BluetoothDevice.getAddressで、Bluetoothアドレスを取得する。

BluetoothDevice  |  Android Developers

CustomReceiver.javaで、

nameに続いて、bluetoothDevice.getAddressで取得したaddressもToast表示する。

nameがこうだとすると、
nameがこうだとすると、

nameがこうだとすると、

addressはこうなる
addressはこうなる

addressはこうなる。

Sample/android/BluetoothDevice/getAddress/src/BluetoothDevice at master · bg1bgst333/Sample · GitHub