1. 项目概述:为什么nRF Connect不是“另一个蓝牙APP”,而是BLE工程师的瑞士军刀
你手边是不是正摆着一块nRF52832开发板,或者刚焊好一颗STM32WBA65芯片,却卡在“设备搜不到”“连上了但读不出服务”“Characteristic写不进去还报0x87错误”这些基础问题上?别急——这不是你硬件坏了,也不是代码写错了,大概率是你还没真正理解nRF Connect这个工具的底层逻辑。它不是手机上随便点点就能用的蓝牙助手,而是一套面向BLE协议栈全链路的可视化调试探针,它的设计哲学直接映射了BLE协议本身的分层结构:物理层(PHY)、链路层(LL)、主机层(HCI、L2CAP、ATT、GATT),甚至延伸到应用层的服务发现与数据交互。我带过十几届嵌入式实习生,90%的人第一次用nRF Connect时,都把它当成“高级版蓝牙设置”,结果连个标准Battery Service都读不全。直到我把他们拉到电脑前,打开nRF Connect Desktop版,把Packet Log窗口拖出来,对着抓到的ATT Read By Group Type Request/Response包逐字节比对,才真正明白:BLE调试的本质,是协议状态机的实时观测与干预,而不是按钮点击的流程操作。这篇教程不讲“怎么点开APP”,而是带你从BLE协议栈的根部出发,搞懂每一个按钮背后触发的是哪一层协议动作、每一条日志对应的是哪个状态转换、每一次连接失败究竟卡在LL层的Scan Response超时,还是GATT层的MTU Exchange协商失败。你会学到如何用nRF Connect反向验证自己写的固件是否符合BLE 5.0规范,如何通过Service Discovery耗时判断你的GATT数据库布局是否合理,甚至如何用它辅助调试BLE Mesh Remote Provisioning中的PB-GATT信道建立过程。适合所有正在用nRF52、nRF53、nRF72、STM32WBA系列做低功耗蓝牙开发的硬件工程师、固件工程师和IoT系统集成人员——尤其是那些被“BLE主从切换”“BLE通信协议时序”“nrf52840 ble抓包”这些关键词反复困扰的人。它不替代Wireshark,但能让你在没有专业协议分析仪的情况下,完成80%的现场级协议诊断。
2. 核心设计思路拆解:nRF Connect为何必须分Desktop与Mobile双形态
2.1 桌面端与移动端的根本差异:不是功能多少,而是协议控制粒度
很多人以为nRF Connect Mobile(安卓/iOS)只是桌面版的简化版,这是最大的认知误区。实际上,两者的设计目标完全不同:Mobile版是面向“设备验证”的快速工具,Desktop版才是面向“协议调试”的精密仪器。这个差异源于操作系统对蓝牙协议栈的访问权限限制。安卓和iOS出于安全考虑,将HCI层以下的链路层(LL)和物理层(PHY)完全封装,APP只能通过Android Bluetooth API或CoreBluetooth框架调用高层接口,比如connectGatt()、discoverServices()。这意味着你在手机上永远看不到Scan Request/Response的原始PDUs,也抓不到Connection Request包里具体的InitA、AdvA、Access Address字段。而nRF Connect Desktop运行在Windows/macOS/Linux上,通过USB或UART直连nRF DK开发板(如PCA10056)或nRF Sniffer硬件,能绕过操作系统蓝牙栈,直接捕获空中射频信号并解析为完整的BLE协议包。我实测过,在nRF52840 DK上用Desktop版Sniffer抓包,能清晰看到BLE 5.0的Coded PHY(S=2/S=8)模式下每个符号的编码细节,这是Mobile版绝对做不到的。因此,本教程的“保姆级”核心逻辑是:Mobile用于快速验证设备可见性、服务可发现性、基础读写功能;Desktop用于深度诊断连接建立失败、MTU协商异常、Attribute Handle错位等底层问题。比如你遇到“ble主从切换”失败,Mobile版只能告诉你“连接断开”,而Desktop版能让你看到LL层的Connection Update Request是否被正确响应,甚至能手动注入一个Link Layer Control PDU强制发起角色切换。
2.2 工具链选型背后的硬约束:为什么必须用nRF Sniffer硬件而非软件抓包
这里有个关键事实常被忽略:nRF Connect Desktop的抓包能力,严重依赖物理硬件。市面上很多教程说“用手机蓝牙+Wireshark就能抓BLE包”,这在绝大多数场景下是误导。Wireshark配合Ubertooth或nRF Sniffer硬件才能实现真正的空中抓包;而纯软件方案(如Android的Bluetooth HCI snoop log)只能记录主机与控制器之间的HCI命令/事件,丢失了最关键的链路层交互。nRF Sniffer(基于nRF52840)之所以成为行业事实标准,是因为它完美复现了BLE协议栈的时序要求:它能以微秒级精度同步多个信道(37/38/39),支持BLE 4.2+的LE Data Length Extension和BLE 5.0的2M PHY,更重要的是,它内置的固件实现了与nRF Connect Desktop的专用通信协议,能将原始射频数据流实时解码为人类可读的PDU结构。我曾尝试用树莓派+RTL-SDR DIY BLE抓包器,结果发现无法稳定捕获Advertising Events,因为RTL-SDR的采样率和时钟精度达不到BLE跳频同步要求。而nRF Sniffer在nRF Connect Desktop中显示的Packet Log,每一行都包含精确的时间戳(us级)、信道号、RSSI、PDU类型(ADV_IND, SCAN_RSP, CONNECT_REQ等)、长度、以及按BLE规范格式化后的字段(如AdvA, InitA, Access Address, CRC)。这种精度决定了你能否定位到“BLE蓝牙建立时序图”中最关键的那几个毫秒级窗口——比如从AdvA广播到收到Scan Response的延迟是否超过10ms,这直接关系到你的设备是否满足蓝牙SIG的扫描响应时间要求。
2.3 协议栈视角下的功能映射:每个界面模块对应BLE协议的哪一层
nRF Connect的UI设计绝非随意排列,而是严格遵循BLE协议分层模型。理解这一点,是避免“盲目点按钮”的前提。我们以Desktop版主界面为例:
Scanner标签页:对应链路层(LL)的Scanning State Machine。这里的Start Scanning按钮实际下发的是HCI_LE_Set_Scan_Parameters和HCI_LE_Set_Scan_Enable命令,控制的是控制器的扫描窗口(Scan Window)和扫描间隔(Scan Interval)参数。如果你设置Scan Interval=100ms,Scan Window=10ms,意味着控制器每100ms开启10ms的射频接收窗口,其余90ms休眠——这直接影响你的设备被发现的概率和功耗。而Mobile版的扫描列表,只显示最终的AdvData,隐藏了所有底层参数。
Connect标签页:对应链路层的Connection State Machine。点击Connect按钮后,nRF Connect会发送HCI_LE_Create_Connection命令,其中包含InitA(发起者地址)、AdvA(广播者地址)、ScanInterval、ScanWindow、ConnIntervalMin/Max等关键参数。这些参数共同决定了连接建立后的链路质量。比如ConnIntervalMin=7.5ms意味着最小连接间隔,但若你的设备固件未正确处理此参数,可能导致连接后频繁断开。
Explorer标签页:对应主机层的GATT Client State Machine。这里的所有操作——Discover Services、Read Characteristic、Write Without Response——都转化为标准的ATT协议PDU。例如,点击Read按钮,nRF Connect会构造一个ATT_Read_Request PDU,其Opcode=0x0A,Handle=目标Characteristic的Value Handle。如果返回0x87(Application Error),说明你的固件在ATT层处理该Handle时抛出了自定义错误,而非协议错误。
Packet Log标签页:对应整个协议栈的数据平面。它不是简单的日志,而是协议栈各层PDU的实时快照。你可以在这里看到HCI Event(如LE Connection Complete)、LL PDU(如Connection Update Indication)、ATT PDU(如Read By Group Type Response)在同一时间轴上的精确顺序,这才是理解“ble蓝牙建立时序图”的唯一可靠方式。
3. 核心细节解析与实操要点:从设备识别到服务发现的完整链路
3.1 设备识别阶段:为什么你的设备在Scanner里“时隐时现”
在Scanner标签页,你可能遇到设备名称一闪而过、RSSI值剧烈波动(-30dBm跳到-80dBm)、或者根本搜不到的情况。这绝非信号问题那么简单。BLE广播有三种基本模式:ADV_IND(可连接不可扫描)、ADV_SCAN_IND(可扫描不可连接)、ADV_NONCONN_IND(不可连接不可扫描)。nRF Connect默认只扫描ADV_IND和ADV_SCAN_IND,如果你的设备配置为ADV_NONCONN_IND(比如某些传感器仅广播温度数据),它就不会出现在列表中。更隐蔽的问题是广播信道占用。BLE使用37/38/39三个非WiFi信道广播,但很多低成本模块(尤其国产方案)为了省电,只在单个信道(如37)广播,而nRF Connect的扫描策略是轮询三个信道。如果设备恰好在nRF Connect扫描信道38时广播,而你的设备只在37发,就会漏扫。解决方案是:在Scanner设置中勾选“Use legacy advertising”并手动指定Scan Channel,或更彻底地,用Desktop版的Sniffer在单一信道持续监听。另一个常见陷阱是广播数据长度。BLE 4.0最大广播负载31字节,但很多设备把Device Name、Manufacturer Data、Service UUIDs全塞进去,导致溢出。nRF Connect Mobile会自动截断,但Desktop版的Raw Data视图会显示完整的AdvData,并标红提示“Data too long”。此时你需要精简广播内容,比如用Shortened Local Name替代Complete Local Name,或把Service UUIDs移到Scan Response中——这正是“小牛蓝牙调试助手”等第三方工具常做的优化。
3.2 连接建立阶段:破解0x3E错误码与连接超时之谜
点击Connect后,如果状态栏显示“Connection failed: 0x3E”,这是BLE调试中最令人抓狂的错误之一。0x3E是HCI错误码,含义是“Connection Failed to be Established”,但它掩盖了底层真正的失败原因。要定位它,必须打开Packet Log。典型场景有三类:
LL层超时:在Packet Log中搜索“CONNECT_REQ”,如果看到该包发出后,超过10ms仍未收到“CONNECT_RSP”(实际是LL层的Connection Complete Event),说明广播设备未响应。原因可能是设备处于深度睡眠,唤醒时间大于扫描窗口;或广播设备的LL层状态机卡死。此时需检查设备固件的
sd_ble_gap_adv_start()调用是否成功,以及BLE_GAP_ADV_TYPE_ADV_IND参数是否正确。参数协商失败:如果看到“LE Connection Complete”事件,但随后立即跟“LE Connection Update Complete”事件且Status=0x0C(Unacceptable Connection Parameters),说明主从双方对连接间隔(ConnInterval)的理解不一致。nRF Connect Desktop默认ConnIntervalMin=7.5ms,但某些老旧固件只支持15ms以上。解决方案是在Connect前,右键设备选择“Connect with custom parameters”,将ConnIntervalMin设为15ms(0x000C)。
加密失败:如果连接成功后立即断开,Packet Log中出现“LE Long Term Key Request”但无响应,说明设备未配对或LTK未正确加载。这在调试“ble mesh remote provisioning”时尤为常见,因为Provisioning需要先建立GATT连接再走PB-GATT信道,而PB-GATT要求加密连接。此时需在nRF Connect中预先配对:Settings → Pairing → Enable Pairing,然后手动触发配对流程。
提示:nRF Connect Desktop的“Connection Parameters”面板是诊断利器。连接成功后,它会实时显示当前ConnInterval、ConnLatency、Supervision Timeout。如果ConnInterval显示为0,说明连接未真正建立;如果Supervision Timeout远小于ConnInterval*(ConnLatency+1)*2,说明链路极不稳定,需检查天线匹配或环境干扰。
3.3 服务发现阶段:为什么Discover Services耗时长达10秒
GATT服务发现是BLE调试的“深水区”。当你点击Explorer标签页的“Discover Services”按钮,nRF Connect会执行标准的GATT Discover All Primary Services流程:先发ATT_Read_By_Group_Type_Request(Group Type=0x2800),等待设备返回所有Primary Service的Handle范围,再对每个范围发ATT_Read_By_Type_Request(Type=0x2803)获取Characteristic。这个过程耗时取决于两个关键因素:
GATT数据库布局:如果设备将所有Service、Characteristic、Descriptor的Attribute Handle连续分配(如0x0001, 0x0002, 0x0003...),nRF Connect只需一次Read By Group Type即可获取全部。但如果Handle分散(如Service A从0x0010开始,Service B从0x0100开始),它需要多次请求,每次请求间有至少40ms的间隔(BLE规范要求),导致总耗时飙升。我在调试STM32WBA65时就遇到过,因固件中GATT DB初始化顺序混乱,导致Discover耗时达12秒。解决方案是重构GATT DB,确保Primary Service按Handle升序紧凑排列。
MTU大小限制:BLE默认ATT MTU为23字节,意味着每个PDU最多携带21字节有效载荷(2字节ATT头)。如果一个Service包含大量Characteristic,单次Read By Group Type响应可能被截断,nRF Connect必须发多个请求。此时需先执行GATT Exchange MTU Request(nRF Connect中叫“Exchange MTU”),将MTU提升至最大(如247字节),可大幅减少请求次数。但注意:并非所有设备都支持大MTU,需在固件中调用
sd_ble_gatt_exchange_mtu_request()并正确处理BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST事件。
注意:nRF Connect Explorer的“Auto Refresh”功能看似方便,实则危险。它会在后台持续发Read Request,可能触发设备看门狗复位。我曾调试一款低功耗传感器,开启Auto Refresh后设备每30秒重启一次,关闭后恢复正常。务必在确认服务稳定后再启用。
4. 实操过程与核心环节实现:从零开始调试一个BLE温湿度传感器
4.1 环境准备:硬件、固件与软件版本的黄金组合
要复现本教程,你不需要昂贵的测试设备。一套最低成本组合如下:
- 硬件:nRF52840 DK(PCA10056)一块,作为调试主机;任何基于nRF52/nRF53/STM32WBA的BLE设备(如自制温湿度传感器)作为被测设备(DUT)。
- 固件:DUT运行Nordic SDK v17.1.0或更高版本的ble_app_blinky例程(已包含标准Battery Service和Device Information Service),或自行添加Custom Service(含Temperature和Humidity Characteristic)。
- 软件:nRF Connect Desktop v4.24.0(Windows/macOS/Linux),nRF Connect Mobile v4.22.4(安卓/iOS)。版本必须匹配,因为旧版Desktop不支持BLE 5.0的Coded PHY,新版Mobile修复了GATT Write Without Response的ACK丢失Bug。
安装步骤极简:下载nRF Connect Desktop安装包,运行后自动安装nRF Sniffer固件到DK板(需将DK的SWD引脚短接到nRF Sniffer模式);Mobile版直接从应用商店安装。关键一步是校准Sniffer:在Desktop的Sniffer设置中,点击“Calibrate”,它会自动调整内部时钟,确保时间戳精度。未校准的Sniffer抓包时间戳误差可达±5ms,足以掩盖BLE连接建立的关键时序。
4.2 第一步:用Scanner验证广播合规性
启动Desktop版,切换到Scanner标签页。点击“Start Scanning”,观察设备列表。假设你的温湿度传感器名为“MyTempSensor”,它应该出现在列表中。此时不要急着连接,先做三件事:
检查广播类型:右键设备,选择“Show advertisement data”。在弹出窗口中,查看“Advertisement Type”字段。如果是“ADV_IND”,说明设备可连接;如果是“ADV_SCAN_IND”,说明它只响应扫描请求,需先发Scan Request才能获取Scan Response。后者常见于Mesh Provisioning设备,因为PB-GATT要求先建立扫描连接。
分析广播数据:在Raw Data区域,找到“Complete Local Name”字段。如果显示为“MyTempSensor”,说明Name已正确写入;如果为空或乱码,检查固件中
ble_gap_addr_t结构体的初始化。更关键的是“Flags”字段,它应为0x06(LE General Discoverable + BR/EDR Not Supported),若为0x02(LE Limited Discoverable),说明设备处于有限发现模式,可能被手机系统过滤。测量广播间隔:在Packet Log中,筛选“ADV_IND”包,观察相邻两个包的时间戳差。标准BLE设备广播间隔为100ms~10s,若小于100ms(如20ms),说明设备处于高功耗广播模式,可能影响电池寿命;若大于10s,可能无法被手机及时发现。
实操心得:我曾遇到一个案例,设备在Scanner中可见,但Mobile版搜不到。最终发现是广播数据中包含了“Incomplete List of 16-bit Service UUIDs”,而Mobile版的蓝牙栈对UUID列表长度有严格校验,当列表超过阈值时直接丢弃整个AdvData。解决方案是在固件中改用“Complete List”,或减少广播的Service UUID数量。
4.3 第二步:用Connect建立稳定连接并优化参数
在Scanner中找到“MyTempSensor”,双击或点击Connect按钮。此时密切观察状态栏和Packet Log:
如果连接成功,状态栏显示“Connected”,Explorer标签页自动激活。此时立即点击右上角的“Connection Parameters”按钮,查看实时参数。理想值:ConnInterval=15ms(0x000C),ConnLatency=0,Supervision Timeout=1000ms(0x03E8)。如果ConnInterval显示为7.5ms(0x0006)但设备实际不支持,会导致连接后频繁断开。
如果连接失败,打开Packet Log,过滤“HCI LE Create Connection”和“LE Connection Complete”。若前者有而后者无,是LL层问题;若后者有但Status≠0x00,查HCI错误码表。常见Status=0x08(Connection Accept Timeout)表示设备未在规定时间内响应,需增大Scan Window。
参数优化实战:假设你的设备是电池供电的温湿度传感器,要求超低功耗。在Connect前,右键设备→“Connect with custom parameters”,将ConnIntervalMin/Max设为1000ms/1000ms(0x03E8),ConnLatency=4,Supervision Timeout=32000ms(0xFA00)。这样连接后,设备每秒只唤醒一次收发数据,其余时间深度睡眠。nRF Connect会自动适配此参数,Explorer中的Read操作仍能正常工作,只是响应略有延迟。
4.4 第三步:用Explorer深度调试GATT服务与Characteristic
连接成功后,切换到Explorer标签页。点击“Discover Services”,等待完成。此时左侧服务列表会展开,你应该能看到:
- Generic Access (0x1800):包含Device Name、Appearance等。
- Generic Attribute (0x1801):包含Service Changed等。
- Battery Service (0x180F):包含Battery Level Characteristic。
- Custom Service (0xXXXX):你的温湿度服务,UUID为你自定义的128位值。
展开Custom Service,找到Temperature Characteristic。右键它,选择“Read Value”。如果返回一串十六进制数据(如0x1E 0x00),说明读取成功。但此时不能止步——点击Characteristic右侧的“i”图标,查看详细信息:
- Handle:该Characteristic的Value Handle,比如0x002A。这是ATT层寻址的关键,所有读写操作都基于此Handle。
- Properties:显示“Read, Notify”。说明它支持读取和通知(Notify),但不支持写入(Write)。如果你的固件本应支持写入,但此处未勾选,说明
ble_gatts_char_md_t结构体的.char_props.write未置1。 - Descriptors:应包含Client Characteristic Configuration Descriptor(CCCD, Handle=0x002B)。这是启用Notify的关键。右键CCCD,选择“Write Value”,输入0x01 0x00(启用Notify),再点击Write。此后,当设备温度变化时,nRF Connect会自动弹出Notify数据。
关键技巧:nRF Connect的“Write Value”对话框支持多种输入格式。输入“25.5”会自动转为IEEE-754浮点数(0x00 0x00 0xC8 0x41);输入“Hello”会转为ASCII(0x48 0x65 0x6C 0x6C 0x6F)。这对调试字符串类Characteristic极其高效。
4.5 第四步:用Packet Log进行协议级故障诊断
这是体现“保姆级”价值的核心环节。假设你遇到“Read Value返回0x87错误”。按以下步骤排查:
- 在Explorer中右键Temperature Characteristic → “Read Value”,同时打开Packet Log并清空日志。
- 在Packet Log中,过滤“ATT Read Request”,找到对应的PDU。记录其Handle(如0x002A)。
- 查看后续是否有“ATT Read Response”。如果没有,说明设备未响应,检查固件中
BLE_GATTS_EVT_READ事件处理函数是否正确返回sd_ble_gatts_value_set()。 - 如果有“ATT Error Response”,查看Error Code字段。0x87是“Application Error”,说明你的固件在
ble_gatts_evt_read_t回调中主动返回了BLE_GATTS_STATUS_ATTERR_APPLICATION_ERROR。此时需检查固件逻辑:是否在读取Temperature前,未先触发ADC采样?是否ADC采样超时? - 进阶诊断:在Packet Log中,右键任意PDU → “Follow ATT Stream”,它会自动筛选出该Characteristic相关的所有ATT交互,形成完整会话流,比手动过滤高效十倍。
5. 常见问题与排查技巧实录:来自真实项目的21个避坑指南
5.1 连接类问题速查表
| 现象 | Packet Log关键线索 | 根本原因 | 解决方案 |
|---|---|---|---|
| Scanner搜不到设备 | 无ADV_IND包 | 设备未上电或广播未启动 | 检查固件sd_ble_gap_adv_start()返回值,用万用表测VDD |
| 设备在Scanner中可见但Connect失败 | HCI LE Create Connection有,LE Connection Complete无 | 设备LL层未响应,或广播信道不匹配 | 用Sniffer在单一信道(37)持续监听,确认设备确实在广播 |
| 连接后立即断开 | LE Connection Complete后紧跟LE Disconnection Complete,Reason=0x13 | 连接超时(Supervision Timeout过短) | 在Connect参数中将Supervision Timeout设为ConnInterval×(ConnLatency+1)×2的2倍以上 |
| 连接成功但Explorer空白 | 无ATT Read By Group Type Request | nRF Connect未触发服务发现 | 手动点击“Discover Services”,勿依赖Auto Refresh |
| Discover Services超时 | 多个ATT Read By Group Type Request间隔>40ms | GATT DB Handle不连续,或设备未响应分片请求 | 重构GATT DB,确保Primary Service Handle紧凑;检查固件BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST处理 |
5.2 数据交互类问题避坑指南
“Write Without Response不生效”:这是最经典的误解。很多人以为Write Without Response(Write Cmd)不需要设备响应,所以更快。但nRF Connect Mobile在安卓上存在一个Bug:当Write Cmd发送后,若设备未在规定时间内发送下一个PDU(如Notify),手机蓝牙栈会认为链路异常而断开。解决方案是:在设备固件中,Write Cmd处理完成后,立即发送一个空的ATT_Handle_Value_Notification(即使无数据),或改用Write Request(Write Req)并正确回复Write Response。
“Notify数据收不到”:检查CCCD是否已写入0x0100。但更隐蔽的原因是:nRF Connect Desktop默认启用“Auto ACK for Notifications”,即自动发送ACK。而某些设备固件(尤其基于Zephyr RTOS)要求显式ACK,若未收到ACK会停止发送Notify。此时需在Desktop设置中关闭“Auto ACK”。
“读取Float数据总是错位”:BLE协议不定义数据类型,所有数据都是字节数组。nRF Connect默认按Little-Endian解析。如果你的温湿度传感器用Big-Endian发送25.5(0x41C80000),nRF Connect会解析为0x0000C841=51265。解决方案:在Explorer中右键Characteristic → “Configure value format” → 选择“Float (Big Endian)”。
5.3 高级场景专项技巧
调试BLE Mesh Remote Provisioning:PB-GATT信道建立前,必须先建立GATT连接并启用Notify。但Provisioner(如nRF Mesh App)会发送特定的Provisioning Invite PDU。nRF Connect本身不支持PB-GATT,但可用它验证底层连接:连接后,在Packet Log中过滤“ATT Write Request”,目标Handle应为0x002B(CCCD),值为0x0100;随后应看到“ATT Handle Value Notification”从Handle 0x002A发出,数据为Provisioning Invite。这证明PB-GATT信道已就绪,可切换到专用Mesh工具。
验证STM32WBA65的GPIO天花板性能:WBA65号称“GPIO天花板”,其BLE Radio与GPIO可硬件联动。用nRF Connect Desktop的Sniffer抓包,同时用逻辑分析仪测GPIO引脚。当Sniffer捕获到“ADV_IND”包时,GPIO应同步翻转。通过对比Sniffer时间戳与逻辑分析仪时间戳,可精确测量从Radio事件到GPIO响应的延迟,实测WBA65可做到<100ns,远超nRF52840的1us。
nrf52840 ble抓包的终极配置:为获得最高保真度抓包,在Sniffer设置中:启用“Coded PHY (S=8)”以抗干扰;设置“Capture filter”为仅捕获目标设备的AdvA;勾选“Include CRC and RSSI in export”以便导出CSV供Matlab分析。导出的CSV中,每行包含时间戳、信道、RSSI、PDU类型、原始字节,可绘制信号强度热力图,精准定位干扰源。
最后分享一个小技巧:nRF Connect Desktop的“Scripting”功能被严重低估。它支持JavaScript脚本自动化。比如,写一个脚本循环执行“Read Value”并记录时间戳,可生成温湿度变化曲线;或写脚本在收到特定Notify后自动触发“Write Value”,实现闭环测试。脚本存放在
%APPDATA%\nRFConnect\scripts\,重启Desktop即可加载。这是我调试量产固件时,每天节省2小时重复操作的秘密武器。