前記事↓
↑これのつづきです。
■環境
ラズパイPICO-W
・Micropython
・MQTTライブラリ:umqtt.simple
・Wifi:内蔵2.4GHz帯/DHCP
PC
・N95、8Gbyte、SSD/256Gbyte、Window11Pro、有線LAN接続
・コード開発:Thonny
・操作:macOSからリモートデスクトップ接続
近傍(2m以内)で動作中の機器
・2.4GHz無線マウス3、同キーボード2、Bluetooth機器多数
・WindowsPC3台、macOS2台、スマホ1台
■複数PICO-Wでの接続:その1
まずはPico-W2台まったく同じままで挑戦!
トライ1:Pico-W2台同一トピック、同一ClientIDでPubした場合
・1台目のPubデータをPythonのSubで受信できました
・2台目の電源ON・・・
2台目のPubデータを受信開始以後に1台目のデータが来ません。
→1台目の接続が止まったようです。
ClientIDが同一の場合、後から接続が先の接続を遮断してしまいます。
それを確認したような当然の結果になりました。
ということでClientIDに着目して再挑戦
トライ2:Pico-W2台同一トピック、別々ClientIDでPubした場合
コードの一部を変更
myId = 'kabayon'
↑この部分をPICO-W2台で別々にしました。
結果
・1台目のPubデータをPythonのSubで受信できました
・2台目の電源ON・・・
・2台目のPubデータを受信開始以後、1台目のデータも来ました!
・が・・・2台目あるいは1台目のデータが「途中から」切れます。
いけてるやん!と思わせて・・・なんでやねん!?
現在の浅い知識から思い浮かべた着目点
【Pub側】
▲最初は受信して途中から切れるから、まるでタイムアウトの感じ。
Pubのコードの中に関係する項目があるのかも・・・
→コードを見ますと・・・
# MQTTオブジェクト(変数)定義
client = MQTTClient(myId, mqttBroker, keepalive=3600)
この「keepalive=3600」が該当していそうですが・・・
3600秒=1時間・・・これじゃない!他に見当たらない!
▲そもそもPubコード内のどの段階で切れている?
1:Wifi接続が切れている?
2:MQTTサーバ接続が切れている?
3:無限ループ送信から落ちている?
これを調べるには・・・
・2がOKならばPICO基板上LEDを点灯
・3がループ内ならば所定待機時間のなかでLEDを点滅させる。
例えば、待機3秒の場合は、
待機開始前にLED消灯、0.5秒スリープ、LED点灯、2.5秒スリープ
とする。これなら簡単にできそうです。
さらにもうひとつ、PubがMQTTサーバからリターンコードを受けているか?
コードのなかの・・・
# ブローカーからの返信メッセージ確認
client.check_msg()
time.sleep(3)
PICO-Wには画面出力がないので、Thonnyでターミナルに表示させる?か、
I2Cの表示デバイスなどに表示させられるはず。(まだやってません)
▲同一トピックだと2台のPubのタイミング次第で衝突?
→Pico-Wごとに別トピックにするとSub側もトピックごとに必要だろうし、
そうなるとトピック切替て受信ということになるし、
しかしそれが本来のMQTTの使いかたのように思えますし・・・
これは安直にトライするよりも別の要因を確認してからにします。
→調べてみますと・・・
出典:
そもそもSubはワイルドカードのような記述で複数のトピックを同時に取得可能
だそうです。トピックを「/」で階層的にするのはそういうことなんですね!!!
自分の例では、Pub側で、
test_mqtt/Pico1
test_mqtt/Pico2
といった感じで複数のPICO-Wの各々でトピックを分ければよいようです。
そしてSub側のトピックを、 test_mqtt/+
として受信するとよさそうです。(まだやってません)
ワイルドカードは「+」。つい「*」と打ってしまいそう。
▲Wifiが2.4GHz帯だから通信が遅い?
→2.4GHz帯でも通常は10Mbps以上出るし・・・
通信速度自体が遅いとは考え難いですが、遅くなる要因はありそう。
→半径30cm以内に2台のWifi接続があると混信でデータが切れる???
他にも2.4GHz帯利用機器が多々動作しているし、これはあるかも。。。
【Sub側】
▲安物PC上でMQTTサーバーとSubをVScode上のJupyterとPythonで
動作させていて、かつ結果を標準出力画面に出していて、
しかもリモートデスクトップでMacOSから操作していたら、
処理が追いつかない?
→VScode上でもよいからJupyterではなく普通にpythonで動作させ、
かつリモートではなくPCに接続のモニターで操作。
Sub動作速度向上させるのに現時点で一番簡単な方法には違いない。
ただし、これが原因ではないようにも思いましたので、
まずはPub側から攻めてみます。
■複数PICO-Wでの接続:その2
上記考察から、一番先に
トピックを階層表現に変えてSubでワイルドカードにて受信
とします。問題解決しようとしまいとこれは必要になること。
つぎに、
Pub接続切れのコード位置を調べる
ことにします。
が・・・ちょっと休憩
機器配置、トピック、id(Connectid)をこんな感じにしました。
MQQTサーバー:N5105/8GB/256GB、Windows11(23H2)、LAN有線接続
MQosquittoサービス稼働
Sub:Mac-mini/M1-2020/16GB/256GB、sonoma14.6.1、LAN有線接続
VScode+Jupyter+python3.11 トピック:test_mqtt/+
Pub:同上 トピック:test_mqtt/kabamini2 id:kabamini2
Pub:i5-12450H/8GB/256GB、Windows11(23H2)、LAN有線接続
VScode+Jupyter+python3.11
トピック:test_mqtt/kabanucm3 id:kabanucm3
Pub:PICO_WHM/MicroPython トピック:test_mqtt/rpp01 id:rpp01
Pub:PICO_WHM/MicroPython トピック:test_mqtt/rpp02 id:rpp02
Pub:PICO_WHM/MicroPython トピック:test_mqtt/rpp03 id:rpp03
Pub:PICO_WHM/MicroPython トピック:test_mqtt/rpp04 id:rpp04
Pub:PICO_WHM/MicroPython トピック:test_mqtt/rpp05 id:rpp05
ちょっとずつ増やすつもりがどどっといってしまいました。
■結果
いけちゃいました!!!
macOSのJupyterでSubした結果例(抜粋)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Sub msg: b'kabaMini2 count 756' on test_mqtt/pub_kabamini2 with 0
Sub msg: b'rpp04 send 153' on test_mqtt/rpp04 with 0
Sub msg: b'rpp05 send 50' on test_mqtt/rpp05 with 0
Sub msg: b'rpp03 send 78' on test_mqtt/rpp03 with 0
Sub msg: b'rpp01 send 34' on test_mqtt/rpp01 with 0
Sub msg: b'kabanucm3 count 689' on test_mqtt/pub_kabanucm3 with 0
Sub msg: b'rpp04 send 154' on test_mqtt/rpp04 with 0
Sub msg: b'rpp02 send 63' on test_mqtt/rpp02 with 0
Sub msg: b'rpp03 send 79' on test_mqtt/rpp03 with 0
Sub msg: b'rpp01 send 35' on test_mqtt/rpp01 with 0
Sub msg: b'rpp04 send 155' on test_mqtt/rpp04 with 0
Sub msg: b'kabaMini2 count 757' on test_mqtt/pub_kabamini2 with 0
Sub msg: b'rpp04 send 156' on test_mqtt/rpp04 with 0
Sub msg: b'rpp05 send 51' on test_mqtt/rpp05 with 0
Sub msg: b'rpp03 send 80' on test_mqtt/rpp03 with 0
Sub msg: b'rpp01 send 36' on test_mqtt/rpp01 with 0
Sub msg: b'rpp02 send 64' on test_mqtt/rpp02 with 0
Sub msg: b'kabanucm3 count 690' on test_mqtt/pub_kabanucm3 with 0
Sub msg: b'rpp04 send 157' on test_mqtt/rpp04 with 0
Sub msg: b'rpp03 send 81' on test_mqtt/rpp03 with 0
Sub msg: b'rpp01 send 37' on test_mqtt/rpp01 with 0
Sub msg: b'rpp04 send 158' on test_mqtt/rpp04 with 0
Sub msg: b'kabaMini2 count 758' on test_mqtt/pub_kabamini2 with 0
Sub msg: b'rpp02 send 65' on test_mqtt/rpp02 with 0
Sub msg: b'rpp04 send 159' on test_mqtt/rpp04 with 0
Sub msg: b'rpp03 send 82' on test_mqtt/rpp03 with 0
Sub msg: b'rpp05 send 52' on test_mqtt/rpp05 with 0
Sub msg: b'rpp01 send 38' on test_mqtt/rpp01 with 0
Sub msg: b'kabanucm3 count 691' on test_mqtt/pub_kabanucm3 with 0
Sub msg: b'rpp04 send 160' on test_mqtt/rpp04 with 0
Sub msg: b'rpp03 send 83' on test_mqtt/rpp03 with 0
Sub msg: b'rpp01 send 39' on test_mqtt/rpp01 with 0
Sub msg: b'rpp04 send 161' on test_mqtt/rpp04 with 0
Sub msg: b'kabaMini2 count 759' on test_mqtt/pub_kabamini2 with 0
Sub msg: b'rpp02 send 66' on test_mqtt/rpp02 with 0
Sub msg: b'rpp04 send 162' on test_mqtt/rpp04 with 0
Sub msg: b'rpp03 send 84' on test_mqtt/rpp03 with 0
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Pub7台の送信間隔を少しずらせてあります。
■ここまででわかったポイント
1:ConnectIDはPub機器ごとに変える。
2:MQTTサーバーとSub処理は機器自体を分ける。
3:トピックを「/」で構造化し、Subでワイルドカード(+)を使う。
4:2.4GHz帯Wifiでも低ノイズ環境ならば問題ない
上記1は必須。
2,3はいかようでもできるが、自分ルールにしてしまえば間違いが減る。
■おまけでわかったこと
Windowsに新規にThonnyをインストールし、設定済のPICO-Wを繋いでも
USBのコネクションができない。
→PICO-Wを一旦USBメモリモードで接続し、UF2ファイルを上書きすると
ThonnyとPicoとのコネクションが成立する。
それがThonnyに記録されるようで、以後はコネクションで問題は生じない。
■PICO-W配線外観
rpp02~05はブレッドボード上に電源装着して給電
この電源、充電式で事前にUSB-Cで充電しました。
5VをV-SYS(39番ピン)に、グランドを38番ピンに接続。
電源出力を5Vに設定、ボードに装着、電源基板上の電源SWをオン。
うっかりPICOに直接USB給電をしないように(40番ピンV-BUSと衝突危険)
PICOに直接USB端子を挿すときはとにかく赤黒線両方はずす。
電源出力は3.3Vと5.0Vの切り替え可能。
この電源基板、注意点さえ守ればけっこう便利です!
以上、とりあえず複数Pubの一括Subができました。
ルールどおりにすれば簡単にできることもわかりました。
■以後の進めかた
Pub側の基本的なプロセスは、
イベント検出→送信データ生成→送信処理(→後処理、繰り返し処理)
ですが、今回のねらいの現場で実際にイベントが発生する間隔は30秒程度。
送信の前後処理は余裕で実行可能と推察さることから、
Pub側の技術的な見込みは概ねたちました。
Sub側のプロセスは、
受信処理→DBMS記録
の繰り返しですが、今回の結果からは、
複数のPubデータが短間隔で到来しても受信処理はなんとかなるんじゃないか?
と推察されます。そうなるとSub側の処理繰返しの課題はDBMS処理に絞られます。
次はこれに注力してみます。
【その3】へつづく