🏠 home › concepts › triple-burning
tags
[IoT, 量产, 三元组, 烧录, 阿里云, 涂鸦, BK7258]
created
2026-05-11
updated
2026-05-11
sources
[raw/snippets/bk7258-build/mass-production-knowledge-2026-05-11.md, raw/snippets/bk7258-build/mass-production-actual-implementation-2026-05-11.md]

定义

设备三元组(涂鸦口径是 MAC + UUID + AuthKey,本项目口径是 PID + UUID + SECRET + MAC)"什么时候到设备 / 谁负责烧 / 烧到哪里"有三种主流工程范式:编译期硬编码 / 量产烧录 / 动态注册。三种各有适用场景,本页梳理三者技术对比 + 业界标杆 + Sentino BK7258 项目的选型推导。

三种范式速查

范式 何时拿到三元组 谁烧 代表产品 Sentino 当前位置
编译期硬编码 写在固件里 谁烧固件谁就烧三元组 当前项目 TRIPLE_TEST 测试三元组 已实现 + 当前默认走这条(用犀云平台测试三元组)
量产烧录 工厂阶段拿三元组池一片片烧 治具 + PC 工具 涂鸦 PMS、阿里一机一密 已实现(厂测 AP !FT@IOT1# + UDP/MQTT 下发)
动态注册 设备首次联网时云端下发 设备自己 阿里一型一密、AWS Fleet Provisioning by Claim 已实现 v1.0.5(2026-01-31)(厂测 AP !FT@IOT0# + 连 mqtt-iot.sentino.jp:1883)

→ 三条路径并存,编译期硬编码当总开关 TRIPLE_TEST 决定走路径 1 还是 2/3,路径 2 vs 3 由设备扫到的厂测 AP SSID 决定。详见 Sentino BK7258 项目的实际实现 段。

范式 A:编译期硬编码

#define TUYA_DEVICE_UUID "5dhe05fCWFzd10tc"
#define TUYA_DEVICE_AUTHKEY "5e79e1ad1dc6394b..."

→ 这条范式不解决量产问题,但是开发期通用入口。所有 IoT 项目都从这里起步,再演进到 B 或 C。

范式 B:量产烧录(行业主流)

云端三元组池                          PCBA 治具阶段
     │                                       │
     │ 1. 云端预先生成 N 个三元组             │
     │    (ProductKey 共享 + DeviceName/Secret 唯一)
     │                                       │
     ▼                                       ▼
  PC 治具工具 ──acquire── 拿出 1 个 ──UART AT── BK7258
                                              │
                                              │ 2. 固件执行 AT+TRIPLE 把 KV 写到 EasyFlash
                                              ▼
                                          Flash 持久化
                                              │
                                              │ 3. 治具 reset + AT+QUERY 验证回读
                                              ▼
  PC 治具工具 ──activate── 销账 + 标记此码已烧 + 回填 USB ID/时间/结果

业界标杆 1:阿里云一机一密(独立核查 2026-05)

业界标杆 2:涂鸦 PMS(独立核查 2026-05)

→ 共同套路:云端三元组池 + PC 治具工具 + 治具 UART + 自定义 AT 协议 + 失败回收

范式 C:动态注册

设备出厂只烧 ProductKey + ProductSecret(产品级共享)
     │
     │ 首次上电 + 联网
     ▼
  设备 ──TLS HTTPS── 云端动态注册 API
                          │
                          │ 平台核对 ProductKey + 预注册的 DeviceName(如 MAC/SN/IMEI)
                          ▼
                     下发 DeviceSecret
     │
     ▼
  设备把 DeviceSecret 持久化到 Flash
     │
     ▼
  之后用三元组正常 MQTT 连接

阿里云一型一密的两个变种(独立核查 2026-05)

变种 设备拿到什么 适用
预注册 拿 DeviceSecret,之后用三元组 产线无法定制 + 设备支持 TLS
免预注册 拿 ClientID + DeviceToken 组合 同上但更灵活

重要警告:一型一密关闭后已按一型一密烧录的设备无法再激活联网——产线方案一旦定下来不能轻易切换。

AWS IoT Fleet Provisioning by Claim

Sentino BK7258 项目的实际实现

2026-05-11 修正说明:本节首版误把"AT+TRIPLE 路径"当作下一步、把范式 C 当作远期。代码核查后的事实是:三种范式都已实现,下文按实际代码改写。详见 mass-production-actual-implementation-2026-05-11

代码里有三条并行路径,当前默认走路径 1(最近 commit "暂用犀云平台固定三元组测试" 印证)。

路径 1(范式 A):编译期硬编码 — 当前默认

总开关:projects/beken_genie_plush_toy/main/rino_iot_process.h:23 #define TRIPLE_TEST。当前选 AI_TRIPLE_USE = 3(毛绒 2 / 犀云平台测试三元组),rino_iot_process.h:40, 49-53

#define AI_TRIPLE_USE   3
#elif (AI_TRIPLE_USE == 3)//毛绒2 犀云平台
#define UUID_DEFAULT    "rn01CfeF467cA4fa"
#define SECRET_DEFAULT  "64b6e1807071418282bca87af114f69e"
#define MAC_DEFAULT     "444AD60C228F"

注入点:rino_iot_process.c:679-688Rino_Iot_Sdk_Task 把这三个值塞进 test_tripl,调 Rino_Iot_System_Init(..., &test_tripl)。落盘:rino_dev_info.c:483-502 Rino_Load_Dev_Info() 比对 FLASH 里的旧三元组,不一致就 Rino_Save_Triple_Info_To_Flash() 覆盖。

当前烧的是犀云平台测试三元组、不是 Sentino 自家三元组——临时测试态,连 Sentino 自家三元组的烧录链路都还没在跑。

路径 2(范式 B):厂测 AP + UDP/MQTT 下发 — 已实现

宏关掉 TRIPLE_TEST 即启用。设备启动后扫 SSID !FT@IOT1#(pwd 31415926factory_test.h:16-17)连厂测 AP,不是用自定义 AT+TRIPLE 命令

厂测工具通过两种方式下发三元组(factory_test.h:30-31):

处理:factory_test.c:183-218 Factory_Set_Burn_Info_Callback: 1. PID 一致性校验(不一致拒绝) 2. FLASH 里已有有效三元组就拒绝覆盖factory_test.c:198),避免重烧污染 3. 写入 → 应答 → Rino_System_Reset() 重启

路径 3(范式 C):云端动态注册 — 2026-01-31 v1.0.5 已实现

设备扫到 !FT@IOT0#factory_test.h:15)走动态注册分支。factory_dynamic_register.c 用设备唯一 ID 连云端动态注册 MQTT,向云请求三元组,云端下发后同样走 burn callback 落盘。

MQTT 接入点(factory_test.h:20-26):

#if (CONFIG_VND_CAL_PROJECT == 1)//台湾板子域名
#define DEFAULT_MQTT_HOST                       "mqtt-iot.sentino.jp"
#define DEFAULT_MQTT_PORT                       1883
#else
#define DEFAULT_MQTT_HOST                       "mqtt.cetus-ai.com"
#define DEFAULT_MQTT_PORT                       2883
#endif

版本溯源:rino_iot_process.h:18 #define DEV_VERSION "1.0.5" //20260131 新增动态注册,优化产测真实驱动力:宣德产线生产 Blisoo 产品时发现工厂 WiFi 无法连接外网(路径 3 当时也连不通),所以加了"白板首次激活"分支以备未来对接其他能联网的产线。

SSID 切换的工程含义

SSID 触发分支 对应工位场景
!FT@IOT1# 路径 2(厂测下发) 烧过的板 / 已有三元组池要灌入
!FT@IOT0# 路径 3(动态注册) 白板首次激活 / 没有预生成三元组

→ 0 / 1 后缀的工程含义就是"白板 vs 烧过的板"两种工位区分。产线只需根据物料状态选 SSID,固件自动走对应分支。

真正的产品缺口:离线烧录通道

3 条路径全部要在线

而宣德工厂 WiFi 不能连外网 → 路径 3 直接不可用,路径 2 要工厂内自己起 MQTT 服务。

→ 真正缺的是离线烧录通道:譬如治具串口直接喂三元组到固件、固件本地校验后写 FLASH,不需要任何网络(既不需要 WiFi 也不需要外网 MQTT)。这是 beken-at-server 框架未来可能的应用场景,但当前没实现。

设计三元组烧录方案的常见错误

错误做法 后果 正确做法
让烧录器直写 EasyFlash 裸 offset KV 元数据损坏,开机找不到 走固件 AT+TRIPLEbk_set_env_enhance()
不做"烧后回读"验证 通信中断 / Flash 写入失败 / 校验位损坏的设备出厂 AT+TRIPLE_QUERY 回读 + diff 校验
三元组池在工厂本地保存 工厂内部泄露 / 重复使用 工厂治具实时从云端 acquire,云端是 source of truth
失败的码不销账 三元组池被烧坏码占满,云端反复重发同一码 治具标 NG → 不 activate → 云端 30 分钟后回收码
把烧录工具的源码 + 三元组池下发给代工厂 工厂可以批量复制 / 仿冒 工具 + 池都在云端,治具只是 UI 客户端

相关概念