涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

Wi-Fi 设备、蜂窝设备、WuKongAI、开发板、TuyaOS 移植等


zhengmin4516
Posts: 6

我在vendor/T5/t5_os/ap/middleware/soc/bk7258_ap/bk7258_ap.defconfig里面添加
CONFIG_WEBSOCKET=y
CONFIG_WEBSOCKET_TLS=y
然后编译报错
/root/Documents/tuya/Projects/T5_TuyaOS-3.13.3/software/TuyaOS/vendor/T5/t5_os/ap/components/bk_websocket/include/bk_ssl.h:25:10: fatal error: mbedtls/ssl.h: No such file or directory
25 | #include "mbedtls/ssl.h"

bk7258_ap.defconfig里面已经默认配置CONFIG_PSA_MBEDTLS=y了

愚者千虑必有一得
Posts: 894

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

TuyaOS 3.13 已在上层封装了 WebSocket client,不建议直接使用 BK 底层的 bk_websocket,因为后者不受 TuyaOS 版本管理、稳定性存疑。

TuyaOS 上层 WebSocket 接口位于:

components/lib_websocket/
使用方式参考 lib_websocket 组件的头文件,通过 tuya_websocket_xxx() API 调用即可,无需修改 defconfig。

zhengmin4516
Posts: 6

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

能否给个示例,我运行下面这段代码,程序会直接崩溃

websocket_client_handle_t ws_client =NULL;
websocket_client_cfg_t cfg = {0};
cfg.uri = "ws://example.com";
cfg.event_cb = websocket_event_callback;
cfg.priv_data = NULL;
websocket_client_init(&ws_client, &cfg);

zhengmin4516
Posts: 6

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

愚者千虑必有一得 2026年 Apr 15日 17:27

TuyaOS 3.13 已在上层封装了 WebSocket client,不建议直接使用 BK 底层的 bk_websocket,因为后者不受 TuyaOS 版本管理、稳定性存疑。

TuyaOS 上层 WebSocket 接口位于:

components/lib_websocket/
使用方式参考 lib_websocket 组件的头文件,通过 tuya_websocket_xxx() API 调用即可,无需修改 defconfig。

还有个问题,我实际的 ws 连接地址是带 query的,例如:wss://example.com/path1?arg1=1&arg2=2
并且需要 header 带个Authorization="Bearer xxxxx"
才能正常连接到服务器,你们封装的这个 WebSocket client支持吗

愚者千虑必有一得
Posts: 894

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

测试核心字段

愚者千虑必有一得
Posts: 894

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

收到!针对你提到的 初始化崩溃 问题,原因是 缺少启动调用


根因分析:

websocket_client_init() 只是初始化句柄和配置,不会启动后台线程。如果不调用 websocket_client_start(),直接使用会触发空指针崩溃。

正确调用顺序:

Code: Select all

#include "tuya_websocket_client.h"

websocket_client_handle_t ws_client = NULL;
websocket_client_cfg_t cfg = {
    .uri = "wss://example.com",
    .event_cb = websocket_event_callback,
    .priv_data = NULL,
};
int ret;

// Step 1: 初始化
ret = websocket_client_init(&ws_client, &cfg);
if (ret != OPR_OK) {
    printf("init failed: %d\n", ret);
    return;
}

// Step 2: 【关键!】启动后台接收线程
ret = websocket_client_start(ws_client);
if (ret != OPR_OK) {
    printf("start failed: %d\n", ret);
    websocket_client_deinit(ws_client);
    return;
}

// 退出时:
// websocket_client_stop(ws_client);
// websocket_client_deinit(ws_client);

崩溃常见原因:

  1. 网络子系统未就绪 — 确保在配网完成之后才调用 WebSocket API
  2. TLS 依赖缺失 — 建议通过 make menuconfig 启用 WebSocket + TLS,而非手动改 defconfig

如果仍然崩溃,请提供:

  1. 崩溃时的 crash log / register dump
  2. 你的 app_main() 和配网初始化代码
愚者千虑必有一得
Posts: 894

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

针对你问的 WSS + Query String + 自定义 Header 支持:


1. WSS(TLS)支持:

tuya_websocket_client 组件支持 WSS,只需要在 .uri 中填 wss:// 开头即可,前提是启用了 TLS 配置。

2. Query String 支持:

WebSocket URI 直接支持 query string,例如:

Code: Select all

.uri = "wss://example.com/path?arg1=1&arg2=2",

3. 自定义 Header 支持:

建议这样排查:

Code: Select all

grep -r "extra_header" components/lib_websocket/include/
grep -r "Authorization" components/lib_websocket/include/

如果当前版本不支持自定义 Header,可以:

  • 将 Token 放到 URL query 参数中(需后端配合)
  • 或使用 Wukong AI 框架本身的请求 API

请先按 3楼的方法确认 websocket_client_start() 是否被调用,如果初始化崩溃的问题仍未解决,请提供崩溃日志,我来进一步分析。

zhengmin4516
Posts: 6

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

好的,已经解决

zhengmin4516
Posts: 6

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

但还有个问题,你们这个 api 设计并未定义任何字段用于指示 WebSocket 帧的类型,我需要知道接收的数据是文本还是二级制分别去处理,能否支持下啊

愚者千虑必有一得
Posts: 894

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊

Re: 涂鸦的 T5 3.13 版本怎么使用 websocket client 啊


针对你提到的 WebSocket 帧类型区分 问题:

结论:当前 tuya_websocket_client API 的回调 event_cb 确实未直接暴露帧类型字段,这是该组件目前的已知限制。


根因说明

WebSocket 协议本身通过 opcode 区分帧类型:

  • 0x1 = 文本帧(Text)
  • 0x2 = 二进制帧(Binary)

底层驱动可以区分,但上层的 tuya_websocket_client 封装将接收到的数据统一透传,未将 opcode 对应的帧类型字段暴露出来。


当前替代方案

  1. 应用层编码(推荐):在文本/二进制数据前加一个字节作为类型标识,例如:

    Code: Select all

       // 发送方
       uint8_t header = is_binary ? 0x02 : 0x01;
       tuya_websocket_send(ws_client, &header, 1);  // 先发类型字节
       tuya_websocket_send(ws_client, data, data_len);  // 再发实际数据

    接收方先读取 1 字节判断类型,再处理后续数据。

  2. 业务分离:将文本和二进制业务拆分到两个不同的 WebSocket 连接,天然隔离。


功能增强建议

这是合理的产品需求,建议通过以下渠道反馈:

  • 在 TuyaOS 官方仓库提交 Issue 或 Feature Request
  • 联系涂鸦技术支持(工单)要求评估 websocket_event_data_t 增加 msg_type 字段

以上内容由 AI 自动分析生成,如有疑问请回复补充。

Post Reply