Armadillo-640と
BT/THオプションモジュール「OP-A600-BTTHMOD-00」
の組み合わせで
ユニ電子株式会社製
Logttaシリーズ
のワイヤレスCO2センサー「Canary+」のデータを
LE Coded PHY(Long-rangeモード)で取得してみました。
ここでは、Canary+のBLEビーコンの情報をLE Coded PHY(Long-rangeモード)で取得し、
CO2濃度、温度、湿度のデータを表示しています。
1. Armadillo-640+BT/THオプションモジュール(OP-A600-BTTHMOD-00)の準備
Armadillo-640:BT/THオプションモジュール(OP-A600-BTTHMOD-00)を使用する準備(手順まとめ)の手順を実施します。
2. LE Coded PHY(Long-rangeモード)でデータを取得するソフトウェアの準備
Armadillo-640:BT/THオプションモジュール+pc-ble-driverでアドバタイジングパケットのPDUを表示の
「5.1 scan_sampleに実行権限を付ける」までの手順を実施します。
3. Canary+のBLEビーコンの情報をLE Coded PHY(Long-rangeモード)で取得
上記手順2のscan_sampleを実行し、Coded PHYでスキャンします。
root@armadillo:~# stdbuf -oL /root/scan_sample -p coded -s /dev/ttyACM0
Canary+に電源が投入されていると、下記のようにアドバタイジングパケットのPDUが表示されます。
(下記表示のうちBDアドレス等の一部のデータは伏字(*)にしています。)
root@armadillo:~# stdbuf -oL /root/scan_sample -p coded -s /dev/ttyACM0 phy: CODED_PHY Accept Extended Advertising packet Serial port used: /dev/ttyACM0 Baud rate used: 1000000 Info: Successfully opened /dev/ttyACM0. Baud rate: 1000000. Flow control: none. Parity: none. device address: 0x************, RSSI: -33 device name: unknown PDU: 1E FF 9E 09 01 D9 06 0A 01 1B 02 FE 05 00 52 07 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** device address: 0x************, RSSI: -34 device name: unknown PDU: 1E FF 9E 09 01 D9 06 0A 01 1B 02 FE 05 00 52 07 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** device address: 0x************, RSSI: -32 device name: unknown PDU: 1E FF 9E 09 01 D9 06 0A 01 1B 02 FE 05 00 52 07 ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
解説)PDUヘッダ[1E FF]に続く、PDUペイロードの頭の3バイト[9E 09 01]が、
Canary+のCO2濃度、温度、湿度を含んだデータフォーマットであることを意味しています。
各データはPDUペイロードの下記の位置に配置されています。
CO2濃度:4.5バイト目(リトルエンディアン)→上例では、[D9 06]→0x06D9→1753→1753[ppm]
温度:6,7バイト目(リトルエンディアン)→上例では、[0A 01]→0x010A→266→26.6[℃]
湿度:8,9バイト目(リトルエンディアン)→上例では、[1B 02]→0x021B→539→53.9[%RH]
4. Canary+のBLEビーコンの情報を要約して表示するスクリプト例
PDUの生データ(16進数)から、CO2濃度、温度、湿度(10進数)で表示する
スクリプト例(canary_sample.sh)です。
canary_sample.sh
#!/bin/bash LOG="/tmp/scan_log" SUMMARY="/tmp/summary_scan_log" DATE=`date` echo "date: $DATE" > $SUMMARY echo "######## Scanning BT Sensor in 10 seconds ########" stdbuf -oL /root/scan_sample -p coded -s /dev/ttyACM0 > $LOG & sleep 10 killall scan_sample echo "######## Finish scanning ########" while read LINE do if [[ "$LINE" != *PDU:* ]] ; then echo $LINE >> $SUMMARY else PDU_HEADER=`echo $LINE | cut -d " " -f 2-3` PDU_PAYLOAD=`echo $LINE | cut -d " " -f 4-` echo "PDU_HEADER: $PDU_HEADER" >> $SUMMARY echo "PDU_PAYLOAD: $PDU_PAYLOAD" >> $SUMMARY ######## In a case of Air Mier beacon: begin ######## IS_AIRMIER_ID=`echo $PDU_PAYLOAD | awk -F ' ' '{print $2 $1}'` IS_AIRMIER_APP=`echo $PDU_PAYLOAD | awk -F ' ' '{print $3}'` if [ "$IS_AIRMIER_ID" = "099E" ] && [ "$IS_AIRMIER_APP" = "01" ] ; then echo "******** This is Air Mier beacon(by PDU_PAYLOAD: 9E 09 01 ....) ********" >> $SUMMARY CO2_HEX=`echo $PDU_PAYLOAD | awk -F ' ' '{print "0x" $5 $4}'` TMP_HEX=`echo $PDU_PAYLOAD | awk -F ' ' '{print "0x" $7 $6}'` HUM_HEX=`echo $PDU_PAYLOAD | awk -F ' ' '{print "0x" $9 $8}'` CO2_DEC=`echo $(($CO2_HEX)) | awk '{printf ("%d", $1)}'` TMP_DEC=`echo $(($TMP_HEX)) | awk '{printf ("%d.%d", $1/10, $1%10)}'` HUM_DEC=`echo $(($HUM_HEX)) | awk '{printf ("%d.%d", $1/10, $1%10)}'` echo "(CO2 TMP HUM)[HEX]: $CO2_HEX $TMP_HEX $HUM_HEX" >> $SUMMARY echo "(CO2 TMP HUM)[DEC]: $CO2_DEC[ppm] $TMP_DEC[degrees] $HUM_DEC[%RH]" >> $SUMMARY fi ######## In a case of Air Mier beacon: end ######## fi done < $LOG head -n 1 $LOG >> $SUMMARY DATE=`date` echo "date: $DATE" >> $SUMMARY cat $SUMMARY
解説)
・scan_sampleを実行して、10秒間、Coded PHY(Long Rangeモード)のアドバタイジングパケットをスキャンします。
・スキャン終了後、PDUペイロードの頭の3バイトが[9E 09 01]の場合、
下記コメントで挟んだ範囲で、CO2濃度、温度、湿度(10進数)に変換します。
######## In a case of Air Mier beacon: begin ########<br> ######## In a case of Air Mier beacon: end ########<br>
・PDUの生データ(16進数)のままを/tmp/scan_logファイルに出力します。
・CO2濃度、温度、湿度(10進数)に変換して/tmp/summary_scan_logファイルに出力します。
・/tmp/summary_scan_logファイルの内容を表示します。
5. Canary+のBLEビーコンの情報を要約して表示するスクリプト(canary_sample)の実行
5.1 canary_sample.shに実行権限を付ける
canary_sample.shに実行権限を付けます。
root@armadillo:~# chmod +x canary_sample.sh
5.2 canary_sample.shを実行
canary_sample.shを実行します。
Canary+に電源が投入されていると、10秒間のスキャンの後、取得したアドバタイジングパケットより、
下記のようにCO2濃度、温度、湿度を表示します。
(下記表示のうちBDアドレス等の一部のデータは伏字(*)にしています。)
canary_sample.sh実行例
root@armadillo:~# ./canary_sample.sh ######## Scanning BT Sensor in 10 seconds ######## ######## Finish scanning ######## Mon May 22 17:12:38 JST 2023 phy: CODED_PHY Accept Extended Advertising packet Serial port used: /dev/ttyACM0 Baud rate used: 1000000 Info: Successfully opened /dev/ttyACM0. Baud rate: 1000000. Flow control: none. Parity: none. device address: 0x********, RSSI: -33 device name: unknown PDU_HEADER: 1E FF PDU_PAYLOAD: 9E 09 01 D9 06 0A 01 1B 02 FE 05 00 52 07 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ******** This is Air Mier beacon(by PDU_PAYLOAD: 9E 09 01 ....) ******** (CO2 TMP HUM)[HEX]: 0x06D9 0x010A 0x021B (CO2 TMP HUM)[DEC]: 1753[ppm] 26.6[degrees] 53.9[%%RH] (略) device address: 0x********, RSSI: -32 device name: unknown PDU_HEADER: 1E FF PDU_PAYLOAD: 9E 09 01 D9 06 0A 01 1B 02 FE 05 00 72 07 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ******** This is Air Mier beacon(by PDU_PAYLOAD: 9E 09 01 ....) ******** (CO2 TMP HUM)[HEX]: 0x06D9 0x010A 0x021B (CO2 TMP HUM)[DEC]: 1753[ppm] 26.6[degrees] 53.9[%%RH] phy: CODED_PHY Mon May 22 17:12:50 JST 2023