我试着用Go语言、AWS IoT和Raspberry Pi搭配做了一些尝试

在之前的文章中,我已经运行了一个使用Raspberrypi和AWSIoT进行通信的Python示例程序。我在寻找其他的通信方法时,发现Go语言似乎也可以实现,于是决定试一试。这篇文章只是包含有关环境设置的一些简短笔记。

请参考以下页面

我正在参考以下页面。

使用Golang和MQTT将消息发布到AWS IoT。

在Raspberry Pi上安装Go语言。

AWS IoT和Raspberrypi的实践备忘录。

在Raspberrypi上设置Go开发环境。

安装Go(在任何版本下)。

$ wget https://storage.googleapis.com/golang/go1.9.linux-armv6l.tar.gz
$ sudo tar -C /usr/local -xzf go1.9.linux-armv6l.tar.gz

进行安装确认和版本确认。

$ ls -l /usr/local/go
$ cat /usr/local/go/VERSION

添加路径。
在~/.bashrc文件的末尾追加以下内容。

export PATH=$PATH:/usr/local/go/bin

确认所设定的路径。

$ source .bashrc
$ echo $PATH
$ which go

需要安装必要的库

$ go get github.com/eclipse/paho.mqtt.golang
$ go get golang.org/x/net/websocket
$ go get golang.org/x/net/proxy

源代码

本次仅作试用,可直接使用参考网站上的内容。设置GoPath等是可选的。为了方便理解,本次将所有文件放在主目录下。

主要.go

package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "io/ioutil"

    MQTT "github.com/eclipse/paho.mqtt.golang"
)

func NewTLSConfig() *tls.Config {
    // CA証明書を設定
    certpool := x509.NewCertPool()
    pemCerts, err := ioutil.ReadFile("xxxxxxxxx.pem")
    if err == nil {
        certpool.AppendCertsFromPEM(pemCerts)
    }

    // クライアント証明書とキーペアを設定
    cert, err := tls.LoadX509KeyPair("xxxxxxxxx-certificate.pem.crt", "xxxxxxxxx-private.pem.key")
    if err != nil {
        panic(err)
    }

    cert.Leaf, err = x509.ParseCertificate(cert.Certificate[0])
    if err != nil {
        panic(err)
    }

    // config設定
    return &tls.Config{

        RootCAs: certpool,
        ClientAuth: tls.NoClientCert,
        ClientCAs: nil,
        InsecureSkipVerify: true,
        Certificates: []tls.Certificate{cert},
    }
}

var f MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
    fmt.Printf("TOPIC: %s\n", msg.Topic())
    fmt.Printf("MSG: %s\n", msg.Payload())
}

func main() {
    tlsconfig := NewTLSConfig()

    opts := MQTT.NewClientOptions()
    opts.AddBroker("ssl://xxxxxxxxxxxxxxxxxxx.amazonaws.com:8883")
    opts.SetClientID("ssl-sample").SetTLSConfig(tlsconfig)
    opts.SetDefaultPublishHandler(f)

    // 接続をする
    c := MQTT.NewClient(opts)
    if token := c.Connect(); token.Wait() && token.Error() != nil {
        panic(token.Error())
    }
    fmt.Println("AWS IoT Connect Success")

    if token := c.Publish("$aws/things/ESP32/shadow/update", 0, false,
        `{"state":{"reported":{"welcome":"I am gopher!!!"}}}`); token.Wait() && token.Error() != nil {
                panic(token.Error())
    }
    fmt.Println("Message Publish Success")

    // 切断
    c.Disconnect(250)
}

执行结果

result.png
result2.png

似乎可以通过这种方式进行通信。
由于Go的环境设置很容易,真是帮了大忙。

广告
将在 10 秒后关闭
bannerAds