小智 AI 通信协议补漏,通过OTA接口注册设备

上周整理了一下小智 AI 的 WebSocket 通信协议,《复刻小智AI第2步,2张核心流程图学习一下它的WebSocket协议》,后面在调试时发现了一个缺失的点,就是漏掉注册设备这一步。

一开始还对配置文件中的 "OTA_VERSION_URL": "https://api.tenclass.net/xiaozhi/ota/", 字段比较费解,好像整个通信过程中也没有用到的地方,而且在 py-xiaozhi 中也不存在固件的概念。

另外因为跑示例的时候,用的 Client-IdDevice-Id 都是从仓库中直接拿的,应该是已经在服务器已经注册过了,只需要额外添加设备即可,所以一直没发现这个问题。

后来在手动修改 Device-Id 的时候终于发现了,仔细研究了一下 xiaozhi-esp32py-xiaozhi,再自己操作了一下,总算搞明白了。

问题

如果在设备启动时,不经过设备注册过程,那么在开始对话之后,服务端会返回没找到设备版本信息的语音,而不是在后台添加设备。

2025-04-21 14:51:23,295 - WebSocketClient - INFO - 收到JSON消息: {"type":"tts","state":"sentence_start","text":"没有找到该设备的版本信息,请正确配置 OTA 地址,然后重新编译固件。","session_id":"14328015"}

这个时候,不管怎么对话,服务端都只会返回这一句。

py-xiaozhixiaozhi-esp32 项目中,都是会在启动阶段进行 OTA 固件版本检查,因此我们也需要在加载配置时,先进行 OTA 版本检查这一步,同时完成设备注册。

注册设备

注册设备也很简单,构建一个固件信息的 JSON 并通过 POST 请求发送到 OTA_VERSION_URL 接口就可以了。

固件信息的 JSON 结构体,可以直接使用官方的,毕竟是在 Python 工程中使用,不会真的去更新固件。

注意:这里的 device_id 需要与配置中的一致,要不然后面还是会没办法使用。

xiaozhi-ai-protocol-ota-1

另外,在发送 POST 请求时,在 header 中同样需要带上 Device-IdClient-Id,要不然会注册失败。

xiaozhi-ai-protocol-ota-2

最后通过 POST 方法将这个请求发送到 OTA_VERSION_URL,这里就不多赘述。

服务端响应

在发送完 OTA 固件版本检测请求后,如果设备在之前没有注册过,那么接口返回结果相比已经注册过的设备,会多一个 activation 字段,包含了 codemessagechallenage 三个属性,其中比较有用的就是 code 属性了。

xiaozhi-ai-protocol-ota-3

这个时候如果开始对话,语音中提示添加设备的验证码,就和 code 属性一样了。

2025-04-21 14:53:45,125 - WebSocketClient - INFO - 收到JSON消息: {"type":"tts","state":"sentence_start","text":"请登录到控制面板添加设备,输入验证码:602245。","session_id":"8b81b659"}

设备端也可以使用这个信息来展示设备激活信息,例如通过屏幕提示用户打开控制台通过验证码添加设备。

注意事项

需要注意的是,如果在激活设备和控制台添加设备前,就已经建立了 WebSocket 连接并且开始对话,添加设备操作是不会生效的,需要重新建立 WebSocket 连接。

并且也是重新建立连接后,才会连接到正确的智能体,要不然就是默认的湾湾小何 😃。

小智复刻系列文章

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>