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給電の指す部分が狭いので付属ケーブルより柔らかいケーブルに変えたいがケーブルを選ぶので大変。


2024年11月18日月曜日

エレコムの法人無線AP「WAB-I1750-PS」のファームウェアを1.5.10iから2.0.4iに上げてみた。

 エレコムの法人無線AP「WAB-I1750-PS」のファームウェアは1.5.10(2021/01/20 公開)で運用していたが、ふと確認すると2024/8/6に 2.0.4が出ていた。

何が変わったか、分からんところも多いが少なくとも管理コンソールのhttps周りの設定が現代的というか、ちょっと進化してTLS1.1,TLS1.2が使えるようになっていた。

1.5.10i2.0.4i
nmap結果XXXX@yyyy:~ $ nmap --script ssl-enum-ciphers -p 443 192.168.0.XXX
Starting Nmap 7.70 ( https://nmap.org ) at 2024-11-18 21:46 JST
Nmap scan report for
192.168.0.XXX
Host is up (0.12s latency).

PORT STATE SERVICE
443/tcp open https
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
| TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 1024) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| 64-bit block cipher DES vulnerable to SWEET32 attack
| 64-bit block cipher IDEA vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
| TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 1024) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| 64-bit block cipher DES vulnerable to SWEET32 attack
| 64-bit block cipher IDEA vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
|_ least strength: D

Nmap done: 1 IP address (1 host up) scanned in 2.39 seconds
XXXX@yyyy:~ $ nmap --script ssl-enum-ciphers -p 443 192.168.0.XXX
Starting Nmap 7.70 ( https://nmap.org ) at 2024-11-18 21:57 JST
Nmap scan report for 192.168.0.XXX
Host is up (0.0093s latency).

PORT STATE SERVICE
443/tcp open https
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
| TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 1024) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| 64-bit block cipher IDEA vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
| TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 1024) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| 64-bit block cipher IDEA vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.1:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
| TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 1024) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| 64-bit block cipher IDEA vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.2:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 1024) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 1024) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 1024) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
| TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 1024) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| 64-bit block cipher IDEA vulnerable to SWEET32 attack
| Broken cipher RC4 is deprecated by RFC 7465
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
|_ least strength: D

Nmap done: 1 IP address (1 host up) scanned in 2.40 seconds

2024年11月4日月曜日

実家に光ファイバーを導入。BBルータを置く台を自作

 実家のネット環境をドコモのHome5Gで動かしていた。
当時は親が工事をしたくないと言ったので光ファイバーを辞めて、そのころ親機が1円(ゼロ円?)で売っていたドコモのHome5Gにすれば毎月の割引もあったので導入した。
導入した1年間ぐらいは5Gのエリアでもなかったが中々の速度で良い感じであったが、だんだんドコモの通信速度が遅くなり耐えられれないのとHome5Gの割引も終わるのでどうするかと物色。

すでに家に入れているJCOMの契約を見直すと安くなることを発見して切り替え。
実家のJCOMはJCN時代の契約(20年ぐらい前?)。それを地デジ/BS放送だけの映像、電話を解約(もともとNTTの回線を使っている状態に、必要ないJCOMの電話契約がついていた。ついていた方が当時は安かったらしい)、光1G(auブランド、でも回線はNTTだった)にした。

光1Gを入れるにあたり、BBルータ、ONUなど親世代には邪魔くさい機器が増えるので、機器を入れる台をDIYで作成。


側面は無線の邪魔にならないように穴を多めにして、コードをひっかける窪みを入れてみた。また電源がたくさんいるので天板の裏に10口のPCタップを設置。エレコムのT-KF04-21020BKというPCタップはお気に入りで家にも3個買っているもので、大きいコンセントを指しても干渉しないように間が大きいのと何よりネジ止めする穴があるのでDIYで作ったラックにしっかり止められる。

作るのは結構時間がかかり
10月20日(日) 木材購入、店でカットしてもらい側面の部分を家でざっくりと切る
10月27日(日) 側面をだいたい形にする
10月31日(木) 側面や天板などをやすり掛け(150番、400番、600番)
11月01日(金) 1回目の塗装
11月02日(土) 2回目の塗装
11月03日(日) 組み立てて夕方に実家に持ち込む
なので1日4,5時間ぐらい作業しているので25~30時間かかった。納期に追われたのでちょっとやすり掛けとか手を抜いたところもあり。

実家では良い感じに収納できたが、タイラップと柔らかいイーサケーブルを持っていき忘れたので配線が汚い。これは年末に直しに行こう。

回線速度は同じ無線LANでつないでも10倍速くなった。

2024年10月20日日曜日

横浜市の情報公開制度を初めて使ってみた(もらった資料や確認して分かったこと)

3個に分けています。
  1. 横浜市の情報公開制度を初めて使ってみた(申請するまで)
  2. 横浜市の情報公開制度を初めて使ってみた(資料が届くまで)
  3. 横浜市の情報公開制度を初めて使ってみた(もらった資料や確認して分かったこと)

-----------------------------

