struct sockaddr_rcに値をセットしてbindに渡して、listenして、acceptするのを待つ。
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を追加。
Fedoraの場合はsudoでここを開いて、
こうなっているのを、
こうして、
daemon-reloadとrestart bluetooth。
これもやっといたほうがいいか。
で、Fedora側でGUIのBluetooth設定でEssential Phoneとペアリングして接続して、Essential Phoneもペアリングと接続済み状態で、
こうなっちゃって、
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"は、XperiaのBluetoothアドレスなのだが、rfcommで相手のアドレスとbindするこれが必要だった。
(Essential Phoneでダメ、Desire 626でダメ、なのでXperia SPで試してた。)
これでなんとかacceptできた。
ただし、
2回目はaccept出来ないし、いったんrfcommをreleaseしないといけない。
それと、1回目はペアリングかつ切断の状態、2回目はペアリングかつ接続の状態、でacceptした気がして、どっちなのかわからない。
ペアリングで接続状態じゃないとそもそもrfcomm0 <リモート側Bluetoothアドレス>が出来ないかも。
acceptするには、rfcomm -aで"closed"になってる事。("clean"だと上手くいかない。)
そして、実はAndroid側もconnect前にcancelDiscoveryでスキャンを止めるようにコードいじった。(これはAndroid側にも原因有るかとおもっていじったのだが、これは関係ないかも。)
これで丸々1日潰したけど、とりあえずacceptできた。
ただ、改めてちゃんと整理したい。