やりたいこと: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
ただ、自分の環境では上記フラグを設定すると、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にするとLocalhostのwindows環境から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