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で活躍できるポテンシャルを十分感じますね。