- 薬局で Microlife WatchBP O3 血圧計 を装着した後、データを直接確認しようとして装置の micro-USB ポート を発見
- Linux 環境で WatchBP Analyzer ソフトウェア を実行したが装置の認識に失敗し、その後 Windows 仮想マシン を通じてデータのダウンロードに成功
- Wireshark と usbmon を使って USB 通信をキャプチャし、データパケット内で 収縮期・拡張期血圧および心拍数 を含むバイト構造を確認
- さらに OPP(振動性最高圧) と タイムスタンプ を追跡したが、時刻データの構造は明確に解釈できなかった
- リバースエンジニアリングの試みは期限のため中断されたが、データ構造の分析経験と「白衣高血圧」の概念 を新たに学んだ事例
血圧計と最初の試み
- 薬局でインフルエンザ予防接種を受けた後、血圧測定結果が高く出たため 24時間血圧測定装置 を装着
- 装置は30分(日中)・60分(夜間)間隔で自動測定
- 装置側面の micro-USB ポート を見つけ、データへのアクセスを試みた
- 装置のモデルは Microlife WatchBP O3 で、関連する Windows 用 WatchBP Analyzer ソフトウェア をダウンロード
- Linux 環境で Bottles を使って実行したが、装置の認識に失敗
hidraw デバイスとして表示され、USB HID インターフェースを使っていることを確認
- その後 Windows 仮想マシン(Gnome Boxes) をインストールして USB デバイスを接続すると、データのダウンロードに成功
- WatchBP Analyzer で最初の3回の測定値を確認
USB トラフィック分析
- 仮想マシン環境を活用して Wireshark で USB 通信をキャプチャ
usbmon3 インターフェースを通じて装置とホスト間のデータフローを記録
- キャプチャしたパケットから、血圧値が含まれていると見られるバイト列を発見
- 例:
05 0a 89 71 43 9b
- 3バイト目は 収縮期血圧(SYS)、4バイト目は 拡張期血圧(DIA)、5バイト目は 心拍数(HR) と推定
- 複数の測定値を比較して データパターン を整理
- 例:
137/113/67, 132/86/68, 126/84/82 など
- 各パケットは32バイト単位で構成され、最初のバイトは有効データ長(SIGNIFICANT BITS)を示す
追加のデータ構造探索
- OPP(振動性最高圧) および タイムスタンプ を含む追加バイトを分析
- OPP データは各測定後のパケットに存在するが、位置は一定していない
- SYS、DIA、HR の後の4バイトを 32ビットのタイムスタンプ と仮定したが、実際の測定時刻とは一致しなかった
- 6列目の値が午前・午後の切り替わり時に
82 から 83 に変わり、7列目が初期化されるパターンを観察
- 一部の値は測定時刻の分単位に似た傾向を示したが、明確な規則は確認できなかった
AI とコードの実験
- Kagi プラットフォームを通じて複数の AI モデルにデータを入力し、分析を試行
- 一部は無効な結果を示したが、エンディアン(endianness) の概念など分析の方向性には役立った
- Python で装置の初期ハンドシェイクとデータダウンロードを模倣しようとしたが、AI が提供したコードの大半は不正確だった
- この過程で pyhidapi ライブラリを新たに知った
まとめと教訓
- 装置を返却しなければならない都合により、リバースエンジニアリング作業は中断
- その過程で USB データ構造の分析とリバースエンジニアリングの実践経験 を得た
- 新しく学んだ用語として 「Normotension」(正常血圧) と 「White Coat Hypertension」(白衣高血圧) に言及
- 注射直後の血圧測定では一時的に高い数値が出ることがある
- 結論として、予防接種直後の血圧測定は推奨されない
1件のコメント
Hacker Newsの意見
高血圧の問題があるので、Hilo デバイスを購入した
腕にカフを装着して**校正(calibration)したあと、手首に小さな装置を着けておくと、動いていないときに昼夜を問わず自動で血圧を測定する
データはスマートフォンアプリと同期して保存され、毎回カフを巻く手間や白衣高血圧(white coat hypertension)**を避けられる
ただし月に1回ほどはカフで再校正する必要があり、アプリのカメラで指を測定する機能は結果にばらつきがある
AI関連の記事で「stupid in ways that made me think」という表現があったが、これはまさにAIがラバーダック・デバッグに役立つ理由をうまく要約した一文だと思う
同僚と話すときよりも、もっと深く考えさせてくれる
心拍数モニターを着けてデータを分析してみたところ、心拍数が急上昇するケースは2つしかなかった — 運転しているときと妻と会話しているときだ
ある水泳選手は、どんなデバイスも使わず自分の心拍だけを聞いているという
白衣高血圧は、必ずしも注射や病院の環境が原因というわけではなく、単に測定状況への緊張感によるものかもしれない
結局、薬を処方されることになった
それ以来、妻が血圧を測るたびに自分まで緊張するようになった
なので平均値だけを参考にしている。自宅のA&D UA-611 Plusでも病院の機器でも同じような変動が見られる
データ形式を分析しながら、年・月・日・時・分をビット単位で推定してみたが、**ビット反転(reverse)**が必要な理由や空き領域の意味はまだ分からない
「これをリバースエンジニアリングすれば血圧が良くなりそうだ」という冗談があまりに共感できて、読んだあと本当に健康になった気がした
オレンジジュースとバナナを1日2回摂るようにしたら、血圧が142/90 → 125/80に下がった
1日あたり約2000mgのカリウムを摂取することになる
「stupid in ways that made me think」という文は、AIの長所と限界を同時によく表した要約のように思える
私も同じように健康データを自分で管理し始めた
年齢を重ねた開発者たちが体の異変を感じ、主体的な健康管理をする流れは今後ますます増える気がする
関連文書はmikado-aktiia.readthedocs.ioにまとめた
私はBPExtractでPDFを読み取り、すべての測定値をApple Healthへ自動で書き出しているが、手動より自動化のほうがずっと良いと感じている
一般医(GP)は結局のところ専門医へ回すための窓口にすぎず、待ち時間が長すぎるからだ
ただし自分の判断が間違っている可能性は常に前提にしておくべきだ
トラフィックダンプを見ると、プロトコルをオフラインで解析してみたくなる
最近もWindowsの仮想プリンタドライバを**リバースエンジニアリング(reverse engineering)**するのに半日を費やしたが、続けたい気持ちを無理やり抑えた