micropythonでAWS IoTにデータ転送


MicroPython Advent Calendar 19日目です。

今日は昨日に引き続きWipyのファームを書き込んだESP32-DevkitでAWS IoTにデータを飛ばしてみたいと思います。
公式で公開されているESP32のファームウェアではAWS IoTに接続することが
できませんでした。
SSL部分の実装具合に差があるのだと思います。

事前準備

あらかじめAWS IoT側で設定をしておきます。
手順の詳細ここでは省かせていただきます。公式ページや他の方の記事を参考にしてください。

モノ、証明書の作成とダウンロード、証明書とモノの紐づけ、ポリシーの作成と証明書の紐づけが済んでいればおkです。。

実行

AWS側の設定ができたらダウンロードした証明書をampyツールでESP32に転送しておきます。
証明書を転送したら以下のコードをESP32に転送して実行してみます。
LM35で読み取った温度をAWS IoTに送るコードです。


import socket
import ssl
import json
from machine import ADC

def lm35():
    adc = ADC()
    apin = adc.channel(pin='P18', attn=ADC.ATTN_0DB)
    return (apin() * 0.000235+0.075) / 0.01

def send():
    s = socket.socket()

    ai = socket.getaddrinfo("xxxxxxxxxx.amazonaws.com", 8443)
    print("Address infos:", ai)
    addr = ai[0][-1]

    s = ssl.wrap_socket(s, certfile='xxxxxxxxxx-certificate.pem.crt',
            keyfile='xxxxxxxxxx-private.pem.key',
            ca_certs='xxxxxxxxxx.pem', 
            cert_reqs=ssl.CERT_REQUIRED)

    s.connect(addr)
    print('Connected to Server')
    temp = lm35()
    json_data = {'state':{'reported':{'Temperature': temp}}}
    send_data=json.dumps(json_data)

    s.write(b"POST /things/ESP32/shadow HTTP/1.1\r\n")
    s.write(b"Host: xxxxxxxxxx.amazonaws.com\r\n")
    s.write(b"Content-Length: %d\r\n" % len(send_data))
    s.write(b"Connection: close\r\n")
    s.write(b"\r\n")
    s.write(send_data)
    print('Send Data to Server')

    recv_data = s.recv(4096)
    print(str(recv_data, 'utf8'))
    s.close()

シャドウステータスの値が更新されました。
今回はHTTPS接続で行いましたがMQTTでも同じようにAWS IoTに接続可能でしょう(要検証)

AWS IoTへの接続はTLS1.2が必要となるため、ESP32を用いました。
必要でないIoTプラットフォームへはESP8266でもよいでしょう。

TCP/IPのスタックを搭載したESP8266/ESP32とmicropythonの組み合わせは
IoTで活躍できるポテンシャルを十分感じますね。