@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,557 @@
1
+ ---
2
+ product: iot
3
+ framework:
4
+ - '*'
5
+ types:
6
+ - feature
7
+ retrievable_scope: always
8
+ feature_domain: app
9
+ ---
10
+
11
+ 本文将介绍腾讯云物联网(IoT)应用端 SDK 的监控拉流能力(`TXIoTMonitorSession`):如何在 App 或小程序中拉取已绑定设备的实时音视频流并渲染播放,以及在此基础上进行清晰度切换、语音对讲、多通道观看、截图与录制、PTZ 云台控制等。监控拉流基于腾讯云实时音视频(TRTC)链路实现,相比传统 P2P 直连方案,在连通率、首帧速度、弱网表现与多端同看等方面具备明显优势(详情参见 方案优势)。
12
+
13
+ ## 功能概述
14
+
15
+ 监控拉流指应用端主动向已绑定的设备发起一次实时观看请求,设备按请求的通道与清晰度推送音视频流,应用端订阅并渲染,全过程由 `TXIoTMonitorSession` 统一管理。典型能力包括:实时画面播放、高清/流畅清晰度切换、远端音频控制、双向语音对讲、多通道同时观看、画面截图与本地录制、PTZ 云台控制。
16
+
17
+ 监控拉流广泛应用于家庭安防、可视门铃、看护陪护、门店巡检等消费类音视频设备场景:
18
+
19
+ ## 方案优势
20
+
21
+ `TXIoTMonitorSession` 底层复用腾讯云实时音视频(TRTC)的媒体网络与传输能力:设备与应用端分别就近接入 TRTC 媒体网络并在同一房间内完成推流与订阅,不依赖设备与手机之间的端到端直连。这一架构选择带来的差异如下。
22
+
23
+ ## 前提条件
24
+
25
+ 在使用监控拉流能力前,请确保已完成以下准备工作:
26
+ - 已开通腾讯云物联网相关服务,并在控制台完成实例、应用和设备的准备工作。可参见 开通服务。
27
+
28
+ - 已在客户端工程中集成 IoT 应用端 SDK 并完成登录。可参见 Android 集成与登录、iOS 集成与登录、小程序集成与登录。
29
+
30
+ - 目标设备已绑定到当前登录账户名下,或已被分享给当前账户。可参见 设备绑定。
31
+
32
+ - 目标设备为支持音视频推流的设备,且当前处于在线状态。
33
+
34
+ - 若需要使用语音对讲,已在工程中申请并获取麦克风权限。
35
+
36
+ ## 使用建议
37
+ - **调用顺序**:获取监控会话对象 → `addListener` 注册回调 → `startRemoteView` 绑定渲染视图 → `startSession` 开始拉流 → 收到 `onSessionEstablished` 后画面稳定播放 → 结束时 `stopRemoteView` + `stopSession`。
38
+
39
+ - **先绑定视图再开始会话**:`startRemoteView` 可以在 `startSession` 之前调用,可省去一次通道协商,出图更快。
40
+
41
+ - **尽早注册监听**:在 `startSession` 之前完成 `addListener`(iOS 为 `addDelegate`),避免错过 `onSessionEstablished` 等早期回调。
42
+
43
+ - **及时释放**:不再需要监控时调用 `stopSession` 并移除监听,避免资源泄漏与重复回调。
44
+
45
+ - **统一错误处理**:在 `onError` 中集中处理错误码,结合错误码给出用户可理解的提示。
46
+
47
+ > **警告:**
48
+ >
49
+ > 监控会话对象为单例,同一时刻只存在一个监控会话。若已有会话正在运行中(已调用 `startSession` 且尚未 `stopSession`),再次调用 `startSession` 会被直接忽略,不会打断或切换已有会话。切换观看设备前必须先调用 `stopSession`。
50
+ >
51
+
52
+ ## 接入步骤
53
+
54
+ ### 步骤 1:获取监控会话对象
55
+
56
+ 登录成功后,通过 `TXIoTEngine` 实例调用 `getMonitorSession()` 获取监控会话对象。若返回空值(Android 与小程序为 `null`,iOS 为 `nil`),通常是 SDK 尚未登录或登录已过期。
57
+
58
+ 【Android】
59
+ ``` java
60
+ TXIoTMonitorSession session = TXIoTEngine.getInstance(context).getMonitorSession();
61
+ if (session == null) {
62
+ // SDK 未登录或登录已过期,请先完成登录
63
+ return;
64
+ }
65
+ ```
66
+
67
+ 【iOS】
68
+ ``` objectivec
69
+ TXIoTMonitorSession *session = [[TXIoTEngine getInstance] getMonitorSession];
70
+ if (session == nil) {
71
+ // SDK 未登录或登录已过期,请先完成登录
72
+ return;
73
+ }
74
+ ```
75
+
76
+ 【小程序】
77
+ ``` typescript
78
+ const { TXIoTEngine } = requirePlugin('tx-iot-sdk');
79
+
80
+ // getInstance 为异步方法,首次调用会等待内部模块加载完成。
81
+ const iotEngine = await TXIoTEngine.getInstance();
82
+ const session = iotEngine.getMonitorSession();
83
+ if (session == null) {
84
+ // SDK 未登录或登录已过期,请先完成登录
85
+ return;
86
+ }
87
+ ```
88
+
89
+ ### 步骤 2:注册监听回调
90
+
91
+ 监控会话的状态变化、首帧渲染、播放状态与错误均通过监听接口返回。请在 `startSession` 之前完成注册。
92
+
93
+ 【Android】
94
+ ``` java
95
+ TXIoTMonitorSessionListener monitorListener = new TXIoTMonitorSessionListener() {
96
+ @Override
97
+ public void onSessionEstablished() {
98
+ // 会话建立成功,所有已请求通道进入播放状态
99
+ }
100
+
101
+ @Override
102
+ public void onRenderFirstFrame(int channelId) {
103
+ // 指定通道首帧已渲染,此时可隐藏加载动画
104
+ }
105
+
106
+ @Override
107
+ public void onPlayStateChanged(int channelId, TXIoTPlayState state) {
108
+ // PLAYING / LOADING / STOPPED,用于驱动 loading 与占位图
109
+ }
110
+
111
+ @Override
112
+ public void onSessionReconnecting() {
113
+ // 链路中断,SDK 正在自动重连
114
+ }
115
+
116
+ @Override
117
+ public void onSessionRecovery() {
118
+ // 重连成功,画面恢复
119
+ }
120
+
121
+ @Override
122
+ public void onError(int channelId, TXIoTErrorCode errCode, String errMsg) {
123
+ // 统一处理错误码与用户提示
124
+ }
125
+
126
+ // 其他回调按需实现...
127
+ };
128
+
129
+ session.addListener(monitorListener);
130
+ ```
131
+
132
+ 【iOS】
133
+ ``` objectivec
134
+ @interface MonitorViewController () <TXIoTMonitorSessionDelegate>
135
+ @end
136
+
137
+ @implementation MonitorViewController
138
+
139
+ - (void)onSessionEstablished {
140
+ // 会话建立成功,所有已请求通道进入播放状态
141
+ }
142
+
143
+ - (void)onRenderFirstFrame:(NSInteger)channelId {
144
+ // 指定通道首帧已渲染,此时可隐藏加载动画
145
+ }
146
+
147
+ - (void)onPlayStateChanged:(NSInteger)channelId state:(TXIoTPlayState)state {
148
+ // Playing / Loading / Stopped,用于驱动 loading 与占位图
149
+ }
150
+
151
+ - (void)onSessionReconnecting {
152
+ // 链路中断,SDK 正在自动重连
153
+ }
154
+
155
+ - (void)onSessionRecovery {
156
+ // 重连成功,画面恢复
157
+ }
158
+
159
+ - (void)onError:(NSInteger)channelId
160
+ errorCode:(TXIoTErrorCode)errorCode
161
+ errorMessage:(NSString *)errorMessage {
162
+ // 统一处理错误码与用户提示
163
+ }
164
+
165
+ @end
166
+
167
+ // 注册代理
168
+ [session addDelegate:self];
169
+ // 退出时注销
170
+ // [session removeDelegate:self];
171
+ ```
172
+
173
+ 【小程序】
174
+ ``` typescript
175
+ const monitorListener = {
176
+ onSessionEstablished() {
177
+ // 会话建立成功,所有已请求通道进入播放状态
178
+ },
179
+ onRenderFirstFrame(channelId) {
180
+ // 指定通道首帧已渲染,此时可隐藏加载动画
181
+ },
182
+ onPlayStateChanged(channelId, state) {
183
+ // PLAYING / LOADING / STOPPED,用于驱动 loading 与占位图
184
+ },
185
+ onSessionReconnecting() {
186
+ // 链路中断,SDK 正在自动重连
187
+ },
188
+ onSessionRecovery() {
189
+ // 重连成功,画面恢复
190
+ },
191
+ onError(channelId, errCode, errMsg) {
192
+ // 统一处理错误码与用户提示
193
+ },
194
+ // 其他回调按需实现...
195
+ };
196
+
197
+ session.addListener(monitorListener);
198
+ ```
199
+
200
+ ### 步骤 3:绑定渲染视图并开始拉流
201
+
202
+ 先通过 `startRemoteView` 为目标通道绑定渲染视图并指定清晰度,再调用 `startSession` 与设备建立会话。
203
+
204
+ |**方法**|**说明**|
205
+ |---------|---------|
206
+ |`startRemoteView`|为 `channelId` 通道绑定渲染视图并播放实时画面。`channelId` 表示设备的视频通道,每个通道对应设备的一个摄像头,需与设备端通道编号对齐,单通道设备使用 `0`;`streamType` 为码流类型(`HD` 高清 / `SD` 流畅)。小程序端不传视图对象,需先用 `setIoTPlayer` 绑定 `<iot-player>` 组件。|
207
+ |`startSession`|与目标设备建立监控会话,`deviceId` 为目标设备标识(`productId` + `deviceName`)。|
208
+
209
+ 【Android】
210
+ ``` java
211
+ // remoteView 为布局中的 TXCloudVideoView
212
+ TXCloudVideoView remoteView = findViewById(R.id.remote_view);
213
+
214
+ int channelId = 0; // 单通道设备使用 0
215
+ // 先绑定渲染视图,再开始会话,可减少一次通道协商
216
+ session.startRemoteView(channelId, TXIoTStreamType.HD, remoteView);
217
+
218
+ TXIoTDeviceId deviceId = new TXIoTDeviceId();
219
+ deviceId.productId = "已绑定到当前账户的 productId";
220
+ deviceId.deviceName = "已绑定到当前账户的 deviceName";
221
+
222
+ session.startSession(deviceId);
223
+ ```
224
+
225
+ 【iOS】
226
+ ``` objectivec
227
+ // remoteView 为布局中的 UIView
228
+ UIView *remoteView = self.remoteVideoView;
229
+
230
+ NSInteger channelId = 0; // 单通道设备使用 0
231
+ // 先绑定渲染视图,再开始会话,可减少一次通道协商
232
+ [session startRemoteView:channelId streamType:TXIoTStreamTypeHD view:remoteView];
233
+
234
+ TXIoTDeviceId *deviceId = [[TXIoTDeviceId alloc] init];
235
+ deviceId.productId = @"已绑定到当前账户的 productId";
236
+ deviceId.deviceName = @"已绑定到当前账户的 deviceName";
237
+
238
+ [session startSession:deviceId];
239
+ ```
240
+
241
+ 【小程序】
242
+ ``` typescript
243
+ const { TXIoTStreamType, TXIoTDeviceId } = requirePlugin('tx-iot-sdk');
244
+
245
+ // WXML 中需放置 <iot-player component-id="remote-player"> 组件
246
+ const channelId = 0; // 单通道设备使用 0
247
+ // 先把通道绑定到 <iot-player> 组件,再订阅视频流
248
+ session.setIoTPlayer(channelId, 'remote-player');
249
+ // 先绑定渲染视图,再开始会话,可减少一次通道协商
250
+ session.startRemoteView(channelId, TXIoTStreamType.HD);
251
+
252
+ const deviceId = new TXIoTDeviceId('已绑定到当前账户的 productId', '已绑定到当前账户的 deviceName');
253
+ session.startSession(deviceId);
254
+ ```
255
+
256
+ > **说明:**
257
+ > 即使设备没有视频画面(例如纯语音对讲场景),小程序端仍需通过 `setIoTPlayer` 绑定 `<iot-player>` 组件,音频通过该组件播放。
258
+ >
259
+
260
+ ### 步骤 4:停止拉流并释放资源
261
+
262
+ 退出监控页面时,先停止通道播放,再停止会话并移除监听。
263
+
264
+ 【Android】
265
+ ``` java
266
+ session.stopRemoteView(0);
267
+ session.stopSession();
268
+ session.removeListener(monitorListener);
269
+ ```
270
+
271
+ 【iOS】
272
+ ``` objectivec
273
+ [session stopRemoteView:0];
274
+ [session stopSession];
275
+ [session removeDelegate:self];
276
+ ```
277
+
278
+ 【小程序】
279
+ ``` typescript
280
+ // 一般在页面 onHide / onUnload 中调用
281
+ session.stopRemoteView(0);
282
+ session.stopSession();
283
+ session.removeListener(monitorListener);
284
+ ```
285
+
286
+ ## 常用能力
287
+
288
+ ### 切换视频清晰度
289
+
290
+ 观看过程中可动态切换通道画面的清晰度,无需重新建立会话。应用端切换后,SDK 会将清晰度要求同步给设备端,由设备推送对应清晰度的视频流。
291
+
292
+ > **注意:**
293
+ > 不同清晰度可能对应不同的计费标准,请确保应用端实际使用的清晰度与用户购买的套餐一致,避免因清晰度与计费套餐不匹配引发计费争议。
294
+ >
295
+
296
+ 【Android】
297
+ ``` java
298
+ // 切换为流畅流
299
+ session.switchRemoteStream(0, TXIoTStreamType.SD);
300
+ // 切换为高清流
301
+ session.switchRemoteStream(0, TXIoTStreamType.HD);
302
+ ```
303
+
304
+ 【iOS】
305
+ ``` objectivec
306
+ // 切换为流畅流
307
+ [session switchRemoteStream:0 streamType:TXIoTStreamTypeSD];
308
+ // 切换为高清流
309
+ [session switchRemoteStream:0 streamType:TXIoTStreamTypeHD];
310
+ ```
311
+
312
+ 【小程序】
313
+ ``` typescript
314
+ // 切换为流畅流
315
+ session.switchRemoteStream(0, TXIoTStreamType.SD);
316
+ // 切换为高清流
317
+ session.switchRemoteStream(0, TXIoTStreamType.HD);
318
+ ```
319
+
320
+ ### 远端音频控制与语音对讲
321
+
322
+ `muteRemoteAudio` 控制单个通道的远端音频,`muteAllRemoteAudio` 控制所有通道。开启语音对讲时调用 `startLocalAudio` 采集并上行本地音频,结束时调用 `stopLocalAudio`;对讲期间可用 `muteLocalAudio` 临时停止上行。
323
+
324
+ 【Android】
325
+ ``` java
326
+ // 静音 0 号通道的远端声音
327
+ session.muteRemoteAudio(0, true);
328
+ // 静音全部通道
329
+ session.muteAllRemoteAudio(true);
330
+
331
+ // 开启语音对讲(需先获取麦克风权限)
332
+ session.startLocalAudio();
333
+ // 对讲过程中临时停止上行
334
+ session.muteLocalAudio(true);
335
+ // 结束对讲
336
+ session.stopLocalAudio();
337
+ ```
338
+
339
+ 【iOS】
340
+ ``` objectivec
341
+ // 静音 0 号通道的远端声音
342
+ [session muteRemoteAudio:0 mute:YES];
343
+ // 静音全部通道
344
+ [session muteAllRemoteAudio:YES];
345
+
346
+ // 开启语音对讲(需先获取麦克风权限)
347
+ [session startLocalAudio];
348
+ // 对讲过程中临时停止上行
349
+ [session muteLocalAudio:YES];
350
+ // 结束对讲
351
+ [session stopLocalAudio];
352
+ ```
353
+
354
+ 【小程序】
355
+ ``` typescript
356
+ // 静音 0 号通道的远端声音
357
+ session.muteRemoteAudio(0, true);
358
+ // 静音全部通道
359
+ session.muteAllRemoteAudio(true);
360
+
361
+ // 开启语音对讲(需先获取麦克风权限)
362
+ session.startLocalAudio();
363
+ // 对讲过程中临时停止上行
364
+ session.muteLocalAudio(true);
365
+ // 结束对讲
366
+ session.stopLocalAudio();
367
+ ```
368
+
369
+ ### 多通道同时拉流
370
+
371
+ 枪球一体机、多目摄像机等设备包含多个视频通道。为每个通道分别调用 `startRemoteView` 绑定独立视图即可同时观看,SDK 会在一次会话内统一订阅这些通道。
372
+
373
+ > **说明:**
374
+ > 建议在调用 `startSession` 之前为全部需要观看的通道都完成 `startRemoteView`;会话建立后新增通道会触发一次通道协商,画面出图相对更慢。所有已请求通道均进入播放状态后才会回调 `onSessionEstablished`。
375
+ >
376
+
377
+ 【Android】
378
+ ``` java
379
+ // 同时观看 0、1 两个通道
380
+ session.startRemoteView(0, TXIoTStreamType.HD, remoteView0);
381
+ session.startRemoteView(1, TXIoTStreamType.HD, remoteView1);
382
+ session.startSession(deviceId);
383
+
384
+ // 仅关闭 1 号通道,0 号通道继续播放
385
+ session.stopRemoteView(1);
386
+ ```
387
+
388
+ 【iOS】
389
+ ``` objectivec
390
+ // 同时观看 0、1 两个通道
391
+ [session startRemoteView:0 streamType:TXIoTStreamTypeHD view:self.remoteView0];
392
+ [session startRemoteView:1 streamType:TXIoTStreamTypeHD view:self.remoteView1];
393
+ [session startSession:deviceId];
394
+
395
+ // 仅关闭 1 号通道,0 号通道继续播放
396
+ [session stopRemoteView:1];
397
+ ```
398
+
399
+ 【小程序】
400
+ ``` typescript
401
+ // 同时观看 0、1 两个通道,分别绑定各自的 <iot-player> 组件
402
+ session.setIoTPlayer(0, 'remote-player-0');
403
+ session.setIoTPlayer(1, 'remote-player-1');
404
+ session.startRemoteView(0, TXIoTStreamType.HD);
405
+ session.startRemoteView(1, TXIoTStreamType.HD);
406
+ session.startSession(deviceId);
407
+
408
+ // 仅关闭 1 号通道,0 号通道继续播放
409
+ session.stopRemoteView(1);
410
+ ```
411
+
412
+ ### 截图与本地录制
413
+
414
+ `takeSnapshot` 对指定通道的当前画面截图,结果通过 `onSnapshotComplete` 返回。`startLocalRecording` 将指定通道的音视频录制到本地文件,录制过程通过 `onLocalRecordBegin`、`onLocalRecording`、`onLocalRecordComplete` 回调通知。小程序端仅支持截图,不支持本地录制。
415
+
416
+ > **注意:**
417
+ > `TXIoTLocalRecordingParams.filePath` 为必填项。若传入空字符串,SDK 会通过 `onLocalRecordBegin` 回调 `ERR_INVALID_PARAMETER`(iOS 为 `TXIoTErrorCodeInvalidParameter`)而不会开始录制。多通道设备的截图与录制均按 `channelId` 独立进行,如需同时录制多个通道,请对每个通道分别调用。
418
+ >
419
+
420
+ 【Android】
421
+ ``` java
422
+ // 截图,结果通过 onSnapshotComplete(channelId, bitmap, errCode) 返回
423
+ session.takeSnapshot(0);
424
+
425
+ // 本地录制
426
+ TXIoTLocalRecordingParams params = new TXIoTLocalRecordingParams();
427
+ params.filePath = getExternalFilesDir(null) + "/monitor_record.mp4";
428
+ session.startLocalRecording(0, params);
429
+
430
+ // 结束录制,完成后回调 onLocalRecordComplete
431
+ session.stopLocalRecording(0);
432
+ ```
433
+
434
+ 【iOS】
435
+ ``` objectivec
436
+ // 截图,结果通过 onSnapshotComplete:image:errorCode: 返回
437
+ [session takeSnapshot:0];
438
+
439
+ // 本地录制
440
+ TXIoTLocalRecordingParams *params = [[TXIoTLocalRecordingParams alloc] init];
441
+ params.filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"monitor_record.mp4"];
442
+ [session startLocalRecording:0 params:params];
443
+
444
+ // 结束录制,完成后回调 onLocalRecordComplete:errorCode:storagePath:
445
+ [session stopLocalRecording:0];
446
+ ```
447
+
448
+ 【小程序】
449
+ ``` typescript
450
+ // 截图,结果通过 onSnapshotComplete(channelId, imagePath) 返回
451
+ session.takeSnapshot(0);
452
+
453
+ // 小程序端不支持本地录制(startLocalRecording / stopLocalRecording)
454
+ ```
455
+
456
+ ### PTZ 云台控制
457
+
458
+ 对支持云台的设备,通过 `sendPTZCommand` 下发转动与变焦指令,`speed` 为转动速度。手势拖动等高频场景下 SDK 会自动合并待发送指令并串行下发,业务层无需自行节流。松手时下发 `STOP` 停止转动。
459
+
460
+ 【Android】
461
+ ``` java
462
+ // 向左转动
463
+ session.sendPTZCommand(0, TXIoTPTZCommand.LEFT, 5);
464
+ // 松手停止
465
+ session.sendPTZCommand(0, TXIoTPTZCommand.STOP, 0);
466
+ // 画面放大
467
+ session.sendPTZCommand(0, TXIoTPTZCommand.ZOOM_IN, 5);
468
+ ```
469
+
470
+ 【iOS】
471
+ ``` objectivec
472
+ // 向左转动
473
+ [session sendPTZCommand:0 command:TXIoTPTZCommandLeft speed:5];
474
+ // 松手停止
475
+ [session sendPTZCommand:0 command:TXIoTPTZCommandStop speed:0];
476
+ // 画面放大
477
+ [session sendPTZCommand:0 command:TXIoTPTZCommandZoomIn speed:5];
478
+ ```
479
+
480
+ 【小程序】
481
+ ``` typescript
482
+ // 向左转动
483
+ session.sendPTZCommand(0, TXIoTPTZCommand.LEFT, 5);
484
+ // 松手停止
485
+ session.sendPTZCommand(0, TXIoTPTZCommand.STOP, 0);
486
+ // 画面放大
487
+ session.sendPTZCommand(0, TXIoTPTZCommand.ZOOM_IN, 5);
488
+ ```
489
+
490
+ ## 状态与回调通知
491
+
492
+ 监控会话通过监听接口(Android:`TXIoTMonitorSessionListener`,iOS:`TXIoTMonitorSessionDelegate`,小程序:`addListener` 回调对象)回调状态与错误:
493
+
494
+ |**回调**|**触发时机**|**关键参数**|
495
+ |---------|---------|---------|
496
+ |`onSessionEstablished`|监控会话建立成功,所有已请求通道均进入播放状态。|无。|
497
+ |`onSessionReconnecting`|会话中断,SDK 正在自动重连。|无。|
498
+ |`onSessionRecovery`|会话重连成功,画面恢复。|无。|
499
+ |`onRenderFirstFrame`|指定通道首帧已渲染,可用于隐藏加载动画。|`channelId`|
500
+ |`onPlayStateChanged`|播放状态变化,用于驱动 loading 与占位图。|`channelId, state`(`PLAYING` / `LOADING` / `STOPPED`)|
501
+ |`onSnapshotComplete`|截图完成。|`channelId` 与截图结果(Android 为 `Bitmap`,iOS 为 `TXImage`,小程序为图片路径)|
502
+ |`onLocalRecordBegin`|本地录制开始,或因参数非法未能开始。|`channelId, errCode, storagePath`|
503
+ |`onLocalRecording`|录制进度更新。|`channelId, durationMs, storagePath`|
504
+ |`onLocalRecordComplete`|本地录制结束。|`channelId, errCode, storagePath`|
505
+ |`onError`|会话或某通道发生错误。|`channelId, errCode, errMsg`|
506
+
507
+ > **注意:**
508
+ > 会话中断时会先触发 `onSessionReconnecting`,SDK 自动尝试重连;重连成功触发 `onSessionRecovery`,无需业务层主动重建会话。若重连仍然失败,最终通过 `onError` 回调错误。
509
+ >
510
+
511
+ ## 常见问题
512
+
513
+ ### 调用 startSession 后一直没有画面,如何排查?
514
+
515
+ 按以下顺序排查:
516
+ 1. 确认监听在 `startSession` 之前注册,否则可能错过 `onSessionEstablished` 与早期的 `onError`。
517
+
518
+ 2. 检查是否收到 `onError`。若为 `ERR_DEVICE_OFFLINE`,说明设备已离线;若为 `ERR_UNAUTHORIZED_OPERATION`,说明当前账户没有该设备的权限,请先完成 设备绑定。
519
+
520
+ 3. 确认 `startRemoteView` 传入的 `channelId` 与设备端通道编号一致。通道编号不匹配时设备不会推送对应通道的流,`onPlayStateChanged` 会长期停留在 `LOADING`。
521
+
522
+ 4. 确认渲染视图已正确加载且尺寸不为0(小程序端确认 `setIoTPlayer` 传入的 `component-id` 与 `<iot-player>` 一致)。
523
+
524
+ 5. 若通道长时间处于 `LOADING`,SDK 会判定为加载超时并自动重试一次;仍失败则通过 `onError` 回调,此时应引导用户检查设备网络与在线状态。
525
+
526
+ ### 监控过程中会被视频通话打断吗?
527
+
528
+ 会。监控拉流的优先级低于视频通话。若设备正在被监控,此时对该设备发起视频通话,视频通话会抢占设备的推流能力:应用端会收到 `onError` 回调 `ERR_DEVICE_SWITCH_TO_VOIP`(iOS 为 `TXIoTErrorCodeDeviceSwitchToVoIP`),且当前监控会话会自动停止。业务层应在收到该错误后更新界面状态,不需要再调用 `stopSession`。视频通话相关能力参见 视频通话。
529
+
530
+ ### 网络抖动导致画面中断,需要业务层自己重连吗?
531
+
532
+ 不需要。SDK 内置自动重连:链路中断后先回调 `onSessionReconnecting`,重连成功回调 `onSessionRecovery`。建议在 `onSessionReconnecting` 中显示重连提示,在 `onSessionRecovery` 中恢复正常界面。仅当 SDK 自动重连失败时才会通过 `onError` 回调错误,此时再由业务层决定是否引导用户手动重试。
533
+
534
+ ### 可以同时监控多台设备吗?
535
+
536
+ 不可以。监控会话对象为单例,同一时刻只存在一个监控会话。切换观看设备时,必须先调用 `stopSession` 停止当前会话,再对新设备调用 `startSession`;未先停止会话时,新的 `startSession` 调用会被直接忽略。
537
+
538
+ ### 一台设备有多个摄像头,如何同时查看?
539
+
540
+ 为每个通道分别调用 `startRemoteView` 并绑定独立的渲染视图,SDK 会在同一会话内订阅这些通道,参见 多通道同时拉流。建议在 `startSession` 之前完成全部通道的绑定。
541
+
542
+ ### 截图与录制可以对多个通道同时进行吗?
543
+
544
+ 可以。`takeSnapshot`、`startLocalRecording`、`stopLocalRecording` 均以 `channelId` 为维度独立生效,需要对多个通道同时操作时,对每个通道分别调用即可,各通道的回调通过参数中的 `channelId` 区分。小程序端仅支持截图,不支持本地录制。
545
+
546
+ ## 接口参考
547
+
548
+ 监控拉流相关接口的完整定义参见:
549
+ - TXIoTMonitorSession(Android)
550
+
551
+ - TXIoTMonitorSession(iOS)
552
+
553
+ - TXIoTMonitorSession(小程序)
554
+
555
+ - TXIoTEngineDef(数据结构与错误码)
556
+
557
+ 安防摄像头场景下的云台控制、语音对讲、录制与截图的进阶用法,参见 云台控制、语音对讲、录制与截图。
@@ -0,0 +1,139 @@
1
+ ---
2
+ product: iot
3
+ framework:
4
+ - '*'
5
+ types:
6
+ - feature
7
+ retrievable_scope: always
8
+ feature_domain: app
9
+ ---
10
+
11
+ 本文介绍腾讯云物联网(IoT)远程控制能力的端到端实现:应用端通过设备管理(`TXIoTDeviceManager`)的 `sendCommand` 下发命令、`getProperties` 查询设备当前属性;设备端通过物模型回调接收属性变更与行为调用并回复执行结果。完成集成与登录 SDK 后,您需确保目标设备已完成 设备绑定,取得 `deviceId` 后方可对其进行远程控制。
12
+
13
+ > **说明:**
14
+ > 本文只覆盖基于物模型的远程控制(`sendCommand` / `getProperties`),不包含 `TXIoTMonitorSession` 与 `TXIoTCallSession` 等音视频能力。
15
+ >
16
+
17
+ ## 前提条件
18
+
19
+ 在远程控制设备前,请确保已完成以下准备工作:
20
+ - 已开通腾讯云物联网相关服务,并在控制台完成实例、应用和设备准备。可参见 开通服务。
21
+
22
+ - 已在客户端工程中集成 IoT 应用端 SDK。
23
+
24
+ - 已通过业务后台生成登录签名,并调用 `TXIoTEngine` 完成登录。
25
+
26
+ - 设备已完成绑定或分享:仅当用户本人拥有该设备、或家庭成员拥有该设备、或用户被分享了该设备时,才具备远程控制的权限。若尚未完成设备绑定或分享,请先参考 设备绑定。
27
+
28
+ 如果尚未完成 SDK 集成与登录,请先参考 Android SDK 集成与登录 或 iOS SDK 集成与登录 或 小程序 SDK 集成与登录。
29
+
30
+ ## 应用端下发控制
31
+
32
+ ### 获取设备管理对象
33
+
34
+ 设备管理能力通过 `TXIoTEngine` 获取。登录成功后,均可通过 `TXIoTEngine` 单例实例调用 `getDeviceManager()` 获取设备管理对象。
35
+
36
+ > **说明:**
37
+ > 如果获取到的 `TXIoTDeviceManager` 为空值(Android 与小程序为 `null`,iOS 为 `nil`),通常是因为 SDK 尚未登录或登录已过期,请先完成登录后再使用相关能力。
38
+ >
39
+
40
+ ### 下发控制命令
41
+
42
+ `sendCommand` 用于向设备下发控制命令。命令内容是一个 JSON 字符串,成功回调返回服务端响应的 JSON 字符串。
43
+
44
+ > **注意:**
45
+ > `jsonData` 中的字段必须与产品物模型保持一致,否则会出现下发失败的问题。设备离线、设备不存在或当前用户无权限时,通过 `onError` 返回错误码与错误信息。
46
+ >
47
+
48
+ |方法|说明|
49
+ |---------|---------|
50
+ |`sendCommand`|向设备下发命令,`jsonData` 为命令 JSON 字符串,原样发送给设备。|
51
+
52
+ 【Android】
53
+ ``` java
54
+ String jsonData = "{\"power_switch\":1}";
55
+ deviceManager.sendCommand(deviceId, jsonData, new TXIoTEngineDef.TXIoTCallback<String>() {
56
+ @Override
57
+ public void onSuccess(String result) {
58
+ // 命令下发成功,result 为服务端返回的 JSON 字符串。
59
+ }
60
+
61
+ @Override
62
+ public void onError(TXIoTEngineDef.TXIoTErrorCode errorCode, String errorMessage) {
63
+ // 命令下发失败,请根据错误码和错误信息处理。
64
+ }
65
+ });
66
+ ```
67
+
68
+ 【iOS】
69
+ ``` objectivec
70
+ NSString *jsonData = @"{\"power_switch\":1}";
71
+ TXIoTCallback<NSString *> *commandCallback = [[TXIoTCallback alloc] init];
72
+ commandCallback.onSuccess = ^(NSString *result) {
73
+ // 命令下发成功,result 为服务端返回的 JSON 字符串。
74
+ };
75
+ commandCallback.onError = ^(TXIoTErrorCode errorCode, NSString *errorMessage) {
76
+ // 命令下发失败,请根据错误码和错误信息处理。
77
+ };
78
+ [deviceManager sendCommand:deviceId jsonData:jsonData callback:commandCallback];
79
+ ```
80
+
81
+ 【小程序】
82
+ ``` typescript
83
+ const jsonData = JSON.stringify({ power_switch: 1 });
84
+ try {
85
+ // 命令下发成功,result 为服务端返回的 JSON 字符串。
86
+ const result = await deviceManager.sendCommand(deviceId, jsonData);
87
+ } catch (err) {
88
+ // 命令下发失败,请根据 err.code 和 err.message 处理。
89
+ }
90
+ ```
91
+
92
+ ### 查询设备属性
93
+
94
+ `getProperties` 用于查询设备当前的属性快照,返回属性 JSON 字符串。命令下发成功只代表云端已受理,设备实际状态需要通过本接口或设备侧上报确认。
95
+
96
+ |方法|说明|
97
+ |---------|---------|
98
+ |`getProperties`|查询设备当前属性,返回属性 JSON 字符串,字段含义由产品物模型定义。|
99
+
100
+ 【Android】
101
+ ``` java
102
+ deviceManager.getProperties(deviceId, new TXIoTEngineDef.TXIoTCallback<String>() {
103
+ @Override
104
+ public void onSuccess(String result) {
105
+ // 查询成功,result 为设备属性 JSON 字符串。
106
+ }
107
+
108
+ @Override
109
+ public void onError(TXIoTEngineDef.TXIoTErrorCode errorCode, String errorMessage) {
110
+ // 查询属性失败,请根据错误码和错误信息处理。
111
+ }
112
+ });
113
+ ```
114
+
115
+ 【iOS】
116
+ ``` objectivec
117
+ TXIoTCallback<NSString *> *propertyCallback = [[TXIoTCallback alloc] init];
118
+ propertyCallback.onSuccess = ^(NSString *result) {
119
+ // 查询成功,result 为设备属性 JSON 字符串。
120
+ };
121
+ propertyCallback.onError = ^(TXIoTErrorCode errorCode, NSString *errorMessage) {
122
+ // 查询属性失败,请根据错误码和错误信息处理。
123
+ };
124
+ [deviceManager getProperties:deviceId callback:propertyCallback];
125
+ ```
126
+
127
+ 【小程序】
128
+ ``` typescript
129
+ try {
130
+ // 查询成功,result 为设备属性 JSON 字符串,字段含义由产品物模型定义。
131
+ const result = await deviceManager.getProperties(deviceId);
132
+ } catch (err) {
133
+ // 查询属性失败,请根据 err.code 和 err.message 处理。
134
+ }
135
+ ```
136
+
137
+ ## 设备端接收远程控制
138
+
139
+ 应用端下发的控制命令最终由设备端通过物模型回调接收:属性类命令触发属性变更回调,行为类命令触发行为调用回调并可回复执行结果。设备端的物模型定义、数据类型与属性上报的完整说明参见 物模型通信。