情報公開制度を利用して分かったこと。

  1. 総総第514号の行政文書が開示され分かったこと(総務局総務部総務課)
    1. 文章が開示され、内閣府故安倍晋三国葬儀事務局へ送付されている事が判明
  2. 芳名帳そのもの開示請求から分かったこと(総務局総務部管理課)
    1. 不開示決定書に、開示できない理由として原本がすでに無いので開示できないとのこと
    2. 電話で、芳名帳が公文書であるなら文書保管期限があるはずで複写が残っていないのは、おかしいのではないかと確認した
      1. (役所)横浜市行政文書管理規則の1年未満に書かれている「1 会議等で受領した軽微な行政文書」にあたるので、破棄した扱い。
  3. 芳名帳に記載する際の個人情報の取り扱いの承諾に関する文書の開示請求から分かったこと
    1. 不開示決定書に開示できない理由として一時的な使用であって、短期間に廃棄され、又は消去される個人情報を取り扱う事務なので作成していない
    2. 電話で条例で一時的なものは市長に報告せずに実施してよいと書いているが法律で利用目的の許諾が必須になっているのではないか
      1. (役所)2022年当時の法律、条令に従うので条例の「取得の状況からみて利用目的が明らかであると認められるとき。 」に該当する。記帳所という特性上、送付されるものと認識しているはず。
      2. (疑問)記帳した人は、思いとして故人の関係組織に渡るとは考えるかもしれないが国に渡させるなんて思いもつかないのではないか?
      3. (疑問)そもそも誰に渡すか決定していないのに記帳を始めるのが勇み足ではないか。
  4. 記帳所の立会のローテイション表の開示請求から分かったこと(総務局総務部管理課)
    1. 不開示決定書に手隙の職員で対応したので文書は無いとのこと
  5. 送付先決定の調整がわかる文書の開示請求で分かったこと(総務局総務部総務課)
    1. 不開示決定書に送付先決定先までの調整がわかる文書がない。電子メールも存在しない

3で2022年当時の個人情報保護の条例が必要になったので入手方法を探した。最新版は横浜市個人情報の保護に関する条例としてWeb公開しているが、古いやつを確認するには結論としては
になる。「横浜市個人情報の保護に関する条例の解釈・運用の手引」もあり「一時的な利用」は1年未満と解釈するなど書いてあり、正直、行政はこうやって平仄をそろえるのかと感心した。ただこれも今の条例に対する解釈なので当時の条例に対する解釈・運用の手引がないと分からない。
市民情報センターに行けば古い条例も閲覧できるようだが解釈・運用の手引きもあるのかな。遠いし平日のみなので大変なんだよな。ちょっと期待して近所の市立図書館にもリファレンスとして置いてないか確認したが最新の条例しかないとのこと。残念。

今回の開示請求した時点では、横浜市がどこに送付したか分からず、安倍晋三選挙事務所か故人親族にでも送付したのかと思っていたので国に送付しているのは想定外であった。
資料が届き始めてから改めてinternetを検索したところ、新聞報道によると最初は国は受け取らず、その後、方針を変えたようにも思える。
また笠間市は「記入いただいた芳名帳は、安倍晋三事務所へお届けさせていただきます。」と書いてあるので直接送ったのであろうか。
行政が民間に個人情報を渡すという利用目的を明らかにしつつ収集して、最後に送るというのは、なんとなく違和感がぬぐえない。

〇資料


横浜市の情報公開制度を初めて使ってみた(資料が届くまで)

 3個に分けています。

  1. 横浜市の情報公開制度を初めて使ってみた(申請するまで)
  2. 横浜市の情報公開制度を初めて使ってみた(資料が届くまで)
  3. 横浜市の情報公開制度を初めて使ってみた(もらった資料や確認して分かったこと)

-----------------------------

9月20日に申請し、10営業日後の10月7日(月)に総務局総務部総務課から封筒一つに開示通知決定通知書、不開示決定通知書が入っていた。要求した内容より回答が少ないので問い合わせ先に電話をすると、要求事項は、総務局総務部総務課と総務局総務部監理課に分かれたので別々に回答が届くとのこと。結局、総務局総務部監理課からは(確か)10月9日(水)に不開示決定通知書1枚が届いた。要求が分割されているというのは、どこにも書いていないので、ちょっと不便。

総務局総務部総務課の回答は総総第514号は開示するというので手書きの請求書?で230円の振り込みをしないといけない。これがなんと窓口でしか対応できないとのこと。コンビニ払いとかできないのか.... しょうがないので休憩時間に郵便局で支払い領収書をもらって、役所に送付した。ちなみに今回は2通目に開示通知決定通知書がなかったので振り込み用紙は無かったが、もしあった際はまとめていくか、2回行くかということになる。徒歩圏内に窓口があればいいけど、無いと面倒だな。

開示文書のCD-Rは10月16日に届いた。

文書の開示請求をしてから約1か月。内容によっては再度請求するとなると調査報道などされる人もなかなか大変だなと感じた。最初の段階で広く請求したくなるのも分かる。

横浜市の情報公開制度を初めて使ってみた(申請するまで)

3個に分けています。
  1. 横浜市の情報公開制度を初めて使ってみた(申請するまで)
  2. 横浜市の情報公開制度を初めて使ってみた(資料が届くまで)
  3. 横浜市の情報公開制度を初めて使ってみた(もらった資料や確認して分かったこと)

-----------------------------