Armadilloフォーラム

C言語からセンサーの温度取得方法について

mouri

2021年1月28日 17時26分

お世話になります
C言語でgatttoolコマンドを使って、オムロンのセンサー2JCIE-BU01から温度を取得してます

G3LとBU01が通信できる状態であれば数秒でコマンドは結果を返してくれますが
電波状況などにより接続できない場合、
gatttool内のタイムアウト(40秒程度)、gatttoolコマンドは他の処理をブロックしてしまいます

マルチスレッドで複数のBU01から並列で取得するコーディングをしてますが
gatttoolコマンドの箇所だけがシングルスレッドの動きになってしまいます

そこでgatttoolを使わず、C言語からBU01の温度を取得したいと思うのですが、
何か手段はないでしょうか?

コメント

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

よろしくお願いいたします。

mouri

2021年2月4日 2時35分

ありがとうございます
教えて頂いたライブラリ等を調べてみます

> 古関です。
>
> コード上での確認しかしていませんが、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
>
> よろしくお願いいたします。