ブログ

Armadillo-640:ワイヤレスCO2センサー「Canary+」のデータをLE Coded PHY(Long-rangeモード)で取得

at_kazutaka.bito
2023年6月19日 14時43分

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