三步搞定AIoT对接:百宝箱平台与xiaozhi协议的完美融合

简介: 本文档介绍了如何基于xiaozhiws协议对接百宝箱AIoT平台,重点关注与标准协议的差异部分。主要修改包括:1)OTA上行需添加Device-Key请求头;2)WebSocket连接时需使用HMAC-SHA256算法生成签名(结合设备MAC地址、devicekey和服务端token)。文档提供了ESP32平台下的C++实现示例,包括签名生成方法和WebSocket连接流程。对接前提是已在百宝箱平台开通AIoT SDK发布渠道并获取设备凭证。其他平台需自行实现HMAC算法相关功能。

本文将介绍基于 xiaozhi-esp32 的 WebSocket 通信协议实现百宝箱 IoT 设备的对接。

前置说明

  • 关于 xiaozhi-esp32 WebSocket 协议的详细介绍请参见:协议原文
  • 本文所示代码仍然采用 esp32 ESP-IDF 框架下的 C++ 代码。其他平台移植时,会提供以 HMAC 算法为主的平替内容。
  • 在根据本文进行对接操作前,请先确保您已授权了百宝箱 AIoT SDK 渠道的协议,若无,请参见:IoT SDK 授权完成相关操作。

操作说明

本文仅介绍与 xiaozhi-esp32 WebSocket 通信协议存在差异的部分,其余与协议本身相同的内容不再赘述。

差异点 1:OAT 上行

在原协议的基础上增加了 Device-key的参数配置,该参数可登录百宝箱 AIoT 设备页面,从右上角 Device Key除获取。

实现代码如下所示。

Http* Ota::SetupHttp() {
    ......
    auto http = board.CreateHttp();
    http->SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); // 在你的智能体里做了导入的设备的 mac 地址
    http->SetHeader("Device-Key", device_key.c_str()); // 从 https://www.tbox.cn/open/iot 页面右上角复制过来

差异点 2:与 WebSocket 建立连接

在与 WebSocket 建立连接时,客户端需将 HTTP 请求头中的 Authorization 字段替换为一个新的签名。该签名由 HMAC(Hash-based Message Authentication Code)算法生成,其输入数据为设备的 MAC 地址与服务端下发的 Token 的拼接结果。实现代码如下所示。

