我试着用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)
}
执行结果
似乎可以通过这种方式进行通信。
由于Go的环境设置很容易,真是帮了大忙。