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