おもちゃ、家電、もろもろの修理の足跡と備忘録

色々と忘れるので、趣味のメモ

ESP8266DEVkit, nodeMCU, LUAで温度と気圧をInternetで送る(software編4-通信系の設定)

2020-01-04 19:26:44 | ESP8266DEVkitで遊ぶ

i2cで気圧/気温センサBMP280の接続ができたら、いよいよ通信系の設定です。結構手こずったので、作った順にメモと一緒に記憶を整理します。


■通信系の設定


  • 必要なnodeMCUモジュール:wifi

i2c経由でBMP280気圧/温度センサの情報を取得できるようになったら、次は通信系。通信系の設定は色々と手こずりました。複数のタイマーで接続完了を監視をしました。

  • wifi接続をタイマーで監視、
  • DHCPでIPをもらうのをタイマー監視、
  • 後述するMQTTサーバへの接続をタイマー監視、 でようやく、温度と気圧をMQTTサーバへ送ることができます。

以下、参考にした情報を記載します。


■wifi.sta.status()


wifiの接続時にwifi.sta.status()の戻り値によって動作を確認しますが、戻り値(数値)が何を表しているのかが不明で、色々と探した情報です。戻り値”5”が"wifi.STA_GOTIP"のようですので、IPで通信するためには、DHCPでIPアドレスがもらえるまで待つ必要があります。

Return value

https://nodemcu.readthedocs.io/en/master/modules/wifi/#wifistastatus

The current state which can be one of the following:

  • wifi.STA_IDLE
  • wifi.STA_CONNECTING
  • wifi.STA_WRONGPWD
  • wifi.STA_APNOTFOUND
  • wifi.STA_FAIL
  • wifi.STA_GOTIP

hint:

node.restartをかけると、しばらく(5秒くらい)は"1"を返すが、その後"5"に変わる。ping も、restart後は返らないが、同様に5秒ほどすると返るようになる。ESP8266Devkit上のSWでのrestartでも同様。

2019/7/21

→5: wifi.STA_GOTIP

  • wifiがつながっても、DHCPによるIP_addressの取得には時間がかかる → wifiの接続確認と、IPアドレス獲得の2つの監視が必要。

■MQTT


  • 必要なnodeMCUモジュール:MQTT

MQTTとは、”MQTT:Message Queuing Telemetry Transport”。詳細は他のWEBを参照していただくとして、概要は以下の通り。

  • データ発信端末(Publisher)、中継ノード(Broker)、データ受信端末(Subscriber)、の3つの要素からなる、軽量なデータ転送プロトコル
  • Queuingそのものはしてくれない

当初、ESP8266DevkitにmqttのPubulisherを載せて、以下の参考に書いてある、Openなmqttサーバへの接続を試みたがうまく接続できず。結局、同じsubnet内のPCにBrokerを作って、同じsubnet内で閉じる系とすることとした。

→結局、加入しているプロバイダ側でhighport(port>1024?:詳細は不明、聞いても教えてくれない、、)をBlockするサービスを入れていて、それを解除しないと通信ができないことが後でわかった。Debugするためには、まずは全て手元でやるのが良いかもしれません。

下の方でMQTTサーバ(broker)の立て方に触れていますので、参考に。

参考:

nodeMCU/Luaを使って、BME280をMQTTで動かす例が載っている。 https://blog.alexellis.io/iot-nodemcu-sensor-bme280/

初めてのmqtt @GitHub https://gist.github.com/voluntas/89000a06a7b79f1230ab


■mqtt.client callback


  • 必要なnodeMCUモジュール:mqtt

mqttの戻り値です。接続できなければResetして再度接続をするようにしました。

結局、同じsubnet内にbrokerを立ててやりましたが、実際には以下のreturn codeでerror code"-5"が戻って来て動かず、、。

Connection failure callback reason codes:

