使用 Golang-AWS-SDK IoTDataPlane 到 AWS IoT 的 HTTP POST

Posted

技术标签:

【中文标题】使用 Golang-AWS-SDK IoTDataPlane 到 AWS IoT 的 HTTP POST【英文标题】:HTTP POST to AWS IoT using Golang-AWS-SDK IoTDataPlane 【发布时间】:2016-03-28 08:39:07 【问题描述】:

我想通过 HTTP 使用 AWS-SDK 在 golang 中通过 AWS IoT 向 MQTT 主题发送消息, 当尝试使用以下代码时,它不成功。回应是:

ResourceNotFoundException: Not Found
status code: 404, request id: 3d2c0f11-09f6-4e86-94bf-ea877a30ebcd

以下是我使用的代码:

package main


import (
        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/iotdataplane"
        "fmt"
)


func main()
svc := iotdataplane.New(session.New(), &aws.Config Region: aws.String("us-west-2"), Endpoint: aws.String("https://YOUR_PREFIX.iot.us-west-2.amazonaws.com"))

params := &iotdataplane.PublishInput
        Topic:   aws.String("mytopic"), // Required
        Payload: []byte("PAYLOAD"),
        Qos:     aws.Int64(0),

resp, err := svc.Publish(params)

if err != nil 
        // Print the error, cast err to awserr.Error to get the Code and
        // Message from an error.
        fmt.Println(err.Error())
        return


// Pretty-print the response data.
fmt.Println(resp)

我还验证了我的 AWS 账户已验证有效的凭据设置和策略。以下是我在 ~/.aws/credentials 中的 aws 凭据

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

以及附加到您的身份的政策:


"Version": "2012-10-17",
"Statement": [
    
        "Effect": "Allow",
        "Action": [
            "iot:*"
        ],
        "Resource": "*"
   
]

我也尝试过使用 Node.JS,它可以工作!!以下是Node中的WORKING源码供参考:

var    AWS = require('aws-sdk');

AWS.config.update(region: 'us-west-2');
var iotdata = new AWS.IotData(endpoint: 'YOUR_PREFIX.iot.us-west-2.amazonaws.com');


var params = 
  topic: 'mytopic', /* required */
  payload: new Buffer('hello') || 'STRING_VALUE',
  qos: 0
;

iotdata.publish(params, function(err, data) 
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
);

要让 Node JS 工作,它需要在根文件夹中有一个适当的 AWS.config 文件。像这样:

accessKeyId = YOUR_ACCESS_KEY_ID
secretAccessKey = YOUR_SECRET_ACCESS_KEY

【问题讨论】:

嗨 Josiah,你能看看我的问题吗?我不知道如何找到 accessKeyId ***.com/questions/35823058/… 嗨 Josiah,你还有这个问题吗?您是否已验证该主题由您提出请求的帐户拥有,并且正在使用的区域是否正确。如果您使用 IoT 控制平面 API“IoT.DescribeEndpoint”而不是硬编码来获取端点地址,是否有帮助? 你有没有在 Golang 中得到这个工作?因为我有同样的问题。 这对我有用,我能够将 MQTT 消息推送到主题,但是,我意识到我需要使用我的东西公钥作为凭证,而不是我的 AWS 凭证。我在 Config.Credentials 结构中看不到任何指定键的内容。提示:添加到 aws.Config LogLevel:aws.LogLevel(aws.LogDebug),以查看发生了什么并在 AWS 控制台中使用 MQTT 客户端查看传入消息 另请注意,您最终会遇到此问题github.com/aws/aws-sdk-go/issues/706,您无法使用设备证书进行身份验证。 【参考方案1】:

如果仍然与任何人相关... 在 aws.Config 中使用 Credentials *credentials.Credentials

请参阅以下文档: https://godoc.org/github.com/aws/aws-sdk-go/aws#Config

【讨论】:

以上是关于使用 Golang-AWS-SDK IoTDataPlane 到 AWS IoT 的 HTTP POST的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份