【问题标题】:Using AWS IoT's ThingShadow with a Websocket Connection将 AWS IoT 的 ThingShadow 与 Websocket 连接一起使用
【发布时间】:2021-03-24 00:19:19
【问题描述】:

当我第一次开始学习如何使用 aws 时,我通过转到 AWS IoT 管理控制台并创建“事物”将我的设备/thingShadow 连接到 IoT 核心。每个事物都附带一个私有、公共和证书密钥,您可以通过执行以下操作来连接到 IoT:

var awsIot = require('aws-iot-device-sdk');

const keyPath = `./260b380cc2-private.pem.key`
const certPath = `./260b380cc2-certificate.pem.crt`
const caPath = './rootCA.pem'
const clientId = 'client'
const host = 'XXXXXXXXXXXXXXXX.iot.us-east-2.amazonaws.com'

var thingShadow = awsIot.thingShadow({
    keyPath: keyPath,
   certPath: certPath,
     caPath: caPath,
   clientId: clientId,
       host: host
 });

 var shadowName = 'testShadow'
 
 thingShadow.on("connect", () => {
    thingShadow.register(shadowName, {}, () => {

        console.log("Conneced. Getting shadow")        
        thingShadow.get(shadowName)
    })
})

thingShadow.on('status',
    function(thingName, stat, clientToken, stateObject) {

       console.log('received '+stat+' on '+thingName+': '+
                   JSON.stringify(stateObject))})

现在,我不是使用 RSA 密钥连接到 IoT Core,而是使用 Amazon 的 Cognito 身份池通过 websocket 协议连接设备:

Aws = require('aws-sdk/dist/aws-sdk-react-native');
awsIot = require('aws-iot-device-sdk');

const AWS_REGION = 'us-east-2';
const AWS_COGNITO_IDENTITY_POOL = 'us-east-2:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const AWS_IOT_ENDPOINT = 'XXXXXXXXXXXXXX.iot.us-east-2.amazonaws.com';

Aws.config.region = AWS_REGION
Aws.config.credentials = new Aws.CognitoIdentityCredentials({
    IdentityPoolId: AWS_COGNITO_IDENTITY_POOL
})

Aws.config.credentials.get(() => {
    const config = {}
    let client
    
    config.host = AWS_IOT_ENDPOINT
    config.protocol = 'wss'
    config.clientId = `client-${Math.floor((Math.random() * 100000) + 1)}`
    config.accessKeyId = 'XXXXXXXXXXXXXX';
    config.secretKey = 'XXXXXXXXXXXXXXXXXXXXXX';
    
    //client = awsIot.device(config)
    client = awsIot.thingShadow(config);
    
    client.on('connect', (success) => {
        if (success) {
            console.log("Connected.")
            client.register('testShadow')
            client.get('testShadow')

        } else {
            console.log("Could not connect.")
        }
       
    })

    client.on('close', () => {
        console.log("Connection closed.")
    })
    
    client.on('message', (topic, message) => {
        console.log(topic, message)
    })

    client.on("status", (shadow, stat, id, state) => {
        console.log(JSON.stringify(state))
    })
    
    client.on('error', error => {
        console.log(error)
    })
})

第二个代码块的问题是,当我使用client = awsIoT.thingShadow(config)时,客户端无法连接并打印Could not connect. 但是当我使用client = awsIot.device(config)时,客户端连接并打印出Connected(当我使用aws.Iot.device,我不包括 client.registerclient.get 代码行)。除此之外,我没有收到任何类型的错误,所以我不确定为什么它无法连接或我应该做什么,以便我可以通过 cognito 身份池获得一个 thingShadow 来连接。甚至可能吗?如果是,我怎样才能获得这种功能?

【问题讨论】:

    标签: node.js amazon-web-services mqtt iot aws-iot


    【解决方案1】:

    您在 WS 示例中使用的 AWS IAM 凭证是否具有访问设备影子所需的 permissions

    【讨论】:

    • 创建池时,有 2 个 IAM 角色。一种用于经过身份验证的身份,另一种用于未经身份验证的身份。未经身份验证的身份似乎没有要编辑的策略,但经过身份验证的身份有。我修改了该身份以包括:连接、发布、接收、订阅、getThingShadow 和 updateThingShadow。我在网上看到人们需要附上两个政策,或者类似的东西。此外,我不确定客户端是作为经过身份验证的身份连接还是以未经身份验证的身份连接。
    • 您可以启用logging in the AWS IoT Console,这会告诉您身份验证尝试失败的原因。
    • 另外,aws-sdk-react-native 似乎已被 Amplify 弃用。 AWS IoT Access 内置于 Amplify:docs.amplify.aws/lib/pubsub/getting-started/q/platform/…
    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 2019-04-06
    • 1970-01-01
    • 2017-08-30
    • 2022-08-15
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多