2025年1月2日木曜日

リコーの環境センサーD202のbluetoothプロトコルの解析(完了)

8月にリコーの環境センサーD202のbluetoothプロトコルを途中まで解析したが、良くわからんなぁと困り、素直に仕様を公開してくれと問い合わせ窓口に連絡したらNDAなしで仕様書を公開してくれた。

12/1(日)にWebの問い合わせ窓口に問い合わせ、担当の方とメールのやり取りをしたら12/3(火)に資料が届いた。公開ありがとうございます。

前回の下記の数字をもとに仕様書に基づいて計算する。

LENTYPEVALUE
20x010x04
50x090x(センサに貼られているシールに記載の識別名4文字がASCIIで格納)
210xFF0x5F069122D3880100DF0D00004AB00000326B89E4

これが下記になる。

番号0001020304050607080910111213141516171819
5F069122D388010DF0D000004AB00000326B89E4
意味※1※2※3気圧気温湿度電圧照度
※1: 企業識別子
※2:モデル識別子
※3:送信カウンタ

  1. 企業識別子
    Bluetoothの団体が管理している企業識別子が入っている。
    RicohだとPDFから「0x065F」がアサインされていることが分かる。
    なので、このセンサーの場合は固定値となる
  2. モデル識別子
    旧製品     : 0x01
    D201/D202 : 0x91
    とのこと。
  3. 送信カウンタ
    インクリメントされる数字を見て途絶を判断するために存在する模様。
  4. 気圧
    8月の解析どおり、0x0D0188D3(=100563)と読んで、100分の1の値にすればよい。
    この場合は1005.63hPaとなる
  5. 気温
    8月の解析どおり、0x0000D0F0(=3551)と読んで、100分の1の値にすればよい。
    この場合は35.51度(セ氏)となる。負数については符号付32bit整数で格納。
  6. 湿度
    8月の解析が少し間違っており、0x0000B04A(=45130)と解釈したのち、1000ではなく、1024で割る。仕様書が無いと分からんかった。よって44.07%になる。
    (なんでここだけ除数が1024何だろう。搭載されているセンサの仕様なのかな)
  7. 電圧
    アドバタイズされた値から0x6B32(=27442)を取得。仮にXとすると式が
    電圧(V)= X * (2.03 / 65535) * 3
    になるとのこと。
    今回の値だと 2.55V(=27442 * (2.03 / 65535) *3 )になる。
    全然、式の意味が分からない。
  8. 照度
    すごく複雑。
    まず、センサーが仮に出力している値を算出する。
    ・番号18の上位4bitが指数部
    ・番号18の下位4bitと番号19の8bitをつなげた12bitで仮数部
    (気圧などと違い、ひっくり返さないことに注意)
    今回だと
    指数部: 番号18が0x89なので上位4bitから8になる。
    仮数部: 番号18の下位4bitと番号19を合わせた0x9E4(=2532)になる。
    これを下記の式に入れる。
    センサーの値 = (2 ^ 指数部) * 0.01 * 仮数部
    今回だと
    センサーの値 = 6481.92
    これがBluetoothでバラまかれている値だが、さらにアプリ側で補正が必要(*)で
    センサーの値が350未満の場合: 2.1242 * センサーの値 + 0
    センサーの値が350以上の場合: 1.0692 * センサーの値 + 388.24
    とする。
    *)センサーの上にシートをかぶせている補正とのこと。
    よって、今回の値は350以上なので、
    7318.71lx (= 1.0692 * 6481.92 + 388.24)になる。
このセンサーはアプリ側でも補正を入れているのでbluetoothの値だけ見ても分からなかっただろうな。

SwitchBot 防水型温湿計、PRO、CO2のBluetoothのデータ構造

みんな大好きSwhitchBotの湿温度計で防水型、PRO、CO2の3種類を購入しbluetooth経由でデータを取るために構造を確認した。

No分類紹介サイト入手日
1防水型直販サイト2023/7/10
2PRO直販サイト2024/9/22
3CO2直販サイト2024/10/30

防水型は公式サイトでデータ構造が公開されている(URL)。
PRO,CO2は「スイッチボットCO2センサーの遊び方」を参照などし、防水型の拡張で構成されていた。

各デバイスのBLE Scannerでのアドバタイズは下記になっていた(黒塗り部分はMACアドレスが入っている)。
〇防水型


〇PRO


〇CO2

防水型、PRO、CO2の区別は長さで区別できるっぽい。
データは防水型、PROは同じフィールドに気温、湿度が入っている。
CO2型は後ろが拡張されてCO2濃度が入っている。
CO2の場合を例にすると下記のようになる

番号000102030405060708091011121314151617
0x690x090xXX0xXX0xXX0xXX0xXX0xXX0x2D0xE40x030x960x2E0x000x070x090x4D0x40

薄紫: MACアドレスが格納
緑: 気温
temp = ((data[9] & 0x0F) * 0.1 + (data[10] & 0x7F)) * (((data[10] & 0x80) > 0 : 1 : -1);
水色: 湿度
humidity = data[11] & 0x7F;
オレンジ: CO2濃度
CO2 = data[14] * 256 + data[15]

なおCO2モデルは電池駆動だとCO2濃度の測定は30分間隔。USB給電を行えば1分間隔で取れた。ただUSB給電の指す部分が狭いので付属ケーブルより柔らかいケーブルに変えたいがケーブルを選ぶので大変。