@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,351 @@
1
+ ---
2
+ product: iot
3
+ framework:
4
+ - ios
5
+ types:
6
+ - feature
7
+ retrievable_scope: always
8
+ feature_domain: app_integration
9
+ ---
10
+
11
+ 本文介绍如何在 iOS 平台集成腾讯云物联网(IoT)应用端 SDK 并完成登录:涵盖工程配置、SDK 引入、登录签名计算与登录调用,并通过拉取家庭列表验证接入是否成功。设备绑定、设备分享、远程控制等能力在登录完成后按需接入,参见本文 [下一步](#ef67075c-1539-435c-b979-0a8d6794cf7c) 章节。
12
+
13
+ ## 前提条件
14
+
15
+ ### 开通服务
16
+
17
+ 请先按照 开通服务 文档,完成服务开通和应用创建,并获取以下信息:
18
+ - **AppKey**:登录必需。
19
+
20
+ - **AppSecret**:登录必需,用于计算登录签名。
21
+
22
+ - **ProductId**:接入设备绑定、物模型等能力时使用,本文不涉及。
23
+
24
+ - **DeviceName**:接入设备绑定、物模型等能力时使用,本文不涉及。
25
+
26
+ ### 环境准备
27
+ - Xcode 11.0 及以上版本。
28
+
29
+ - 确保项目已设置有效的开发者签名。
30
+
31
+ - 一台 iOS 12.0 及以上真机(与 Podfile 的 `platform :ios, '12.0'` 配置保持一致)。
32
+
33
+ ## 创建项目
34
+
35
+ 参考以下步骤创建一个新的 iOS 项目。如果已有项目,可跳过本节。
36
+ 1. 打开 Xcode,选择 **New Project**(新建项目)。
37
+
38
+ 2. 在平台标签中选择 **iOS**,然后选择 **App** 模板,单击 **Next**。
39
+
40
+ 3. 在 **Choose options for your new project** 页面设置 **Product Name**、**Team**、**Organization Identifier** 等项目基本信息,单击 **Next** 并选择保存路径,最后单击 **Create** 完成创建。
41
+
42
+ ## 集成 SDK
43
+ 1. 在项目根目录的 `Podfile` 中添加 IoT SDK 依赖:
44
+
45
+ > **说明:**
46
+ >
47
+ > `Podfile` 是 iOS 项目的 CocoaPods 依赖配置文件,位于项目根目录(与 `.xcodeproj` 同级),用文本编辑器编辑即可。如果目录下没有 `Podfile`,先在终端进入项目目录执行 `pod init` 生成。
48
+ >
49
+
50
+ ``` ruby
51
+ # 将下方的 'YourApp' 替换为您 Xcode 项目中实际的 Target 名称
52
+ platform :ios, '12.0'
53
+
54
+ target 'YourApp' do
55
+ # 物联网应用端 SDK(IOT 定制版)
56
+ pod 'TXLiteAVSDK_Professional',:podspec =>'https://liteav.sdk.qcloud.com/pod/liteavsdkspec/customer/TXLiteAVSDK_Professional_IOT_13.4.0.25016.podspec'
57
+ end
58
+ ```
59
+
60
+ **Xcode 16 兼容性问题:**若使用 Xcode 16 及以上版本,`pod install` 后可能报部署目标版本错误。请在 `Podfile` 末尾添加以下配置解决:
61
+
62
+ ``` ruby
63
+ post_install do |installer|
64
+ installer.pods_project.build_configurations.each do |config|
65
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
66
+ end
67
+ installer.pods_project.targets.each do |target|
68
+ target.build_configurations.each do |config|
69
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
70
+ end
71
+ end
72
+ end
73
+ ```
74
+ 2. 完成配置后,在终端执行 `pod install`,SDK 将自动下载并集成到工程中。
75
+
76
+ 3. `pod install` 完成后,在 Finder 中找到项目目录下的 **.xcworkspace** 文件并双击打开(请打开 `.xcworkspace` 而非 `.xcodeproj`)。
77
+
78
+ 4. 在 Xcode 的 **Build Settings** 中搜索 **User Script Sandboxing**,将其值设置为 **No**。
79
+
80
+ 5. 在 **Signing & Capabilities** 中确认已配置有效的开发者签名。
81
+
82
+ ## 接入步骤
83
+
84
+ ### 步骤 1:获取 SDK 实例
85
+
86
+ 调用 `TXIoTEngine.getInstance` 获取 SDK 实例,并注册 `TXIoTEngineDelegate` 监听登录、签名过期和设备状态推送。
87
+ ``` objectivec
88
+ // 获取单例实例
89
+ TXIoTEngine *iotEngine = [TXIoTEngine getInstance];
90
+ // 注册监听(self 需遵循 TXIoTEngineDelegate 协议)
91
+ [iotEngine addDelegate:self];
92
+ ```
93
+
94
+ 在监听对象中实现 `TXIoTEngineDelegate` 协议方法:
95
+ ``` objectivec
96
+ #pragma mark - TXIoTEngineDelegate
97
+
98
+ - (void)onLoginSuccess {
99
+ // 登录成功
100
+ }
101
+
102
+ - (void)onLoginFailure:(TXIoTErrorCode)errCode errMsg:(NSString *)errMsg {
103
+ // 登录失败
104
+ }
105
+
106
+ - (void)onUserSignatureExpired {
107
+ // 登录签名过期,请重新计算签名后再次调用 login
108
+ }
109
+
110
+ - (void)onReceivePushMessage:(TXIoTPushMessage *)pushMessage {
111
+ // 接收设备在线、离线等状态变更
112
+ }
113
+ ```
114
+
115
+ ### 步骤 2:计算登录签名
116
+
117
+ > **说明:**
118
+ > 快速接入阶段可直接在客户端计算签名进行调试。正式上线时请将签名计算逻辑放在业务后台,不要将 AppSecret 保存在客户端。
119
+ >
120
+
121
+ #### 签名参数
122
+
123
+ 参与签名的参数:
124
+
125
+ |参数|说明|
126
+ |---------|---------|
127
+ |`RequestId`|唯一请求 ID,建议使用 UUID。|
128
+ |`Timestamp`|当前 UNIX 秒级时间戳。|
129
+ |`Nonce`|随机正整数,用于和时间戳一起防重放。|
130
+ |`AppKey`|从 开通服务 文档获取的 AppKey。|
131
+ |`OpenID`|用户标识,需与后续登录的 `userId` 保持一致。支持数字、字母、下划线,长度不超过 32 字节。|
132
+
133
+ > **注意:**
134
+ > **OpenID 与 UserID 的关系:**签名参数名为 **OpenID**,SDK 登录接口参数名为 **userId**,两者是同一个东西,值必须保持一致。
135
+ >
136
+
137
+ #### 签名计算规则
138
+ 1. 去掉值为空的参数。
139
+
140
+ 2. 将参数按参数名的字典序升序排列。
141
+
142
+ 3. 将排序后的参数按 `Key=Value` 格式拼接。
143
+
144
+ 4. 使用 `&` 连接所有参数,得到签名原文。
145
+
146
+ 5. 使用从 开通服务 文档获取的 `AppSecret` 对签名原文进行 HMAC-SHA1 签名。
147
+
148
+ 6. 对签名结果进行 Base64 编码,得到最终 `Signature`。
149
+
150
+ #### 签名计算示例
151
+
152
+ 例如,参与签名的参数如下:
153
+ ``` plaintext
154
+ RequestId=8b8d499bbba1ac28b6da21b4
155
+ Timestamp=1546315200
156
+ Nonce=71087795
157
+ AppKey=your_app_key
158
+ OpenID=user_001
159
+ ```
160
+
161
+ 排序后的签名原文:
162
+ ``` plaintext
163
+ AppKey=your_app_key&Nonce=71087795&OpenID=user_001&RequestId=8b8d499bbba1ac28b6da21b4&Timestamp=1546315200
164
+ ```
165
+
166
+ 使用 `your_app_secret` 作为 AppSecret 对上述原文计算,期望得到的签名为 `aSLzd4Ett7RsiLhrYht6Yk9+0qY=`,可用于自验签名实现是否正确。
167
+
168
+ 参考以下示例计算签名。客户端示例基于系统自带的 CommonCrypto 框架;正式上线时签名在业务后台计算,参考服务端示例:
169
+
170
+ 【客户端(Objective-C)】
171
+ ``` objectivec
172
+ #import <CommonCrypto/CommonHMAC.h>
173
+
174
+ + (NSString *)generateSignatureWithAppSecret:(NSString *)appSecret
175
+ requestId:(NSString *)requestId
176
+ timestamp:(int64_t)timestamp
177
+ nonce:(NSInteger)nonce
178
+ appKey:(NSString *)appKey
179
+ openId:(NSString *)openId {
180
+ NSDictionary<NSString *, NSString *> *params = @{
181
+ @"RequestId": requestId,
182
+ @"Timestamp": @(timestamp).stringValue,
183
+ @"Nonce": @(nonce).stringValue,
184
+ @"AppKey": appKey,
185
+ @"OpenID": openId,
186
+ };
187
+
188
+ // 去掉值为空的参数,按参数名的字典序升序排列
189
+ NSArray<NSString *> *sortedKeys = [params.allKeys sortedArrayUsingSelector:@selector(compare:)];
190
+ NSMutableArray<NSString *> *pairs = [NSMutableArray array];
191
+ for (NSString *key in sortedKeys) {
192
+ NSString *value = params[key];
193
+ if (value.length == 0) {
194
+ continue;
195
+ }
196
+ [pairs addObject:[NSString stringWithFormat:@"%@=%@", key, value]];
197
+ }
198
+ // 按 Key=Value 格式拼接,使用 & 连接
199
+ NSString *source = [pairs componentsJoinedByString:@"&"];
200
+
201
+ // 使用 AppSecret 对签名原文进行 HMAC-SHA1 签名
202
+ NSData *keyData = [appSecret dataUsingEncoding:NSUTF8StringEncoding];
203
+ NSData *sourceData = [source dataUsingEncoding:NSUTF8StringEncoding];
204
+ unsigned char digest[CC_SHA1_DIGEST_LENGTH];
205
+ CCHmac(kCCHmacAlgSHA1, keyData.bytes, keyData.length,
206
+ sourceData.bytes, sourceData.length, digest);
207
+
208
+ // 对签名结果进行 Base64 编码
209
+ NSData *digestData = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
210
+ return [digestData base64EncodedStringWithOptions:0];
211
+ }
212
+ ```
213
+
214
+ ``` python
215
+ import base64
216
+ import hashlib
217
+ import hmac
218
+
219
+ def generate_signature(app_secret, request_id, timestamp, nonce, app_key, user_id):
220
+ params = {
221
+ "RequestId": request_id,
222
+ "Timestamp": str(timestamp),
223
+ "Nonce": str(nonce),
224
+ "AppKey": app_key,
225
+ "OpenID": user_id,
226
+ }
227
+ # 去掉值为空的参数
228
+ params = {
229
+ key: value
230
+ for key, value in params.items()
231
+ if value is not None and value != ""
232
+ }
233
+ # 按参数名的字典序升序排列
234
+ sorted_items = sorted(params.items(), key=lambda item: item[0])
235
+ # 按 Key=Value 格式拼接,使用 & 连接
236
+ source = "&".join([f"{key}={value}" for key, value in sorted_items])
237
+ # 使用 AppSecret 对签名原文进行 HMAC-SHA1 签名
238
+ digest = hmac.new(
239
+ app_secret.encode("utf-8"),
240
+ source.encode("utf-8"),
241
+ hashlib.sha1,
242
+ ).digest()
243
+ # 对签名结果进行 Base64 编码
244
+ signature = base64.b64encode(digest).decode("utf-8")
245
+ return signature
246
+
247
+ signature = generate_signature(
248
+ app_secret="your_app_secret",
249
+ request_id="8b8d499bbba1ac28b6da21b4",
250
+ timestamp=1546315200,
251
+ nonce=71087795,
252
+ app_key="your_app_key",
253
+ user_id="user_001",
254
+ )
255
+ print(signature)
256
+ ```
257
+
258
+ ### 步骤 3:登录 SDK
259
+
260
+ 调用 `TXIoTEngine.login` 登录 SDK,传入上一步计算得到的签名参数。
261
+
262
+ #### 参数说明
263
+ | 参数 | 类型 | 说明 |
264
+ | --- | --- | --- |
265
+ | <code>appKey</code> | NSString | 从 开通服务 文档获取的 AppKey。 |
266
+ | <code>userId</code> | NSString | 用户标识,支持数字、字母、下划线,长度不超过32字节。<br>首次使用会自动注册,已注册则登录原有账号,该账号下的设备绑定关系仍然保留。需与签名参数 <code>OpenID</code> 保持一致。 |
267
+ | <code>userSignature.requestId</code> | NSString | 对应签名参数 <code>RequestId</code>。 |
268
+ | <code>userSignature.timestamp</code> | int64_t | 对应签名参数 <code>Timestamp</code>。 |
269
+ | <code>userSignature.nonce</code> | NSInteger | 对应签名参数 <code>Nonce</code>。 |
270
+ | <code>userSignature.signature</code> | NSString | 签名计算结果。 |
271
+
272
+ ``` objectivec
273
+ TXIoTUserSignature *userSignature = [[TXIoTUserSignature alloc] init];
274
+ userSignature.requestId = requestId;
275
+ userSignature.timestamp = timestamp;
276
+ userSignature.nonce = nonce;
277
+ userSignature.signature = signature;
278
+
279
+ [iotEngine login:appKey userId:userId userSignature:userSignature];
280
+ ```
281
+
282
+ ### 步骤 4:验证登录结果
283
+
284
+ 登录成功后,调用 `getFamilyManager` 获取家庭管理实例并拉取家庭列表,以此验证登录态与网络链路是否正常。返回的 `familyId` 是后续绑定设备、查询设备列表的必备参数,请妥善保存。
285
+ ``` objectivec
286
+ TXIoTFamilyManager *familyManager = [iotEngine getFamilyManager];
287
+ if (familyManager == nil) {
288
+ // SDK 未登录或登录态已失效
289
+ return;
290
+ }
291
+
292
+ TXIoTCallback<NSArray<TXIoTFamilyInfo *> *> *callback = [[TXIoTCallback alloc] init];
293
+ callback.onSuccess = ^(NSArray<TXIoTFamilyInfo *> * _Nullable familyList) {
294
+ if (familyList.count == 0) {
295
+ // 当前账号下没有家庭,调用 createFamily 创建(见下方示例)
296
+ return;
297
+ }
298
+ // 选择一个家庭,记录 familyId
299
+ NSString *familyId = familyList.firstObject.familyId;
300
+ };
301
+ callback.onError = ^(TXIoTErrorCode errorCode, NSString * _Nullable errorMessage) {
302
+ // 获取家庭列表失败
303
+ };
304
+ [familyManager getFamilyList:callback];
305
+ ```
306
+
307
+ 如果当前账号下没有家庭,可调用 `createFamily` 创建:
308
+ ``` objectivec
309
+ TXIoTCallback<TXIoTFamilyInfo *> *callback = [[TXIoTCallback alloc] init];
310
+ callback.onSuccess = ^(TXIoTFamilyInfo * _Nullable familyInfo) {
311
+ // 创建成功,记录 familyId
312
+ };
313
+ callback.onError = ^(TXIoTErrorCode errorCode, NSString * _Nullable errorMessage) {
314
+ // 创建家庭失败
315
+ };
316
+ [familyManager createFamily:@"我的家庭" callback:callback];
317
+ ```
318
+
319
+ ## 常见问题
320
+
321
+ ### 为什么 `getFamilyManager` 或 `getDeviceManager` 返回 `nil`?
322
+
323
+ SDK 尚未登录或登录态已失效。请先调用 `TXIoTEngine.login`,并在收到 `onLoginSuccess` 后再获取对应 Manager。
324
+
325
+ ### 登录签名过期后如何处理?
326
+
327
+ 当收到 `onUserSignatureExpired` 回调时,请重新计算登录签名,然后再次调用 `TXIoTEngine.login`。
328
+
329
+ ### 登录失败或提示签名错误如何排查?
330
+
331
+ 请按以下顺序逐项核对:
332
+ 1. `AppKey` 与 `AppSecret` 是否来自同一个应用且配对正确。
333
+
334
+ 2. 签名参数 `OpenID` 与登录接口的 `userId` 是否完全一致。
335
+
336
+ 3. `Timestamp` 是否为 UNIX 秒级时间戳(非毫秒),且与当前时间偏差在允许范围内。
337
+
338
+ 4. 参与签名的参数是否已去掉空值、并按参数名字典序升序排列后以 `&` 连接。
339
+
340
+ 5. 签名算法是否为 HMAC-SHA1,且签名结果经过 Base64 编码。
341
+
342
+ 可使用 签名计算示例 中给出的期望输出(`aSLzd4Ett7RsiLhrYht6Yk9+0qY=`)自验签名实现是否正确。
343
+
344
+ ## 下一步
345
+
346
+ 完成基础接入后,您还可以继续接入以下能力:
347
+ - 设备绑定
348
+
349
+ - 远程控制
350
+
351
+ - 家庭管理
@@ -0,0 +1,268 @@
1
+ ---
2
+ product: iot
3
+ framework:
4
+ - minprogram
5
+ types:
6
+ - feature
7
+ retrievable_scope: always
8
+ feature_domain: app_integration
9
+ ---
10
+
11
+ 本文将介绍如何在小程序平台集成腾讯云物联网(IoT)应用端 SDK 并完成登录,包括工程配置、插件引入、登录签名计算与登录调用等,并通过拉取家庭列表验证接入是否成功。设备绑定、设备分享、远程控制等能力在登录完成后按需接入,参见本文 [下一步](#ef67075c-1539-435c-b979-0a8d6794cf7c) 章节。
12
+
13
+ ## 前提条件
14
+
15
+ ### 开通服务
16
+
17
+ 请先按照 开通服务 文档,完成服务开通和应用创建,并获取以下信息:
18
+ - **AppKey**:登录必需。
19
+
20
+ - **AppSecret**:登录必需,用于计算登录签名。
21
+
22
+ - **ProductId**:接入设备绑定、物模型等能力时使用,本文不涉及。
23
+
24
+ - **DeviceName**:接入设备绑定、物模型等能力时使用,本文不涉及。
25
+
26
+ ### 环境准备
27
+ - 安装 [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)。
28
+
29
+ - 一部 iPhone 或 Android 真机,安装并登录微信。模拟器不支持原生组件(即 <live-pusher> 和 <live-player> 标签),需要在真机上进行运行体验。
30
+
31
+ - 申请小程序 AppID。由于小程序测试号不具备 <live-pusher> 和 <live-player> 的使用权限,需要申请常规小程序账号进行开发。
32
+
33
+ - 申请 live-pusher、live-player 和双人音视频对话权限。该权限仅接入实时监控、视频通话能力时需要,仅完成本文的登录接入可跳过。
34
+
35
+ ## 创建项目
36
+
37
+ 参考以下步骤创建一个新的小程序项目。如果已有项目,可跳过本节。
38
+ 1. 打开微信开发者工具,单击 **+**(新建项目)。
39
+
40
+ 2. 项目类型选择**小程序**,填写项目名称与本地目录。
41
+
42
+ 3. **AppID** 填写前提条件中申请的常规小程序 AppID(小程序测试号不具备 <live-pusher> 和 <live-player> 的使用权限)。
43
+
44
+ 4. 后端服务选择**不使用云服务**,模板选择 **JS-基础模板**,单击**确定**完成创建。
45
+
46
+ ## 集成插件
47
+ 1. 在小程序根目录的 `app.json` 中添加腾讯云物联网插件声明:
48
+
49
+ ``` json
50
+ {
51
+ "plugins": {
52
+ "tx-iot-sdk": {
53
+ "version": "latest",
54
+ "provider": "wx5201edc27c631209"
55
+ }
56
+ }
57
+ }
58
+ ```
59
+ 2. 保存后重新编译工程,插件即集成到小程序中。`version` 为 `latest` 时会自动使用插件的最新版本,正式项目建议固定为具体版本号,避免插件升级引入非预期变更。
60
+
61
+ 3. 在需要使用 SDK 的页面或逻辑文件中,通过 `requirePlugin` 引入插件导出的接口:
62
+
63
+ ``` typescript
64
+ const { TXIoTEngine, TXIoTUserSignature } = requirePlugin('tx-iot-sdk');
65
+ ```
66
+
67
+ ## 接入步骤
68
+
69
+ ### 步骤 1:获取 SDK 实例
70
+
71
+ 调用 `TXIoTEngine.getInstance` 获取 SDK 实例,注册登录、签名过期和设备状态推送监听。
72
+ ``` typescript
73
+ const engine = await TXIoTEngine.getInstance();
74
+ engine.addListener({
75
+ onLoginSuccess() {
76
+ // 登录成功
77
+ },
78
+ // 其他回调按需实现
79
+ });
80
+ ```
81
+
82
+ ### 步骤 2:计算登录签名
83
+
84
+ > **说明:**
85
+ > 快速接入阶段可直接在客户端计算签名进行调试。正式上线时请将签名计算逻辑放在业务后台,不要将 AppSecret 保存在客户端。
86
+ >
87
+
88
+ #### 签名参数
89
+
90
+ 参与签名的参数:
91
+
92
+ |参数|说明|
93
+ |---------|---------|
94
+ |`RequestId`|唯一请求 ID,建议使用 UUID。|
95
+ |`Timestamp`|当前 UNIX 秒级时间戳。|
96
+ |`Nonce`|随机正整数,用于和时间戳一起防重放。|
97
+ |`AppKey`|从 开通服务 文档获取的 AppKey。|
98
+ |`OpenID`|用户标识,需与后续登录的 `userId` 保持一致。支持数字、字母、下划线,长度不超过32字节。|
99
+
100
+ > **注意:**
101
+ > OpenID 与 UserID 的关系:签名参数名为 **OpenID**,SDK 登录接口参数名为 **userId**,两者是同一个东西,值必须保持一致。
102
+ >
103
+
104
+ #### 签名计算规则
105
+ 1. 去掉值为空的参数。
106
+
107
+ 2. 将参数按参数名的字典序升序排列。
108
+
109
+ 3. 将排序后的参数按 `Key=Value` 格式拼接。
110
+
111
+ 4. 使用 `&` 连接所有参数,得到签名原文。
112
+
113
+ 5. 使用从 开通服务 文档获取的 `AppSecret` 对签名原文进行 HMAC-SHA1 签名。
114
+
115
+ 6. 对签名结果进行 Base64 编码,得到最终 `Signature`。
116
+
117
+ #### 签名计算示例
118
+
119
+ 例如,参与签名的参数如下:
120
+ ``` text
121
+ RequestId=8b8d499bbba1ac28b6da21b4
122
+ Timestamp=1546315200
123
+ Nonce=71087795
124
+ AppKey=your_app_key
125
+ OpenID=user_001
126
+ ```
127
+
128
+ 排序后的签名原文:
129
+ ``` text
130
+ AppKey=your_app_key&Nonce=71087795&OpenID=user_001&RequestId=8b8d499bbba1ac28b6da21b4&Timestamp=1546315200
131
+ ```
132
+
133
+ 使用 `your_app_secret` 作为 AppSecret 对上述原文计算,期望得到的签名为 `aSLzd4Ett7RsiLhrYht6Yk9+0qY=`,可用于自验签名实现是否正确。
134
+
135
+ 参考以下示例计算签名。客户端调试示例基于 `js-sha1` 库(需通过 npm 安装并在微信开发者工具中执行「构建 npm」);正式上线时签名在业务后台计算,参考服务端示例:
136
+
137
+ 【客户端(小程序)】
138
+ ``` typescript
139
+ import { sha1 } from 'js-sha1';
140
+
141
+ function generateSignature(
142
+ appSecret: string,
143
+ requestId: string,
144
+ timestamp: number,
145
+ nonce: number,
146
+ appKey: string,
147
+ openId: string,
148
+ ): string {
149
+ const params: Record<string, string> = {
150
+ RequestId: requestId,
151
+ Timestamp: String(timestamp),
152
+ Nonce: String(nonce),
153
+ AppKey: appKey,
154
+ OpenID: openId,
155
+ };
156
+ // 去掉值为空的参数,按参数名的字典序升序排列,使用 & 连接
157
+ const source = Object.keys(params)
158
+ .filter((key) => params[key] !== undefined && params[key] !== '')
159
+ .sort()
160
+ .map((key) => `${key}=${params[key]}`)
161
+ .join('&');
162
+ // 使用 AppSecret 对签名原文进行 HMAC-SHA1 签名
163
+ const buffer = sha1.hmac.arrayBuffer(appSecret, source);
164
+ // 对签名结果进行 Base64 编码
165
+ return wx.arrayBufferToBase64(buffer);
166
+ }
167
+
168
+ const signature = generateSignature(
169
+ 'your_app_secret',
170
+ '8b8d499bbba1ac28b6da21b4',
171
+ 1546315200,
172
+ 71087795,
173
+ 'your_app_key',
174
+ 'user_001',
175
+ );
176
+ console.log(signature); // aSLzd4Ett7RsiLhrYht6Yk9+0qY=
177
+ ```
178
+
179
+ ### 步骤 3:登录 SDK
180
+
181
+ 调用 `TXIoTEngine.login` 登录 SDK,传入上一步计算得到的签名参数。
182
+
183
+ #### 参数说明
184
+ | 参数 | 类型 | 说明 |
185
+ | --- | --- | --- |
186
+ | <code>appKey</code> | String | 从 开通服务 文档获取的 AppKey。 |
187
+ | <code>userId</code> | String | 用户标识,支持数字、字母、下划线,长度不超过32字节。<br>首次使用会自动注册,已注册则登录原有账号,该账号下的设备绑定关系仍然保留。需与签名参数 <code>OpenID</code> 保持一致。 |
188
+ | <code>userSignature.requestId</code> | String | 对应签名参数 <code>RequestId</code>。 |
189
+ | <code>userSignature.timestamp</code> | Number | 对应签名参数 <code>Timestamp</code>。 |
190
+ | <code>userSignature.nonce</code> | Number | 对应签名参数 <code>Nonce</code>。 |
191
+ | <code>userSignature.signature</code> | String | 签名计算结果。 |
192
+
193
+ ``` typescript
194
+ const userSignature = new TXIoTUserSignature();
195
+ userSignature.requestId = requestId; // 对应签名参数 RequestId
196
+ userSignature.timestamp = timestamp; // 对应签名参数 Timestamp(秒级)
197
+ userSignature.nonce = nonce; // 对应签名参数 Nonce
198
+ userSignature.signature = signature; // 上一步计算得到的签名
199
+
200
+ engine.login(appKey, userId, userSignature);
201
+ ```
202
+
203
+ ### 步骤 4:验证登录结果
204
+
205
+ 登录成功后,调用 `getFamilyManager` 获取家庭管理实例并拉取家庭列表,以此验证登录态与网络链路是否正常。返回的 `familyId` 是后续绑定设备、查询设备列表的必备参数,请妥善保存。
206
+ ``` typescript
207
+ const familyManager = engine.getFamilyManager();
208
+ if (!familyManager) {
209
+ // SDK 未登录或登录态已失效
210
+ return;
211
+ }
212
+
213
+ try {
214
+ let familyList = await familyManager.getFamilyList();
215
+ if (familyList.length === 0) {
216
+ // 当前账号下没有家庭,先创建一个
217
+ const familyInfo = await familyManager.createFamily('我的家庭');
218
+ familyList = [familyInfo];
219
+ }
220
+ // familyList: TXIoTFamilyInfo[]
221
+ // 选择一个家庭,记录 familyId
222
+ const familyId = familyList[0].familyId;
223
+ } catch (err) {
224
+ // err: { code, message }
225
+ console.error('获取家庭信息失败:', err.code, err.message);
226
+ }
227
+ ```
228
+
229
+ ## 常见问题
230
+
231
+ ### 为什么 `getFamilyManager` 或 `getDeviceManager` 返回 `null`?
232
+
233
+ SDK 尚未登录或登录态已失效。请先调用 `TXIoTEngine.login`,并在收到 `onLoginSuccess` 后再获取对应 Manager。
234
+
235
+ ### 登录签名过期后如何处理?
236
+
237
+ 当收到 `onUserSignatureExpired` 回调时,请重新计算登录签名,然后再次调用 `TXIoTEngine.login`。
238
+
239
+ ### 登录失败或提示签名错误如何排查?
240
+
241
+ 请按以下顺序逐项核对:
242
+ 1. `AppKey` 与 `AppSecret` 是否来自同一个应用且配对正确。
243
+
244
+ 2. 签名参数 `OpenID` 与登录接口的 `userId` 是否完全一致。
245
+
246
+ 3. `Timestamp` 是否为 UNIX 秒级时间戳(非毫秒),且与当前时间偏差在允许范围内。
247
+
248
+ 4. 参与签名的参数是否已去掉空值、并按参数名字典序升序排列后以 `&` 连接。
249
+
250
+ 5. 签名算法是否为 HMAC-SHA1,且签名结果经过 Base64 编码。
251
+
252
+ 可使用 签名计算示例 中给出的期望输出(`aSLzd4Ett7RsiLhrYht6Yk9+0qY=`)自验签名实现是否正确。
253
+
254
+ ### 调用 `requirePlugin` 报错或提示插件不存在?
255
+ - 确认 `app.json` 中已正确声明 `plugins`(插件名 `tx-iot`,`provider` 为 `wx5201edc27c631209`),保存后重新编译工程。
256
+
257
+ - 确认使用的是常规小程序 AppID,小程序测试号不支持插件能力。
258
+
259
+ ## 下一步
260
+
261
+ 完成基础接入后,您还可以继续接入以下能力:
262
+ - 绑定与分享
263
+
264
+ - 远程控制
265
+
266
+ - 实时监控
267
+
268
+ - 视频通话