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

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

概述

本文档用于阐述如何以与具体运行芯片、OS 无关的方式,基于 xiaozhi ws 协议来对接百宝箱 AIoT 平台。

与 xiaozhi ws 协议一致的部分,本文不做赘述。主要关注差异部分,用以指示任意三方平台快速对接。

相关演示代码仍然采用 esp32 ESP-IDF 框架下的 c++ 代码,其他平台移植时应提供相关平替(主要是 HMAC 算法)。

关键差异

前提

你已在百宝箱智能体平台上开通 AIoT SDK 发布渠道,这意味着你能看到【开放平台】->【AIoT】这样的导航路径。

相较 xiaozhi ws 协议的差异

OTA 上行

增加了 Device-Key头,带上 device key(https://www.tbox.cn/open/iot 页面右上角 Device Key: xxxxxxxxx 部分):

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 页面右上角复制过来

WebSocket 建连

ws 建连时 http header 中的: Authorization 对应的值变为一个以设备 MAC 地址、device key、服务端下发的 token 经由 HMAC 算法(Hash-based Message Authentication Code)计算出来的签名,实现如下:

#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());
    }


相关文章
|
4天前
|
云安全 人工智能 自然语言处理
|
8天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
800 17
|
11天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
805 59
Meta SAM3开源:让图像分割,听懂你的话
|
2天前
|
人工智能 安全 小程序
阿里云无影云电脑是什么?最新收费价格个人版、企业版和商业版无影云电脑收费价格
阿里云无影云电脑是运行在云端的虚拟电脑,分企业版和个人版。企业版适用于办公、设计等场景,4核8G配置低至199元/年;个人版适合游戏、娱乐,黄金款14元/月起。支持多端接入,灵活按需使用。
237 164
|
9天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
336 116
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
368 3
|
6天前
|
弹性计算 搜索推荐 应用服务中间件
阿里云服务器租用价格:一年、1小时及一个月收费标准及优惠活动参考
阿里云服务器优惠汇总:轻量应用服务器200M带宽38元/年起,ECS云服务器2核2G 99元/年、2核4G 199元/年,4核16G 89元/月,8核32G 160元/月,香港轻量服务器25元/月起,支持按小时计费,新老用户同享,续费同价,限时秒杀低至1折。
406 166