Go 언어 × AWSIoT × Raspberrypi 해 보았습니다.

10974 단어 5awsIoTmqttRaspberryPi
이전 기사에서는 Raspberrypi와 AWSIoT를 통신시킬 때 샘플 파이썬 프로그램에서 움직였습니다.
그 때, 그 밖에도 통신을 하는 방법 있을까라고 찾아 보았는데, Go에서도 할 수 있을 것이었기 때문에 시험해 보기로 했습니다.
기사 자체는 환경 구축 포함한 메모 정도에.

참고 페이지



다음 페이지를 참고로 하고 있습니다.

golang+MQTT로 AWS IoT에 Pubslish

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 등의 설정은 임의로 설정해 주십시오.
(이번은 알기 쉽도록 home 바로 아래에 모든 파일을 넣은 글을 쓰고 있습니다)

main.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는 환경 구축 편이므로 살아납니다.

좋은 웹페이지 즐겨찾기