#define HMAC_OUTPUT_LEN 32  // HMAC-SHA256 输出长度
#define MAC_ADDRESS_LEN 18  // MAC 地址长度
std::vector<unsigned char> hexStringToByteArray(const std::string& hex_str) {
    // 每个字节由两个字符表示,因此需要的字节数是字符串长度的一半
    std::vector<unsigned char> byteArray;
    if (hex_str.length() % 2 != 0) {
        throw std::invalid_argument("Hex string must have an even length");
    }
    for (size_t i = 0; i < hex_str.length(); i += 2) {
        // 取出每两个字符
        std::string byteString = hex_str.substr(i, 2);
        // 将字符转换为十进制整数
        unsigned char byte = static_cast<unsigned char>(strtol(byteString.c_str(), nullptr, 16));
        byteArray.push_back(byte);
    }
    return byteArray;
}
void generate_signature(const char *mac, const char *token, const unsigned char *device_key, unsigned char *signature) {
    char message[MAC_ADDRESS_LEN + 256]; // 存储 MAC + token
    snprintf(message, sizeof(message), "%s%s", mac, token); // 合并 MAC 和 token
    // 使用 HMAC-SHA256 生成签名
    mbedtls_md_context_t ctx;
    const mbedtls_md_info_t *info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
    
    mbedtls_md_init(&ctx);
    mbedtls_md_setup(&ctx, info, 1);  // 1表示使用HMAC
    mbedtls_md_hmac_starts(&ctx, device_key, HMAC_OUTPUT_LEN);
    mbedtls_md_hmac_update(&ctx, (const unsigned char *)message, strlen(message));
    mbedtls_md_hmac_finish(&ctx, signature);
    mbedtls_md_free(&ctx);
}
bool WebsocketProtocol::OpenAudioChannel() {
    if (websocket_ != nullptr) {
        delete websocket_;
    }
    // 获取设备唯一标识符
    std::string mac_address = SystemInfo::GetMacAddress();
    ESP_LOGW(TAG, "Device mac addr: %s\n", mac_address.c_str());
    // 生成签名
    Settings settings("websocket", false);
    std::string url = settings.GetString("url");
    std::string token = settings.GetString("token");
    auto device_key_array = hexStringToByteArray(device_key);
    unsigned char signature[HMAC_OUTPUT_LEN] = { 0 }; // 存储签名
    generate_signature(mac_address.c_str(), token.c_str(), device_key_array.data(), signature);
    std::string signature_string =  bytesToHexString(signature, HMAC_OUTPUT_LEN);
    int version = settings.GetInt("version");
    if (version != 0) {
        version_ = version;
    }
    error_occurred_ = false;
    websocket_ = Board::GetInstance().CreateWebSocket();
    
    if (!signature_string.empty()) {
        // If token not has a space, add "Bearer " prefix
        if (signature_string.find(" ") == std::string::npos) {
            signature_string = "Bearer " + signature_string;
        }
        // ESP_LOGI(TAG, "signature_string %s", signature_string.c_str());
        websocket_->SetHeader("Authorization", signature_string.c_str());
    }
相关文章
|
人工智能 物联网 开发工具
百宝箱开放平台 ✖️ IoT 设备接入
本文介绍IoT厂商如何通过开放平台将搭载ESP32芯片的设备与百宝箱智能体集成,涵盖设备接入、配网、绑定及启用全流程,并提供SDK下载与配置指引,助力快速实现AI对话功能。
351 0
|
1月前
|
存储 人工智能 自然语言处理
Gemini 2.5 Flash / Nano Banana 系统提示词泄露:全文解读+安全隐患分析
本文揭示了Nano Banana的内部系统指令,展示其如何通过“描绘不等于认可”原则,将图像生成请求无条件传递给下游模型,禁止自身进行内容审查。该机制凸显“先生成、后过滤”的安全架构,引发对生成边界与伦理的深层思考。
313 6
Gemini 2.5 Flash / Nano Banana 系统提示词泄露:全文解读+安全隐患分析
|
24天前
|
人工智能 自然语言处理 数据可视化
告别高成本定制:友盟U-AgentBox上线,开发者可一键集成行业模板,3天打造专属企业Agent
12月29日,蚂蚁百宝箱与友盟联合推出面向开发者的智能体产品U-AgentBox,聚焦低门槛、高效率集成专属智能体。通过模板化构建、可视化编辑与轻量级部署,助力开发者快速实现业务智能化升级。
169 9
|
8月前
|
存储 Rust Go
介绍一下这只小水獭 —— Fluss Logo 背后的故事
Fluss是一款开源流存储项目,致力于为Lakehouse架构提供高效的实时数据层。其全新Logo以一只踏浪前行的小水獭为核心形象,象征流动性、适应性和友好性。水獭灵感源于“Fluss”德语中“河流”的含义,传递灵活与亲和力。经过30多版设计迭代,最终呈现动态活力的视觉效果。Fluss计划捐赠给Apache软件基金会,目前已开启孵化提案。社区还推出了系列周边礼品,欢迎加入钉钉群109135004351参与交流!
946 3
介绍一下这只小水獭 —— Fluss Logo 背后的故事
|
1月前
|
人工智能 安全
一年输送旅客数千万次,浦东国际机场的效率秘密藏在这个智能体里
秋冬旅游高峰,浦东机场迎百万客流挑战。蚂蚁百宝箱推出“浦东国际机场”智能体,集成航班查询、停车导航、交通路线、餐饮酒店等一站式服务,实现“出发—到港”全链路智慧出行,提升旅客体验与机场运营效率。
158 2
|
18天前
|
弹性计算 人工智能 数据库
2026年阿里云2核2G/4G、4核8G/8核16G云服务器租赁价格解析:多配置选型与计费体系指南
2026年阿里云2核2G/4G、4核8G/8核16G云服务器租赁价格多少钱?阿里云服务器租赁覆盖轻量应用服务器、ECS 云服务器及 GPU 服务器三大品类,提供 2 核 2G 至 8 核 64G 等多档配置,适配从个人开发到企业级高负载的多元需求。不同实例通过差异化硬件架构与优惠政策,平衡性能与成本,同时支持灵活的计费模式与配置调整。本文结合实例特性、价格体系及适用场景,为用户提供客观选型参考。
|
3月前
|
自然语言处理 JavaScript API
百宝箱开放平台 ✖️ 开发流程
本文介绍通过开放平台集成智能体能力的流程,包括创建发布应用、获取授权令牌及调用API/SDK三步。涵盖智能体调用、模型测评、文件操作等接口,并提供Java、Python、Node.js及Web SDK支持,助力开发者快速实现智能对话与内容生成功能集成。(239字)
306 0
百宝箱开放平台 ✖️ 开发流程
|
9天前
|
人工智能 运维 搜索推荐
杭州速车携手蚂蚁百宝箱,快速抢滩文旅AI新市场
杭州速车科技依托蚂蚁百宝箱,打造“福小厝”等9个文旅智能体,实现从技术服务商向“AI+场景”转型。通过低代码平台快速交付,覆盖导览、打卡、营销等场景,服务超10万用户,助力景区提升体验与消费转化。
100 11
|
24天前
|
人工智能 开发框架 监控
康存数科携手蚂蚁百宝箱共研预付式消费 AI Agent,解决预付消费信任问题助力体验升级
康存数据与蚂蚁百宝箱达成合作,联合开发预付式消费领域AI Agent,融合双方技术与行业优势,基于大模型打造覆盖消费者、商家、监管等多端的智能服务生态,推动预付消费迈向AI驱动的信任新阶段。
117 5
|
2月前
|
人工智能 自然语言处理 资源调度
蚂蚁百宝箱“一箱搞定”会展智能,「桐小乌」为乌镇互联网大会提供全天候一站式向导服务
2025世界互联网大会·乌镇峰会圆满落幕,蚂蚁百宝箱依托智能体开发平台,快速打造会展专属智能体“桐小乌”,实现会前、会中、会后全链路智能化服务。通过“碰一下”打卡、AR导览、智能问答等功能,提升参会体验;基于行业模板与零代码能力,助力展会高效运营,推动智能会展“一箱搞定”。
199 9
蚂蚁百宝箱“一箱搞定”会展智能,「桐小乌」为乌镇互联网大会提供全天候一站式向导服务