<figure>
ConstantValueDescription
mqtt.CONN_FAIL_SERVER_NOT_FOUND-5There is no broker listening at the specified IP Address and Port
mqtt.CONN_FAIL_NOT_A_CONNACK_MSG-4The response from the broker was not a CONNACK as required by the protocol
mqtt.CONN_FAIL_DNS-3DNS Lookup failed
mqtt.CONN_FAIL_TIMEOUT_RECEIVING-2Timeout waiting for a CONNACK from the broker
mqtt.CONN_FAIL_TIMEOUT_SENDING-1Timeout trying to send the Connect message
mqtt.CONNACK_ACCEPTED0No errors. Note: This will not trigger a failure callback.
mqtt.CONNACK_REFUSED_PROTOCOL_VER1The broker is not a 3.1.1 MQTT broker.
mqtt.CONNACK_REFUSED_ID_REJECTED2The specified ClientID was rejected by the broker. (See mqtt.Client())
mqtt.CONNACK_REFUSED_SERVER_UNAVAILABLE3The server is unavailable.
mqtt.CONNACK_REFUSED_BAD_USER_OR_PASS4The broker refused the specified username or password.
mqtt.CONNACK_REFUSED_NOT_AUTHORIZED5The username is not authorized.
</figure>

■MQTTのDebug環境整備


  • PCでmosquittoサーバ(broker)を立ち上げる

    この辺りなどを参照

    https://www.1ft-seabass.jp/memo/2015/07/13/windows-7-64bit-install-mosquitto/

    windows10/64bitのCMD.exeを起動して、"mosquiito.exe -v" でbrokerを起動する

    option ”-v” でbroker/subscriberからの情報がコンソールに出力される。(default port=1883)

    この状態で、wifi-up して IP獲得が確認できたら mosquitto-serverに向かって接続をする。

  • AndroidでMQTT Dashboardを立ち上げてサーバにサブスクライバで覗きに行くとデータが見える

    subscriberは、Androidの”MQTT Dashboard"とかなんでも良いですが、接続します。

    mosquito.exe の入ったフォルダに、mosquitto_subというsubscribeのソフトも入っています。

    立ち上げ方は、"mosquitto_sub.exe -v -h localhost -t "#"。

brokerを立ち上げた状態で、subscriberを立ち上げるとbroker側に接続された旨のメッセージがでるので、あとは自分の作ったアプリをDebugします。

  • ESPlorer.exeで wifi_up.lua と wifi-status.lua でwifiに接続する

  • wifiを起ち上げるスクリプト、wifiのstatusを確認するスクリプトをESP8266Devkitに入れておいて、dofileで叩くと、コマンドのように都度確認できます。

  • send-baro-temp.luaを立ち上げて走らせると、サーバに向かってデータを投げる

    • wifiが立ち上がって、IPが取得できたあと、mqtt brokerにデータを投げる

memo:

★wifiのUpを確認するスクリプトをTryしたがうまくゆかず。 wifi.sta.status()が変わらない。

以下のスクリプトで、イベント待ちはできることは確認した。

wifi.eventmon.STA_CONNECTED 状態になったら function(T)をする、というもの。

wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)  print("\n\tSTA - CONNECTED".."\n\tSSID: "..T.SSID.."\n\tBSSID: "..  T.BSSID.."\n\tChannel: "..T.channel)  end)

https://nodemcu.readthedocs.io/en/master/modules/wifi/#wifieventmon-module のあたりを参考に。

2019/7/28


■通信系の状態管理


通信はプロトコルの積み重ねで成立するので、上位は下部のプロトコルが接続されているかどうかを知る必要があります。wifi/IP/mqttの順で確立してゆくので、その状態を引き渡してゆきます。今回は、下部でエラーなり接続が切れた場合は、Full-resetするようにしました。

この状態遷移をEventDrivenでうまく書けなかったので、statusを持ちまわることで具現化。

 status: 0初期化後の状態

status: 1wifiがUpした状態

status: 2mqttが接続完了した状態

2019/8/1

 


mqtt関連参考


https://iotbytes.wordpress.com/mqtt-with-nodemcu/

https://github.com/hobbyquaker/nodemcu-gpiomqtt/blob/master/gpiomqtt.lua

https://learn.adafruit.com/diy-esp8266-home-security-with-lua-and-mqtt/programming-the-esp8266-with-lua

