@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,328 @@
1
+ ---
2
+ product: iot
3
+ framework:
4
+ - android
5
+ types:
6
+ - feature
7
+ retrievable_scope: always
8
+ feature_domain: app_integration
9
+ ---
10
+
11
+ 本文介绍如何在 Android 平台集成腾讯云物联网(IoT)应用端 SDK 并完成登录:涵盖工程配置、SDK 引入、登录签名计算与登录调用,并通过拉取家庭列表验证接入是否成功。设备绑定、设备分享、远程控制等能力在登录完成后按需接入,参见本文 [下一步](#c74dc1ed-b64a-4744-a1e1-9d9cb3eb7e49) 章节。
12
+
13
+ ## 前提条件
14
+
15
+ ### 开通服务
16
+
17
+ 请先按照 开通服务 文档,完成服务开通和应用创建,并获取以下信息:
18
+ - **AppKey**:登录必需。
19
+
20
+ - **AppSecret**:登录必需,用于计算登录签名。
21
+
22
+ - **ProductId**:接入设备绑定、物模型等能力时使用,本文不涉及。
23
+
24
+ - **DeviceName**:接入设备绑定、物模型等能力时使用,本文不涉及。
25
+
26
+ ### 环境准备
27
+ - Android Studio 3.5 及以上版本。
28
+
29
+ - 最低兼容 Android 4.4(SDK API Level 19),建议 Android 5.0(SDK API Level 21)及以上。
30
+
31
+ ## 创建项目
32
+
33
+ 参考以下步骤创建一个新的 Android 项目。如果已有项目,可跳过本节。
34
+ 1. 打开 Android Studio,选择 **New Project**(新建项目)。
35
+
36
+ 2. 选择 **Empty Views Activity** 模板,单击 **Next**。
37
+
38
+ 3. 在 **Configure your project** 页面配置:
39
+
40
+ - **Language** 选择 **Java**。
41
+
42
+ - **Minimum SDK** 建议 Android 5.0(API 21)及以上。
43
+
44
+ - **Build configuration language** 选择 **Groovy DSL (build.gradle)**。
45
+
46
+ ## 集成 SDK
47
+ 1. 在 **app/build.gradle**(非根目录的 build.gradle)的 **dependencies** 中添加 IoT SDK 依赖:
48
+
49
+ ``` groovy
50
+ dependencies {
51
+ // 物联网应用端 SDK
52
+ implementation 'com.tencent.liteav.customize:LiteAVSDK_Professional:13.4.0.25011'
53
+ }
54
+ ```
55
+ 2. 完成配置后,在 Android Studio 工具栏单击 **Sync Now**,SDK 将自动下载并集成到工程中。出现 Build successful 即表示成功。
56
+
57
+ ## 接入步骤
58
+
59
+ ### 步骤 1:获取 SDK 实例
60
+
61
+ 调用 `TXIoTEngine.getInstance` 获取 SDK 实例,注册登录、签名过期和设备状态推送监听。
62
+ ``` java
63
+ TXIoTEngine iotEngine = TXIoTEngine.getInstance(getApplicationContext());
64
+ iotEngine.addListener(new TXIoTEngine.TXIoTEngineListener() {
65
+ @Override
66
+ public void onLoginSuccess() {
67
+ // 登录成功
68
+ }
69
+
70
+ //其他回调省略实现
71
+ });
72
+ ```
73
+
74
+ ### 步骤 2:计算登录签名
75
+
76
+ > **说明:**
77
+ > 快速接入阶段可直接在客户端计算签名进行调试。正式上线时请将签名计算逻辑放在业务后台,不要将 AppSecret 保存在客户端。
78
+ >
79
+
80
+ #### 签名参数
81
+
82
+ 参与签名的参数:
83
+
84
+ |参数|说明|
85
+ |---------|---------|
86
+ |`RequestId`|唯一请求 ID,建议使用 UUID。|
87
+ |`Timestamp`|当前 UNIX 秒级时间戳。|
88
+ |`Nonce`|随机正整数,用于和时间戳一起防重放。|
89
+ |`AppKey`|从 开通服务 文档获取的 AppKey。|
90
+ |`OpenID`|用户标识,需与后续登录的 `userId` 保持一致。支持数字、字母、下划线,长度不超过 32 字节。|
91
+
92
+ > **注意:**
93
+ > OpenID 与 UserID 的关系:签名参数名为 **OpenID**,SDK 登录接口参数名为 **userId**,两者是同一个东西,值必须保持一致。
94
+ >
95
+
96
+ #### 签名计算规则
97
+ 1. 去掉值为空的参数。
98
+
99
+ 2. 将参数按参数名的字典序升序排列。
100
+
101
+ 3. 将排序后的参数按 `Key=Value` 格式拼接。
102
+
103
+ 4. 使用 `&` 连接所有参数,得到签名原文。
104
+
105
+ 5. 使用从 开通服务 文档获取的 `AppSecret` 对签名原文进行 HMAC-SHA1 签名。
106
+
107
+ 6. 对签名结果进行 Base64 编码,得到最终 `Signature`。
108
+
109
+ #### 签名计算示例
110
+
111
+ 例如,参与签名的参数如下:
112
+ ``` text
113
+ RequestId=8b8d499bbba1ac28b6da21b4
114
+ Timestamp=1546315200
115
+ Nonce=71087795
116
+ AppKey=your_app_key
117
+ OpenID=user_001
118
+ ```
119
+
120
+ 排序后的签名原文:
121
+ ``` text
122
+ AppKey=your_app_key&Nonce=71087795&OpenID=user_001&RequestId=8b8d499bbba1ac28b6da21b4&Timestamp=1546315200
123
+ ```
124
+
125
+ 使用 `your_app_secret` 作为 AppSecret 对上述原文计算,期望得到的签名为 `aSLzd4Ett7RsiLhrYht6Yk9+0qY=`,可用于自验签名实现是否正确。
126
+
127
+ 参考以下示例计算签名。客户端示例基于 Java 标准库(Android 端 Base64 请使用 `android.util.Base64`);正式上线时签名在业务后台计算,参考服务端示例:
128
+
129
+ 【客户端(Java)】
130
+ ``` java
131
+ import javax.crypto.Mac;
132
+ import javax.crypto.spec.SecretKeySpec;
133
+ import java.util.Base64;
134
+ import java.util.Map;
135
+ import java.util.TreeMap;
136
+
137
+ public class SignatureDemo {
138
+
139
+ static String generateSignature(String appSecret, String requestId, long timestamp,
140
+ int nonce, String appKey, String openId) throws Exception {
141
+ // TreeMap 按参数名的字典序升序排列
142
+ Map<String, String> params = new TreeMap<>();
143
+ params.put("RequestId", requestId);
144
+ params.put("Timestamp", String.valueOf(timestamp));
145
+ params.put("Nonce", String.valueOf(nonce));
146
+ params.put("AppKey", appKey);
147
+ params.put("OpenID", openId);
148
+
149
+ // 去掉值为空的参数,按 Key=Value 格式拼接,使用 & 连接
150
+ StringBuilder source = new StringBuilder();
151
+ for (Map.Entry<String, String> entry : params.entrySet()) {
152
+ if (entry.getValue() == null || entry.getValue().isEmpty()) {
153
+ continue;
154
+ }
155
+ if (source.length() > 0) {
156
+ source.append("&");
157
+ }
158
+ source.append(entry.getKey()).append("=").append(entry.getValue());
159
+ }
160
+
161
+ // 使用 AppSecret 对签名原文进行 HMAC-SHA1 签名
162
+ Mac mac = Mac.getInstance("HmacSHA1");
163
+ mac.init(new SecretKeySpec(appSecret.getBytes("UTF-8"), "HmacSHA1"));
164
+ byte[] digest = mac.doFinal(source.toString().getBytes("UTF-8"));
165
+
166
+ // 对签名结果进行 Base64 编码(Android 端请使用 android.util.Base64,flag 传 NO_WRAP)
167
+ return Base64.getEncoder().encodeToString(digest);
168
+ }
169
+
170
+ public static void main(String[] args) throws Exception {
171
+ String signature = generateSignature(
172
+ "your_app_secret",
173
+ "8b8d499bbba1ac28b6da21b4",
174
+ 1546315200L,
175
+ 71087795,
176
+ "your_app_key",
177
+ "user_001"
178
+ );
179
+ System.out.println(signature); // aSLzd4Ett7RsiLhrYht6Yk9+0qY=
180
+ }
181
+ }
182
+ ```
183
+
184
+ ``` python
185
+ import base64
186
+ import hashlib
187
+ import hmac
188
+
189
+ def generate_signature(app_secret, request_id, timestamp, nonce, app_key, user_id):
190
+ params = {
191
+ "RequestId": request_id,
192
+ "Timestamp": str(timestamp),
193
+ "Nonce": str(nonce),
194
+ "AppKey": app_key,
195
+ "OpenID": user_id,
196
+ }
197
+ # 去掉值为空的参数
198
+ params = {
199
+ key: value
200
+ for key, value in params.items()
201
+ if value is not None and value != ""
202
+ }
203
+ # 按参数名的字典序升序排列
204
+ sorted_items = sorted(params.items(), key=lambda item: item[0])
205
+ # 按 Key=Value 格式拼接,使用 & 连接
206
+ source = "&".join([f"{key}={value}" for key, value in sorted_items])
207
+ # 使用 AppSecret 对签名原文进行 HMAC-SHA1 签名
208
+ digest = hmac.new(
209
+ app_secret.encode("utf-8"),
210
+ source.encode("utf-8"),
211
+ hashlib.sha1,
212
+ ).digest()
213
+ # 对签名结果进行 Base64 编码
214
+ signature = base64.b64encode(digest).decode("utf-8")
215
+ return signature
216
+
217
+ signature = generate_signature(
218
+ app_secret="your_app_secret",
219
+ request_id="8b8d499bbba1ac28b6da21b4",
220
+ timestamp=1546315200,
221
+ nonce=71087795,
222
+ app_key="your_app_key",
223
+ user_id="user_001",
224
+ )
225
+ print(signature)
226
+ ```
227
+
228
+ ### 步骤 3:登录 SDK
229
+
230
+ 调用 `TXIoTEngine.login` 登录 SDK,传入上一步计算得到的签名参数。
231
+
232
+ #### 参数说明
233
+ | 参数 | 类型 | 说明 |
234
+ | --- | --- | --- |
235
+ | <code>appKey</code> | String | 从 开通服务 文档获取的 AppKey。 |
236
+ | <code>userId</code> | String | 用户标识,支持数字、字母、下划线,长度不超过 32 字节。<br>首次使用会自动注册,已注册则登录原有账号,该账号下的设备绑定关系仍然保留。需与签名参数 <code>OpenID</code> 保持一致。 |
237
+ | <code>userSignature.requestId</code> | String | 对应签名参数 <code>RequestId</code>。 |
238
+ | <code>userSignature.timestamp</code> | long | 对应签名参数 <code>Timestamp</code>。 |
239
+ | <code>userSignature.nonce</code> | int | 对应签名参数 <code>Nonce</code>。 |
240
+ | <code>userSignature.signature</code> | String | 签名计算结果。 |
241
+
242
+ ``` java
243
+ TXIoTEngine.TXIoTUserSignature userSignature = new TXIoTEngine.TXIoTUserSignature();
244
+ userSignature.requestId = requestId;
245
+ userSignature.timestamp = timestamp;
246
+ userSignature.nonce = nonce;
247
+ userSignature.signature = signature;
248
+
249
+ iotEngine.login(appKey, userId, userSignature);
250
+ ```
251
+
252
+ ### 步骤 4:验证登录结果
253
+
254
+ 登录成功后,调用 `getFamilyManager` 获取家庭管理实例并拉取家庭列表,以此验证登录态与网络链路是否正常。返回的 `familyId` 是后续绑定设备、查询设备列表的必备参数,请妥善保存。
255
+ ``` java
256
+ TXIoTFamilyManager familyManager = iotEngine.getFamilyManager();
257
+ if (familyManager == null) {
258
+ // SDK 未登录或登录态已失效
259
+ return;
260
+ }
261
+
262
+ familyManager.getFamilyList(new TXIoTCallback<List<TXIoTFamilyInfo>>() {
263
+ @Override
264
+ public void onSuccess(List<TXIoTFamilyInfo> familyList) {
265
+ if (familyList.isEmpty()) {
266
+ // 当前账号下没有家庭,调用 createFamily 创建(见下方示例)
267
+ return;
268
+ }
269
+ // 选择一个家庭,记录 familyId
270
+ String familyId = familyList.get(0).familyId;
271
+ }
272
+
273
+ @Override
274
+ public void onError(TXIoTErrorCode errorCode, String errorMessage) {
275
+ // 获取家庭列表失败
276
+ }
277
+ });
278
+ ```
279
+
280
+ 如果当前账号下没有家庭,可调用 `createFamily` 创建:
281
+ ``` java
282
+ familyManager.createFamily("我的家庭", new TXIoTCallback<TXIoTFamilyInfo>() {
283
+ @Override
284
+ public void onSuccess(TXIoTFamilyInfo familyInfo) {
285
+ // 创建成功,记录 familyId
286
+ String familyId = familyInfo.familyId;
287
+ }
288
+
289
+ @Override
290
+ public void onError(TXIoTErrorCode errorCode, String errorMessage) {
291
+ // 创建家庭失败
292
+ }
293
+ });
294
+ ```
295
+
296
+ ## 常见问题
297
+
298
+ ### 为什么 `getFamilyManager` 或 `getDeviceManager` 返回 `null`?
299
+
300
+ SDK 尚未登录或登录态已失效。请先调用 `TXIoTEngine.login`,并在收到 `onLoginSuccess` 后再获取对应 Manager。
301
+
302
+ ### 登录签名过期后如何处理?
303
+
304
+ 当收到 `onUserSignatureExpired` 回调时,请重新计算登录签名,然后再次调用 `TXIoTEngine.login`。
305
+
306
+ ### 登录失败或提示签名错误如何排查?
307
+
308
+ 请按以下顺序逐项核对:
309
+ 1. `AppKey` 与 `AppSecret` 是否来自同一个应用且配对正确。
310
+
311
+ 2. 签名参数 `OpenID` 与登录接口的 `userId` 是否完全一致。
312
+
313
+ 3. `Timestamp` 是否为 UNIX 秒级时间戳(非毫秒),且与当前时间偏差在允许范围内。
314
+
315
+ 4. 参与签名的参数是否已去掉空值、并按参数名字典序升序排列后以 `&` 连接。
316
+
317
+ 5. 签名算法是否为 HMAC-SHA1,且签名结果经过 Base64 编码。
318
+
319
+ 可使用 签名计算示例 中给出的期望输出(`aSLzd4Ett7RsiLhrYht6Yk9+0qY=`)自验签名实现是否正确。
320
+
321
+ ## 下一步
322
+
323
+ 完成基础接入后,您还可以继续接入以下能力:
324
+ - 设备绑定
325
+
326
+ - 远程控制
327
+
328
+ - 家庭管理
@@ -0,0 +1,326 @@
1
+ ---
2
+ product: iot
3
+ framework:
4
+ - harmonyos
5
+ types:
6
+ - feature
7
+ retrievable_scope: always
8
+ feature_domain: app_integration
9
+ ---
10
+
11
+ 本文介绍如何在鸿蒙(HarmonyOS)平台集成腾讯云物联网(IoT)应用端 SDK 并完成登录:涵盖工程配置、SDK 引入、登录签名计算与登录调用,并通过拉取家庭列表验证接入是否成功。设备绑定、设备分享、远程控制等能力在登录完成后按需接入,参见本文「下一步」章节。
12
+
13
+ ## 前提条件
14
+
15
+ ### 开通服务
16
+
17
+ 请先按照 开通服务 文档,完成服务开通和应用创建,并获取以下信息:
18
+ - **AppKey**:登录必需。
19
+
20
+ - **AppSecret**:登录必需,用于计算登录签名。
21
+
22
+ - **ProductId**:接入设备绑定、物模型等能力时使用,本文不涉及。
23
+
24
+ - **DeviceName**:接入设备绑定、物模型等能力时使用,本文不涉及。
25
+
26
+ ### 环境准备
27
+ - DevEco Studio 5.0 及以上版本。
28
+
29
+ - 一台 HarmonyOS NEXT 真机,且项目已配置有效的签名信息。
30
+
31
+ ## 创建项目
32
+
33
+ 参考以下步骤创建一个新的鸿蒙项目。如果已有项目,可跳过本节。
34
+ 1. 打开 DevEco Studio,选择 **Create Project**(新建项目)。
35
+
36
+ 2. 选择 **Application** 下的 **Empty Ability** 模板,单击 **Next**。
37
+
38
+ 3. 设置 **Project name**、**Bundle name**、**Compile SDK** 等项目基本信息,单击 **Finish** 完成创建。
39
+
40
+ ## 集成 SDK
41
+ 1. 将 SDK 的 HAR 包(如 `liteavsdk.har`)拷贝到模块目录下(例如 `entry/lib/`),并在模块的 `oh-package.json5` 中添加依赖:
42
+
43
+ ``` json5
44
+ // entry/oh-package.json5
45
+ {
46
+ "dependencies": {
47
+ "@tencentcloud/liteavsdk_iot": "file:./lib/liteavsdk.har"
48
+ }
49
+ }
50
+ ```
51
+ 2. 在模块的 `module.json5` 中声明所需权限。网络权限为必需;麦克风与摄像头权限在涉及语音对讲或视频通话时需要,且需在运行时向用户动态申请:
52
+
53
+ ``` json5
54
+ // entry/src/main/module.json5
55
+ {
56
+ "module": {
57
+ "requestPermissions": [
58
+ { "name": "ohos.permission.INTERNET" },
59
+ { "name": "ohos.permission.MICROPHONE" },
60
+ { "name": "ohos.permission.CAMERA" }
61
+ ]
62
+ }
63
+ }
64
+ ```
65
+ 3. 执行 **Sync Now** 同步依赖后,即可在 ArkTS 代码中引用 SDK:
66
+
67
+ ``` typescript
68
+ import { getIoTEngineInstance } from '@tencentcloud/liteavsdk_iot'
69
+ ```
70
+
71
+ ## 接入步骤
72
+
73
+ ### 步骤 1:获取 SDK 实例
74
+
75
+ 调用全局函数 `getIoTEngineInstance` 获取 SDK 单例,并注册 `TXIoTEngineListener` 监听登录、签名过期和设备状态推送。该单例在整个 App 生命周期内复用,以保证登录态在各页面间共享。
76
+ ``` typescript
77
+ import { getIoTEngineInstance, TXIoTEngine, TXIoTEngineListener } from '@tencentcloud/liteavsdk_iot'
78
+
79
+ // 获取单例实例(context 为可选参数)
80
+ const iotEngine: TXIoTEngine = getIoTEngineInstance()
81
+
82
+ // 注册监听:TXIoTEngineListener 为接口,所有回调均为可选,按需实现
83
+ const engineListener: TXIoTEngineListener = {
84
+ onLoginSuccess: () => {
85
+ // 登录成功
86
+ },
87
+ onLoginFailure: (errCode, errMsg) => {
88
+ // 登录失败
89
+ },
90
+ onUserSignatureExpired: () => {
91
+ // 登录签名过期,请重新计算签名后再次调用 login
92
+ },
93
+ onReceivePushMessage: (pushMessage) => {
94
+ // 接收设备在线、离线等状态变更
95
+ }
96
+ }
97
+ iotEngine.addListener(engineListener)
98
+ ```
99
+
100
+ ### 步骤 2:计算登录签名
101
+
102
+ > **说明:**
103
+ > 快速接入阶段可直接在客户端计算签名进行调试。正式上线时请将签名计算逻辑放在业务后台,不要将 AppSecret 保存在客户端。
104
+ >
105
+
106
+ #### 签名参数
107
+
108
+ 参与签名的参数:
109
+
110
+ |参数|说明|
111
+ |---------|---------|
112
+ |`RequestId`|唯一请求 ID,建议使用 UUID。|
113
+ |`Timestamp`|当前 UNIX 秒级时间戳。|
114
+ |`Nonce`|随机正整数,用于和时间戳一起防重放。|
115
+ |`AppKey`|从 开通服务 文档获取的 AppKey。|
116
+ |`OpenID`|用户标识,需与后续登录的 `userId` 保持一致。支持数字、字母、下划线,长度不超过 32 字节。|
117
+
118
+ > **注意:**
119
+ > **OpenID 与 UserID 的关系:**签名参数名为 **OpenID**,SDK 登录接口参数名为 **userId**,两者是同一个东西,值必须保持一致。
120
+ >
121
+
122
+ #### 签名计算规则
123
+ 1. 去掉值为空的参数。
124
+
125
+ 2. 将参数按参数名的字典序升序排列。
126
+
127
+ 3. 将排序后的参数按 `Key=Value` 格式拼接。
128
+
129
+ 4. 使用 `&` 连接所有参数,得到签名原文。
130
+
131
+ 5. 使用从 开通服务 文档获取的 `AppSecret` 对签名原文进行 HMAC-SHA1 签名。
132
+
133
+ 6. 对签名结果进行 Base64 编码,得到最终 `Signature`。
134
+
135
+ #### 签名计算示例
136
+
137
+ 例如,参与签名的参数如下:
138
+ ``` plaintext
139
+ RequestId=8b8d499bbba1ac28b6da21b4
140
+ Timestamp=1546315200
141
+ Nonce=71087795
142
+ AppKey=your_app_key
143
+ OpenID=user_001
144
+ ```
145
+
146
+ 排序后的签名原文:
147
+ ``` plaintext
148
+ AppKey=your_app_key&Nonce=71087795&OpenID=user_001&RequestId=8b8d499bbba1ac28b6da21b4&Timestamp=1546315200
149
+ ```
150
+
151
+ 使用 `your_app_secret` 作为 AppSecret 对上述原文计算,期望得到的签名为 `aSLzd4Ett7RsiLhrYht6Yk9+0qY=`,可用于自验签名实现是否正确。
152
+
153
+ 参考以下示例计算签名。客户端示例基于系统自带的 CryptoFramework(加解密算法框架);正式上线时签名在业务后台计算,参考服务端示例:
154
+
155
+ 【客户端(ArkTS)】
156
+ ``` typescript
157
+ import cryptoFramework from '@ohos.security.cryptoFramework'
158
+ import util from '@ohos.util'
159
+
160
+ // 去掉空值参数,按参数名字典序升序排列后以 & 连接,得到签名原文
161
+ function createSignSource(appKey: string, openId: string, requestId: string,
162
+ timestamp: number, nonce: number): string {
163
+ const pairs = [
164
+ `AppKey=${appKey}`,
165
+ `Nonce=${nonce}`,
166
+ `OpenID=${openId}`,
167
+ `RequestId=${requestId}`,
168
+ `Timestamp=${timestamp}`
169
+ ]
170
+ return pairs.sort().join('&')
171
+ }
172
+
173
+ // 使用 AppSecret 对签名原文进行 HMAC-SHA1 签名,结果 Base64 编码
174
+ async function generateSignature(appSecret: string, source: string): Promise<string> {
175
+ const encoder = new util.TextEncoder()
176
+ const symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC')
177
+ const symKey = await symKeyGenerator.convertKey({ data: encoder.encodeInto(appSecret) })
178
+ const mac = cryptoFramework.createMac('SHA1')
179
+ await mac.init(symKey)
180
+ await mac.update({ data: encoder.encodeInto(source) })
181
+ const result = await mac.doFinal()
182
+ return new util.Base64Helper().encodeToStringSync(result.data)
183
+ }
184
+ ```
185
+
186
+ 【服务端(Python)】
187
+ ``` python
188
+ import base64
189
+ import hashlib
190
+ import hmac
191
+
192
+ def generate_signature(app_secret, request_id, timestamp, nonce, app_key, user_id):
193
+ params = {
194
+ "RequestId": request_id,
195
+ "Timestamp": str(timestamp),
196
+ "Nonce": str(nonce),
197
+ "AppKey": app_key,
198
+ "OpenID": user_id,
199
+ }
200
+ # 去掉值为空的参数
201
+ params = {
202
+ key: value
203
+ for key, value in params.items()
204
+ if value is not None and value != ""
205
+ }
206
+ # 按参数名的字典序升序排列
207
+ sorted_items = sorted(params.items(), key=lambda item: item[0])
208
+ # 按 Key=Value 格式拼接,使用 & 连接
209
+ source = "&".join([f"{key}={value}" for key, value in sorted_items])
210
+ # 使用 AppSecret 对签名原文进行 HMAC-SHA1 签名
211
+ digest = hmac.new(
212
+ app_secret.encode("utf-8"),
213
+ source.encode("utf-8"),
214
+ hashlib.sha1,
215
+ ).digest()
216
+ # 对签名结果进行 Base64 编码
217
+ signature = base64.b64encode(digest).decode("utf-8")
218
+ return signature
219
+
220
+ signature = generate_signature(
221
+ app_secret="your_app_secret",
222
+ request_id="8b8d499bbba1ac28b6da21b4",
223
+ timestamp=1546315200,
224
+ nonce=71087795,
225
+ app_key="your_app_key",
226
+ user_id="user_001",
227
+ )
228
+ print(signature)
229
+ ```
230
+
231
+ ### 步骤 3:登录 SDK
232
+
233
+ 调用 `TXIoTEngine.login` 登录 SDK,传入上一步计算得到的签名参数。
234
+
235
+ #### 参数说明
236
+ | 参数 | 类型 | 说明 |
237
+ | --- | --- | --- |
238
+ | <code>appKey</code> | string | 从 开通服务 文档获取的 AppKey。 |
239
+ | <code>userId</code> | string | 用户标识,支持数字、字母、下划线,长度不超过 32 字节。<br>首次使用会自动注册,已注册则登录原有账号,该账号下的设备绑定关系仍然保留。需与签名参数 <code>OpenID</code> 保持一致。 |
240
+ | <code>userSignature.requestId</code> | string | 对应签名参数 <code>RequestId</code>。 |
241
+ | <code>userSignature.timestamp</code> | number | 对应签名参数 <code>Timestamp</code>。 |
242
+ | <code>userSignature.nonce</code> | number | 对应签名参数 <code>Nonce</code>。 |
243
+ | <code>userSignature.signature</code> | string | 签名计算结果。 |
244
+
245
+ ``` typescript
246
+ import { TXIoTUserSignature } from '@tencentcloud/liteavsdk_iot'
247
+
248
+ const userSignature = new TXIoTUserSignature()
249
+ userSignature.requestId = requestId
250
+ userSignature.timestamp = timestamp
251
+ userSignature.nonce = nonce
252
+ userSignature.signature = signature
253
+
254
+ iotEngine.login(appKey, userId, userSignature)
255
+ ```
256
+
257
+ ### 步骤 4:验证登录结果
258
+
259
+ 登录成功后,调用 `getFamilyManager` 获取家庭管理实例并拉取家庭列表,以此验证登录态与网络链路是否正常。返回的 `familyId` 是后续绑定设备、查询设备列表的必备参数,请妥善保存。
260
+ ``` typescript
261
+ const familyManager = iotEngine.getFamilyManager()
262
+ if (!familyManager) {
263
+ // SDK 未登录或登录态已失效
264
+ return
265
+ }
266
+
267
+ familyManager.getFamilyList({
268
+ onSuccess: (familyList) => {
269
+ if (familyList.length === 0) {
270
+ // 当前账号下没有家庭,调用 createFamily 创建(见下方示例)
271
+ return
272
+ }
273
+ // 选择一个家庭,记录 familyId
274
+ const familyId = familyList[0].familyId
275
+ },
276
+ onError: (errorCode, errorMessage) => {
277
+ // 获取家庭列表失败
278
+ }
279
+ })
280
+ ```
281
+
282
+ 如果当前账号下没有家庭,可调用 `createFamily` 创建:
283
+ ``` typescript
284
+ familyManager.createFamily('我的家庭', {
285
+ onSuccess: (familyInfo) => {
286
+ // 创建成功,记录 familyInfo.familyId
287
+ },
288
+ onError: (errorCode, errorMessage) => {
289
+ // 创建家庭失败
290
+ }
291
+ })
292
+ ```
293
+
294
+ ## 常见问题
295
+
296
+ ### 为什么 `getFamilyManager` 或 `getDeviceManager` 返回 `null`?
297
+
298
+ SDK 尚未登录或登录态已失效。请先调用 `TXIoTEngine.login`,并在收到 `onLoginSuccess` 后再获取对应 Manager。
299
+
300
+ ### 登录签名过期后如何处理?
301
+
302
+ 当收到 `onUserSignatureExpired` 回调时,请重新计算登录签名,然后再次调用 `TXIoTEngine.login`。
303
+
304
+ ### 登录失败或提示签名错误如何排查?
305
+
306
+ 请按以下顺序逐项核对:
307
+ 1. `AppKey` 与 `AppSecret` 是否来自同一个应用且配对正确。
308
+
309
+ 2. 签名参数 `OpenID` 与登录接口的 `userId` 是否完全一致。
310
+
311
+ 3. `Timestamp` 是否为 UNIX 秒级时间戳(非毫秒),且与当前时间偏差在允许范围内。
312
+
313
+ 4. 参与签名的参数是否已去掉空值、并按参数名字典序升序排列后以 `&` 连接。
314
+
315
+ 5. 签名算法是否为 HMAC-SHA1,且签名结果经过 Base64 编码。
316
+
317
+ 可使用「签名计算示例」中给出的期望输出(`aSLzd4Ett7RsiLhrYht6Yk9+0qY=`)自验签名实现是否正确。
318
+
319
+ ## 下一步
320
+
321
+ 完成基础接入后,您还可以继续接入以下能力:
322
+ - 设备绑定
323
+
324
+ - 远程控制
325
+
326
+ - 家庭管理