chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

RPi等から、WSL上のMQTT BrokerにPublishできるようにする

やりたいこと:RPi等からWSL上のMQTT BrokerにPublishしたい
課題:普通にBrokerを起動しただけでは接続できない(原因は、(1)Broker本体の設定の問題、(2)PC内のルーティングの問題、(3)Windows Firewallの問題)
結論:先人の記事を参考に設定した結果、RPi --> mosquitto on WSLの疎通確認まではできた
詳細:

普通にMQTT Broker(Mosquitto)を動かすと同一ネットワークしか接続を許さないので、外部ネットワークからも接続できるようにconfig を修正する
file: /etc/mosquitto/conf.d/permit.conf

listener 1883
allow_anonymous true

次に、Windows環境に接続に来たパケットをWSLに流すための仕組みなのだが、、mirroredのモードで起動するとフォワーダ等を動かさなくても接続できるらしい
要点だけ書くと以下を.wslconfig に設定しておくとミラーモードになるらしい(ミラーモードとは?? WindowsのIPに接続に来たらWSLにもパケットが流れるということか??)
file: Windowsの個人フォルダ .wslconfig

[wsl2]
networkingMode=mirrored

WSL2 2.0.x時代の外部PCからWSLに接続する方法

ただ、自分の環境では上記フラグを設定すると、WSLの起動時エラーになるのであった。何度かWSLを再起動するとエラーが出なくなった(なぜかは分からない)

Microsoft Defender ファイアウォールに対して、手動で1883ポートのみ受信許可に設定する(1883ポートについて inbound/outboundの両方を許可)

New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 1883 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 1883 -Action Allow -Protocol TCP

この状態で、RPiから1883番ポートで接続テスト

raspberrypi:~ $ telnet 192.168.10.100  1883
Trying 192.168.10.100...
Connected to 192.168.10.100.
Escape character is '^]'.
^CConnection closed by foreign host.

上記の通り、RPiからWSL上のMQTT Brokerに1883で接続することができた(MQTT Publishまでは見ていないが多分大丈夫だろう)
MQTTに接続できたので、今後はRPi Pico等で収集したセンサーデータ等をMQTT PublishでPCに送付、PC側でSubscribeしてデータを取得、各種解析が可能になる。

■追記
WSLのネットワーク設定をmirrored modeにするとLocalhostwindows環境からWSLに接続できなくなった。
この件は以下でも議論されている
Localhost is not accessible from windows in mirrored mode · Issue #11172 · microsoft/WSL · GitHub
mirrored modeを使わずNATモード?で運用するか、Workaroundとして、「Windows でシステムのモバイル ホットスポットをオンにする」方法もあるらしいが、特殊すぎてこれはちょっとどうかという気がする。WSLではなく、すなおに RPi3等の上でMQTT Brokerを走らせるのが無難なんだろうか。

もう少し試した結果、以下のIP指定だとmirrored network設定されているWSLに接続できるようであった。

$ telnet 0.0.0.0 1883
Trying 0.0.0.0...
Connected to 0.0.0.0.
Escape character is '^]'.
Connection closed by foreign host.

$ telnet 127.0.0.1 1883
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.

Workaroundで、127.0.0.1: 1883を指定することで、Windows上のMQTT ClientからUbuntu(WSL)上のMQTT Brokerに接続できた。今後センサの試作は以下の構成で行う予定。


■参考URL
WSL2 2.0.x時代の外部PCからWSLに接続する方法
Authentication methods | Eclipse Mosquitto
Windows Subsystem for Linuxガイド 第34回 ミラードネットワークモード | マイナビニュース
自作ドローンの制御系設計 vol. 1 | Remma's Laboratory
ドローンの自作|姿勢制御プログラム(PID制御編) – imo Lab.
【Arduinoドローン自作】NO.6 PID制御実装編 - とある科学の備忘録
わかりやすいPID制御 | 組込み技術ラボ
PID制御のプログラム例。仕組みと考え方を詳しく解説!
PID Explained • Proportional Integral Derivative
PID Without a PhD Tim Wescott, Wescott Design Services