<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>蓝牙 on Codexer</title><link>https://codexer.com/tags/%E8%93%9D%E7%89%99/</link><description>Recent content in 蓝牙 on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 12 Oct 2026 07:50:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/%E8%93%9D%E7%89%99/index.xml" rel="self" type="application/rss+xml"/><item><title>用 Codex 拆一颗坏掉的血糖仪：AI 能读到的，和读不到的</title><link>https://codexer.com/posts/2026-10-12-codex-glucose-monitor-reverse-engineering/</link><pubDate>Mon, 12 Oct 2026 07:50:00 +0800</pubDate><guid>https://codexer.com/posts/2026-10-12-codex-glucose-monitor-reverse-engineering/</guid><description>&lt;h2 id="先说这个场景"&gt;先说这个场景&lt;/h2&gt;
&lt;p&gt;花一百美元买了个连续血糖监测仪（CGM），想搞清楚血糖波动到底有没有人们说的那么要紧。第一颗还没预热完就罢工，换来的第二颗撑了两天。钱退了，但作者 Farhan Ahmad 心里不痛快：一个贴在身上的医疗设备，坏了就坏了，连一句「我为什么坏了」都不给。&lt;/p&gt;
&lt;p&gt;他是软件工程师出身，也做数据科学，对嵌入式设备有点概念。于是他把那颗已经扔进垃圾桶的传感器翻了出来，连同贴着蓝牙 PIN 的敷贴器一起，去问 Codex 和 OpenAI Astra：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我有一颗坏掉的罗氏连续血糖监测仪，就在这台电脑旁边。它自称 AC-1R00075XXXX。你能不能建立蓝牙连接，把它还在发的东西读出来？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;几分钟后，Codex 写好一段 Python，扫描蓝牙、配对，把传感器里残存的数据整个 dump 了出来。&lt;/p&gt;
&lt;p&gt;这个细节值得停一下。问题本身是模糊的，「把它发的东西读出来」既没有协议，也没有数据结构，更没说怎么连。Codex 在这里做的事不是写一个 App，而是把他脑子里的一个疑问，翻译成了一段能跑的程序。&lt;/p&gt;
&lt;h2 id="读到了什么"&gt;读到了什么&lt;/h2&gt;
&lt;p&gt;工具是 Python 加 Bleak（蓝牙低功耗通信库），在 Mac 上走 Apple 的 CoreBluetooth。&lt;/p&gt;
&lt;p&gt;传感器在扫描里出现了，也接受了连接，暴露三个 service：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Device Information（设备信息）&lt;/li&gt;
&lt;li&gt;Continuous Glucose Monitoring（连续血糖监测）&lt;/li&gt;
&lt;li&gt;Reconnection Configuration（重连配置）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;设备信息回的是 Roche Diabetes Care GmbH、型号 303、固件 FW_V7.5.1-9205bbad。也就是说，虽然 App 判定它死了，射频部分和足够回话的那部分固件还活着。所谓「变砖」，至少在这里是个会话状态，不是彻底断电的硬件。&lt;/p&gt;
&lt;p&gt;关键的一步在这里。传感器实现了标准的蓝牙 CGM 服务，里面有个叫 Record Access Control Point 的特征值，客户端可以通过它索要存储的测量记录。作者发了两条请求：先数记录条数，再全部取回。传感器报 96 条，给了 96 条，最后回了成功。&lt;/p&gt;
&lt;p&gt;96 条记录拆开是这样：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;34 个有效数字血糖值&lt;/li&gt;
&lt;li&gt;29 个 NaN，意思是当时拿不到数字测量结果&lt;/li&gt;
&lt;li&gt;33 个 -Infinity，附带一条警告，说结果低于设备能处理的范围&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;96 条记录的校验和全部通过。这说明取回来的数据包本身是完整的，但不代表底下的血糖测量是对的。这两件事经常被混为一谈。&lt;/p&gt;</description></item></channel></rss>