@tencentcloud/sdk-mcp 1.7.7 → 1.7.9-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +7 -9
  3. package/index.js +8 -8
  4. package/knowledge/chunker.js +1 -0
  5. package/knowledge/doc-url-resolver.js +16 -9
  6. package/knowledge/embedding/build-vectors.js +92 -0
  7. package/knowledge/embedding/embed-model.js +41 -0
  8. package/knowledge/embedding/vector-augment.js +126 -0
  9. package/knowledge/embedding/vector-index.js +70 -0
  10. package/knowledge/frontmatter-meta.js +23 -0
  11. package/knowledge/path-meta.js +56 -0
  12. package/knowledge/search/exact-lookup.js +145 -16
  13. package/knowledge/search/filter-pool.js +77 -33
  14. package/knowledge/search/rank-profile.js +25 -0
  15. package/knowledge/search/requires-framework.js +4 -1
  16. package/knowledge/search/search-core.js +74 -13
  17. package/knowledge/search/search-knowledge.js +24 -34
  18. package/knowledge/search/search-pass.js +495 -169
  19. package/knowledge/search/url-row-scorer.js +24 -6
  20. package/package.json +3 -1
  21. package/resource/index/manifest.json +1 -1
  22. package/resource/index/vectors/index.json +4 -0
  23. package/resource/integration/callkit/preset/android/integration.md +0 -2
  24. package/resource/integration/callkit/preset/ios/integration.md +0 -2
  25. package/resource/integration/chat/preset/react/integration.md +9 -5
  26. package/resource/integration/chat/preset/uni-app/integration.md +4 -0
  27. package/resource/integration/chat/preset/vue/integration.md +10 -6
  28. package/resource/integration/livekit/preset/live/android/prepare-integration.md +0 -4
  29. package/resource/integration/livekit/preset/live/ios/prepare-integration.md +0 -4
  30. package/resource/integration/roomkit/preset/vue/integration.md +154 -208
  31. package/resource/knowledge/callkit/best-practice/android/video-chat-dating.md +0 -2
  32. package/resource/knowledge/callkit/core-sdk/android/answer-call.md +0 -2
  33. package/resource/knowledge/callkit/core-sdk/android/make-call.md +0 -2
  34. package/resource/knowledge/callkit/core-sdk/flutter/answer-call.md +0 -4
  35. package/resource/knowledge/callkit/core-sdk/flutter/make-call.md +0 -2
  36. package/resource/knowledge/callkit/core-sdk/flutter/offline-push.md +0 -2
  37. package/resource/knowledge/callkit/core-sdk/ios/answer-call.md +0 -2
  38. package/resource/knowledge/callkit/core-sdk/ios/make-call.md +0 -4
  39. package/resource/knowledge/callkit/core-sdk/ios/offline-push.md +0 -2
  40. package/resource/knowledge/callkit/core-sdk/uni-app/answer-call.md +0 -2
  41. package/resource/knowledge/callkit/core-sdk/uni-app/make-call.md +0 -2
  42. package/resource/knowledge/callkit/faq/ios.md +0 -2
  43. package/resource/knowledge/callkit/faq/uniapp-app.md +0 -2
  44. package/resource/knowledge/callkit/preset/miniprogram/integration.md +2 -3
  45. package/resource/knowledge/callkit/preset/miniprogram/uniapp-integration.md +0 -2
  46. package/resource/knowledge/chat/preset/ios-uikit/integration.md +0 -16
  47. package/resource/knowledge/chat/preset/react/h5/integration.md +16 -5
  48. package/resource/knowledge/chat/preset/vue/features/conversation-list.md +6 -3
  49. package/resource/knowledge/chat/preset/vue/h5/integration.md +7 -4
  50. package/resource/knowledge/iot/app/activate-service.md +95 -0
  51. package/resource/knowledge/iot/app/demo/android.md +93 -0
  52. package/resource/knowledge/iot/app/demo/ios.md +87 -0
  53. package/resource/knowledge/iot/app/demo/miniprogram.md +79 -0
  54. package/resource/knowledge/iot/app/device-binding.md +378 -0
  55. package/resource/knowledge/iot/app/device-sharing.md +414 -0
  56. package/resource/knowledge/iot/app/family-management.md +762 -0
  57. package/resource/knowledge/iot/app/integration/android.md +328 -0
  58. package/resource/knowledge/iot/app/integration/harmonyos.md +326 -0
  59. package/resource/knowledge/iot/app/integration/ios.md +351 -0
  60. package/resource/knowledge/iot/app/integration/miniprogram.md +268 -0
  61. package/resource/knowledge/iot/app/monitor-playback.md +557 -0
  62. package/resource/knowledge/iot/app/remote-control.md +139 -0
  63. package/resource/knowledge/iot/app/video-call.md +559 -0
  64. package/resource/knowledge/iot/app/wechat-call/device-call-miniprogram.md +204 -0
  65. package/resource/knowledge/iot/app/wechat-call/miniprogram-call-device.md +193 -0
  66. package/resource/knowledge/iot/client-api/app/android/txiotcallsession.md +189 -0
  67. package/resource/knowledge/iot/client-api/app/android/txiotcloudstorage.md +77 -0
  68. package/resource/knowledge/iot/client-api/app/android/txiotdevicemanager.md +175 -0
  69. package/resource/knowledge/iot/client-api/app/android/txiotengine.md +172 -0
  70. package/resource/knowledge/iot/client-api/app/android/txiotenginedef.md +163 -0
  71. package/resource/knowledge/iot/client-api/app/android/txiotfamilymanager.md +146 -0
  72. package/resource/knowledge/iot/client-api/app/android/txiotmonitorsession.md +246 -0
  73. package/resource/knowledge/iot/client-api/app/harmonyos/txiotcallsession.md +191 -0
  74. package/resource/knowledge/iot/client-api/app/harmonyos/txiotcloudstorage.md +77 -0
  75. package/resource/knowledge/iot/client-api/app/harmonyos/txiotdevicemanager.md +183 -0
  76. package/resource/knowledge/iot/client-api/app/harmonyos/txiotengine.md +186 -0
  77. package/resource/knowledge/iot/client-api/app/harmonyos/txiotenginedef.md +164 -0
  78. package/resource/knowledge/iot/client-api/app/harmonyos/txiotfamilymanager.md +150 -0
  79. package/resource/knowledge/iot/client-api/app/harmonyos/txiotmonitorsession.md +252 -0
  80. package/resource/knowledge/iot/client-api/app/ios/txiotcallsession.md +199 -0
  81. package/resource/knowledge/iot/client-api/app/ios/txiotcloudstorage.md +76 -0
  82. package/resource/knowledge/iot/client-api/app/ios/txiotdevicemanager.md +173 -0
  83. package/resource/knowledge/iot/client-api/app/ios/txiotengine.md +173 -0
  84. package/resource/knowledge/iot/client-api/app/ios/txiotenginedef.md +171 -0
  85. package/resource/knowledge/iot/client-api/app/ios/txiotfamilymanager.md +146 -0
  86. package/resource/knowledge/iot/client-api/app/ios/txiotmonitorsession.md +250 -0
  87. package/resource/knowledge/iot/client-api/app/miniprogram/txiotcallsession.md +180 -0
  88. package/resource/knowledge/iot/client-api/app/miniprogram/txiotcloudstorage.md +76 -0
  89. package/resource/knowledge/iot/client-api/app/miniprogram/txiotdevicemanager.md +281 -0
  90. package/resource/knowledge/iot/client-api/app/miniprogram/txiotengine.md +183 -0
  91. package/resource/knowledge/iot/client-api/app/miniprogram/txiotenginedef.md +152 -0
  92. package/resource/knowledge/iot/client-api/app/miniprogram/txiotfamilymanager.md +179 -0
  93. package/resource/knowledge/iot/client-api/app/miniprogram/txiotmonitorsession.md +226 -0
  94. package/resource/knowledge/iot/client-api/device/android-smart-device.md +813 -0
  95. package/resource/knowledge/iot/client-api/device/linux-rtos-device.md +2027 -0
  96. package/resource/knowledge/iot/device/activate-service.md +167 -0
  97. package/resource/knowledge/iot/device/ai-voice-chat/advanced-features/custom-agent.md +171 -0
  98. package/resource/knowledge/iot/device/ai-voice-chat/advanced-features/smart-device-control.md +721 -0
  99. package/resource/knowledge/iot/device/ai-voice-chat/integration-guide/android-smart-device.md +247 -0
  100. package/resource/knowledge/iot/device/ai-voice-chat/integration-guide/linux-rtos-device.md +368 -0
  101. package/resource/knowledge/iot/device/ai-voice-chat/overview.md +84 -0
  102. package/resource/knowledge/iot/device/cloud-storage.md +696 -0
  103. package/resource/knowledge/iot/device/data-model.md +972 -0
  104. package/resource/knowledge/iot/device/demo/android-smart-device.md +97 -0
  105. package/resource/knowledge/iot/device/demo/linux-rtos-device.md +106 -0
  106. package/resource/knowledge/iot/device/device-ota-upgrade.md +237 -0
  107. package/resource/knowledge/iot/device/dynamic-registration/android-smart-device.md +275 -0
  108. package/resource/knowledge/iot/device/dynamic-registration/linux-rtos-device.md +297 -0
  109. package/resource/knowledge/iot/device/login-and-register/android-smart-device.md +131 -0
  110. package/resource/knowledge/iot/device/login-and-register/linux-rtos-device.md +291 -0
  111. package/resource/knowledge/iot/device/monitor-pushing/android-smart-device.md +237 -0
  112. package/resource/knowledge/iot/device/monitor-pushing/linux-rtos-device.md +493 -0
  113. package/resource/knowledge/iot/device/video-call/android-smart-device.md +299 -0
  114. package/resource/knowledge/iot/device/video-call/linux-rtos-device.md +465 -0
  115. package/resource/knowledge/iot/device/wechat-call/android-smart-device.md +534 -0
  116. package/resource/knowledge/iot/device/wechat-call/linux-rtos-device.md +681 -0
  117. package/resource/knowledge/iot/kids-watch/overview.md +28 -0
  118. package/resource/knowledge/iot/security-camera/activate-service.md +74 -0
  119. package/resource/knowledge/iot/security-camera/monitor-playback/app-integration.md +302 -0
  120. package/resource/knowledge/iot/security-camera/monitor-playback/device-integration/android.md +237 -0
  121. package/resource/knowledge/iot/security-camera/monitor-playback/device-integration/linux-rtos.md +493 -0
  122. package/resource/knowledge/iot/security-camera/overview.md +31 -0
  123. package/resource/knowledge/iot/security-camera/ptz-control.md +153 -0
  124. package/resource/knowledge/iot/security-camera/recording-and-snapshot.md +182 -0
  125. package/resource/knowledge/iot/security-camera/voice-intercom.md +174 -0
  126. package/resource/knowledge/iot/smart-vision/serviceoverview.md +114 -0
  127. package/resource/knowledge/iot/voice-recorder/app-demo.md +99 -0
  128. package/resource/knowledge/iot/voice-recorder/device-demo.md +189 -0
  129. package/resource/knowledge/iot/voice-recorder/overview.md +64 -0
  130. package/resource/knowledge/livekit/core-sdk/features/android/base-beauty.md +0 -2
  131. package/resource/knowledge/livekit/core-sdk/features/android/gift.md +0 -4
  132. package/resource/knowledge/livekit/core-sdk/features/android/live-list.md +0 -2
  133. package/resource/knowledge/livekit/core-sdk/features/flutter/audio-effect.md +0 -2
  134. package/resource/knowledge/livekit/core-sdk/features/flutter/base-beauty.md +0 -2
  135. package/resource/knowledge/livekit/core-sdk/features/flutter/gift.md +0 -4
  136. package/resource/knowledge/livekit/core-sdk/features/ios/base-beauty.md +0 -2
  137. package/resource/knowledge/livekit/core-sdk/features/ios/gift.md +0 -4
  138. package/resource/knowledge/livekit/core-sdk/features/ios/live-list.md +0 -2
  139. package/resource/knowledge/livekit/core-sdk/features/uni-app/base-beauty.md +0 -2
  140. package/resource/knowledge/livekit/core-sdk/features/uni-app/gift.md +0 -4
  141. package/resource/knowledge/livekit/core-sdk/live/android/co-guest-interaction.md +0 -4
  142. package/resource/knowledge/livekit/core-sdk/live/android/host-interaction.md +0 -10
  143. package/resource/knowledge/livekit/core-sdk/live/android/integration.md +0 -2
  144. package/resource/knowledge/livekit/core-sdk/live/flutter/co-guest-interaction.md +0 -2
  145. package/resource/knowledge/livekit/core-sdk/live/flutter/host-interaction.md +0 -10
  146. package/resource/knowledge/livekit/core-sdk/live/flutter/integration.md +0 -2
  147. package/resource/knowledge/livekit/core-sdk/live/ios/co-guest-interaction.md +0 -4
  148. package/resource/knowledge/livekit/core-sdk/live/ios/host-interaction.md +0 -10
  149. package/resource/knowledge/livekit/core-sdk/live/ios/integration.md +0 -2
  150. package/resource/knowledge/livekit/core-sdk/live/uni-app/co-guest-interaction.md +0 -4
  151. package/resource/knowledge/livekit/core-sdk/live/uni-app/host-interaction.md +0 -4
  152. package/resource/knowledge/livekit/core-sdk/live/uni-app/integration.md +0 -2
  153. package/resource/knowledge/livekit/core-sdk/voice/android/co-guest-interaction.md +0 -2
  154. package/resource/knowledge/livekit/core-sdk/voice/android/host-interaction.md +0 -4
  155. package/resource/knowledge/livekit/core-sdk/voice/android/integration.md +0 -4
  156. package/resource/knowledge/livekit/core-sdk/voice/flutter/integration.md +0 -2
  157. package/resource/knowledge/livekit/core-sdk/voice/ios/co-guest-interaction.md +0 -2
  158. package/resource/knowledge/livekit/core-sdk/voice/ios/host-interaction.md +0 -4
  159. package/resource/knowledge/livekit/core-sdk/voice/ios/integration.md +0 -4
  160. package/resource/knowledge/livekit/core-sdk/voice/uni-app/co-guest-interaction.md +0 -2
  161. package/resource/knowledge/livekit/core-sdk/voice/uni-app/integration.md +0 -2
  162. package/resource/knowledge/livekit/faq/error-code.md +0 -2
  163. package/resource/knowledge/push/config/android/honor.md +16 -1
  164. package/resource/knowledge/push/config/android/huawei.md +20 -4
  165. package/resource/knowledge/push/config/android/meizu.md +19 -5
  166. package/resource/knowledge/push/config/android/vivo.md +20 -1
  167. package/resource/knowledge/push/config/donut.md +0 -2
  168. package/resource/knowledge/push/config/harmonyos.md +21 -5
  169. package/resource/knowledge/push/integration/android.md +0 -5
  170. package/resource/knowledge/push/integration/donut.md +0 -3
  171. package/resource/knowledge/push/integration/flutter.md +1 -4
  172. package/resource/knowledge/push/integration/harmonyos.md +0 -3
  173. package/resource/knowledge/push/integration/ios.md +0 -3
  174. package/resource/knowledge/push/integration/react-native.md +0 -5
  175. package/resource/knowledge/push/integration/uni-app.md +0 -3
  176. package/resource/knowledge/push/integration/unity.md +0 -3
  177. package/resource/knowledge/push/integration/unreal-engine.md +0 -3
  178. package/resource/knowledge/roomkit/core-sdk/android/call-user-to-room.md +0 -2
  179. package/resource/knowledge/roomkit/core-sdk/android/room-participant-state.md +0 -2
  180. package/resource/knowledge/roomkit/core-sdk/android/room-state.md +0 -2
  181. package/resource/knowledge/roomkit/core-sdk/android/schedule-room.md +0 -2
  182. package/resource/knowledge/roomkit/core-sdk/flutter/call-user-to-room.md +0 -2
  183. package/resource/knowledge/roomkit/core-sdk/flutter/room-participant-state.md +0 -2
  184. package/resource/knowledge/roomkit/core-sdk/flutter/room-state.md +0 -2
  185. package/resource/knowledge/roomkit/core-sdk/flutter/schedule-room.md +0 -2
  186. package/resource/knowledge/roomkit/core-sdk/ios/call-user-to-room.md +0 -2
  187. package/resource/knowledge/roomkit/core-sdk/ios/room-participant-state.md +0 -2
  188. package/resource/knowledge/roomkit/core-sdk/ios/room-state.md +0 -2
  189. package/resource/knowledge/roomkit/core-sdk/ios/schedule-room.md +0 -2
  190. package/resource/knowledge/roomkit/core-sdk/vue/room-view.md +0 -3
  191. package/resource/knowledge/roomkit/preset/uniapp-app/integration.md +18 -14
  192. package/resource/knowledge/rtcengine/web/how_to_run_web_sdk_demo.md +0 -2
  193. package/resource/knowledge/rtcengine/web/plugin/23-advanced-support-detection.md +30 -0
  194. package/resource/knowledge/rtcengine/web/plugin/24-advanced-network-quality.md +0 -2
  195. package/resource/knowledge/rtcengine/web/plugin/31-advanced-plugins-overview.md +1 -1
  196. package/resource/knowledge/rtcengine/web/plugin/35-advanced-ai-denoiser.md +1 -1
  197. package/resource/knowledge/rtcengine/web/plugin/36-advanced-virtual-background.md +4 -0
  198. package/resource/knowledge/trtc/android/TRTCCloud.md +94 -85
  199. package/resource/knowledge/trtc/android/TRTCCloudDef.md +48 -46
  200. package/resource/knowledge/trtc/android/TRTCCloudListener.md +48 -48
  201. package/resource/knowledge/trtc/android/TXAudioEffectManager.md +18 -18
  202. package/resource/knowledge/trtc/android/TXDeviceManager.md +4 -4
  203. package/resource/knowledge/trtc/android/TXLiteAVCode.md +1 -0
  204. package/resource/knowledge/trtc/c++/ITRTCCloud.md +90 -90
  205. package/resource/knowledge/trtc/c++/ITXAudioEffectManager.md +18 -18
  206. package/resource/knowledge/trtc/c++/ITXDeviceManager.md +9 -9
  207. package/resource/knowledge/trtc/c++/TRTCCloudCallback.md +47 -47
  208. package/resource/knowledge/trtc/c++/TRTCTypeDef.md +47 -45
  209. package/resource/knowledge/trtc/c++/TXLiteAVCode.md +1 -0
  210. package/resource/knowledge/trtc/ios/TRTCCloud.md +93 -93
  211. package/resource/knowledge/trtc/ios/TRTCCloudDelegate.md +50 -50
  212. package/resource/knowledge/trtc/ios/TXAudioEffectManager.md +8 -8
  213. package/resource/knowledge/trtc/ios/TXDeviceManager.md +9 -9
  214. package/resource/knowledge/trtc/ios/TXLiteAVCode.md +1 -0
  215. package/resource/knowledge/trtc/ios/TXLiveSDKTypeDef.md +48 -46
  216. package/server-config.js +8 -9
  217. package/server.js +1 -1
  218. package/tools/common/finalize_answer.js +1 -1
  219. package/tools/common/present_framework_choice.js +1 -1
  220. package/tools/common/search_trtc_knowledge.js +22 -3
  221. package/tools/definitions/search_trtc_knowledge_def.js +3 -2
  222. package/utils/preflight-route.js +19 -2
  223. package/utils/report-cls-client.js +1 -1
  224. package/utils/report-es-client.js +1 -1
