実装例
SwitchBot 温湿度計の測定値を BLE Advertisement パケットから直接読み取るを参考に実装。
scan_beacon01.rb
require 'scan_beacon'
scanner = ScanBeacon::DefaultScanner.new
scanner.each_advertisement{|ad_data,mac,rssi,ad_type|
if mac == "xx:xx:xx:xx:xx:xx" and ad_type == 213 # MACアドレスを事前に調べておく
t2 = ad_data[16].unpack("C*")[0] & 0b00001111
t1 = ad_data[17].unpack("C*")[0] & 0b01111111
temperature = t1 + t2/10.0
humidity = ad_data[18].unpack("C*")[0]& 0b01111111
puts [temperature,humidity].join("\t")
end
}
事前準備
- SwitchBotの温湿度計のMACアドレスを調べる
MACアドレスはスマホのアプリの設定画面で確認できる。 - hciuartサービスを起動する
sudo systemctl start hciuart
実行
$ sudo ruby scan_beacon01.ruby
21.8 58
21.8 58
補足
方式の検討
SwitchBotの温湿度計から温度/湿度を受信するには、Pythonだと公式ライブラリが使えるがRubyだとそれが無い。
SwitchBotの温湿度計は仕組み的にはBLEのAdvertisingが使われており、一昔前に少し流行ったBeacon関連の先駆者の実装や記事が参考にできる。
方式 | 実現性 | コスト | 補足 |
---|---|---|---|
scan_beacon gem | ○ | ○ | |
hcidumpをパース | ○ | ○ | |
Bluez API | ○ | × | Ruby以外に低レイヤの実装が必要そう |
D-Bus | ? | ? | 実現性が不明。D-BusでBLEのAdvertiingを扱えるのか不明 |
rfcommでBluetoothをdevにマッピングさせる | ? | ? | 実現性が不明。rfcommとBLE Advertisingが合わない? |
今回は、scan_beacon gem を利用した。
Raspberry Pi zeroでBluetoothのscanをするとWifiが切れる事が有るので注意
Raspberry Pi zeroのwifiは5GHzに対応しておらず2.4GHzしか使えない。
またBluetoothのscanは強い電波を発するためWifiの2.4GHzと干渉し繋がらなくなる場合が有る。
Raspberry Pi zeroでBluetoothのscanをする際には、PCからRaspberryPiへの接続にはGPIO等のwifi以外の接続方法を利用するのが望ましい。
ただし今回の記事の範囲ではscan動作は行わないので2.4GHzのWifiでのRaspberry Pi zeroの利用に問題は無い。