【Telink TL322X 测评】第十章:小型无线 IoT Demo 设计与演示
本帖最后由 chen55025470 于 2026-7-11 22:55 编辑# 【Telink TL322X 测评】第十章:小型无线 IoT Demo 设计与演示
* **前面章节分别验证基础外设、BLE、协议栈覆盖、射频和功耗。**
* **本章把这些能力组合成一个可以展示的 BLE IoT Demo,用于最终文章和视频收尾。**
## 10.0 当前验证记录
**本章已经完成可交互 IoT Demo 固件构建、烧录和读回校验:**
| **项目** | **结果** |
| ------------------------- | --------------------------------------------------------------------------------- |
| **SDK target** | `feature_test` |
| **FEATURE\_TEST\_MODE** | `TEST_GATT_API` |
| **BLE 广播名** | `iot_demo` |
| **固件** | `firmware\eval09_gatt_api_iot_demo.bin` |
| **大小** | **138564 bytes** |
| **SHA256** | `BD2EF9EE758A8DF08E6AB1397271185A2CE8A37CB7A3B5098D15113A538FE5DB` |
| **烧录验证** | **2026-07-09 已完成写入、读回,SHA256 与本地固件一致** |
| **构建脚本** | `tools\build_eval09.ps1` |
| **烧录校验脚本** | `tools\flash_verify_eval09.ps1` |
| **最新日志** | `logs\flash_verify_eval09_latest.log` |
| **App APK** | `D:\Project\Evaluation\Telink\App\releases\TelinkBleTester-0.1.0-debug.apk` |
| **APK SHA256** | `94AF2A52654BB9C35AD1FABCF54812F2F4AE43A3142E593809EF2220F5B85B3E` |
**本章已达到的效果:手机 App 可以扫描并连接 **`iot_demo`,通过 Telink SPP 写入 `IOTL/IOTT/IOTS/IOTN` 命令控制开发板 LED、查询状态和开启周期 Notify;开发板通过 `IOTR` Notify 返回序号、事件、LED 状态、计数和运行时间。
## 10.1 本章任务目标
**本章主要完成以下任务:**
```
1. 选择一个可落地的小型无线 IoT Demo 方向;
2. 明确手机 App 与开发板之间的 BLE GATT 数据流;
3. 整合 LED 状态控制、状态查询和周期 Notify;
4. 完成代码、烧录、联调和演示素材预留;
5. 总结 TL322X 在实际小应用中的开发体验。
```
## 10.2 开发板与测试方式
**本章最终采用 BLE GATT / Telink SPP Demo 路线:**
```
构建 TEST_GATT_API IoT Demo 固件
↓
烧录并读回校验
↓
手机 App 扫描 iot_demo
↓
连接并发现 GATT Service / Characteristic
↓
App 写入 IOT 命令控制开发板
↓
开发板通过 Notify 返回 IOTR 状态包
↓
拍摄 LED、App 日志和完整交互视频
```
**当前 SDK 中没有可直接构建的 Matter/Thread target,因此本章不强行写成 Matter/Thread Demo,最终收敛为 BLE IoT 控制节点。**
## 10.3 独立工程与 SDK 基线
**本章记录目录为:**
```
D:\Project\Evaluation\Telink\eval_projects\09_wireless_iot_demo
```
**本章源码副本位于:**
```
src\sdk
```
**本章当前使用的主要源码入口为:**
```
src\sdk\vendor\feature_test\feature_gatt_api
```
**工程关键文件:**
```
src\build_config.json
src\source_manifest.md
firmware\eval09_gatt_api_iot_demo.bin
tools\build_eval09.ps1
tools\flash_verify_eval09.ps1
logs\build_eval09_gatt_api_iot_demo.log
logs\flash_verify_eval09_latest.log
```
## 10.4 关键源码与配置
**与本章相关的主要文件如下:**
| **文件** | **作用** |
| ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| `src\sdk\vendor\feature_test\default_att.c` | **将设备名更新为**`iot_demo` |
| `src\sdk\vendor\feature_test\feature_gatt_api\app.c` | **广播名、SPP 写回调、IoT 命令解析、LED 控制、周期 Notify 主逻辑** |
| `src\sdk\CMakeLists.txt` | **跳过空**`obj_dump`,避免生成`.lst`时卡住或失败 |
| `src\sdk\cmake_configs\TL_BLE_SDK_322X_cmake.json` | `feature_test`target 的`obj_dump`置空 |
| `tools\build_eval09.ps1` | **独立构建脚本,输出固件、大小和 SHA256** |
| `tools\flash_verify_eval09.ps1` | **写入、读回和 SHA256 校验脚本** |
| `D:\Project\Evaluation\Telink\App\android_ble_tester\app\src\main\java\com\telink\eval\bletester\MainActivity.java` | **手机 App 增加**`09 目标`、IoT 控制按钮和`IOTR`解码 |
**本章实际构建时使用:**
```
FEATURE_TEST_MODE=TEST_GATT_API
```
## 10.5 BLE IoT 交互协议
**手机 App 写入 Telink SPP **`Phone->Module` 特征值,开发板从 Telink SPP `Module->Phone` 特征值 Notify 返回结果。
**手机写入命令:**
| **命令** | **HEX / ASCII** | **作用** |
| -------------- | ------------------------------------ | ------------------------- |
| **LED 开** | `49 4F 54 4C 01`/`IOTL 01` | **点亮 Demo LED** |
| **LED 关** | `49 4F 54 4C 00`/`IOTL 00` | **熄灭 Demo LED** |
| **LED 翻转** | `49 4F 54 54`/`IOTT` | **翻转 Demo LED** |
| **状态查询** | `49 4F 54 53`/`IOTS` | **立即返回一次状态** |
| **开启上报** | `49 4F 54 4E 01`/`IOTN 01` | **每 1 秒返回一次状态** |
| **停止上报** | `49 4F 54 4E 00`/`IOTN 00` | **停止周期状态上报** |
**开发板 Notify 返回 **`IOTR` 状态包,长度 16 字节:
| **字节** | **含义** |
| ------------ | ---------------------------------------------------------------- |
| **0..3** | **固定**`IOTR` |
| **4** | **序号** |
| **5** | **事件:**`ACK`、`STATUS`、`PERIODIC`、`ERROR` |
| **6** | **LED 状态,**`1`为开,`0`为关 |
| **7** | **周期上报状态,**`1`为开启 |
| **8..11**| **计数器,小端** |
| **12..15** | **运行时间秒数,小端** |
**如果 App 写入非 **`IOT` 命令,固件会走兼容路径返回 `ECHO`,便于继续使用前面章节的数据收发截图方式。
## 10.6 编译、烧录与读回校验
**重新构建本章工程:**
```
cd D:\Project\Evaluation\Telink\eval_projects\09_wireless_iot_demo
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\build_eval09.ps1
```
**构建成功后输出:**
```
Firmware: firmware\eval09_gatt_api_iot_demo.bin
Size: 138564 bytes
SHA256: BD2EF9EE758A8DF08E6AB1397271185A2CE8A37CB7A3B5098D15113A538FE5DB
```
**烧录和读回校验:**
```
cd D:\Project\Evaluation\Telink\eval_projects\09_wireless_iot_demo
powershell -NoProfile -ExecutionPolicy Bypass -File .\tools\flash_verify_eval09.ps1 -ResetAfterFlash
```
**手动烧录命令格式:**
```
TC.exe all
TC.exe fi -d 1 --chip=TL322X
TC.exe ulf 0 0 -d 1 --chip=TL322X
TC.exe wf 0 -i firmware\eval09_gatt_api_iot_demo.bin -d 1 --chip=TL322X
TC.exe rf 0 138564 -o firmware\eval09_gatt_api_iot_demo_readback.bin -d 1 --chip=TL322X
```
**2026-07-09 实测校验结果:**
```
Local SHA256: BD2EF9EE758A8DF08E6AB1397271185A2CE8A37CB7A3B5098D15113A538FE5DB
Readback SHA256: BD2EF9EE758A8DF08E6AB1397271185A2CE8A37CB7A3B5098D15113A538FE5DB
Result: PASS, local firmware and flash readback are identical.
```
## 10.7 实测操作流程
**手机端操作:**
```
1. 安装最新 APK;
2. 打开“泰凌 TL322X BLE 测试工具”;
3. 点击“09 目标”,目标设备名自动切换为 iot_demo;
4. 点击“扫描”,找到 iot_demo;
5. 点击 iot_demo 设备条目,再点击“连接”;
6. 点击“发现服务”,App 自动选择 Telink SPP 写入和 Notify 特征值;
7. 点击“LED 开”“LED 关”“LED 翻转”“状态查询”“开启上报”“停止上报”;
8. 在日志中观察 `IOT 状态 seq=... event=... LED=... 周期上报=... 计数=... uptime=...s`。
```
**开发板现象:**
```
1. 手机连接后连接状态 LED 点亮;
2. 点击 LED 开 / 关 / 翻转后,开发板 Demo LED 状态变化;
3. 点击状态查询后,App 日志立即出现一次 IOTR 状态;
4. 点击开启上报后,App 每秒收到一次 PERIODIC 状态;
5. 点击停止上报后,周期 Notify 停止。
```
## 10.8 图片和视频素材
* **最终 Demo 的硬件实物照片,包含 TL322X 开发板、供电线和手机 App**
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223214v4mw4lti9zr9tkv8.jpg)
* **Demo 架构图,说明 TL322X、手机 App、Telink SPP Service/Characteristic 和 **`IOT` / `IOTR` 数据流
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223231uikjogog67iao699.png)
* **App 扫描到 **`iot_demo` 的截图,显示设备名、地址或 RSSI
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223246l85eeevn6h5hmez0.jpg)
* **App 连接后发现服务的截图,显示 Telink SPP 写入和 Notify 特征值**
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223302osmcnd04pcphbe5c.jpg)
* **点击 LED 开 / 关 / 翻转后的 App 日志截图,显示 **`IOT 状态`、序号和 LED 状态
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223317qeiegj8j5yeik5j2.jpg)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223340difwu1ada1xfiy61.jpg)
* **开启周期上报后的 App 日志截图,显示连续 **`PERIODIC`、计数和 uptime!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223357ynnaeq7quzpnwb74.jpg)
* **VS Code 中关键源码位置截图,包含 **`app_iot_spp_write_callback`、`app_iot_send_status` 或广播名 `iot_demo`
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223416wu3v78sslk92lqd4.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223432mnaeq2i9leinqeia.png)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223444snxi2op6u1x2fnz5.png)
* `TC.exe` 写入、读回和 SHA256 一致的命令行截图,显示 `Write flash`、`Read back flash`、`Local SHA256`、`Readback SHA256` 和 `Result: PASS`
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223500ona37as1is75sf5d.png)
* **Demo 最终效果照片,例如手机控制开发板 LED 状态变化**
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223518xvhiil3bo9zvh9m7.jpg)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223534f3mfzsly90ee8bsp.jpg)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223545xddshdkkd7dkrnhi.jpg)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223555a43v8r3zz38c3x54.jpg)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223607izigmmg7mjy77mbb.jpg)
!(//m.qjumbo.com/forum/data/attachment/forum/202607/11/223621kz2c88zuo54p2uue.jpg)
* **最终 Demo 完整演示视频,从开发板上电、App 扫描连接、LED 控制到周期 Notify 全过程**
https://www.bilibili.com/video/BV1dxNA6SEoe/?vd_source=316829e08811c8c0cbcbeff97baf1277
* **开启周期上报后连续运行一段时间的稳定性录屏**
https://www.bilibili.com/video/BV1dsNA6nERu/?vd_source=316829e08811c8c0cbcbeff97baf1277
## 10.9 问题记录
### 10.9.1 flash loader 同步失败
**本章烧录前出现过 **`TC.exe all` 可以枚举 EVK,但 `fi` 返回 `sws_sync error` 的情况。处理方法是先执行:
```
TC.exe rst -f -d 1 --chip=TL322X
```
**软件复位后 **`fi` 恢复正常。如果软件 reset 无效,就按前面章节确认的方法按住 Flash 点点taptap安卓 RESET 后重新接入。
### 10.9.2 objdump 生成 .lst 卡住或失败
**构建过程中 **`riscv32-elf-objdump` 生成 `feature_test.lst` 曾长时间卡住;将 `feature_test` target 的 `obj_dump` 置空后,CMake 又会生成无参数 `objdump` 命令并失败。最终处理方式:
```
1. `src\sdk\cmake_configs\TL_BLE_SDK_322X_cmake.json` 中 feature_test 的 obj_dump 置空;
2. `src\sdk\CMakeLists.txt` 增加 `NOT OBJ_DUMP STREQUAL "[]"` 判断;
3. `tools\build_eval09.ps1` 在没有有效 `.lst` 时清理旧 `.lst`,避免误用。
```
**本章固件验证以 **`.bin` 写入和读回 SHA256 为准,`.lst` 不是必要产物。
### 10.9.3 Matter/Thread 不在当前 SDK 覆盖范围内
**当前 SDK BLE target 可用,Matter/Thread target 未在本 SDK 中出现。解决方法是优先完成 BLE GATT IoT Demo,协议栈 Demo 等拿到专用 SDK 后再扩展。**
## 10.10 本章测试结论
```
1. 09 工程已经不是单纯官方原始示例,已加入手机 App 可控制的 IoT 交互协议;
2. 固件广播名为 iot_demo,便于与 04/05/07 工程区分;
3. 本地固件与 Flash 读回固件 SHA256 一致;
4. App 已支持 09 目标、LED 控制、状态查询、周期 Notify 和 IOTR 日志解码;
```
## 10.11 本章小结
**第十章作为整套测评的收尾工程,已经完成一个可落地的 BLE IoT Demo:手机 App 通过 BLE GATT 写入控制命令,TL322X 开发板执行 LED 状态变化并通过 Notify 返回状态数据。**
页:
[1]