Armadilloフォーラム

RFCOMMでのBluetoothシリアル通信について

ttt90

2024年2月19日 14時29分

お世話になっております。

https://armadillo.atmark-techno.com/blog/615/4246
上記のブログを参考にBluetoothのシリアル通信を実現しようとしているのですが、
” rfcomm listen /dev/rfcomm0 22 &”を実行後、
ペアリング済みのPCからTeratermで接続しようとすると、
下記エラーが出ます。

[エラー]
Can't create RFCOMM TTY: Address already in use

”systemctl daemon-reload”をした後に”systemctl restart bluetooth”をしても効果はありませんでした。
ModemManagerの無効化もしております。

こちらの解決方法をお教えいただけますでしょうか。
よろしくお願いいたします。

コメント

at_dominique.m…

2024年3月1日 16時49分

ttt90さん、

返事が遅くなって申し訳ございません、
マルティネです。

> https://armadillo.atmark-techno.com/blog/615/4246
> 上記のブログを参考にBluetoothのシリアル通信を実現しようとしているのですが、
> ” rfcomm listen /dev/rfcomm0 22 &”を実行後、
> ペアリング済みのPCからTeratermで接続しようとすると、
> 下記エラーが出ます。
>
> [エラー]
> Can't create RFCOMM TTY: Address already in use
>
> ”systemctl daemon-reload”をした後に”systemctl restart bluetooth”をしても効果はありませんでした。
> ModemManagerの無効化もしております。

https://armadillo.atmark-techno.com/forum/armadillo/18972 の続きですね。

コンテナのコンフィグファイルあるいは起動オプションを教えていただけますか?

こちらで確認して、コンテナで rfcomm を使用する際に /dev/rfcomm0 のファイルがうまく生成されてなかったので、PCからの接続時に逆に rfcomm が「No such device」でエラーしていました。
コンテナのコンフィグファイルに「add_hotplugs rfcomm」を追加することで Base OS 側の udev との連携ができるようになって、接続できました。

また、デバイスがすでに存在する場合は Address already in use で失敗しますので、/dev/rfcomm0 ではなく /dev/rfcomm1 などで試してください。
rfcomm show ですでに使用されている rfcomm デバイスを表示できます(引数は armadillo の bluetooth mac です、以下の場合は /dev/rfcomm34 を使うと already in use でエラーします):

armadillo:~# rfcomm show 34:6F:24:C0:C6:F5
rfcomm34: 00:00:00:00:00:00 channel 1 clean 

また、使い方はブログと異なりますが、rfcomm コマンドを使わなくてもプログラミングで socket() を使用できる場合はそれだけでもいいかもしれません。
armadillo で以下の python コードを実行して、pc側で rfcomm connect を使用できましたので teraterm でも接続できるかと思います(すみません、windows を手元にないので linux pcから試してました)

root@armadillo:/# python3
>>> import socket
# armadillo の bluetooth mac
>>> me='34:6F:24:C0:C6:F5'
>>> sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
# 22 は rfcomm に使っていた 22 channel と同じです。
>>> sock.bind((me, 22))
>>> sock.listen()
>>> s = sock.accept()
# シリアル接続に書いた物が受信できる
>>> s[0].recv(100)
b'hello'
# 送信する物はシリアル側で表示される
>>> s[0].send(b'okay\n')

その場合に /dev/rfcomm0 などのデバイスが不要なので、上記の問題もないかと思います。
(pc側も rfcomm/シリアル接続ではなく、socket.bind(('pcaddr', 22)) + socket.connect(('armadillo addr', 22)) で使用できますが、そっちは teraterm を標準に使えた方が便利ですね)

よろしくお願いします。