sockaddr_rc構造体

struct sockaddr_rcに値をセットしてbindに渡して、listenして、acceptするのを待つ。

./bluetooth/rfcomm.txt

acceptを抜けたら、acceptにも渡しておいたstruct sockaddr_rcにリモート側の情報が入っている。
struct_sockaddr_rc.cで、

acceptを抜けたら、リモート側のBluetoothアドレスremote_addr.rc_bdaddrを文字列に変換して出力する。
クライアントは、AndroidカテゴリのBluetoothSocket.connectで作ったやつを使う。
サーバはプログラム以外にもいろいろ準備が必要。

【備忘録】BluetoothでAndroidからLinuxにメッセージを送る|Azukish

まず、この辺をやる。
まず、この辺をやる。

まず、この辺をやる。
hci0でpiscan追加。
spdtoolでchannelが22のSPを追加。

sudoで開く
sudoで開く

Fedoraの場合はsudoでここを開いて、

こうなっているのを
こうなっているのを

こうなっているのを、

こうして
こうして

こうして、

daemon-reloadとrestart bluetooth
daemon-reloadとrestart bluetooth

daemon-reloadとrestart bluetooth

これもやっといたほうがいいか
これもやっといたほうがいいか

これもやっといたほうがいいか。
で、Fedora側でGUIBluetooth設定でEssential Phoneとペアリングして接続して、Essential Phoneもペアリングと接続済み状態で、

こうなっちゃって
こうなっちゃって

こうなっちゃって、

accept抜けないから強制終了させて
accept抜けないから強制終了させて

accept抜けないから強制終了させて。
ここまでやっても失敗するし、何が原因か全然わからない状態に。
結果的には、

【ESP32】UbuntuとBluetooth ClassicでSPP通信する方法【Arduino】 | みゆともり

で見つけた、

$ sudo rfcomm -r -M -L 0 bind 0 E0:63:xx:xx:xx:9F

"E0:63:xx:xx:xx:9F"は、XperiaBluetoothアドレスなのだが、rfcommで相手のアドレスとbindするこれが必要だった。
(Essential Phoneでダメ、Desire 626でダメ、なのでXperia SPで試してた。)

これでなんとかacceptできた。
これでなんとかacceptできた。

これでなんとかacceptできた。
ただし、

2回目はaccept出来ないし、いったんrfcommをreleaseしないといけない。
2回目はaccept出来ないし、いったんrfcommをreleaseしないといけない。

2回目はaccept出来ないし、いったんrfcommをreleaseしないといけない。
それと、1回目はペアリングかつ切断の状態、2回目はペアリングかつ接続の状態、でacceptした気がして、どっちなのかわからない。
ペアリングで接続状態じゃないとそもそもrfcomm0 <リモート側Bluetoothアドレス>が出来ないかも。
acceptするには、rfcomm -aで"closed"になってる事。("clean"だと上手くいかない。)
そして、実はAndroid側もconnect前にcancelDiscoveryでスキャンを止めるようにコードいじった。(これはAndroid側にも原因有るかとおもっていじったのだが、これは関係ないかも。)

これで丸々1日潰したけど、とりあえずacceptできた。
ただ、改めてちゃんと整理したい。

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