Marcel の NodeMCU カスタム ビルドhttp://frightanic.com/nodemcu-custom-build/で作成されたファームウェアで esp8266 を使用しています 。「dev」ブランチと「master」をテストしました。
ここにある「 Connect to MQTT Broker」コードを少し変更しましたhttps://github.com/nodemcu/nodemcu-firmware
-- init mqtt client with keepalive timer 120sec
m = mqtt.Client("clientid", 120, "user", "password")
m:on("connect", function(con) print ("connected") end)
m:on("offline", function(con) print ("offline") end)
-- m:connect( host, port, secure, auto_reconnect, function(client) )
-- for secure: m:connect("192.168.11.118", 1880, 1, 0)
-- for auto-reconnect: m:connect("192.168.11.118", 1880, 0, 1)
m:connect("192.168.11.118", 1880, 0, 0, function(conn) print("connected") end)
-- publish a message with data = hello, QoS = 0, retain = 0
local i = 1
while i < 10 do
m:publish("/topic","hello",0,0, function(conn) print("sent") end)
i = i + 1
end
m:close();
私は mosquitto を mqtt ブローカーとして使用しており、すべてのトピック#でサブスクライバーを立ち上げました。
結果は次のとおりです。メッセージは正しく到着しますが、サブスクライバーに到着するのは本当に遅いです (それぞれ約 1 秒)...なぜですか?
また、UDP を優先して mqtt アーキテクチャを変更しようとしました。esp8266 は 100 メッセージを高速で送信します。
更新 1#:
私はさらにいくつかの実験を行いました:
- [android phone + a mqtt publisher] を使用してブローカーとサブスクライバーをテストすると、サブスクライバーはすぐにメッセージを受信します
- 「デバッグ」を有効にして nodemcu をロードしたところ、興味深い発見がありました: 続きを読む
デバッグログとソースコードを読んで理解したことについて..メッセージをメモリに保存する一種のキューがあり、タイマー(頻度/間隔はわかりません)がキューからメッセージを読み取り、それを介して送信しますmqtt。100通のメッセージを送ろうとするとキューが増えるのですが、同時にメッセージを届けることができません(もしかしたら競合状態?)。
ここで 2 つ目の問題があります。15 を超えるメッセージがエンキューされた後、ファームウェアがクラッシュし、デバイスが再起動します。これは、メモリが使用できなくなったという症状のようです。