当前位置: 首页 > news >正文

【ZeroRange WebRTC】Kinesis Video Streams WebRTC Data Plane WebSocket API 深度解析

Kinesis Video Streams WebRTC Data Plane WebSocket API 深度解析

基于官方文档与 amazon-kinesis-video-streams-webrtc-sdk-c-main 源码(v1.7.0+)


1. 职责定位

维度说明
所属平面Data Plane WebSocket(信令数据面)
主要用途1. 建立 Master/Viewer 会话长连接
2. 实时交换 SDP Offer/Answer
3. 收发 ICE Candidate(Trickle)
4. 下发控制信令(Go Away、Reconnect Ice Server)
协议WebSocket over TLS(WSS)
鉴权预签名 URL(X-Amz-ChannelARN、X-Amz-ClientId 等 Query 参数)
消息格式JSON,UTF-8,每条消息 ≤ 10 KiB
并发模型每通道仅 1 个 Master + N 个 Viewer(默认 10,可调)

2. 端到端交互时序

Client (SDK)WSS EndpointKVS Signaling Service1. 建立连接GET /?X-Amz-ChannelARN=arn:aws:kinesisvideo:...&X-Amz-ClientId=web-123101 Switching Protocols2. 心跳/保活(可选)PingPongloop[every 30 s]3. 业务消息{"action":"SDP_OFFER","RecipientClientId":"master","MessagePayload":"..."}{"action":"STATUS_RESPONSE","CorrelationId":"...","Status":"200"}{"action":"SDP_ANSWER","SenderClientId":"master","MessagePayload":"..."}4. 关闭Close(1000)Client (SDK)WSS EndpointKVS Signaling Service

3. 连接握手细节

3.1 端点拼装

  • 模板定义(src/source/Signaling/LwsApiCalls.h:97-98)
#define SIGNALING_ENDPOINT_MASTER_URL_WSS_TEMPLATE \"%s?%s=%s"                                    // baseWssUrl?X-Amz-ChannelARN=...
#define SIGNALING_ENDPOINT_VIEWER_URL_WSS_TEMPLATE \"%s?%s=%s&%s=%s"                              // + &X-Amz-ClientId=...
  • 代码拼装(src/source/Signaling/LwsApiCalls.c:1463-1469)
if (role == VIEWER) {SNPRINTF(url, ARRAY_SIZE(url),SIGNALING_ENDPOINT_VIEWER_URL_WSS_TEMPLATE,pSignalingClient->channelEndpointWss,SIGNALING_CHANNEL_ARN_PARAM_NAME,pSignalingClient->channelDescription.channelArn,SIGNALING_CLIENT_ID_PARAM_NAME,pSignalingClient->clientInfo.signalingClientInfo.clientId);
} else { // MASTERSNPRINTF(url, ARRAY_SIZE(url),SIGNALING_ENDPOINT_MASTER_URL_WSS_TEMPLATE,pSignalingClient->channelEndpointWss,SIGNALING_CHANNEL_ARN_PARAM_NAME,pSignalingClient->channelDescription.channelArn);
}

3.2 TLS & 预签名

  • 使用 HTTPS 证书链校验;根证书由系统 CA 提供。
  • Query 参数已包含 SigV4 预签名,服务端校验时间戳、签名、过期(默认 15 min)。
  • SDK 内部复用 createRequestInfo() 统一注入 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN(若使用临时凭证)。

4. 消息格式

4.1 发送模板(src/source/Signaling/LwsApiCalls.h:115-129)

// 基础版
{"action": "SDP_OFFER|SDP_ANSWER|ICE_CANDIDATE|...","RecipientClientId": "<peer id>","MessagePayload": "<Base64Encoded>"
}// 带 CorrelationId(用于同步等待 STATUS_RESPONSE)
{"action": "...","RecipientClientId": "...","MessagePayload": "...","CorrelationId": "<uuid>"
}
  • MessagePayload 长度 ≤ 10 KiB(UTF-8 编码后)。
  • 若消息类型为 SDP_OFFER 且本地已获取 IceServerList,SDK 会追加 IceServerList 字段(供对端使用)。

4.2 接收格式

{"action": "SDP_OFFER|SDP_ANSWER|ICE_CANDIDATE|GO_AWAY|RECONNECT_ICE_SERVER|STATUS_RESPONSE","SenderClientId": "<from>",      // 仅接收时存在"MessagePayload": "<Base64>","CorrelationId": "<uuid>",         // 可选"Status": "200|403|404|..."      // 仅 STATUS_RESPONSE
}

5. 代码调用链路

5.1 连接建立

// 状态机:SIGNALING_STATE_CONNECT
connectSignalingChannel()
└─ connectSignalingChannelLws()      // src/source/Signaling/LwsApiCalls.c:1445├─ lws_client_connect_via_info()   // libwebsockets└─ 等待 LWS_CALLBACK_CLIENT_ESTABLISHED

5.2 发送消息