@@ -0,0 +1,2027 @@
1
+ ---
2
+ product: iot
3
+ framework:
4
+ - linux
5
+ types:
6
+ - api
7
+ retrievable_scope: always
8
+ feature_domain: client_api
9
+ ---
10
+
11
+ ## 概述
12
+
13
+ 本文档描述设备端公开 C API。接口线程安全(可任意线程调用),异步回调契约为:同步返回成功则一定回调,同步返回失败则一定不回调(个别接口另有说明)。推荐生命周期:​tc_iot_init → ​tc_iot_login → 各业务模块 init → 业务运行 → 各业务模块 deinit → ​tc_iot_deinit。
14
+
15
+ SDK 模块一览:
16
+
17
+ |模块|说明|
18
+ |---------|---------|
19
+ |核心生命周期|核心生命周期(连接与设备身份)。|
20
+ |物模型|物模型(属性 / 事件 / 行为)。|
21
+ |音视频|音视频通话 / IPC 监控。|
22
+ |云存储|云存储(全时 / 事件录像与抓图上报)。|
23
+ |AI 对话|AI 对话(AITalk)。|
24
+ |录音卡|录音卡(当前经 BLE 传输;本地落盘尚未启用)。|
25
+ |OTA 升级|固件下载、校验及固件刷写状态上报。|
26
+ |类型定义|音视频公共类型(AV / AITalk / 录音卡共用)。|
27
+ |错误码|SDK 统一错误码。|
28
+
29
+ API 索引:
30
+
31
+ ### 核心生命周期(tc_iot.h)
32
+
33
+ |函数列表|描述|
34
+ |---------|---------|
35
+ |tc_iot_init|初始化 SDK 核心(异步完成初始化)。|
36
+ |tc_iot_deinit|反初始化 SDK;阻塞等待内部清理完成后返回。|
37
+ |tc_iot_login|使用三元组登录(异步 MQTT 连接,内部可重试)。|
38
+ |tc_iot_logout|登出并清除本地凭证(异步,无独立完成回调)。|
39
+ |tc_iot_dynamic_register|动态注册设备(同一时刻仅允许一路)。|
40
+ |tc_iot_get_ntp_time|读取 NTP 同步后的 UTC 毫秒时间戳。|
41
+ |tc_iot_get_sdk_version|读取 SDK 版本字符串。|
42
+
43
+ ### 物模型(tc_iot_data_model.h)
44
+
45
+ |函数列表|描述|
46
+ |---------|---------|
47
+ |tc_iot_data_model_init|初始化物模型并订阅下行 topic。|
48
+ |tc_iot_data_model_report_property|上报属性。|
49
+ |tc_iot_data_model_report_event|上报事件。|
50
+ |tc_iot_data_model_deinit|反初始化;同步清除单例后异步退订。|
51
+
52
+ ### 音视频(tc_iot_av.h)
53
+
54
+ |函数列表|描述|
55
+ |---------|---------|
56
+ |tc_iot_av_init|初始化 AV 模块并注册观察者(内部拷贝 observer)。|
57
+ |tc_iot_av_deinit|反初始化 AV;同步清除单例后异步退订信令。|
58
+ |tc_iot_av_get_contacts|拉取联系人列表。|
59
+ |tc_iot_av_call|发起呼出。|
60
+ |tc_iot_av_accept|接听呼入;仅在振铃态有效,否则回调 AV_ON_*。|
61
+ |tc_iot_av_reject|拒绝呼入;仅在振铃态有效。|
62
+ |tc_iot_av_hangup|挂断当前会话;无对应会话时回调 ​TC_IOT_ERR_AV_ON_IDLE。|
63
+ |tc_iot_create_video_channel|创建视频推流通道。|
64
+ |tc_iot_create_audio_channel|创建全局唯一音频推流通道。|
65
+ |tc_iot_destroy_video_channel|销毁视频通道。|
66
+ |tc_iot_destroy_audio_channel|销毁音频通道。|
67
+ |tc_iot_push_video_frame|推送一帧视频(调用方线程同步)。|
68
+ |tc_iot_push_audio_frame|推送一帧音频(调用方线程同步)。|
69
+
70
+ ### 云存储(tc_iot_cloud_storage.h)
71
+
72
+ |函数列表|描述|
73
+ |---------|---------|
74
+ |tc_iot_cloud_storage_init|初始化云存储并查询套餐。|
75
+ |tc_iot_cloud_storage_deinit|反初始化云存储,停止录像并释放资源。|
76
+ |tc_iot_cloud_storage_get_plan_type|查询指定通道当前云存套餐类型。|
77
+ |tc_iot_cloud_storage_start_continuous_recording|开始全时录像。|
78
+ |tc_iot_cloud_storage_stop_continuous_recording|停止全时录像。|
79
+ |tc_iot_cloud_storage_start_event_recording|开始事件录像。|
80
+ |tc_iot_cloud_storage_stop_event_recording|停止事件录像。|
81
+ |tc_iot_cloud_storage_report_event_snapshot|上报事件抓图。|
82
+
83
+ ### AI 对话(tc_iot_aitalk.h)
84
+
85
+ |函数列表|描述|
86
+ |---------|---------|
87
+ |tc_iot_aitalk_init|初始化 AITalk。|
88
+ |tc_iot_aitalk_deinit|反初始化;阻塞等待内部清理完成。|
89
+ |tc_iot_aitalk_start_speak|开始对话。|
90
+ |tc_iot_aitalk_stop_speak|停止对话(异步投递,空闲时幂等成功)。|
91
+ |tc_iot_aitalk_send_audio|发送一帧上行音频。|
92
+ |tc_iot_aitalk_send_text|发送文本给 LLM。|
93
+ |tc_iot_aitalk_register_contacts|注册可供机器人呼叫的联系人。|
94
+ |tc_iot_aitalk_interrupt|打断机器人当前播报(连续模式下有效)。|
95
+
96
+ ### 录音卡(tc_iot_audio_recorder.h)
97
+
98
+ |函数列表|描述|
99
+ |---------|---------|
100
+ |tc_iot_audio_recorder_init|初始化录音卡并注册观察者。|
101
+ |tc_iot_audio_recorder_deinit|反初始化;阻塞等待内部清理完成。|
102
+ |tc_iot_audio_recorder_start|开始录音。|
103
+ |tc_iot_audio_recorder_stop|停止录音(异步投递)。|
104
+ |tc_iot_audio_recorder_send_audio|发送一帧录音音频。|
105
+
106
+ ### OTA 升级(tc_iot_ota.h)
107
+
108
+ |函数列表|描述|
109
+ |---------|---------|
110
+ |tc_iot_ota_init|初始化 OTA,注册回调并上报当前固件版本。|
111
+ |tc_iot_ota_deinit|反初始化 OTA,停止下载并释放资源。|
112
+ |tc_iot_ota_download_firmware|发起固件下载,由 SDK 下载并校验固件。|
113
+ |tc_iot_ota_report_upgrade_progress|上报固件刷写进度。|
114
+ |tc_iot_ota_report_upgrade_result|上报固件刷写结果。|
115
+
116
+ ## 核心生命周期(tc_iot.h)
117
+
118
+ 核心生命周期(连接与设备身份)
119
+
120
+ > **线程模型**
121
+ >
122
+ > 本头文件接口可在任意线程调用。
123
+ >
124
+
125
+ > **回调 / 通知模型**
126
+ >
127
+ > - on_log:日志回调线程可能与调用方线程不同。
128
+ > - on_device_event:event_data 当前恒为 NULL;回调内勿做耗时操作。ONLINE 仅表示 MQTT 已连,不携带校时,壁钟请用 ​tc_iot_get_ntp_time(未就绪返回 NTP_TIME_NOT_READY)。
129
+ > - tc_iot_login_cb / ​tc_iot_dynamic_register_cb: 同步返回 SUCCESS 则一定会回调;同步失败则一定不回调。
130
+
131
+ > **生命周期**
132
+ >
133
+ > 推荐顺序:​tc_iot_init → ​tc_iot_login(等待回调成功)→ 各业务模块 init → 业务运行 → 各业务模块 deinit → ​tc_iot_deinit。 ​tc_iot_logout 可选;deinit 会断开 MQTT。
134
+ >
135
+
136
+ > **业务约束**
137
+ >
138
+ > - 重复 init 返回 ALREADY_INITIALIZED;未 init 调用业务接口返回 NOT_INITIALIZED。
139
+ > - tc_iot_init 同步 SUCCESS 仅表示任务已投递;异步初始化失败时后续 login 会以回调失败体现。
140
+ > - tc_iot_deinit 为阻塞接口;动态注册进行中时拒绝 deinit (DYNAMIC_REGISTER_BUSY)。
141
+ > - 动态注册成功后的 device_key 须由调用方写入非易失存储, 再作为 device_secret 登录。
142
+ > - region 取值见 ​tc_iot_config_s。
143
+
144
+ |函数列表|描述|
145
+ |---------|---------|
146
+ |tc_iot_init|初始化 SDK 核心(异步完成初始化)。|
147
+ |tc_iot_deinit|反初始化 SDK;阻塞等待内部清理完成后返回。|
148
+ |tc_iot_login|使用三元组登录(异步 MQTT 连接,内部可重试)。|
149
+ |tc_iot_logout|登出并清除本地凭证(异步,无独立完成回调)。|
150
+ |tc_iot_dynamic_register|动态注册设备(同一时刻仅允许一路)。|
151
+ |tc_iot_get_ntp_time|读取 NTP 同步后的 UTC 毫秒时间戳。|
152
+ |tc_iot_get_sdk_version|读取 SDK 版本字符串。|
153
+
154
+ ### tc_iot_init
155
+
156
+ **初始化 SDK 核心(异步完成初始化)**
157
+
158
+ |参数|描述|
159
+ |---------|---------|
160
+ |config|初始化配置,不可为 NULL。region 见 ​tc_iot_config_s。|
161
+
162
+ |返回值|描述|
163
+ |---------|---------|
164
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
165
+ |TC_IOT_ERR_INVALID_ARGUMENT|config 为空、storage_path / region 非法,或 region 不在允许取值内。|
166
+ |TC_IOT_ERR_ALREADY_INITIALIZED|已初始化。|
167
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
168
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
169
+ |TC_IOT_ERR_FAILURE|内部 AV 通道初始化失败。|
170
+
171
+ ### tc_iot_deinit
172
+
173
+ **反初始化 SDK;阻塞等待内部清理完成后返回**
174
+
175
+ |返回值|描述|
176
+ |---------|---------|
177
+ |TC_IOT_ERR_SUCCESS|成功。|
178
+ |TC_IOT_ERR_NOT_INITIALIZED|未初始化。|
179
+ |TC_IOT_ERR_DYNAMIC_REGISTER_BUSY|动态注册进行中。|
180
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
181
+
182
+ ### tc_iot_login
183
+
184
+ **使用三元组登录(异步 MQTT 连接,内部可重试)**
185
+
186
+ 同步返回 SUCCESS 仅表示任务已投递;最终结果以 `callback` 为准。 已连接时回调 ​TC_IOT_ERR_ALREADY_CONNECTED。
187
+
188
+ |参数|描述|
189
+ |---------|---------|
190
+ |device_info|设备三元组;product_id/device_id/device_secret 必填。|
191
+ |callback|登录结果回调;同步 SUCCESS 则一定回调,失败则不回调。|
192
+
193
+ |返回值|描述|
194
+ |---------|---------|
195
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
196
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法。|
197
+ |TC_IOT_ERR_NOT_INITIALIZED|未 init。|
198
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
199
+
200
+ ### tc_iot_logout
201
+
202
+ **登出并清除本地凭证(异步,无独立完成回调)**
203
+
204
+ 进行中的 login 会被取消并以 ​TC_IOT_ERR_NOT_CONNECTED 回调。
205
+
206
+ |返回值|描述|
207
+ |---------|---------|
208
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
209
+ |TC_IOT_ERR_NOT_INITIALIZED|未 init。|
210
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
211
+
212
+ ### tc_iot_dynamic_register
213
+
214
+ **动态注册设备(同一时刻仅允许一路)**
215
+
216
+ 成功后用回调中的 device_key 作为 device_secret 登录。
217
+
218
+ |参数|描述|
219
+ |---------|---------|
220
+ |param|注册参数。|
221
+ |callback|注册结果回调;同步 SUCCESS 则一定回调,失败则不回调。|
222
+
223
+ |返回值|描述|
224
+ |---------|---------|
225
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
226
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法。|
227
+ |TC_IOT_ERR_NOT_INITIALIZED|未 init。|
228
+ |TC_IOT_ERR_DYNAMIC_REGISTER_BUSY|已有注册进行中。|
229
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
230
+
231
+ ### tc_iot_get_ntp_time
232
+
233
+ **读取 NTP 同步后的 UTC 毫秒时间戳**
234
+
235
+ MQTT ONLINE 后异步触发同步;未完成前返回 NTP_TIME_NOT_READY。
236
+
237
+ |参数|描述|
238
+ |---------|---------|
239
+ |utc_time_ms|输出 UTC 毫秒时间戳,不可为 NULL。|
240
+
241
+ |返回值|描述|
242
+ |---------|---------|
243
+ |TC_IOT_ERR_SUCCESS|已同步并写入。|
244
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法。|
245
+ |TC_IOT_ERR_NTP_TIME_NOT_READY|尚未同步完成。|
246
+
247
+ ### tc_iot_get_sdk_version
248
+
249
+ **读取 SDK 版本字符串**
250
+
251
+ 可在任意时刻调用,包括 init 之前。返回值为静态字符串,无需释放。
252
+
253
+ |返回值|描述|
254
+ |---------|---------|
255
+ |const char *|SDK 版本号字符串;不会为 NULL。|
256
+
257
+ ### tc_iot_log_level_e
258
+
259
+ **日志输出阈值(数值越大输出越详细)。 设置为某级别时,输出该级别及更严重的日志(不含更详细级别)。**
260
+
261
+ |枚举|取值|描述|
262
+ |---------|---------|---------|
263
+ |TC_IOT_LOG_LEVEL_NONE|0|关闭日志输出。|
264
+ |TC_IOT_LOG_LEVEL_ERROR|1|仅输出错误。|
265
+ |TC_IOT_LOG_LEVEL_WARN|2|输出警告与错误。|
266
+ |TC_IOT_LOG_LEVEL_INFO|3|输出信息、警告与错误。|
267
+ |TC_IOT_LOG_LEVEL_DEBUG|4|输出全部日志(含调试,最详细)。|
268
+
269
+ ### tc_iot_device_event_type_e
270
+
271
+ **设备在线状态事件(MQTT 连接态映射;不含墙钟时间)**
272
+
273
+ |枚举|取值|描述|
274
+ |---------|---------|---------|
275
+ |TC_IOT_DEV_EVENT_ONLINE|0|MQTT 已连接(≠ NTP 已同步)。|
276
+ |TC_IOT_DEV_EVENT_OFFLINE|1|MQTT 已断开。|
277
+ |TC_IOT_DEV_EVENT_RECONNECTING|2|MQTT 重连中。|
278
+
279
+ ### tc_iot_login_cb
280
+
281
+ **登录结果回调**
282
+
283
+ typedef void(* ​tc_iot_login_cb) (​tc_iot_error_e error_code, const char *error_message)
284
+
285
+ |参数|描述|
286
+ |---------|---------|
287
+ |error_code|成功时为 ​TC_IOT_ERR_SUCCESS。|
288
+ |error_message|错误描述,可为 NULL。|
289
+
290
+ ### tc_iot_dynamic_register_cb
291
+
292
+ **动态注册结果回调**
293
+
294
+ typedef void(* ​tc_iot_dynamic_register_cb) (​tc_iot_error_e error_code, const char *error_message, const char *device_key)
295
+
296
+ |参数|描述|
297
+ |---------|---------|
298
+ |error_code|成功时为 ​TC_IOT_ERR_SUCCESS。|
299
+ |error_message|错误描述,可为 NULL。|
300
+ |device_key|成功时为设备密钥;须在回调返回前拷贝并写入非易失存储, 再作为后续 login 的 device_secret。|
301
+
302
+ ## 物模型(tc_iot_data_model.h)
303
+
304
+ 物模型(属性 / 事件 / 行为)
305
+
306
+ > **线程模型**
307
+ >
308
+ > 本头文件接口可在任意线程调用。
309
+ >
310
+
311
+ > **回调 / 通知模型**
312
+ >
313
+ > - on_report_*_result_cb:上报结果(含超时);user_data 为 report 传入值。
314
+ > - on_receive_property_changed_cb:云端属性控制。
315
+ > - on_receive_new_action_cb:收到行为调用;调用方填充 action_output_data_* 后返回 0 表示成功回复,非 0 表示失败回复; 回调返回后 action 对象即释放,禁止缓存指针。
316
+
317
+ > **生命周期**
318
+ >
319
+ > tc_iot_login 成功 → ​tc_iot_data_model_init → report_* → ​tc_iot_data_model_deinit
320
+ >
321
+
322
+ > **业务约束**
323
+ >
324
+ > - 标量类型用 data_value 对应字段;STRING 指针在构建 JSON 期间须有效。
325
+ > - 可一次 report 多条;每条结果经 on_report_*_result_cb 返回。
326
+ > - OBJECT / ARRAY 枚举已预留,当前实现未支持,请勿使用。
327
+
328
+ |函数列表|描述|
329
+ |---------|---------|
330
+ |tc_iot_data_model_init|初始化物模型并订阅下行 topic。|
331
+ |tc_iot_data_model_report_property|上报属性。|
332
+ |tc_iot_data_model_report_event|上报事件。|
333
+ |tc_iot_data_model_deinit|反初始化;同步清除单例后异步退订。|
334
+
335
+ ### tc_iot_data_model_init
336
+
337
+ **初始化物模型并订阅下行 topic**
338
+
339
+ 须 login 成功。
340
+
341
+ |参数|描述|
342
+ |---------|---------|
343
+ |data_model_callback|回调表。|
344
+
345
+ |返回值|描述|
346
+ |---------|---------|
347
+ |TC_IOT_ERR_SUCCESS|成功。|
348
+ |TC_IOT_ERR_ALREADY_INITIALIZED|重复初始化。|
349
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
350
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
351
+ |TC_IOT_ERR_FAILURE|通用失败。|
352
+
353
+ ### tc_iot_data_model_report_property
354
+
355
+ **上报属性**
356
+
357
+ property_num > 0;同步 SUCCESS 表示发布任务已投递, 逐条结果经 on_report_property_result_cb 返回。
358
+
359
+ |参数|描述|
360
+ |---------|---------|
361
+ |data_model_property|属性数组。|
362
+ |property_num|数量。|
363
+ |report_cb_user_data|透传到结果回调。|
364
+
365
+ |返回值|描述|
366
+ |---------|---------|
367
+ |TC_IOT_ERR_SUCCESS|成功。|
368
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
369
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
370
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
371
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
372
+ |TC_IOT_ERR_FAILURE|通用失败。|
373
+
374
+ ### tc_iot_data_model_report_event
375
+
376
+ **上报事件**
377
+
378
+ 语义与 report_property 相同,结果经 on_report_event_result_cb。
379
+
380
+ |参数|描述|
381
+ |---------|---------|
382
+ |data_model_event|事件数组。|
383
+ |event_num|数量。|
384
+ |event_cb_user_data|透传到结果回调。|
385
+
386
+ |返回值|描述|
387
+ |---------|---------|
388
+ |TC_IOT_ERR_SUCCESS|成功。|
389
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
390
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
391
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
392
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
393
+ |TC_IOT_ERR_FAILURE|通用失败。|
394
+
395
+ ### tc_iot_data_model_deinit
396
+
397
+ **反初始化;同步清除单例后异步退订**
398
+
399
+ |返回值|描述|
400
+ |---------|---------|
401
+ |TC_IOT_ERR_SUCCESS|成功。|
402
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
403
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
404
+
405
+ ### data_model_data_type_t
406
+
407
+ **物模型数据类型**
408
+
409
+ |枚举|取值|描述|
410
+ |---------|---------|---------|
411
+ |DATA_MODEL_DATA_TYPE_BOOL|0|布尔。|
412
+ |DATA_MODEL_DATA_TYPE_INT|1|整数。|
413
+ |DATA_MODEL_DATA_TYPE_FLOAT|2|浮点。|
414
+ |DATA_MODEL_DATA_TYPE_STRING|3|字符串。|
415
+ |DATA_MODEL_DATA_TYPE_ENUM|4|枚举。|
416
+ |DATA_MODEL_DATA_TYPE_TIME|5|时间。|
417
+ |DATA_MODEL_DATA_TYPE_OBJECT|6|预留;当前实现未支持。|
418
+ |DATA_MODEL_DATA_TYPE_ARRAY|7|预留;当前实现未支持。|
419
+
420
+ ### data_model_event_type_t
421
+
422
+ **事件类型**
423
+
424
+ |枚举|取值|描述|
425
+ |---------|---------|---------|
426
+ |DATA_MODEL_EVENT_TYPE_INFO|0|信息类事件。|
427
+ |DATA_MODEL_EVENT_TYPE_ALERT|1|告警类事件。|
428
+ |DATA_MODEL_EVENT_TYPE_FAULT|2|故障类事件。|
429
+
430
+ ### data_model_report_result_t
431
+
432
+ **上报结果**
433
+
434
+ |枚举|取值|描述|
435
+ |---------|---------|---------|
436
+ |DATA_MODEL_REPORT_SUCCESS|0|云端接受。|
437
+ |DATA_MODEL_REPORT_REJECTED|1|云端拒绝。|
438
+ |DATA_MODEL_REPORT_NO_RESPONSE|2|无云端响应。|
439
+ |DATA_MODEL_REPORT_LOCAL_TIMEOUT|3|本地等待超时。|
440
+
441
+ ### data_model_bool_t
442
+
443
+ **布尔属性值类型**
444
+
445
+ typedef bool ​data_model_bool_t
446
+
447
+ ### data_model_int_t
448
+
449
+ **整型属性值类型**
450
+
451
+ typedef int32_t ​data_model_int_t
452
+
453
+ ### data_model_float_t
454
+
455
+ **浮点属性值类型**
456
+
457
+ typedef double ​data_model_float_t
458
+
459
+ ### data_model_string_t
460
+
461
+ **字符串属性值类型(调用方持有指针)**
462
+
463
+ typedef char* ​data_model_string_t
464
+
465
+ ### data_model_enum_t
466
+
467
+ **枚举属性值类型**
468
+
469
+ typedef uint32_t ​data_model_enum_t
470
+
471
+ ### data_model_time_t
472
+
473
+ **时间属性值类型(通常为 Unix 秒)**
474
+
475
+ typedef uint32_t ​data_model_time_t
476
+
477
+ ### tc_iot_data_model_callback_t
478
+
479
+ **物模型回调表**
480
+
481
+ typedef struct ​tc_iot_data_model_callback ​tc_iot_data_model_callback_t
482
+
483
+ ## 音视频(tc_iot_av.h)
484
+
485
+ 音视频通话 / IPC 监控
486
+
487
+ > **线程模型**
488
+ >
489
+ > 本头文件接口可在任意线程调用;信令类操作异步执行。push_* 在调用方线程同步执行。
490
+ >
491
+
492
+ > **回调 / 通知模型**
493
+ >
494
+ > - tc_iot_av_observer_s:init 时拷贝;信令与帧回调可能不在调用方线程;音视频帧回调可能来自媒体线程;所有回调须尽快返回、勿阻塞。
495
+ > - tc_iot_av_operation_cb:call/accept/reject/hangup 的 MQTT 发布结果; 同步 SUCCESS 则一定回调,同步失败则一定不回调。
496
+ > - accept/reject/hangup 要求 callback 非 NULL;call 也应提供有效 callback。
497
+
498
+ > **生命周期**
499
+ >
500
+ > tc_iot_init + ​tc_iot_login 成功 → ​tc_iot_av_init → (可选提前)create_*channel → 按会话推流 / 呼叫 API → destroy* / hangup → ​tc_iot_av_deinit
501
+ >
502
+
503
+ > **推流时机**
504
+ >
505
+ > - 监控:收到 on_monitor_begin 后持续 push_*;on_monitor_end 后可停。 多路监控复用同一音频通道,每路视频会话期间仍须送音频。
506
+ > - VOIP:通话建立后再推(呼出等 on_call_accepted;呼入等 accept 成功)。
507
+ > - 通道可预先 create;无活跃会话时 push 仅缓存,是否进房/上云由会话侧决定。
508
+ > - 云存:创建与套餐通道 ID 对应的视频通道及全局音频通道后持续 push_*;全时 / 事件录像均从该通道取流。仅云存场景无需 tc_iot_av_init。
509
+
510
+ > **业务约束**
511
+ >
512
+ > - 视频通道槽位最多 4 个,channel_id 须唯一;0 合法。与云存联用时须为 0~4。
513
+ > - 音频通道全局仅 1 路;已存在时 create 返回 NULL,须复用指针。
514
+ > - push_audio_frame 上行应送 16-bit PCM。非 PCM 当前仍返回 SUCCESS,但不编码、不供云存使用。
515
+ > - 视频 Annex-B;IDR 须含 SPS/PPS(H265 含 VPS);不支持 B 帧。
516
+ > - 监控与 VOIP 互斥(冲突时返回 AV_ON_*)。
517
+ > - tc_iot_av_get_contacts 异步拉取联系人;callback 不可为 NULL,limit 合法范围为 (0, 1024]。
518
+
519
+ |函数列表|描述|
520
+ |---------|---------|
521
+ |tc_iot_av_init|初始化 AV 模块并注册观察者(内部拷贝 observer)。|
522
+ |tc_iot_av_deinit|反初始化 AV;同步清除单例后异步退订信令。|
523
+ |tc_iot_av_get_contacts|拉取联系人列表。|
524
+ |tc_iot_av_call|发起呼出。|
525
+ |tc_iot_av_accept|接听呼入;仅在振铃态有效,否则回调 AV_ON_*。|
526
+ |tc_iot_av_reject|拒绝呼入;仅在振铃态有效。|
527
+ |tc_iot_av_hangup|挂断当前会话;无对应会话时回调 ​TC_IOT_ERR_AV_ON_IDLE。|
528
+ |tc_iot_create_video_channel|创建视频推流通道。|
529
+ |tc_iot_create_audio_channel|创建全局唯一音频推流通道。|
530
+ |tc_iot_destroy_video_channel|销毁视频通道。|
531
+ |tc_iot_destroy_audio_channel|销毁音频通道。|
532
+ |tc_iot_push_video_frame|推送一帧视频(调用方线程同步)。|
533
+ |tc_iot_push_audio_frame|推送一帧音频(调用方线程同步)。|
534
+
535
+ ### tc_iot_av_init
536
+
537
+ **初始化 AV 模块并注册观察者(内部拷贝 observer)**
538
+
539
+ 须在 login 成功且设备身份就绪后调用。
540
+
541
+ |参数|描述|
542
+ |---------|---------|
543
+ |observer|事件观察者,不可为 NULL。|
544
+
545
+ |返回值|描述|
546
+ |---------|---------|
547
+ |TC_IOT_ERR_SUCCESS|成功。|
548
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
549
+ |TC_IOT_ERR_ALREADY_INITIALIZED|重复初始化。|
550
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
551
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
552
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
553
+ |TC_IOT_ERR_FAILURE|通用失败。|
554
+
555
+ ### tc_iot_av_deinit
556
+
557
+ **反初始化 AV;同步清除单例后异步退订信令**
558
+
559
+ |返回值|描述|
560
+ |---------|---------|
561
+ |TC_IOT_ERR_SUCCESS|成功。|
562
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
563
+
564
+ ### tc_iot_av_get_contacts
565
+
566
+ **拉取联系人列表**
567
+
568
+ 同步返回 SUCCESS 仅表示请求已投递;列表结果或 MQTT 发布失败经 callback 返回。contacts / next_cursor 仅回调期间有效。
569
+
570
+ |参数|描述|
571
+ |---------|---------|
572
+ |cursor|分页游标;首页传 NULL 或空串。|
573
+ |limit|单页条数上限,合法范围 (0, 1024]。|
574
+ |callback|结果回调,不可为 NULL。同步 SUCCESS 则一定回调,失败则不回调。|
575
+
576
+ |返回值|描述|
577
+ |---------|---------|
578
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
579
+ |TC_IOT_ERR_NOT_INITIALIZED|AV 尚未 init。|
580
+ |TC_IOT_ERR_INVALID_ARGUMENT|callback 为空,或 limit 不在 (0, 1024]。|
581
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
582
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
583
+
584
+ ### tc_iot_av_call
585
+
586
+ **发起呼出**
587
+
588
+ contact->user_id 必填;建议提供非 NULL callback。 若已有非监控会话进行中,回调 ​TC_IOT_ERR_AV_ON_CALLING。
589
+
590
+ |参数|描述|
591
+ |---------|---------|
592
+ |contact|被叫联系人。|
593
+ |option|媒体选项。|
594
+ |callback|操作结果回调。|
595
+
596
+ |返回值|描述|
597
+ |---------|---------|
598
+ |TC_IOT_ERR_SUCCESS|成功。|
599
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
600
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
601
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
602
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
603
+
604
+ ### tc_iot_av_accept
605
+
606
+ **接听呼入;仅在振铃态有效,否则回调 AV_ON_** *
607
+
608
+ |参数|描述|
609
+ |---------|---------|
610
+ |contact|主叫联系人。|
611
+ |callback|操作结果回调,不可为 NULL。|
612
+
613
+ |返回值|描述|
614
+ |---------|---------|
615
+ |TC_IOT_ERR_SUCCESS|成功。|
616
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
617
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
618
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
619
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
620
+
621
+ ### tc_iot_av_reject
622
+
623
+ **拒绝呼入;仅在振铃态有效**
624
+
625
+ |参数|描述|
626
+ |---------|---------|
627
+ |contact|主叫联系人。|
628
+ |callback|操作结果回调,不可为 NULL。|
629
+
630
+ |返回值|描述|
631
+ |---------|---------|
632
+ |TC_IOT_ERR_SUCCESS|成功。|
633
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
634
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
635
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
636
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
637
+
638
+ ### tc_iot_av_hangup
639
+
640
+ **挂断当前会话;无对应会话时回调 ​**TC_IOT_ERR_AV_ON_IDLE
641
+
642
+ |参数|描述|
643
+ |---------|---------|
644
+ |contact|对端联系人。|
645
+ |callback|操作结果回调,不可为 NULL。|
646
+
647
+ |返回值|描述|
648
+ |---------|---------|
649
+ |TC_IOT_ERR_SUCCESS|成功。|
650
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
651
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
652
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
653
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
654
+
655
+ ### tc_iot_create_video_channel
656
+
657
+ **创建视频推流通道**
658
+
659
+ channel_id 全局唯一,同时最多 4 路;0 合法。与云存联用时须为 0~4。
660
+
661
+ |参数|描述|
662
+ |---------|---------|
663
+ |channel_id|通道 ID;须唯一。0 合法。云存联用时须为 0~4。|
664
+ |quality|画质档位。|
665
+
666
+ |返回值|描述|
667
+ |---------|---------|
668
+ |tc_iot_av_channel_t *|通道句柄;失败返回 NULL(未 init / id 冲突 / 已满 / OOM)。|
669
+
670
+ ### tc_iot_create_audio_channel
671
+
672
+ **创建全局唯一音频推流通道**
673
+
674
+ 已存在或未 init 时返回 NULL。多路监控须复用同一指针。
675
+
676
+ |返回值|描述|
677
+ |---------|---------|
678
+ |tc_iot_av_channel_t *|通道句柄;失败返回 NULL。|
679
+
680
+ ### tc_iot_destroy_video_channel
681
+
682
+ **销毁视频通道**
683
+
684
+ |参数|描述|
685
+ |---------|---------|
686
+ |av_channel|视频通道。|
687
+
688
+ |返回值|描述|
689
+ |---------|---------|
690
+ |TC_IOT_ERR_SUCCESS|成功。|
691
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
692
+
693
+ ### tc_iot_destroy_audio_channel
694
+
695
+ **销毁音频通道**
696
+
697
+ |参数|描述|
698
+ |---------|---------|
699
+ |av_channel|音频通道。|
700
+
701
+ |返回值|描述|
702
+ |---------|---------|
703
+ |TC_IOT_ERR_SUCCESS|成功。|
704
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
705
+
706
+ ### tc_iot_push_video_frame
707
+
708
+ **推送一帧视频(调用方线程同步)**
709
+
710
+ 须为视频通道。格式见 tc_iot_def.h(Annex-B;IDR 含参数集)。
711
+
712
+ |参数|描述|
713
+ |---------|---------|
714
+ |av_channel|视频通道。|
715
+ |frame|视频帧。|
716
+
717
+ |返回值|描述|
718
+ |---------|---------|
719
+ |TC_IOT_ERR_SUCCESS|成功。|
720
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
721
+
722
+ ### tc_iot_push_audio_frame
723
+
724
+ **推送一帧音频(调用方线程同步)**
725
+
726
+ 须为音频通道。上行应送 16-bit PCM;非 PCM 仍返回 SUCCESS,但不编码、不供云存使用。同一通道生命周期内 sample_rate / channels 应保持稳定。
727
+
728
+ |参数|描述|
729
+ |---------|---------|
730
+ |av_channel|音频通道。|
731
+ |frame|音频帧。|
732
+
733
+ |返回值|描述|
734
+ |---------|---------|
735
+ |TC_IOT_ERR_SUCCESS|成功。非 PCM 时亦返回 SUCCESS,但不编码。|
736
+ |TC_IOT_ERR_INVALID_ARGUMENT|空指针或非音频通道。|
737
+
738
+ ### ptz_command_e
739
+
740
+ **云台控制命令**
741
+
742
+ |枚举|取值|描述|
743
+ |---------|---------|---------|
744
+ |PTZ_CMD_UP|0|上仰|
745
+ |PTZ_CMD_DOWN|1|下俯|
746
+ |PTZ_CMD_LEFT|2|左转|
747
+ |PTZ_CMD_RIGHT|3|右转|
748
+ |PTZ_CMD_ZOOM_IN|4|放大|
749
+ |PTZ_CMD_ZOOM_OUT|5|缩小|
750
+ |PTZ_CMD_STOP|6|停止运动|
751
+
752
+ ### tc_iot_av_channel_t
753
+
754
+ **不透明 AV 推流通道句柄**
755
+
756
+ typedef struct ​tc_iot_av_channel_s ​tc_iot_av_channel_t
757
+
758
+ ### tc_iot_call_option_t
759
+
760
+ **呼叫 / 监控媒体选项**
761
+
762
+ typedef struct ​tc_iot_call_option_s ​tc_iot_call_option_t
763
+
764
+ ### tc_iot_av_operation_cb
765
+
766
+ **呼叫操作完成回调**
767
+
768
+ typedef void(* ​tc_iot_av_operation_cb) (​tc_iot_error_e error_code, const char *error_message)
769
+
770
+ |参数|描述|
771
+ |---------|---------|
772
+ |error_code|结果码。|
773
+ |error_message|错误描述,可为 NULL。|
774
+
775
+ ### tc_iot_av_contacts_cb
776
+
777
+ **联系人列表回调**
778
+
779
+ typedef void(* ​tc_iot_av_contacts_cb) (​tc_iot_error_e error_code, const char *error_message, const ​tc_iot_contact_s *contacts, uint32_t count, const char *next_cursor)
780
+
781
+ contacts、error_message、next_cursor 仅回调期间有效,须在返回前拷贝。
782
+
783
+ ### 宏定义
784
+
785
+ |宏|取值|描述|
786
+ |---------|---------|---------|
787
+ |MAX_CUSTOM_DATA_LENGTH|256|call_option.custom_data 数组容量(含结尾 '\0')。|
788
+
789
+ ## 云存储(tc_iot_cloud_storage.h)
790
+
791
+ 全时 / 事件录像与抓图上报。
792
+
793
+ > **线程模型**
794
+ >
795
+ > 本头文件接口可在任意线程调用;不得在云存回调内调用会阻塞的接口。
796
+ >
797
+ > init / deinit / report_event_snapshot:提交后立即返回。
798
+ >
799
+ > get_plan_type:同步读取当前套餐。
800
+ >
801
+ > start/stop_continuous_recording、start/stop_event_recording:提交后阻塞等待完成后返回。
802
+ >
803
+
804
+ > **回调 / 通知模型**
805
+ >
806
+ > - 回调须尽快返回;回调内不得调用会阻塞的云存接口。
807
+ > - on_init_result:同步返回 SUCCESS 则一定会回调;同步失败则一定不回调。
808
+ > - on_event_result:事件上报与图片上传完成后通知;event_result 仅在回调期间有效。
809
+ > - on_plan_type_changed:云端套餐变更时通知。
810
+ > - picture_data 须在对应 on_event_result 触发前始终有效。
811
+
812
+ > **生命周期**
813
+ >
814
+ > tc_iot_init → ​tc_iot_login 成功 → (按通道 ​tc_iot_create_video_channel / ​tc_iot_create_audio_channel 并持续 push 帧)→ ​tc_iot_cloud_storage_init → 等待 on_init_result → 按套餐开始录像 / 抓图 → ​tc_iot_cloud_storage_deinit。
815
+ >
816
+
817
+ > **业务约束**
818
+ >
819
+ > - channel_id 合法范围为 0~4;同时在线通道不超过 4 路。
820
+ > - 录像从与 channel_id 对应的视频通道及全局音频通道取流。仅云存场景无需调用 tc_iot_av_init,create/push 即可。
821
+ > - 视频为 H264/H265 Annex-B 裸流;音频经 tc_iot_push_audio_frame 送 16-bit PCM。
822
+ > - 全时套餐才可 start_continuous_recording;事件或全时套餐可 start_event_recording。
823
+ > - 图片套餐或视频套餐可 report_event_snapshot。
824
+ > - 同一通道同一 event_id 不可并发;重复开始返回失败。
825
+
826
+ |函数列表|描述|
827
+ |---------|---------|
828
+ |tc_iot_cloud_storage_init|初始化云存储并查询套餐。|
829
+ |tc_iot_cloud_storage_deinit|反初始化云存储,停止录像并释放资源。|
830
+ |tc_iot_cloud_storage_get_plan_type|查询指定通道当前云存套餐类型。|
831
+ |tc_iot_cloud_storage_start_continuous_recording|开始全时录像。|
832
+ |tc_iot_cloud_storage_stop_continuous_recording|停止全时录像。|
833
+ |tc_iot_cloud_storage_start_event_recording|开始事件录像。|
834
+ |tc_iot_cloud_storage_stop_event_recording|停止事件录像。|
835
+ |tc_iot_cloud_storage_report_event_snapshot|上报事件抓图。|
836
+
837
+ ### tc_iot_cloud_storage_init
838
+
839
+ **初始化云存储并查询套餐**
840
+
841
+ 须先完成 SDK 初始化和登录。初始化请求提交后,SDK 向云端查询各通道套餐,结果通过 on_init_result 回调。
842
+
843
+ |参数|描述|
844
+ |---------|---------|
845
+ |cloud_storage_callback|tc_iot_cloud_storage_callback_t 回调表,不可为 NULL;on_init_result 为必选回调。|
846
+
847
+ |返回值|描述|
848
+ |---------|---------|
849
+ |TC_IOT_ERR_SUCCESS|初始化请求已提交,结果通过 on_init_result 回调。|
850
+ |TC_IOT_ERR_INVALID_ARGUMENT|回调表为空,或未注册 on_init_result。|
851
+ |TC_IOT_ERR_ALREADY_INITIALIZED|云存储已初始化。|
852
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 未初始化。|
853
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
854
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
855
+
856
+ ### tc_iot_cloud_storage_deinit
857
+
858
+ **反初始化云存储,停止录像并释放资源**
859
+
860
+ 设备退出登录或释放 SDK 前调用。反初始化会停止正在进行的录像;未完成的事件可能以 EVENT_CANCELLED 结束。无独立完成回调。
861
+
862
+ |返回值|描述|
863
+ |---------|---------|
864
+ |TC_IOT_ERR_SUCCESS|反初始化请求已提交。|
865
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 未初始化。|
866
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
867
+
868
+ ### tc_iot_cloud_storage_get_plan_type
869
+
870
+ **查询指定通道当前云存套餐类型**
871
+
872
+ 可在任意线程调用。优先返回视频套餐(全时 / 事件);无视频套餐且开通图片套餐时返回 IMAGE。通道不存在、尚未 init 完成或 channel_id 非法时返回 UNKNOWN。
873
+
874
+ |参数|描述|
875
+ |---------|---------|
876
+ |channel_id|通道 ID,合法范围 0~4。|
877
+
878
+ |返回值|描述|
879
+ |---------|---------|
880
+ |tc_iot_cloud_storage_plan_type_t|当前套餐类型;见枚举说明。|
881
+
882
+ ### tc_iot_cloud_storage_start_continuous_recording
883
+
884
+ **开始全时录像**
885
+
886
+ 仅在该通道套餐为 FULL_TIME 时有效。调用方须已创建对应视频通道和全局音频通道,并持续 push 音视频帧。本接口阻塞等待内部启动完成。
887
+
888
+ |参数|描述|
889
+ |---------|---------|
890
+ |channel_id|通道 ID,合法范围 0~4。|
891
+
892
+ |返回值|描述|
893
+ |---------|---------|
894
+ |TC_IOT_ERR_SUCCESS|已开始全时录像。|
895
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或云存储未初始化。|
896
+ |TC_IOT_ERR_INVALID_ARGUMENT|channel_id 超出合法范围。|
897
+ |TC_IOT_ERR_CLOUD_STORAGE_CHANNEL_NOT_FOUND|该 channel_id 无云存套餐。|
898
+ |TC_IOT_ERR_CLOUD_STORAGE_NO_PLAN|当前不是全时套餐。|
899
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
900
+ |TC_IOT_ERR_FAILURE|请求提交失败或内部启动失败。|
901
+
902
+ ### tc_iot_cloud_storage_stop_continuous_recording
903
+
904
+ **停止全时录像**
905
+
906
+ 停止指定通道的全时录像。未在录像时也返回成功。本接口阻塞等待内部停止完成。
907
+
908
+ |参数|描述|
909
+ |---------|---------|
910
+ |channel_id|通道 ID,合法范围 0~4。|
911
+
912
+ |返回值|描述|
913
+ |---------|---------|
914
+ |TC_IOT_ERR_SUCCESS|已停止,或当前未在全时录像。|
915
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或云存储未初始化。|
916
+ |TC_IOT_ERR_INVALID_ARGUMENT|channel_id 超出合法范围。|
917
+ |TC_IOT_ERR_CLOUD_STORAGE_CHANNEL_NOT_FOUND|该 channel_id 无云存套餐。|
918
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
919
+ |TC_IOT_ERR_FAILURE|请求提交失败或内部停止失败。|
920
+
921
+ ### tc_iot_cloud_storage_start_event_recording
922
+
923
+ **开始事件录像**
924
+
925
+ 在事件或全时套餐下开始一段事件录像。同步 SUCCESS 表示事件已受理;上报与图片上传结果通过 on_event_result 回调。本接口阻塞等待内部启动完成。
926
+
927
+ |参数|描述|
928
+ |---------|---------|
929
+ |channel_id|通道 ID,合法范围 0~4。|
930
+ |event_params|tc_iot_cloud_storage_event_params_t 事件参数,不可为 NULL。picture_data 若非空,须在 on_event_result 前保持有效。|
931
+
932
+ |返回值|描述|
933
+ |---------|---------|
934
+ |TC_IOT_ERR_SUCCESS|事件录像已开始,结果通过 on_event_result 回调。|
935
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数为空或 channel_id 超出合法范围。|
936
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或云存储未初始化。|
937
+ |TC_IOT_ERR_CLOUD_STORAGE_CHANNEL_NOT_FOUND|该 channel_id 无云存套餐。|
938
+ |TC_IOT_ERR_CLOUD_STORAGE_NO_PLAN|当前不是事件或全时套餐。|
939
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
940
+ |TC_IOT_ERR_FAILURE|请求提交失败、event_id 重复或内部启动失败。|
941
+
942
+ ### tc_iot_cloud_storage_stop_event_recording
943
+
944
+ **停止事件录像**
945
+
946
+ 结束指定 event_id 的事件录像。本接口阻塞等待内部停止完成;事件最终结果仍通过 on_event_result 回调。
947
+
948
+ |参数|描述|
949
+ |---------|---------|
950
+ |channel_id|通道 ID,合法范围 0~4。|
951
+ |event_id|须与 start_event_recording 时传入的 event_id 一致。|
952
+
953
+ |返回值|描述|
954
+ |---------|---------|
955
+ |TC_IOT_ERR_SUCCESS|停止请求已完成。|
956
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或云存储未初始化。|
957
+ |TC_IOT_ERR_INVALID_ARGUMENT|channel_id 超出合法范围。|
958
+ |TC_IOT_ERR_CLOUD_STORAGE_CHANNEL_NOT_FOUND|该 channel_id 无云存套餐。|
959
+ |TC_IOT_ERR_CLOUD_STORAGE_EVENT_NOT_FOUND|未找到对应事件。|
960
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
961
+ |TC_IOT_ERR_FAILURE|请求提交失败或内部停止失败。|
962
+
963
+ ### tc_iot_cloud_storage_report_event_snapshot
964
+
965
+ **上报事件抓图**
966
+
967
+ 上报一张事件图片,不启动录像。同步 SUCCESS 表示请求已投递;结果通过 on_event_result 回调。picture_data 须在回调前保持有效。
968
+
969
+ |参数|描述|
970
+ |---------|---------|
971
+ |channel_id|通道 ID,合法范围 0~4。|
972
+ |event_params|tc_iot_cloud_storage_event_params_t 事件参数,不可为 NULL。抓图场景忽略 pre_record_seconds。|
973
+
974
+ |返回值|描述|
975
+ |---------|---------|
976
+ |TC_IOT_ERR_SUCCESS|请求已投递,结果通过 on_event_result 回调。|
977
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数为空或 channel_id 超出合法范围。|
978
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或云存储未初始化。|
979
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
980
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
981
+
982
+ ### tc_iot_cloud_storage_plan_type_t
983
+
984
+ **云存套餐类型**
985
+
986
+ get_plan_type 与 on_plan_type_changed 使用该枚举。视频套餐优先于图片套餐。
987
+
988
+ |枚举|取值|描述|
989
+ |---------|---------|---------|
990
+ |TC_IOT_CLOUD_STORAGE_PLAN_TYPE_UNKNOWN|0|尚未查询到套餐、通道不存在或参数非法。|
991
+ |TC_IOT_CLOUD_STORAGE_PLAN_TYPE_NONE|1|通道存在但无有效云存套餐。|
992
+ |TC_IOT_CLOUD_STORAGE_PLAN_TYPE_FULL_TIME|2|全时录像套餐。|
993
+ |TC_IOT_CLOUD_STORAGE_PLAN_TYPE_EVENT|3|事件录像套餐。|
994
+ |TC_IOT_CLOUD_STORAGE_PLAN_TYPE_IMAGE|4|仅图片 / 抓图套餐。|
995
+
996
+ ### tc_iot_cloud_storage_event_params_t
997
+
998
+ **事件录像 / 抓图参数**
999
+
1000
+ start_event_recording 与 report_event_snapshot 共用。picture_data 由调用方持有,回调返回前不得释放。
1001
+
1002
+ |字段|类型|描述|
1003
+ |---------|---------|---------|
1004
+ |event_id|uint32_t|事件 ID;同一通道内不可与未结束事件重复。|
1005
+ |picture_data|const uint8_t *|事件配图,可为 NULL 表示无图;非空时须在 on_event_result 前保持有效。|
1006
+ |picture_size|uint32_t|配图像素数据长度;picture_data 为 NULL 时须为 0。|
1007
+ |pre_record_seconds|uint32_t|事件录像预录秒数;仅 start_event_recording 使用,抓图忽略。|
1008
+ |extra_info|const char *|附加信息 JSON 字符串,可为 NULL。|
1009
+
1010
+ ### tc_iot_cloud_storage_event_result_t
1011
+
1012
+ **事件处理结果**
1013
+
1014
+ 通过 on_event_result 回传;仅在回调期间有效。
1015
+
1016
+ |字段|类型|描述|
1017
+ |---------|---------|---------|
1018
+ |event_id|uint32_t|对应请求中的事件 ID。|
1019
+ |event_report_result|tc_iot_error_e|事件上报结果;成功为 SUCCESS,失败常见为 REPORT_FAILED 或 EVENT_CANCELLED。|
1020
+ |picture_upload_result|tc_iot_error_e|图片上传结果;无图时为 SUCCESS,失败常见为 PIC_UPLOAD_FAILED 或 EVENT_CANCELLED。|
1021
+
1022
+ ### tc_iot_cloud_storage_callback_t
1023
+
1024
+ **云存储回调表**
1025
+
1026
+ init 时拷贝函数指针。on_init_result 必填;其余可选。
1027
+
1028
+ |字段|类型|描述|
1029
+ |---------|---------|---------|
1030
+ |on_init_result|void(* on_init_result) (tc_iot_error_e error_code, const char *error_message)|必填;套餐查询完成或失败时回调。|
1031
+ |on_event_result|void(* on_event_result) (uint8_t channel_id, const tc_iot_cloud_storage_event_result_t *event_result)|可选;事件录像或抓图处理完成时回调。|
1032
+ |on_plan_type_changed|void(* on_plan_type_changed) (uint8_t channel_id, tc_iot_cloud_storage_plan_type_t plan_type)|可选;云端套餐变更时回调。|
1033
+
1034
+ ### on_init_result
1035
+
1036
+ **云存储初始化结果回调**
1037
+
1038
+ 套餐查询成功时 error_code 为 SUCCESS,之后可通过 get_plan_type 读取各通道套餐。失败时常见为 PLANS_QUERY_FAILED。
1039
+
1040
+ |参数|描述|
1041
+ |---------|---------|
1042
+ |error_code|成功时为 ​TC_IOT_ERR_SUCCESS。|
1043
+ |error_message|错误描述,可为 NULL。仅在回调期间有效。|
1044
+
1045
+ ### on_event_result
1046
+
1047
+ **事件处理结果回调**
1048
+
1049
+ 事件录像结束或抓图上报完成后回调。收到回调后,对应 picture_data 即可释放。
1050
+
1051
+ |参数|描述|
1052
+ |---------|---------|
1053
+ |channel_id|通道 ID。|
1054
+ |event_result|tc_iot_cloud_storage_event_result_t 结果,仅在回调期间有效。|
1055
+
1056
+ ### on_plan_type_changed
1057
+
1058
+ **套餐变更回调**
1059
+
1060
+ 云端套餐开通、变更或失效时回调。全时套餐失效时 SDK 会停止该通道录像;业务应按新套餐决定是否重新 start_continuous_recording。
1061
+
1062
+ |参数|描述|
1063
+ |---------|---------|
1064
+ |channel_id|通道 ID。|
1065
+ |plan_type|tc_iot_cloud_storage_plan_type_t 变更后的套餐类型。|
1066
+
1067
+ ## AI 对话(tc_iot_aitalk.h)
1068
+
1069
+ AI 对话(AITalk)
1070
+
1071
+ > **线程模型**
1072
+ >
1073
+ > 本头文件接口可在任意线程调用;多数操作为异步提交。 ​tc_iot_aitalk_deinit 为阻塞等待清理完成。
1074
+ >
1075
+
1076
+ > **回调 / 通知模型**
1077
+ >
1078
+ > - observer:init 时拷贝函数指针;user_data 透传到各回调。
1079
+ > - on_receive_bot_audio 等媒体/文本回调可能来自通道线程,须尽快返回。
1080
+ > - on_error 可能不在调用方线程。
1081
+ > - tc_iot_aitalk_operation_cb(start_speak / register_contacts): 同步 SUCCESS 则一定回调;同步失败则一定不回调 (非法 mode 例外:同步返回 INVALID_ARGUMENT 且同步调用 callback)。
1082
+
1083
+ > **生命周期**
1084
+ >
1085
+ > tc_iot_init → ​tc_iot_login → ​tc_iot_aitalk_init → (可选)register_contacts → start_speak → send_audio / send_text → stop_speak → ​tc_iot_aitalk_deinit
1086
+ >
1087
+
1088
+ > **业务约束**
1089
+ >
1090
+ > - 当前仅支持 ​TC_IOT_AITALK_MODE_CONTINUOUS。
1091
+ > - interrupt 仅连续模式有效;PTT 模式下经 on_error 通知 AITALK_NOT_SUPPORT,同步仍可能返回 SUCCESS(任务已投递)。
1092
+ > - init 的 codec 须为 AAC / OPUS / G722。
1093
+ > - send_audio:帧 codec 与 init 一致,或送 16-bit PCM(可由 SDK 编码)。
1094
+ > - 推荐 16 kHz 单声道;frame_duration_ms 与 codec 匹配(如 20)。
1095
+ > - 下行 bot 音频格式由通道侧决定,以 on_receive_bot_audio 的 frame 字段为准(常见为 PCM)。
1096
+
1097
+ |函数列表|描述|
1098
+ |---------|---------|
1099
+ |tc_iot_aitalk_init|初始化 AITalk。|
1100
+ |tc_iot_aitalk_deinit|反初始化;阻塞等待内部清理完成。|
1101
+ |tc_iot_aitalk_start_speak|开始对话。|
1102
+ |tc_iot_aitalk_stop_speak|停止对话(异步投递,空闲时幂等成功)。|
1103
+ |tc_iot_aitalk_send_audio|发送一帧上行音频。|
1104
+ |tc_iot_aitalk_send_text|发送文本给 LLM。|
1105
+ |tc_iot_aitalk_register_contacts|注册可供机器人呼叫的联系人。|
1106
+ |tc_iot_aitalk_interrupt|打断机器人当前播报(连续模式下有效)。|
1107
+
1108
+ ### tc_iot_aitalk_init
1109
+
1110
+ **初始化 AITalk**
1111
+
1112
+ 须已 ​tc_iot_init。
1113
+
1114
+ |参数|描述|
1115
+ |---------|---------|
1116
+ |init_params|初始化参数。|
1117
+ |observer|事件观察者。|
1118
+ |user_data|透传到各 observer 回调。|
1119
+
1120
+ |返回值|描述|
1121
+ |---------|---------|
1122
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
1123
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
1124
+ |TC_IOT_ERR_ALREADY_INITIALIZED|重复初始化。|
1125
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1126
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1127
+
1128
+ ### tc_iot_aitalk_deinit
1129
+
1130
+ **反初始化;阻塞等待内部清理完成**
1131
+
1132
+ 若会话进行中,会先停止会话。
1133
+
1134
+ |返回值|描述|
1135
+ |---------|---------|
1136
+ |TC_IOT_ERR_SUCCESS|成功。|
1137
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1138
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1139
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1140
+
1141
+ ### tc_iot_aitalk_start_speak
1142
+
1143
+ **开始对话**
1144
+
1145
+ 仅支持 CONTINUOUS;会话已有效时立即成功回调。
1146
+
1147
+ |参数|描述|
1148
+ |---------|---------|
1149
+ |mode|对话模式。|
1150
+ |callback|结果回调。|
1151
+
1152
+ |返回值|描述|
1153
+ |---------|---------|
1154
+ |TC_IOT_ERR_SUCCESS|成功。|
1155
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
1156
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1157
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1158
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1159
+
1160
+ ### tc_iot_aitalk_stop_speak
1161
+
1162
+ **停止对话(异步投递,空闲时幂等成功)**
1163
+
1164
+ |返回值|描述|
1165
+ |---------|---------|
1166
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
1167
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1168
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1169
+
1170
+ ### tc_iot_aitalk_send_audio
1171
+
1172
+ **发送一帧上行音频**
1173
+
1174
+ 同步 SUCCESS 表示任务已投递;未进房时内部可能丢弃。
1175
+
1176
+ |参数|描述|
1177
+ |---------|---------|
1178
+ |frame|音频帧。|
1179
+
1180
+ |返回值|描述|
1181
+ |---------|---------|
1182
+ |TC_IOT_ERR_SUCCESS|成功。|
1183
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1184
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
1185
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1186
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1187
+
1188
+ ### tc_iot_aitalk_send_text
1189
+
1190
+ **发送文本给 LLM**
1191
+
1192
+ |参数|描述|
1193
+ |---------|---------|
1194
+ |text|文本;长度不超过 1024。|
1195
+
1196
+ |返回值|描述|
1197
+ |---------|---------|
1198
+ |TC_IOT_ERR_SUCCESS|成功。|
1199
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1200
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
1201
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1202
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1203
+
1204
+ ### tc_iot_aitalk_register_contacts
1205
+
1206
+ **注册可供机器人呼叫的联系人**
1207
+
1208
+ count ∈ [1, TC_IOT_AITALK_MAX_CONTACT_COUNT]。 结果缓存至下次会话;callback 报告缓存结果。
1209
+
1210
+ |参数|描述|
1211
+ |---------|---------|
1212
+ |contacts|联系人数组。|
1213
+ |contact_count|数量。|
1214
+ |callback|结果回调。|
1215
+
1216
+ |返回值|描述|
1217
+ |---------|---------|
1218
+ |TC_IOT_ERR_SUCCESS|成功。|
1219
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1220
+ |TC_IOT_ERR_INVALID_ARGUMENT|参数非法(空指针、非法取值等)。|
1221
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1222
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1223
+
1224
+ ### tc_iot_aitalk_interrupt
1225
+
1226
+ **打断机器人当前播报(连续模式下有效)**
1227
+
1228
+ |返回值|描述|
1229
+ |---------|---------|
1230
+ |TC_IOT_ERR_SUCCESS|任务已投递。|
1231
+ |TC_IOT_ERR_NOT_INITIALIZED|核心或业务模块尚未 init。|
1232
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1233
+
1234
+ > **注意**
1235
+ >
1236
+ > 同步 SUCCESS 仅表示任务已投递。PTT 模式不支持 interrupt,经 on_error 通知 ​TC_IOT_ERR_AITALK_NOT_SUPPORT。
1237
+ >
1238
+
1239
+ ### tc_iot_aitalk_mode_e
1240
+
1241
+ **对话模式**
1242
+
1243
+ |枚举|取值|描述|
1244
+ |---------|---------|---------|
1245
+ |TC_IOT_AITALK_MODE_CONTINUOUS|0|连续对话(当前唯一可用模式)。|
1246
+ |TC_IOT_AITALK_MODE_PUSH_TO_TALK|1|按键说话;当前 start_speak 不接受该模式。|
1247
+
1248
+ ### tc_iot_aitalk_bot_state_e
1249
+
1250
+ **机器人状态**
1251
+
1252
+ |枚举|取值|描述|
1253
+ |---------|---------|---------|
1254
+ |TC_IOT_AITALK_BOT_STATE_LISTENING|1|正在聆听用户语音。|
1255
+ |TC_IOT_AITALK_BOT_STATE_THINKING|2|正在思考 / 推理。|
1256
+ |TC_IOT_AITALK_BOT_STATE_SPEAKING|3|正在播报回复。|
1257
+ |TC_IOT_AITALK_BOT_STATE_INTERRUPTED|4|播报被打断。|
1258
+ |TC_IOT_AITALK_BOT_STATE_FINISHED|5|本轮对话结束。|
1259
+
1260
+ ### tc_iot_aitalk_operation_cb
1261
+
1262
+ **异步操作结果回调(start_speak / register_contacts)**
1263
+
1264
+ typedef void(* ​tc_iot_aitalk_operation_cb) (​tc_iot_error_e error_code, const char *error_message)
1265
+
1266
+ ### 宏定义
1267
+
1268
+ |宏|取值|描述|
1269
+ |---------|---------|---------|
1270
+ |TC_IOT_AITALK_BOT_ID_MAX_LEN|16|bot_id 最大长度(不含结尾 '\0')。|
1271
+ |TC_IOT_AITALK_MAX_CONTACT_COUNT|10|register_contacts 单次最多联系人数。|
1272
+
1273
+ ## 录音卡(tc_iot_audio_recorder.h)
1274
+
1275
+ 经 BLE 通道录制上行音频(当前版本本地落盘尚未启用)。
1276
+
1277
+ > **线程模型**
1278
+ >
1279
+ > 本头文件接口可在任意线程调用;init / start / stop / send_audio 为异步提交。 ​tc_iot_audio_recorder_deinit 阻塞等待内部清理完成后返回。
1280
+ >
1281
+
1282
+ > **回调 / 通知模型**
1283
+ >
1284
+ > - observer:init 时拷贝函数指针;user_data 透传到各回调。回调须尽快返回。
1285
+ > - on_audio_recorder_start / on_audio_recorder_stop:录音会话真正开始或结束后通知。params 仅在回调期间有效。
1286
+ > - on_error:无可用输出、传输断开等异常路径通知。
1287
+ > - tc_iot_audio_recorder_operation_cb(start):若 callback 非 NULL,同步 SUCCESS 则一定会回调;同步失败则一定不回调。
1288
+
1289
+ > **生命周期**
1290
+ >
1291
+ > tc_iot_init → ​tc_iot_audio_recorder_init → (等待 BLE 传输就绪)→ start → send_audio → stop → ​tc_iot_audio_recorder_deinit。录音卡不依赖 AV / AITalk 初始化。
1292
+ >
1293
+
1294
+ > **业务约束**
1295
+ >
1296
+ > - start 前须 BLE 传输就绪(当前版本本地落盘尚未启用)。
1297
+ > - 当前版本本地落盘尚未启用,start 依赖 BLE 传输就绪;未就绪时 start 回调 ​TC_IOT_ERR_NOT_CONNECTED,并通过 on_error 通知。
1298
+ > - send_audio 同步 SUCCESS 表示帧已拷贝并投递,调用返回后即可释放 frame->data。未在录音中时同步仍可能 SUCCESS,该帧会被丢弃,并通过 on_error 通知 NOT_CONNECTED。
1299
+ > - 重复 start(已在录音)会回调 FAILURE;未在录音时 stop 内部忽略。
1300
+ > - storage_path 只保存指针,不拷贝字符串;非空时须在 deinit 前保持有效。
1301
+
1302
+ |函数列表|描述|
1303
+ |---------|---------|
1304
+ |tc_iot_audio_recorder_init|初始化录音卡并注册观察者。|
1305
+ |tc_iot_audio_recorder_deinit|反初始化;阻塞等待内部清理完成。|
1306
+ |tc_iot_audio_recorder_start|开始录音。|
1307
+ |tc_iot_audio_recorder_stop|停止录音(异步投递)。|
1308
+ |tc_iot_audio_recorder_send_audio|发送一帧录音音频。|
1309
+
1310
+ ### tc_iot_audio_recorder_init
1311
+
1312
+ **初始化录音卡并注册观察者**
1313
+
1314
+ 须先完成 SDK 初始化。内部拷贝 params 与 observer 函数指针。同步 SUCCESS 表示任务已投递,无独立 init 完成回调。
1315
+
1316
+ |参数|描述|
1317
+ |---------|---------|
1318
+ |init_params|tc_iot_audio_recorder_params_s 初始化配置,不可为 NULL。|
1319
+ |observers|tc_iot_audio_recorder_observer_s 回调表,不可为 NULL;各回调指针均可为 NULL。|
1320
+ |user_data|自定义回调上下文,可为 NULL;须在 deinit 及回调完成前保持有效。|
1321
+
1322
+ |返回值|描述|
1323
+ |---------|---------|
1324
+ |TC_IOT_ERR_SUCCESS|初始化请求已提交。|
1325
+ |TC_IOT_ERR_INVALID_ARGUMENT|init_params 或 observers 为空。|
1326
+ |TC_IOT_ERR_ALREADY_INITIALIZED|录音卡已初始化。|
1327
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 未初始化。|
1328
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足或请求提交失败。|
1329
+
1330
+ ### tc_iot_audio_recorder_deinit
1331
+
1332
+ **反初始化;阻塞等待内部清理完成**
1333
+
1334
+ 停止会话并释放资源后返回。deinit 后 start / send_audio / stop 返回 NOT_INITIALIZED。
1335
+
1336
+ |返回值|描述|
1337
+ |---------|---------|
1338
+ |TC_IOT_ERR_SUCCESS|已完成反初始化。|
1339
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或录音卡未初始化。|
1340
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1341
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1342
+
1343
+ ### tc_iot_audio_recorder_start
1344
+
1345
+ **开始录音**
1346
+
1347
+ 请求已提交。BLE 就绪后建立录音会话;成功时触发 on_audio_recorder_start。若提供 callback,结果通过该回调返回。
1348
+
1349
+ |参数|描述|
1350
+ |---------|---------|
1351
+ |callback|tc_iot_audio_recorder_operation_cb 开始结果回调,可为 NULL。|
1352
+
1353
+ |返回值|描述|
1354
+ |---------|---------|
1355
+ |TC_IOT_ERR_SUCCESS|请求已提交;若提供 callback 则一定会回调。|
1356
+ |TC_IOT_ERR_NOT_INITIALIZED|录音卡未初始化。|
1357
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1358
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1359
+
1360
+ ### tc_iot_audio_recorder_stop
1361
+
1362
+ **停止录音(异步投递)**
1363
+
1364
+ 同步 SUCCESS 表示请求已投递。无独立完成回调;会话结束后通过 on_audio_recorder_stop 通知。未在录音时内部忽略。
1365
+
1366
+ |返回值|描述|
1367
+ |---------|---------|
1368
+ |TC_IOT_ERR_SUCCESS|停止请求已提交。|
1369
+ |TC_IOT_ERR_NOT_INITIALIZED|录音卡未初始化。|
1370
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1371
+
1372
+ ### tc_iot_audio_recorder_send_audio
1373
+
1374
+ **发送一帧录音音频**
1375
+
1376
+ 同步 SUCCESS 表示帧数据已拷贝并受理,调用返回后即可释放 frame->data。未在录音中时同步仍可能 SUCCESS,随后经 on_error 通知 NOT_CONNECTED 并丢弃该帧。
1377
+
1378
+ |参数|描述|
1379
+ |---------|---------|
1380
+ |frame|tc_iot_audio_frame 音频帧,不可为 NULL;data 不可为 NULL,data_size 须大于 0。|
1381
+
1382
+ |返回值|描述|
1383
+ |---------|---------|
1384
+ |TC_IOT_ERR_SUCCESS|帧已拷贝并投递。未在录音中时仍可能返回此值,随后经 on_error 丢弃。|
1385
+ |TC_IOT_ERR_NOT_INITIALIZED|录音卡未初始化。|
1386
+ |TC_IOT_ERR_INVALID_ARGUMENT|frame / data 为空,或 data_size 为 0。|
1387
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1388
+ |TC_IOT_ERR_FAILURE|请求提交失败。|
1389
+
1390
+ ### tc_iot_audio_recorder_params_s
1391
+
1392
+ **录音卡初始化配置**
1393
+
1394
+ init 时按值拷贝结构体;storage_path 字符串本身不拷贝。
1395
+
1396
+ |字段|类型|描述|
1397
+ |---------|---------|---------|
1398
+ |storage_path|const char *|本地录音目录,可为 NULL;非空时须在 deinit 前保持有效。|
1399
+
1400
+ ### tc_iot_audio_recorder_observer_s
1401
+
1402
+ **录音卡回调表**
1403
+
1404
+ init 时拷贝函数指针。各字段均可为 NULL。
1405
+
1406
+ |字段|类型|描述|
1407
+ |---------|---------|---------|
1408
+ |on_audio_recorder_start|void(* on_audio_recorder_start) (const char *params, void *user_data)|录音会话开始。|
1409
+ |on_audio_recorder_stop|void(* on_audio_recorder_stop) (const char *params, void *user_data)|录音会话结束。|
1410
+ |on_error|void(* on_error) (tc_iot_error_e error_code, const char *error_msg, void *user_data)|异常通知,如无可用输出或传输断开。|
1411
+
1412
+ ### tc_iot_audio_recorder_operation_cb
1413
+
1414
+ **录音卡操作结果回调**
1415
+
1416
+ typedef void(* ​tc_iot_audio_recorder_operation_cb) (​tc_iot_error_e error_code, const char *error_message)
1417
+
1418
+ |参数|描述|
1419
+ |---------|---------|
1420
+ |error_code|成功时为 ​TC_IOT_ERR_SUCCESS;无输出就绪为 NOT_CONNECTED;非空闲 start 为 FAILURE。|
1421
+ |error_message|结果描述,可为 NULL。仅在回调期间有效。|
1422
+
1423
+ ### on_audio_recorder_start
1424
+
1425
+ **录音开始回调**
1426
+
1427
+ BLE 会话真正开始后触发。params 为 SDK 提供的状态描述,仅在回调期间有效。
1428
+
1429
+ |参数|描述|
1430
+ |---------|---------|
1431
+ |params|状态描述字符串,仅在回调期间有效。|
1432
+ |user_data|init 传入的值。|
1433
+
1434
+ ### on_audio_recorder_stop
1435
+
1436
+ **录音停止回调**
1437
+
1438
+ 录音会话结束后触发。params 为 SDK 提供的状态描述,仅在回调期间有效。
1439
+
1440
+ |参数|描述|
1441
+ |---------|---------|
1442
+ |params|状态描述字符串,仅在回调期间有效。|
1443
+ |user_data|init 传入的值。|
1444
+
1445
+ ### on_error
1446
+
1447
+ **录音卡错误回调**
1448
+
1449
+ 无可用输出、传输断开等路径触发。error_msg 仅在回调期间有效。
1450
+
1451
+ |参数|描述|
1452
+ |---------|---------|
1453
+ |error_code|错误码,常见为 ​TC_IOT_ERR_NOT_CONNECTED 或 ​TC_IOT_ERR_FAILURE。|
1454
+ |error_msg|错误描述,可为 NULL。|
1455
+ |user_data|init 传入的值。|
1456
+
1457
+ ## OTA 升级(tc_iot_ota.h)
1458
+
1459
+ 固件下载、校验及固件刷写状态上报。
1460
+
1461
+ > **线程模型**
1462
+ >
1463
+ > 本头文件接口可在任意线程调用。
1464
+ >
1465
+
1466
+ > **回调 / 通知模型**
1467
+ >
1468
+ > - OTA 回调内不得执行耗时或阻塞操作;固件刷写应在独立升级线程中执行。
1469
+ > - 接口返回 `TC_IOT_ERR_SUCCESS` 表示请求已提交。下载结果通过 `on_download_firmware_result` 回调通知。
1470
+ > - 回调中的 `firmware_info`、`error_message` 和 `file_path` 仅在回调期间有效,延后使用时须复制内容。
1471
+
1472
+ > **生命周期**
1473
+ >
1474
+ > SDK 登录成功后调用 ​tc_iot_ota_init;退出登录或释放 SDK 前调用 ​tc_iot_ota_deinit。
1475
+ >
1476
+
1477
+ > **业务约束**
1478
+ >
1479
+ > - 运行环境须提供文件读写接口;设备没有文件系统时,可联系技术支持。
1480
+ > - 初始化时填写各模块当前运行的固件版本,模块名称不可重复。
1481
+ > - SDK 同一时间只能处理一个 OTA 任务。
1482
+
1483
+ |函数列表|描述|
1484
+ |---------|---------|
1485
+ |tc_iot_ota_init|初始化 OTA,注册回调并上报当前固件版本。|
1486
+ |tc_iot_ota_deinit|反初始化 OTA,停止下载并释放资源。|
1487
+ |tc_iot_ota_download_firmware|发起固件下载,由 SDK 下载并校验固件。|
1488
+ |tc_iot_ota_report_upgrade_progress|上报固件刷写进度。|
1489
+ |tc_iot_ota_report_upgrade_result|上报固件刷写结果。|
1490
+
1491
+ ### tc_iot_ota_init
1492
+
1493
+ **初始化 OTA,注册回调并上报当前固件版本**
1494
+
1495
+ 须先完成 SDK 初始化和登录。初始化后,SDK 上报各模块当前版本,并在有可用升级时通过回调通知升级任务。
1496
+
1497
+ |参数|描述|
1498
+ |---------|---------|
1499
+ |config|tc_iot_ota_config_t 初始化配置,不可为 NULL。|
1500
+ |observer|tc_iot_ota_observer_t 回调表,不可为 NULL;`on_receive_firmware_upgrade_notify` 和 `on_download_firmware_result` 为必选回调。|
1501
+ |user_data|自定义回调上下文,可为 NULL;其指向的对象须在 OTA 反初始化和相关回调完成前保持有效。|
1502
+
1503
+ |返回值|描述|
1504
+ |---------|---------|
1505
+ |TC_IOT_ERR_SUCCESS|初始化请求已提交。|
1506
+ |TC_IOT_ERR_ALREADY_INITIALIZED|OTA 已初始化。|
1507
+ |TC_IOT_ERR_OTA_INIT_PARAM_INVALID|配置或模块数组为空、模块数量为 0、模块信息非法或模块名称重复。|
1508
+ |TC_IOT_ERR_OTA_INIT_OBSERVER_NULL|回调表为空或必选回调未注册。|
1509
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 未初始化。|
1510
+ |TC_IOT_ERR_NOT_CONNECTED|尚未登录,须先完成登录。|
1511
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1512
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
1513
+
1514
+ ### tc_iot_ota_deinit
1515
+
1516
+ **反初始化 OTA,停止下载并释放资源**
1517
+
1518
+ 设备退出登录或释放 SDK 前调用。反初始化会中止正在进行的下载,不触发该下载的结果回调。已下载完成的固件文件不会删除。
1519
+
1520
+ |返回值|描述|
1521
+ |---------|---------|
1522
+ |TC_IOT_ERR_SUCCESS|反初始化请求已提交。|
1523
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或 OTA 未初始化。|
1524
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
1525
+
1526
+ ### tc_iot_ota_download_firmware
1527
+
1528
+ **发起固件下载,由 SDK 下载并校验固件**
1529
+
1530
+ 收到 `on_receive_firmware_upgrade_notify` 通知后,设备检查本地状态,确认满足更新条件后调用。下载进行中不得重复调用。
1531
+
1532
+ |参数|描述|
1533
+ |---------|---------|
1534
+ |firmware_info|tc_iot_ota_firmware_info_t 目标固件信息,不可为 NULL;模块名称和目标版本须与本次升级通知一致。|
1535
+ |download_directory|固件保存目录,不可为 NULL 或空字符串;目录须可写且有足够空间。|
1536
+
1537
+ |返回值|描述|
1538
+ |---------|---------|
1539
+ |TC_IOT_ERR_SUCCESS|下载请求已提交,结果通过下载结果回调通知。|
1540
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或 OTA 未初始化。|
1541
+ |TC_IOT_ERR_INVALID_ARGUMENT|固件信息非法,或下载目录为空。|
1542
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1543
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
1544
+
1545
+ 接口返回失败时,直接处理返回的错误码,无需等待下载结果回调。
1546
+
1547
+ ### tc_iot_ota_report_upgrade_progress
1548
+
1549
+ **上报固件刷写进度**
1550
+
1551
+ SDK 通知固件下载及校验成功后,设备在固件刷写过程中按实际进度调用。
1552
+
1553
+ |参数|描述|
1554
+ |---------|---------|
1555
+ |firmware_info|tc_iot_ota_firmware_info_t 目标固件信息,不可为 NULL;须与下载成功回调中的模块名称和目标版本一致。|
1556
+ |upgrade_progress|固件刷写百分比,取值为 0~100。|
1557
+
1558
+ |返回值|描述|
1559
+ |---------|---------|
1560
+ |TC_IOT_ERR_SUCCESS|进度上报请求已提交。|
1561
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或 OTA 未初始化。|
1562
+ |TC_IOT_ERR_INVALID_ARGUMENT|固件信息为空、模块名称或版本为空,或字符串未以 `\0` 结尾。|
1563
+ |TC_IOT_ERR_OTA_PROGRESS_TYPE_INVALID|固件刷写进度超出 0~100。|
1564
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1565
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
1566
+
1567
+ ### tc_iot_ota_report_upgrade_result
1568
+
1569
+ **上报固件刷写结果**
1570
+
1571
+ 须在固件下载及校验成功后调用。固件刷写完成后,设备调用此接口,上报固件刷写结果(刷写成功/失败),后台会据此更新设备升级状态。
1572
+
1573
+ |参数|描述|
1574
+ |---------|---------|
1575
+ |firmware_info|tc_iot_ota_firmware_info_t 目标固件信息,不可为 NULL;须与下载成功回调中的模块名称和目标版本一致。|
1576
+ |result_code|固件刷写结果:`0` 为成功,`-1` 为失败。|
1577
+ |description|结果说明,需填写以 `\0` 结尾的字符串;不需要时可设为 NULL。|
1578
+
1579
+ |返回值|描述|
1580
+ |---------|---------|
1581
+ |TC_IOT_ERR_SUCCESS|结果上报请求已提交。|
1582
+ |TC_IOT_ERR_NOT_INITIALIZED|SDK 或 OTA 未初始化。|
1583
+ |TC_IOT_ERR_INVALID_ARGUMENT|固件信息非法,或 `result_code` 不是 `0`、`-1`。|
1584
+ |TC_IOT_ERR_OUT_OF_MEMORY|内存不足。|
1585
+ |TC_IOT_ERR_POST_TASK_FAILED|请求提交失败。|
1586
+
1587
+ ### tc_iot_ota_firmware_info_t
1588
+
1589
+ **固件模块及版本信息**
1590
+
1591
+ 初始化配置中的版本表示当前运行的固件版本;升级通知、下载及固件刷写上报中的版本表示目标版本。
1592
+
1593
+ |字段|类型|描述|
1594
+ |---------|---------|---------|
1595
+ |module_name|char[64]|模块名称,以 `\0` 结尾;须与后台固件模块名称一致。|
1596
+ |module_version|char[32]|固件版本,以 `\0` 结尾。|
1597
+
1598
+ ### tc_iot_ota_config_t
1599
+
1600
+ **OTA 初始化配置**
1601
+
1602
+ |字段|类型|描述|
1603
+ |---------|---------|---------|
1604
+ |firmware_info|tc_iot_ota_firmware_info_t *|各模块当前固件信息数组,不可为 NULL;模块名称不可重复。|
1605
+ |firmware_info_count|uint32_t|`firmware_info` 数组中有效元素的数量,必须大于0。|
1606
+
1607
+ ### tc_iot_ota_observer_t
1608
+
1609
+ **OTA 回调表**
1610
+
1611
+ |字段|类型|描述|
1612
+ |---------|---------|---------|
1613
+ |on_receive_firmware_upgrade_notify|void(* on_receive_firmware_upgrade_notify) (const ​tc_iot_ota_firmware_info_t *firmware_info, void *user_data)|必填;SDK 通知需要更新的目标模块和目标版本。|
1614
+ |on_download_firmware_progress|void(* on_download_firmware_progress) (const ​tc_iot_ota_firmware_info_t *firmware_info, uint32_t current_size, uint32_t total_size, void *user_data)|可选;SDK 通知已下载字节数和固件总字节数。|
1615
+ |on_download_firmware_result|void(* on_download_firmware_result) (const ​tc_iot_ota_firmware_info_t *firmware_info, ​tc_iot_error_e error_code, const char *error_message, const char *file_path, void *user_data)|必填;SDK 通知下载结果,成功时提供保存固件的路径。|
1616
+
1617
+ ### on_receive_firmware_upgrade_notify
1618
+
1619
+ **固件升级通知回调**
1620
+
1621
+ 有可用升级时,SDK 通过此回调通知目标模块和目标版本。设备检查本地状态,确认满足更新条件后,调用 `tc_iot_ota_download_firmware` 发起下载。
1622
+
1623
+ |参数|描述|
1624
+ |---------|---------|
1625
+ |firmware_info|目标模块和目标版本,仅在回调期间有效;延后处理时须复制内容。|
1626
+ |user_data|`tc_iot_ota_init` 传入的值。|
1627
+
1628
+ ### on_download_firmware_progress
1629
+
1630
+ **固件下载进度回调**
1631
+
1632
+ SDK 在下载过程中调用。下载百分比可按 `(uint64_t)current_size * 100 / total_size` 计算。
1633
+
1634
+ |参数|描述|
1635
+ |---------|---------|
1636
+ |firmware_info|本次下载的目标模块和目标版本,仅在回调期间有效。|
1637
+ |current_size|已下载字节数。|
1638
+ |total_size|固件总字节数。|
1639
+ |user_data|`tc_iot_ota_init` 传入的值。|
1640
+
1641
+ ### on_download_firmware_result
1642
+
1643
+ **固件下载结果回调**
1644
+
1645
+ SDK 通知固件下载结果。仅在 `error_code` 为 `TC_IOT_ERR_SUCCESS` 时,复制固件信息和文件路径,交由**独立升级线程**执行固件刷写。
1646
+
1647
+ |参数|描述|
1648
+ |---------|---------|
1649
+ |firmware_info|本次下载的目标模块和目标版本,仅在回调期间有效。|
1650
+ |error_code|固件下载结果;`TC_IOT_ERR_SUCCESS` 表示成功。|
1651
+ |error_message|失败原因;成功时为 NULL,失败时提供错误描述;仅在回调期间有效。|
1652
+ |file_path|成功时为下载并校验通过的固件文件路径;失败时为 NULL;指针仅在回调期间有效。|
1653
+ |user_data|`tc_iot_ota_init` 传入的值。|
1654
+
1655
+ |错误码|描述|
1656
+ |---------|---------|
1657
+ |TC_IOT_ERR_SUCCESS|固件下载、文件大小和 MD5 校验成功。|
1658
+ |TC_IOT_ERR_OTA_START_FAILED|升级任务不匹配或重复发起下载;检查模块名称、目标版本及下载接口的调用时机。|
1659
+ |TC_IOT_ERR_OTA_DOWNLOAD_FAILED|下载、文件读写失败或文件大小不匹配。|
1660
+ |TC_IOT_ERR_OTA_VERIFY_FAILED|MD5 校验失败。|
1661
+ |TC_IOT_ERR_OUT_OF_MEMORY|下载过程中内存不足。|
1662
+ |其他非零错误码|下载失败,原因见 `error_message`。|
1663
+
1664
+ ## 类型定义(tc_iot_def.h 及公共结构体)
1665
+
1666
+ 音视频公共类型(AV / AITalk / 录音卡共用)
1667
+
1668
+ > **帧所有权**
1669
+ >
1670
+ > tc_iot_*_frame 中的 data 由调用方持有。push / send 接口在返回前会拷贝 或同步消费完毕;回调中的 frame->data 仅在回调返回前有效,调用方如需 异步使用须自行拷贝。
1671
+ >
1672
+
1673
+ > **格式约定**
1674
+ >
1675
+ > - AV 上行音频:应送 PCM,16-bit 小端交错(单声道连续样本,立体声 LRLR…);data_size 须与 sample_rate/channels/frame_duration_ms 一致(推荐 20ms)。非 PCM 当前返回 SUCCESS 但不编码、不供云存使用。
1676
+ > - AV 下行音频:observer 收到 PCM;sample_rate/channels 透传自解码帧 (由远端编码决定;当前不按进房参数重采样)。
1677
+ > - AV 上行视频:Annex-B 裸流(H264/H265);不支持 B 帧。 type=IDR 时须将 SPS/PPS(H265 另含 VPS)与 IDR 放在同一缓冲; 先送 IDR 再送 P 帧,否则对端可能无法起播。
1678
+ > - AITalk:init 指定编码格式;send_audio 可送同格式编码帧,或 PCM (init 为 AAC/OPUS/G722 时可由 SDK 编码)。
1679
+
1680
+ ### tc_iot_audio_codec_e
1681
+
1682
+ **音频编码类型**
1683
+
1684
+ |枚举|取值|描述|
1685
+ |---------|---------|---------|
1686
+ |TC_IOT_AUDIO_CODEC_UNKNOWN|0|未知 / 未指定|
1687
+ |TC_IOT_AUDIO_CODEC_PCM|1|PCM(AV 上行编码依赖此类型;非 PCM 仍 SUCCESS 但不编码)|
1688
+ |TC_IOT_AUDIO_CODEC_AAC|2|AAC|
1689
+ |TC_IOT_AUDIO_CODEC_OPUS|3|Opus|
1690
+ |TC_IOT_AUDIO_CODEC_G722|4|G.722|
1691
+
1692
+ ### tc_iot_audio_sample_rate_e
1693
+
1694
+ **音频采样率(Hz)**
1695
+
1696
+ |枚举|取值|描述|
1697
+ |---------|---------|---------|
1698
+ |TC_IOT_AUDIO_SAMPLE_RATE_UNKNOWN|0|未知 / 未指定|
1699
+ |TC_IOT_AUDIO_SAMPLE_RATE_8000|8000|8 kHz|
1700
+ |TC_IOT_AUDIO_SAMPLE_RATE_16000|16000|16 kHz(推荐)|
1701
+ |TC_IOT_AUDIO_SAMPLE_RATE_32000|32000|32 kHz|
1702
+ |TC_IOT_AUDIO_SAMPLE_RATE_48000|48000|48 kHz|
1703
+
1704
+ ### tc_iot_audio_channel_e
1705
+
1706
+ **音频声道数**
1707
+
1708
+ |枚举|取值|描述|
1709
+ |---------|---------|---------|
1710
+ |TC_IOT_AUDIO_CHANNEL_UNKNOWN|0|未知 / 未指定|
1711
+ |TC_IOT_AUDIO_CHANNEL_MONO|1|单声道|
1712
+ |TC_IOT_AUDIO_CHANNEL_STEREO|2|立体声(样本交错 LRLR…)|
1713
+
1714
+ ### tc_iot_video_codec_e
1715
+
1716
+ **视频编码类型**
1717
+
1718
+ |枚举|取值|描述|
1719
+ |---------|---------|---------|
1720
+ |TC_IOT_VIDEO_CODEC_UNKNOWN|0|未知 / 未指定|
1721
+ |TC_IOT_VIDEO_CODEC_H264|1|H.264 / AVC|
1722
+ |TC_IOT_VIDEO_CODEC_H265|2|H.265 / HEVC|
1723
+ |TC_IOT_VIDEO_CODEC_MJPEG|3|Motion JPEG|
1724
+
1725
+ ### tc_iot_video_frame_type_e
1726
+
1727
+ **视频帧类型**
1728
+
1729
+ |枚举|取值|描述|
1730
+ |---------|---------|---------|
1731
+ |TC_IOT_VIDEO_FRAME_TYPE_UNKNOWN|0|未知 / 未指定|
1732
+ |TC_IOT_VIDEO_FRAME_TYPE_IDR|1|关键帧 / IDR(缓冲须含 SPS/PPS,H265 另含 VPS)|
1733
+ |TC_IOT_VIDEO_FRAME_TYPE_P|2|P 帧(预测帧)|
1734
+
1735
+ ### tc_iot_video_rotation_e
1736
+
1737
+ **视频旋转角度(度)**
1738
+
1739
+ |枚举|取值|描述|
1740
+ |---------|---------|---------|
1741
+ |TC_IOT_VIDEO_ROTATION_0|0|不旋转|
1742
+ |TC_IOT_VIDEO_ROTATION_90|90|顺时针 90°|
1743
+ |TC_IOT_VIDEO_ROTATION_180|180|180°|
1744
+ |TC_IOT_VIDEO_ROTATION_270|270|顺时针 270°|
1745
+
1746
+ ### tc_iot_video_quality_e
1747
+
1748
+ **视频画质档位(呼叫 option / 监控切换 / 建视频通道时使用)**
1749
+
1750
+ |枚举|取值|描述|
1751
+ |---------|---------|---------|
1752
+ |TC_IOT_VIDEO_QUALITY_UNKNOWN|0|未知 / 未指定|
1753
+ |TC_IOT_VIDEO_QUALITY_LD|1|流畅(LD)|
1754
+ |TC_IOT_VIDEO_QUALITY_SD|2|标清(SD)|
1755
+ |TC_IOT_VIDEO_QUALITY_HD|3|高清(HD)|
1756
+ |TC_IOT_VIDEO_QUALITY_FHD|4|超清(FHD)|
1757
+
1758
+ ### tc_iot_media_content_e
1759
+
1760
+ **会话媒体内容类型**
1761
+
1762
+ |枚举|取值|描述|
1763
+ |---------|---------|---------|
1764
+ |TC_IOT_MEDIA_CONTENT_UNKNOWN|0|未知 / 未指定|
1765
+ |TC_IOT_MEDIA_CONTENT_AUDIO|1|仅音频|
1766
+ |TC_IOT_MEDIA_CONTENT_VIDEO|2|仅视频|
1767
+ |TC_IOT_MEDIA_CONTENT_AUDIO_VIDEO|3|音视频|
1768
+
1769
+ ### data_model_data_item_t
1770
+
1771
+ **物模型数据项**
1772
+
1773
+ |字段|类型|描述|
1774
+ |---------|---------|---------|
1775
+ |data_id|char *|标识符(属性 / 事件参数 / 行为参数 ID)。|
1776
+ |data_type|data_model_data_type_t|数据类型。|
1777
+ |data_value|data_model_data_value_t|数据值;按 data_type 选用联合体字段。|
1778
+
1779
+ ### data_model_data_value_t
1780
+
1781
+ **物模型数据值联合体(按 data_type 选用对应字段)**
1782
+
1783
+ |字段|类型|描述|
1784
+ |---------|---------|---------|
1785
+ |value_bool|data_model_bool_t|DATA_MODEL_DATA_TYPE_BOOL|
1786
+ |value_int|data_model_int_t|DATA_MODEL_DATA_TYPE_INT|
1787
+ |value_float|data_model_float_t|DATA_MODEL_DATA_TYPE_FLOAT|
1788
+ |value_string|data_model_string_t|DATA_MODEL_DATA_TYPE_STRING|
1789
+ |value_enum|data_model_enum_t|DATA_MODEL_DATA_TYPE_ENUM|
1790
+ |value_time|data_model_time_t|DATA_MODEL_DATA_TYPE_TIME|
1791
+
1792
+ ### tc_iot_aitalk_audio_option_s
1793
+
1794
+ **会话音频参数**
1795
+
1796
+ |字段|类型|描述|
1797
+ |---------|---------|---------|
1798
+ |codec|tc_iot_audio_codec_e|会话编码;须为 AAC / OPUS / G722。|
1799
+ |sample_rate|tc_iot_audio_sample_rate_e|采样率;推荐 16000。|
1800
+ |frame_duration_ms|uint32_t|单帧时长(毫秒);须与 codec 匹配,推荐 20。|
1801
+
1802
+ ### tc_iot_aitalk_init_params_s
1803
+
1804
+ **AITalk 初始化参数**
1805
+
1806
+ |字段|类型|描述|
1807
+ |---------|---------|---------|
1808
+ |bot_id|char[TC_IOT_AITALK_BOT_ID_MAX_LEN + 1]|机器人 ID;长度 ≤ TC_IOT_AITALK_BOT_ID_MAX_LEN(数组含结尾 '\0')。|
1809
+ |audio_option|tc_iot_aitalk_audio_option_s|会话音频参数。|
1810
+ |prompt_variables_json|const char *|可选;prompt 变量 JSON 字符串,生命周期须覆盖 init 异步过程。|
1811
+
1812
+ ### tc_iot_aitalk_observer_s
1813
+
1814
+ **AITalk 事件观察者**
1815
+
1816
+ |字段|类型|描述|
1817
+ |---------|---------|---------|
1818
+ |on_receive_bot_audio|void(* on_receive_bot_audio) (const ​tc_iot_audio_frame *frame, void *user_data)|机器人下行音频;frame 仅在回调内有效。|
1819
+ |on_receive_bot_text|void(* on_receive_bot_text) (const char *text, void *user_data)|机器人下行文本。|
1820
+ |on_receive_asr_text|void(* on_receive_asr_text) (const char *text, void *user_data)|ASR 文本;仅最终结果(is_final)会回调。|
1821
+ |on_bot_state_changed|void(* on_bot_state_changed) (​tc_iot_aitalk_bot_state_e old_state, ​tc_iot_aitalk_bot_state_e new_state, void *user_data)|机器人状态变化。|
1822
+ |on_launch_call|void(* on_launch_call) (const ​tc_iot_contact_s *contact, void *user_data)|机器人发起呼叫联系人(需配合 register_contacts)。|
1823
+ |on_error|void(* on_error) (​tc_iot_error_e error_code, const char *error_msg, void *user_data)|会话或通道错误(含 AITALK_*)。|
1824
+
1825
+ ### tc_iot_audio_frame
1826
+
1827
+ **音频帧**
1828
+
1829
+ |字段|类型|描述|
1830
+ |---------|---------|---------|
1831
+ |codec|tc_iot_audio_codec_e|音频编码类型。|
1832
+ |sample_rate|tc_iot_audio_sample_rate_e|采样率(Hz)。|
1833
+ |channels|tc_iot_audio_channel_e|声道数。|
1834
+ |frame_duration_ms|uint32_t|单帧时长(毫秒);须与 data_size 匹配;推荐 20。|
1835
+ |data|uint8_t *|PCM 时为 16-bit 小端样本;调用方持有。|
1836
+ |data_size|size_t|data 字节数。|
1837
+ |pts_ms|uint64_t|呈现时间戳,毫秒;调用方保证单调。|
1838
+
1839
+ ### tc_iot_av_observer_s
1840
+
1841
+ **AV 事件观察者;字段可为 NULL 表示不关心该事件**
1842
+
1843
+ |字段|类型|描述|
1844
+ |---------|---------|---------|
1845
+ |on_call_requested|void(* on_call_requested) (const ​tc_iot_contact_s *contact, ​tc_iot_call_option_t option)|App 呼入邀请。|
1846
+ |on_call_accepted|void(* on_call_accepted) (const ​tc_iot_contact_s *contact)|对端接听(呼出场景)。|
1847
+ |on_call_rejected|void(* on_call_rejected) (const ​tc_iot_contact_s *contact)|对端拒绝。|
1848
+ |on_call_timeout|void(* on_call_timeout) (const ​tc_iot_contact_s *contact)|呼叫超时。|
1849
+ |on_call_hangup|void(* on_call_hangup) (const ​tc_iot_contact_s *contact)|对端挂断或会话中止。|
1850
+ |on_monitor_begin|void(* on_monitor_begin) (int channel_id, ​tc_iot_call_option_t option)|IPC 监控:App 开始拉流。|
1851
+ |on_monitor_switch|void(* on_monitor_switch) (int channel_id, ​tc_iot_video_quality_e quality)|IPC 监控:切换画质。|
1852
+ |on_monitor_end|void(* on_monitor_end) (int channel_id)|IPC 监控:结束拉流。|
1853
+ |on_ptz_command_received|void(* on_ptz_command_received) (int channel_id, ​ptz_command_e ptz_command, int speed)|收到云台控制命令;speed 为速度档位。|
1854
+ |on_audio_frame_received|void(* on_audio_frame_received) (const ​tc_iot_audio_frame *frame)|远端音频:PCM;sample_rate/channels 透传自解码帧(随远端编码,不按进房参数重采样);frame 仅回调内有效。|
1855
+ |on_video_frame_received|void(* on_video_frame_received) (const ​tc_iot_video_frame *frame)|远端视频;frame 仅回调内有效。|
1856
+
1857
+ ### tc_iot_call_option_s
1858
+
1859
+ **呼叫 / 监控媒体选项**
1860
+
1861
+ |字段|类型|描述|
1862
+ |---------|---------|---------|
1863
+ |media_content|tc_iot_media_content_e|媒体内容类型(音频 / 视频 / 音视频)。|
1864
+ |video_quality|tc_iot_video_quality_e|视频画质档位。|
1865
+ |custom_data|char[MAX_CUSTOM_DATA_LENGTH]|自定义附带数据;数组容量为 MAX_CUSTOM_DATA_LENGTH(含结尾 '\0')。|
1866
+
1867
+ ### tc_iot_config_s
1868
+
1869
+ **SDK 初始化配置**
1870
+
1871
+ |字段|类型|描述|
1872
+ |---------|---------|---------|
1873
+ |storage_path|const char *|本地持久化目录;可为 NULL;非空时长度不超过 256。|
1874
+ |log_level|tc_iot_log_level_e|日志输出阈值,见 ​tc_iot_log_level_e。|
1875
+ |on_log|void(* on_log) (​tc_iot_log_level_e level, const char *log)|可选;为 NULL 时不向外抛日志文本。|
1876
+ |on_device_event|void(* on_device_event) (​tc_iot_device_event_type_e event_type, const void *event_data)|可选;为 NULL 时不通知在线状态。|
1877
+ |region|const char *|接入地域。国内版:"";海外版:"us-east"、"europe"、"ap-bangkok"。可为 NULL(与 "" 等价)。非法取值 init 返回 INVALID_ARGUMENT。|
1878
+
1879
+ ### tc_iot_contact_s
1880
+
1881
+ **联系人;呼叫相关 API 至少需要 user_id**
1882
+
1883
+ |字段|类型|描述|
1884
+ |---------|---------|---------|
1885
+ |user_id|const char *|用户 ID,必填。|
1886
+ |user_name|const char *|显示名,可选。|
1887
+ |avatar_url|const char *|头像 URL,可选。|
1888
+
1889
+ ### tc_iot_data_model_action_t
1890
+
1891
+ **行为(下行调用 + 上行输出)**
1892
+
1893
+ |字段|类型|描述|
1894
+ |---------|---------|---------|
1895
+ |action_id|char *|行为 ID。|
1896
+ |token|char *|云端下发的请求 token,回复时须原样带回。|
1897
+ |timestamp|uint32_t|时间戳。|
1898
+ |action_input_data_num|int|输入参数个数。|
1899
+ |action_input_data_list|data_model_data_item_t *|输入参数列表。|
1900
+ |action_output_data_num|int|输出参数个数;在 on_receive_new_action_cb 内填写。|
1901
+ |action_output_data_list|data_model_data_item_t *|输出参数列表;在 on_receive_new_action_cb 内填写后由 SDK 回复云端。|
1902
+
1903
+ ### tc_iot_data_model_callback
1904
+
1905
+ **物模型回调表**
1906
+
1907
+ |字段|类型|描述|
1908
+ |---------|---------|---------|
1909
+ |on_report_property_result_cb|void(* on_report_property_result_cb) (char *property_id, void *user_data, ​data_model_report_result_t result_code)|属性上报结果(含超时);user_data 为 report_property 传入值。|
1910
+ |on_receive_property_changed_cb|void(* on_receive_property_changed_cb) (char *property_id, ​tc_iot_data_model_property_t *data_model_property)|云端下发属性变更。|
1911
+ |on_report_event_result_cb|void(* on_report_event_result_cb) (char *event_id, void *user_data, ​data_model_report_result_t result_code)|事件上报结果(含超时);user_data 为 report_event 传入值。|
1912
+ |on_receive_new_action_cb|int(* on_receive_new_action_cb) (char *action_id, ​tc_iot_data_model_action_t *data_model_action)|收到行为调用。|
1913
+
1914
+ ### tc_iot_data_model_event_t
1915
+
1916
+ **事件**
1917
+
1918
+ |字段|类型|描述|
1919
+ |---------|---------|---------|
1920
+ |event_id|char *|事件 ID。|
1921
+ |event_type|data_model_event_type_t|事件类型。|
1922
+ |event_data_num|int|event_data_list 元素个数。|
1923
+ |event_data_list|data_model_data_item_t *|事件参数列表。|
1924
+
1925
+ ### tc_iot_data_model_property_t
1926
+
1927
+ **属性**
1928
+
1929
+ |字段|类型|描述|
1930
+ |---------|---------|---------|
1931
+ |property|data_model_data_item_t|属性数据项。|
1932
+
1933
+ ### tc_iot_device_info_s
1934
+
1935
+ **设备三元组(login 用)**
1936
+
1937
+ |字段|类型|描述|
1938
+ |---------|---------|---------|
1939
+ |product_id|const char *|产品 ID,必填。|
1940
+ |device_id|const char *|设备名 / 设备 ID,必填。|
1941
+ |device_secret|const char *|设备密钥,必填。|
1942
+
1943
+ ### tc_iot_dynamic_register_param_s
1944
+
1945
+ **动态注册参数**
1946
+
1947
+ |字段|类型|描述|
1948
+ |---------|---------|---------|
1949
+ |product_id|const char *|产品 ID,必填。|
1950
+ |device_id|const char *|设备名 / 设备 ID,必填。|
1951
+ |product_secret|const char *|产品密钥;长度须满足 16, 64)。|
1952
+
1953
+ ### tc_iot_video_frame
1954
+
1955
+ **视频帧(Annex-B 裸流)**
1956
+
1957
+ |字段|类型|描述|
1958
+ |---------|---------|---------|
1959
+ |codec|[tc_iot_video_codec_e|视频编码类型。|
1960
+ |type|tc_iot_video_frame_type_e|IDR 缓冲须含 SPS/PPS(H265 含 VPS);P 帧不含参数集即可。|
1961
+ |rotation|tc_iot_video_rotation_e|画面旋转角度。|
1962
+ |width|uint32_t|像素宽度。|
1963
+ |height|uint32_t|像素高度。|
1964
+ |data|uint8_t *|Annex-B 裸流;调用方持有;不可为 NULL,data_size > 0。|
1965
+ |data_size|size_t|data 字节数。|
1966
+ |pts_ms|uint64_t|呈现时间戳,毫秒;调用方保证单调(热路径不做校验)。|
1967
+
1968
+ ## 错误码(tc_iot_err.h)
1969
+
1970
+ SDK 统一错误码
1971
+
1972
+ 0 为成功,负数为失败。各模块返回值子集以对应头文件函数注释为准; 此处给出全量枚举含义。
1973
+
1974
+ ### tc_iot_error_e
1975
+
1976
+ **SDK 统一错误码**
1977
+
1978
+ |枚举|取值|描述|
1979
+ |---------|---------|---------|
1980
+ |TC_IOT_ERR_SUCCESS|0|成功。|
1981
+ |TC_IOT_ERR_FAILURE|-1|通用失败。|
1982
+ |TC_IOT_ERR_OUT_OF_MEMORY|-2|内存不足。|
1983
+ |TC_IOT_ERR_INVALID_ARGUMENT|-3|参数非法(空指针、非法取值等)。|
1984
+ |TC_IOT_ERR_NOT_INITIALIZED|-4|核心或业务模块尚未 init。|
1985
+ |TC_IOT_ERR_ALREADY_INITIALIZED|-5|重复初始化。|
1986
+ |TC_IOT_ERR_NOT_CONNECTED|-6|MQTT 未连接,或操作因登出被取消。|
1987
+ |TC_IOT_ERR_ALREADY_CONNECTED|-7|已处于已连接状态(如重复 login)。|
1988
+ |TC_IOT_ERR_CONNECT_FAILED|-8|MQTT / 网络连接失败(非 CONNACK 细分码)。|
1989
+ |TC_IOT_ERR_POST_TASK_FAILED|-9|请求提交失败。|
1990
+ |TC_IOT_ERR_AV_ON_IDLE|-10|AV:空闲,无对应会话(操作与当前会话冲突)。|
1991
+ |TC_IOT_ERR_AV_ON_OUTGOING|-11|AV:正在呼出。|
1992
+ |TC_IOT_ERR_AV_ON_RINGING|-12|AV:正在振铃(呼入)。|
1993
+ |TC_IOT_ERR_AV_ON_CALLING|-13|AV:已在通话中。|
1994
+ |TC_IOT_ERR_AV_ON_IPC_MONITOR|-14|AV:处于 IPC 监控会话。|
1995
+ |TC_IOT_ERR_DYNAMIC_REGISTER_BUSY|-20|动态注册:已有注册进行中(含阻塞 deinit)。|
1996
+ |TC_IOT_ERR_DYNAMIC_REGISTER_REQUEST_FAILED|-21|动态注册:请求发送或网络失败。|
1997
+ |TC_IOT_ERR_DYNAMIC_REGISTER_RESPONSE_INVALID|-22|动态注册:响应解析失败或内容非法。|
1998
+ |TC_IOT_ERR_NTP_TIME_NOT_READY|-30|NTP 尚未同步完成(ONLINE 之后仍可能短暂返回此值)。|
1999
+ |TC_IOT_ERR_CLOUD_STORAGE_CHANNEL_NOT_FOUND|-100|云存储:该 channel_id 无云存套餐。套餐类型不匹配见 -102。|
2000
+ |TC_IOT_ERR_CLOUD_STORAGE_PLANS_QUERY_FAILED|-101|云存储:套餐查询失败(经 on_init_result)。|
2001
+ |TC_IOT_ERR_CLOUD_STORAGE_NO_PLAN|-102|云存储:当前套餐不支持该操作。|
2002
+ |TC_IOT_ERR_CLOUD_STORAGE_EVENT_NOT_FOUND|-103|云存储:未找到对应事件。|
2003
+ |TC_IOT_ERR_CLOUD_STORAGE_REPORT_FAILED|-104|云存储:事件上报失败(经 on_event_result)。|
2004
+ |TC_IOT_ERR_CLOUD_STORAGE_PIC_UPLOAD_FAILED|-105|云存储:图片上传失败(经 on_event_result)。|
2005
+ |TC_IOT_ERR_CLOUD_STORAGE_EVENT_CANCELLED|-106|云存储:事件被取消(如反初始化)。|
2006
+ |TC_IOT_ERR_AITALK_NOT_SUPPORT|-200|AITalk:能力或模式不支持(亦可经 on_error)。|
2007
+ |TC_IOT_ERR_AITALK_BOT_LEAVED|-201|AITalk:机器人已离开会话。|
2008
+ |TC_IOT_ERR_AITALK_INVALID_PARAM|-202|AITalk:参数非法。|
2009
+ |TC_IOT_ERR_AITALK_INTERNAL_ERROR|-203|AITalk:内部错误。|
2010
+ |TC_IOT_ERR_AITALK_NOT_ACTIVATED|-204|AITalk:服务未开通 / 未激活。|
2011
+ |TC_IOT_ERR_AITALK_SERVICE_EXPIRED|-205|AITalk:服务已过期。|
2012
+ |TC_IOT_ERR_AITALK_ASR_ERROR|-206|AITalk:ASR 错误。|
2013
+ |TC_IOT_ERR_AITALK_TTS_ERROR|-207|AITalk:TTS 错误。|
2014
+ |TC_IOT_ERR_AITALK_LLM_ERROR|-208|AITalk:LLM 错误。|
2015
+ |TC_IOT_ERR_AITALK_START_CONVERSATION_TIMEOUT|-209|AITalk:开始对话超时。|
2016
+ |TC_IOT_ERR_CONNECT_UNACCEPTABLE_PROTOCOL_VERSION|-301|MQTT CONNACK:不接受的协议版本。|
2017
+ |TC_IOT_ERR_CONNECT_IDENTIFIER_REJECTED|-302|MQTT CONNACK:客户端标识被拒绝。|
2018
+ |TC_IOT_ERR_CONNECT_SERVER_UNAVAILABLE|-303|MQTT CONNACK:服务端不可用。|
2019
+ |TC_IOT_ERR_CONNECT_BAD_USERNAME_OR_PASSWORD|-304|MQTT CONNACK:用户名或密码错误。|
2020
+ |TC_IOT_ERR_CONNECT_NOT_AUTHORIZED|-305|MQTT CONNACK:未授权。|
2021
+ |TC_IOT_ERR_OTA_INIT_PARAM_INVALID|-400|OTA:初始化配置非法(模块数组为空、数量为 0、模块信息非法或模块名称重复)。|
2022
+ |TC_IOT_ERR_OTA_INIT_OBSERVER_NULL|-401|OTA:回调表为空或必选回调未注册。|
2023
+ |TC_IOT_ERR_OTA_START_FAILED|-402|OTA:升级任务不匹配或操作时机不正确。|
2024
+ |TC_IOT_ERR_OTA_PROGRESS_TYPE_INVALID|-403|OTA:固件刷写进度超出 0~100。|
2025
+ |TC_IOT_ERR_OTA_DOWNLOAD_FAILED|-404|OTA:固件下载或文件读写失败,或文件大小不匹配。|
2026
+ |TC_IOT_ERR_OTA_VERIFY_FAILED|-405|OTA:固件 MD5 校验失败。|
2027
+ |TC_IOT_ERR_OTA_REPORT_FAILED|-406|OTA:版本或进度、结果上报失败。|