使用aws-iot-sdk-v3(TypeScript)时IoTDataPlane的publish()调用无限挂起
问题:使用AWS IoT Data Plane SDK发布MQTT消息时无限挂起
我尝试向非保留的IoT Core MQTT主题发布消息,但调用publish()时会无限挂起(除非设置特定超时,否则总会触发超时)。我确认所用IAM用户具备发布MQTT主题的正确权限,但怀疑可能存在跨账户问题。不过即便如此,我认为应该出现明确的失败提示,而非端点挂起的情况。
无论在本地还是云端运行,都会出现挂起问题。
基础代码
import { IoTDataPlane, IoTDataPlaneClientConfig, PublishCommandInput } from '@aws-sdk/client-iot-data-plane'; import { Endpoint, Credentials } from '@aws-sdk/types'; export async function publishToMQTT(payload: Uint8Array, accessKeyId: string, secretKey: string, sessionToken: string): Promise<void> { const endpoint: Endpoint = { hostname: 'myendpoint-ats.iot.us-east-1.amazonaws.com', protocol: 'mqtt', port: 443, path: '' //不确定这里是否需要填值;该字段是对象必填项,但我没有对应值 }; const creds: Credentials = { accessKeyId: accessKeyId, secretAccessKey: secretKey, sessionToken: sessionToken }; const config: IoTDataPlaneClientConfig = { credentials: creds, endpoint: endpoint, maxAttempts: 1, region: 'us-east-1' }; const client = new IoTDataPlane(config); const publishInput: PublishCommandInput = { payload: payload, qos: 0, retain: true, topic: 'org/test/topic/<device-specific-id>/status_code' //已移除<> }; const result = await this.client.publish(publishInput); // 此处挂起 /* 后续逻辑 */ }
SDK生成的请求数据
method: 'POST', hostname: 'myendpoint-ats.iot.us-east-1.amazonaws.com', port: 443, protocol: 'mqtt:', path: '/topics/org%2Ftest%2Ftopic%2Fdevice-specific-id%2Fstatus_code', // 主题已URL编码 query: { qos: "0", retain: "true" }
我也尝试改用IoTDataPlaneClient.send(PublishCommand)的写法,但结果仍然是端点挂起。
解决方案
问题根源在于端点的配置方式:之前使用的是@aws-sdk/types中的Endpoint对象,改用字符串格式的端点即可解决问题,消息能正常发布且不再挂起。
修改前代码
const endpoint: Endpoint = { hostname: 'myendpoint-ats.iot.us-east-1.amazonaws.com', protocol: 'mqtt', port: 443, path: '' };
修改后代码
const endpoint: string = 'https://myendpoint-ats.iot.us-east-1.amazonaws.com';
内容的提问来源于stack exchange,提问作者nducasse
相关产品推荐
相关产品推荐