// 应用线程
signalingClientSendMessageSync()
└─ writeLwsData()                     // 原子写入缓冲区└─ lws_callback_on_writable()    // 唤醒 LWS 线程
// LWS 线程回调
lwsWssCallbackRoutine(LWS_CALLBACK_CLIENT_WRITEABLE)
└─ lws_write()

5.3 接收消息

lwsWssCallbackRoutine(LWS_CALLBACK_CLIENT_RECEIVE)
├─ jsmn_parse()                       // 解析 JSON
├─ getMessageTypeFromString()         // 转枚举
├─ receiveLwsMessageWrapper()         // 异步投递工作线程
└─ 用户回调 messageReceivedFn

6. 状态机与错误处理

回调原因SDK 动作日志关键词
LWS_CALLBACK_CLIENT_ESTABLISHED设置 connected=TRUE,广播 connectedCvarConnection established
LWS_CALLBACK_CLIENT_CONNECTION_ERROR设置 connected=FALSE,启动 reconnectHandler 线程Client connection failed
LWS_CALLBACK_CLIENT_CLOSED同上WSS callback ... closed
LWS_CALLBACK_WS_PEER_INITIATED_CLOSE记录关闭码Peer initiated close with code
  • 重连线程指数退避:初始 100 ms → 最大 30 s;退避因子 1.5。
  • 退避期间保持 WSS 协议级 Ping/Pong(默认 30 s 间隔)。

7. 关键日志与快速检索

# 连接
grep -n "Connection established\|Client connection failed" master.log# 消息收发
grep -n "Sending data over web socket\|Received message type" master.log# 关闭/重连
grep -n "WSS callback.*closed\|Reconnect attempt" master.log

8. 性能与限制

项目默认值/上限说明
单通道 Viewer 数10可在控制面提高配额
消息大小10 KiB含 Base64 后的 JSON
连接空闲超时60 s服务端主动断开
Ping/Pong 间隔30 s保活,可配置
重连退避100 ms → 30 s指数 1.5x

9. 常见错误码与排错

HTTP Status含义排查要点
400 InvalidArgument参数非法检查 ARN、ClientId 格式与长度
403 AccessDenied签名/权限失败时钟偏差 < 5 min;IAM 策略是否允许 kinesisvideo:ConnectAsViewer/ConnectAsMaster
404 ResourceNotFound通道不存在ARN 区域与端点一致;通道是否被删除
400 ClientLimitExceeded超限Viewer 数超配额;API 速率超限(默认 100 TPS)
1000/1001 正常关闭-无需处理;重连即可

10. 小结

  • 职责:WebSocket 数据面仅负责会话级信令,不承载媒体与配置。
  • 安全:TLS + 预签名 URL,短期凭证,独立限流。
  • 可靠:指数退避重连、Ping/Pong 保活、消息 ACK(CorrelationId)。
  • 易用:JSON 透明格式,与标准 WebRTC 信令对齐;SDK 封装发送/接收/重连细节。

掌握连接 URL 拼装、消息模板、回调处理与重连策略,即可快速定位信令层问题。

http://www.dtcms.com/a/609767.html

相关文章:

  • Docker核心概念、常用命令与实战指南
  • 交换机安全基线整改方式-华为S5700系列
  • Django 接口文档生成:Swagger 与 ReDoc 全面说明
  • Docker K8s VM 简介
  • FPGA教程系列-Vivado中读取ROM中数据
  • 网站怎么添加模块鹿寨建设局网站
  • 响应式外贸网站案例国外ps网站
  • springcloud feign远程调用请求参数对象变成linkhashmap处理
  • “耐达讯自动化Profibus总线光端机在化工变频泵控制系统中的应用与价值解析”
  • centos7.2安装cacti1.2.27
  • 将 vue3 项目打包后部署在 springboot 项目运行
  • 福州短视频seo网站建筑网站首页大图
  • 阿根廷网站后缀毕业设计网站成品
  • 性能相关指标
  • 数据结构--6:优先级队列(堆)
  • ESP32 Wsl2 环境搭建
  • Elasticsearch:如何创建知识库并使用 AI Assistant 来配置连接器
  • Blender学习笔记(04)-- 选中实体的一部分,单独设置颜色
  • 哪个网站做攻略比较好品牌vi设计案例欣赏ppt
  • 珠海市网站建设企业网站编辑给续南明做的封面
  • 国产化Excel开发组件Spire.XLS教程:Python将列表导出为CSV文件(含一维/二维/字典列表)
  • 接口自动化测试框架实战(Pytest+Allure+Excel)
  • 苹果质量检测与分类 - YOLO13结合RFCAConv实现
  • YZ系列工具之YZ09: VBA_Excel之读心术
  • 三芯联动:“通信 + 供电 + 主控”的安全闭环与场景革命
  • EXCEL 数字编码化排序(如部门层级排序)
  • sse,短轮询,长轮询,webSocket
  • 芦笋嫩茎形态分类与识别_YOLO11-C3k2-MambaOut-SFSC模型实现_1
  • 昆明专业网站营销北京工程建设交易平台
  • 衡阳网站搜索引擎优化wordpress如何设水印图片