見出し画像

TWBlueScan:開発が一気に進んだがbeaconの処理で悩む

浦和レッズ引き分け!老猫は体調がかなり悪いなかTVの前にいました。TVから聞こえるスタジアムの音に反応してしっぽを振っていました。

さて、昨日開発の方向性を決めたBlueToothのデバイスの情報を集めるセンサーTWBlueScanのリポジトリを作って一気にソースコードを書きました。

基本的な機能が動作した後、少し欲がでて、

の情報も取得できるようにしました。
参考にしたのは、

のデータシートと

のサイトです。何も設定を変更しなくてもデフォルトで送信されるアドバタイスパケットから気温などの環境情報が取得できます。

// OMRONSセンサーのデータ
// https://omronfs.omron.com/ja_JP/ecb/products/pdf/CDSC-016A-web1.pdf
// P60
// https://armadillo.atmark-techno.com/howto/armadillo_2JCIE-BU01_GATT
// 01     Data Type
// c5     連番
// a9 09  温度 0.01℃
// cd 1a  湿度 0.01%
// 0d 00  照度 1lx
// 26 6c 0f 00 気圧 1hPa
// 3d 13  騒音 0.01dB
// 07 00  eTVOC 1ppb
// c3 01  二酸化炭素 1ppm
// ff

func checkOMRONEnv(dev *device.Device1) {
	if dev == nil || dev.Properties == nil || dev.Properties.ManufacturerData == nil {
		log.Printf("checkOMRONEnv no data")
	}
	i, ok := dev.Properties.ManufacturerData[0x02d5]
	if !ok {
		log.Printf("checkOMRONEnv no ManufacturerData")
	}
	if v, ok := i.(dbus.Variant); ok {
		if ba, ok := v.Value().([]uint8); ok && len(ba) > 18 && ba[0] == 1 {
			seq := int(ba[1])
			temp := float64(int(ba[3])*256+int(ba[2])) * 0.01
			hum := float64(int(ba[5])*256+int(ba[4])) * 0.01
			lx := int(ba[7])*256 + int(ba[6])
			press := float64(int(ba[11])*(256*256*256)+int(ba[10])*(256*256)+int(ba[9])*256+int(ba[8])) * 0.001
			sound := float64(int(ba[13])*256+int(ba[12])) * 0.01
			v := int(ba[15])*256 + int(ba[14])
			co2 := int(ba[17])*256 + int(ba[16])
			log.Printf("seq=%d,temp=%.02f,hum=%.02f,lx=%d,press=%.02f,sound=%.02f,eTVOC=%d,eCO2=%d",
				seq, temp, hum, lx, press, sound, v, co2,
			)
			syslogCh <- fmt.Sprintf("type=OMRONEnv,address=%s,name=%s,rssi=%d,seq=%d,temp=%.02f,hum=%.02f,lx=%d,press=%.02f,sound=%.02f,eTVOC=%d,eCO2=%d",
				dev.Properties.Address, dev.Properties.Name, dev.Properties.RSSI,
				seq, temp, hum, lx, press, sound, v, co2,
			)
		}
	}
}

のように変換すれば、

2021/08/30 07:35:31.031 info:local5 twBlueScan type=OMRONEnv,address=EF:6E:29:F9:8C:48,name=Rbt,rssi=-61,seq=137,temp=24.54,hum=64.88,lx=20,press=1012.50,sound=51.15,eTVOC=186,eCO2=1522

のようなログが出力されます。
何となく良くなってきましたが、まだ元のサンプルから流用したbeaconの処理に問題があり悩んでいます。続きは明日

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。