小机云设备校验
设备需要使用小机云服务,需要与小机云平台进行校验
小机云设备的设备校验,只需要向模块设置您的项目信息,然后重启即可
第三方设备自己需要实现校验流程
校验方法:HMAC 挑战应答
设备连接后,通过二进制帧与手机进行挑战应答握手。设备用 ProjectSecret 对「MAC + 时间戳」计算 HMAC-SHA256 摘要,发送给手机转交服务器验证
相比内容校验(KeyContent),HMAC 方式报文更短(全程二进制,最小单包仅 1 字节)、固件代码更简洁、安全性更高
第一步:获取项目密钥
- 进入小机云控制台并登录。登录后,点击项目卡片更多查看项目详情

- 点击查看项目秘钥(ProjectSecret)

注意
HMAC 校验方式的项目,ProjectSecret 直接作为 HMAC 密钥使用,不需要进行 AES 加密。
握手流程
整个握手使用二进制帧传输(非 $X 文本协议),流程如下:
设备 手机App 服务器
│ │ │
│ ① 发送挑战请求 [0x01] │ │
│ ────────────────────────────→│ │
│ │ │
│ ② 收到挑战 [0x02]+时间戳 │ │
│ ←────────────────────────────│ │
│ │ │
│ ③ 计算 HMAC,发送摘要 │ │
│ [0x03][长度][digest] │ │
│ ────────────────────────────→│ ④ 调用 verifyHmac 接口 │
│ │ ───────────────────────────→│
│ │ │ ⑤ 重算比较
│ │ ⑥ 返回校验结果 │
│ │ ←───────────────────────────│
│ ⑦ 收到结果 [0x04]成功 │ │
│ 或 [0x05]失败 │ │
│ ←────────────────────────────│ │各帧详细说明
| 步骤 | 方向 | 帧内容 | 字节数 | 说明 |
|---|---|---|---|---|
| ① | 设备→App | [0x01] | 1 | 设备请求挑战 |
| ② | App→设备 | [0x02][时间戳 4字节] | 5 | App 生成当前 UTC 秒级时间戳,大端序 |
| ③ | 设备→App | [0x03][0x08][digest 8字节] | 10 | 设备计算 HMAC 摘要,截断取前 8 字节 |
| ⑦ | App→设备 | [0x04] 或 [0x05] | 1 | 0x04 成功,0x05 失败 |
时间戳说明
- 时间戳为 4 字节大端序 的 UTC 秒级 Unix 时间戳(非 13 位毫秒)
- 服务器会校验时间戳与当前时间差不超过 5 分钟,防止重放攻击
- 手机 App 在发送挑战时记住时间戳,收到设备摘要后连同时间戳一起提交给服务器验证
实现校验方法
您可以自己在单片机中实现校验流程,也可以使用小机云调试工具快速体验校验流程
如果需要自己实现校验流程,可以跳过使用小机云调试工具体验这一过程
自己实现校验流程
设备与项目各项属性为:
projectId:1032n8e32sa9v2bdf3
mac:112233445566(需要与创建设备时输入的MAC一致)
ProjectSecret:B407CEA9A9DA7B9A088F81D42E217444
握手过程示例:
① 设备发送挑战请求
发送:01
收到 App 回复:02 6789ABCD(时间戳 0x6789ABCD = 1736543181)
② 设备计算 HMAC
原文 = mac(6字节) + timestamp(4字节大端)
原文(10字节):11 22 33 44 55 66 67 89 AB CD
密钥(字符串):B407CEA9A9DA7B9A088F81D42E217444
HMAC-SHA256 计算结果(32字节),取前 8 字节作为摘要
③ 设备发送摘要
假设 HMAC 计算结果前 8 字节为:A1 B2 C3 D4 E5 F6 07 18
发送:03 08 A1 B2 C3 D4 E5 F6 07 18
校验成功收到:04
校验失败收到:05
单片机 Demo
可以参考开源项目中的《xsgee-esp32-ble-arduino》
ESP32 Arduino 参考代码(约 15 行核心逻辑):
#include <mbedtls/md.h>
// 收到挑战时间戳后计算 HMAC
void computeHmac(const char* secret, const uint8_t* mac, uint32_t timestamp, uint8_t* out) {
uint8_t msg[10];
memcpy(msg, mac, 6);
msg[6] = (timestamp >> 24) & 0xFF;
msg[7] = (timestamp >> 16) & 0xFF;
msg[8] = (timestamp >> 8) & 0xFF;
msg[9] = timestamp & 0xFF;
uint8_t full[32];
mbedtls_md_context_t ctx;
mbedtls_md_init(&ctx);
mbedtls_md_setup(&ctx, mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), 1);
mbedtls_md_hmac_starts(&ctx, (const uint8_t*)secret, strlen(secret));
mbedtls_md_hmac_update(&ctx, msg, sizeof(msg));
mbedtls_md_hmac_finish(&ctx, full);
mbedtls_md_free(&ctx);
memcpy(out, full, 8); // 截断取前 8 字节
}与内容校验(KeyContent)的对比
| 对比项 | 内容校验(KeyContent) | HMAC 挑战应答 |
|---|---|---|
| 传输格式 | $X 文本协议 + hex 字符串 | 二进制帧 |
| 加密方式 | AES/ECB/PKCS7 256 | HMAC-SHA256 |
| 报文长度 | 较长(需拼接多个字段再加密) | 最短 1 字节,摘要帧 10 字节 |
| 固件代码量 | 约 400 行(含 AES) | 约 15 行(mbedTLS) |
| 安全性 | AES-ECB 模式,相同明文产生相同密文 | 标准 MAC,恒等比较防时序攻击 |
| 时间戳精度 | 13 位毫秒 | 4 字节秒级 |
| MTU 要求 | 需支持较长 MTU 或分包 | 最小 20 字节 MTU 即可完成 |
| 适用场景 | 兼容老设备/老固件 | 新设备推荐,尤其低端 BLE 模块 |
小机云