文章目录
上周整理了一下小智 AI 的 WebSocket 通信协议,《复刻小智AI第2步,2张核心流程图学习一下它的WebSocket协议》,后面在调试时发现了一个缺失的点,就是漏掉注册设备这一步。
一开始还对配置文件中的 "OTA_VERSION_URL": "https://api.tenclass.net/xiaozhi/ota/",
字段比较费解,好像整个通信过程中也没有用到的地方,而且在 py-xiaozhi
中也不存在固件的概念。
另外因为跑示例的时候,用的 Client-Id
、Device-Id
都是从仓库中直接拿的,应该是已经在服务器已经注册过了,只需要额外添加设备即可,所以一直没发现这个问题。
后来在手动修改 Device-Id
的时候终于发现了,仔细研究了一下 xiaozhi-esp32
和 py-xiaozhi
,再自己操作了一下,总算搞明白了。
问题
如果在设备启动时,不经过设备注册过程,那么在开始对话之后,服务端会返回没找到设备版本信息的语音,而不是在后台添加设备。
2025-04-21 14:51:23,295 - WebSocketClient - INFO - 收到JSON消息: {"type":"tts","state":"sentence_start","text":"没有找到该设备的版本信息,请正确配置 OTA 地址,然后重新编译固件。","session_id":"14328015"}
这个时候,不管怎么对话,服务端都只会返回这一句。
在 py-xiaozhi
和 xiaozhi-esp32
项目中,都是会在启动阶段进行 OTA 固件版本检查,因此我们也需要在加载配置时,先进行 OTA 版本检查这一步,同时完成设备注册。
注册设备
注册设备也很简单,构建一个固件信息的 JSON 并通过 POST 请求发送到 OTA_VERSION_URL
接口就可以了。
固件信息的 JSON 结构体,可以直接使用官方的,毕竟是在 Python
工程中使用,不会真的去更新固件。
注意:这里的 device_id 需要与配置中的一致,要不然后面还是会没办法使用。
另外,在发送 POST 请求时,在 header
中同样需要带上 Device-Id
和 Client-Id
,要不然会注册失败。
最后通过 POST 方法将这个请求发送到 OTA_VERSION_URL
,这里就不多赘述。
服务端响应
在发送完 OTA 固件版本检测请求后,如果设备在之前没有注册过,那么接口返回结果相比已经注册过的设备,会多一个 activation
字段,包含了 code
、message
和 challenage
三个属性,其中比较有用的就是 code
属性了。
这个时候如果开始对话,语音中提示添加设备的验证码,就和 code
属性一样了。
2025-04-21 14:53:45,125 - WebSocketClient - INFO - 收到JSON消息: {"type":"tts","state":"sentence_start","text":"请登录到控制面板添加设备,输入验证码:602245。","session_id":"8b81b659"}
设备端也可以使用这个信息来展示设备激活信息,例如通过屏幕提示用户打开控制台通过验证码添加设备。
注意事项
需要注意的是,如果在激活设备和控制台添加设备前,就已经建立了 WebSocket 连接并且开始对话,添加设备操作是不会生效的,需要重新建立 WebSocket 连接。
并且也是重新建立连接后,才会连接到正确的智能体,要不然就是默认的湾湾小何 😃。
0 条评论。