https://www.foobarflies.io/a-simple-connected-object-with-nodemcu-and-mqtt/

2019/8/6

 


色々と悩みつつLUAスクリプトの開発


そもそもLUA言語の考え方がよくわかっていなかったのですが、TRY&ERRORでやっちゃいました。先人のWEBを参考似、使い方については、https://nodemcu.readthedocs.io/en/master/ の中で検索しつつ作り上げました。上記URLには、それぞれの使い方も記載されているので、非常に参考になりました。スクリプトの名前があちこちにありますが、途中のスクリプトは掲載しませんが、最後に出来上がったスクリプトをご参考までに載せます。

■ wifi-reconnect-ok1.lua

  • wifi.sta.getip()を待つ

wifi.eventmon.register(wifi.eventmon.STA_CONNECTED/DISCONNECTED)で表示されて、IPが払い出されるまでに6秒ほどかかる模様。なので、wifi.sta.getip()でIPをチェックしてから次に進まないとどこかでerrorになる。

error_max でIPがもらえない回数が超えると、reconnectする。

tmrは、MODEでtmr.ALARM_SEMIを設定すると、一度設定した割込みが入ると停止する、再度起動するためには、wifi.timer:start()が必要。

  • wifi.sta.config(cfg)

cfg={}

 cfg.auto=false でAutoConnectがFalseになる、=true でAutoConnect。Config RegisterにModeが記憶されるので、AutoConnectにすると、次にRebootから自動的に接続される。


wifi-reconnect-mqtt-ok2.lua

ok1のUpdate版。mqttでpublishしている時に表示のためにnodeMCU基板上のLEDを点灯させる。

以下は、モバイルバッテリーにつないだESP8266Devkitをwifi経由でPCのMQTTBroker経由してAndroidのアプリでMQTT subcribeしたもの。有効数字?は少数以下2桁くらいありそう。止めてからキャプチャしたのでStatusは”Disconnected"となっています。つながっているときには、”Connected to 192.168.0.30"とかサーバ(MQTTBroker)のアドレスが表示されます。


Androidでbroker(参考)


MQTT Brokerをスマホにインストールして、スマホだけで覗けるようにもしてみました。

Androidに以下の手順でmosquittoをインストール

  • APP storeで‘termux`をインストール(termuxはLinuxのターミナルソフト)
  • apt update
  • apt upgrade
  • pkg install mosquitto
  • mosquitto -v でbrokerを立ち上げる

192.168.0.3x(SmartPhoneを固定IP化して)で検証、動作確認しました。

これに加えて、同じSmartPhoneで同時にsubscribeするために、2画面にしてsubscriberを起動して動作を確認しました。OK!

2019/8/17


wifi-reconnect-ok3.lua

PCのMQTT Brokerで、clean session=false とすることでMQTT Brokerでのclean sessionをfalse, つまりsubscriber側が切れたら、brokerでpublishされたデータを保持してくれる。mqtt.Clientのパラメータで設定する。

(Brokerが落ちているとerror=-5で落ちて動かなくなるのが判明、、。要修正)→とりあえず、mqtt関連でofflineとか Mqtt failed. reason: -5、とかerrorが出たら、node.restart()するようにコード修正。

2019/8/18


なんだかわからないが、起動しても動かない、、。→i2cのケーブルが一本抜けていた。コードで以下の対処をした。

  • BME280.setup()でinitializingの成功を確認、不成功の場合はnode.restartするようにした。i2cでも同様の仕組みを組み込んだ。→この場合、1秒間隔くらいでLEDが点滅する。(node.restartすると、D1pinのあたりの大きなLEDが点灯したのち、RST端子近くの小さなLEDが連続して点滅する。
  • brokerが落ちた場合も、mqtt がofflineになるので、その時にもnode.restart。→この場合、15秒間隔くらいでLEDが点滅する。
これらの対処により、シリアルを接続しなくても、ESP8266Devkitの上のLEDの状態を見るとどの辺りが不良なのかがわかるようにしました。

2019/8/19

 


最新の画像もっと見る

コメントを投稿