2018年5月5日土曜日

[ESP32][AWS][IoT][Micropython]MQTT接続してPublish/Subscribeしてみる

Micropythonの公式v1.9.3のままだと証明書ありのSSL接続が未実装状態だったというオチがあって、3日ほど格闘してようやく解決。。

コミュニティのやり取りを見てると、ここの認証回りの修正は当分先な気がするので、自前パッチをあてるのがよさそうです。
(ESP-IDFのバージョンも最新のを使いたいとかもあるし、いっそのことまとめてやっちゃえ!w)


ってことで修正して動作確認。


#SSL接続import socket, ssl
s=socket.socket()
addr=socket.getaddrinfo("www.yahoo.com", 443)[0][-1]
s.connect(addr)
client=ssl.wrap_socket(s)


#MosquitoのブローカーにPublish(証明書なし)
import ssl
import socket
from mqtt import MQTTClient
MQTT_CLIENT_ID = "12341234"
MQTT_HOST      = "192.168.1.2"
MQTT_PORT      = 1883
client = MQTTClient(client_id=MQTT_CLIENT_ID, server=MQTT_HOST, port=MQTT_PORT, keepalive=10000, ssl=False)
client.connect()
client.publish("test", "ok")
client.disconnect()

#MosquitoのブローカーにPublish(証明書あり)
kw = {}
kw["cacert"]          = cacertdata
kw["cert"]            = certdata
kw["key"]             = keydata
kw["cert_reqs"]       = ssl.CERT_REQUIRED
kw["server_hostname"] = MQTT_HOST
kw["server_side"]     = False
client = MQTTClient(client_id=MQTT_CLIENT_ID, server=MQTT_HOST, port=MQTT_PORT, keepalive=10000, ssl=True, ssl_params=kw)
client.connect()
client.publish("test", "ok")
client.disconnect()


#Subsctibeしてみる


def sub_cb(topic, msg):
    print((topic, msg))

client = MQTTClient(client_id=MQTT_CLIENT_ID, server=MQTT_HOST, port=MQTT_PORT, keepalive=10000, ssl=True, ssl_params=kw)
client.connect()

client.set_callback(sub_cb)
client.subscribe("foo_topic")

client.wait_msg()
又は
client.check_msg()



これらが上手く実行できていれば問題ないと思います。

0 件のコメント:

Androider