mouri
2021年1月28日 17時26分
お世話になります
C言語でgatttoolコマンドを使って、オムロンのセンサー2JCIE-BU01から温度を取得してます
G3LとBU01が通信できる状態であれば数秒でコマンドは結果を返してくれますが
電波状況などにより接続できない場合、
gatttool内のタイムアウト(40秒程度)、gatttoolコマンドは他の処理をブロックしてしまいます
マルチスレッドで複数のBU01から並列で取得するコーディングをしてますが
gatttoolコマンドの箇所だけがシングルスレッドの動きになってしまいます
そこでgatttoolを使わず、C言語からBU01の温度を取得したいと思うのですが、
何か手段はないでしょうか?
コメント
mouri
ありがとうございます
教えて頂いたライブラリ等を調べてみます
> 古関です。
>
> コード上での確認しかしていませんが、linux-kernelの中で、
> L2CAP_CONN_TIMEOUTが40秒で決めうちされているように見えます。
>
> ユーザーランドから変えられなさそうに見えました。
>
> ですので、c言語 + gatttoolベースの対話処理だと
> あきらめる時間をtimerかけて決めて、gatttool側をkillをするなどでしょうか。
>
> gatttool側のプロセスが強制終了したとき、
> linux-kernel側は コネクション作成のキャンセル処理
> (HCI_OP_LE_CREATE_CONN_CANCEL) 呼ぶようですので、
> connect要求しっぱなしにはならないと思います。
>
>
> > そこでgatttoolを使わず、C言語からBU01の温度を取得したいと思うのですが、
>
> こちらで試してはいませんが、
> c言語だと以下などはいかがでしょうか。
> ・libbluetooth-devを使う
> ・gattlibを使う
>
> python pipやrubygemを利用すれば比較的楽に作れそうですが、
> c言語だと多少、生々しい実装が必要になりそうです。
>
> 弊社のpythonサンプルは以下にあります。
> https://armadillo.atmark-techno.com/howto/armadillo_2JCIE-BU01_GATT
>
> よろしくお願いいたします。
at_koseki
2021年2月2日 19時46分
古関です。
コード上での確認しかしていませんが、linux-kernelの中で、
L2CAP_CONN_TIMEOUTが40秒で決めうちされているように見えます。
ユーザーランドから変えられなさそうに見えました。
ですので、c言語 + gatttoolベースの対話処理だと
あきらめる時間をtimerかけて決めて、gatttool側をkillをするなどでしょうか。
gatttool側のプロセスが強制終了したとき、
linux-kernel側は コネクション作成のキャンセル処理
(HCI_OP_LE_CREATE_CONN_CANCEL) 呼ぶようですので、
connect要求しっぱなしにはならないと思います。
> そこでgatttoolを使わず、C言語からBU01の温度を取得したいと思うのですが、
こちらで試してはいませんが、
c言語だと以下などはいかがでしょうか。
・libbluetooth-devを使う
・gattlibを使う
python pipやrubygemを利用すれば比較的楽に作れそうですが、
c言語だと多少、生々しい実装が必要になりそうです。
弊社のpythonサンプルは以下にあります。
https://armadillo.atmark-techno.com/howto/armadillo_2JCIE-BU01_GATT
よろしくお願いいたします。