2020年5月11日月曜日

stm32(NUCLEO-F767ZI)でbeebotteを使ってMQTT通信する!

2020年お初の記事です。えぇ。
このブログはゆるくやるのがモットーなので(という言い訳

ということでまたまたstm32ネタでございます。
最近スマートホーム化を推進しておりまして、
既製品を買うのもいいのですが、今回は自作してみようかなといろいろ調べていました。
基本的にはIFTTTと連携するのが楽ちんそうだったのでラズパイでやろうと思ったのですが...

ラズパイ...壊れてる...OTZ

そんなわけで代替を考えていた所、そーえばstm32にはEthernet端子がついていたなと。
しかも調べてるうちにIPv6プラスでネット接続してる場合はポート開放が出来るルータが限られていて、
うちのTP-LINK A10ちゃんはポート開放に対応してないということが判明orz

そこでMQTT!!!٩(๑´3`๑)۶

毎度長い長い前置きごめんなさいね( ・´ー・`)どや

    環境

  • Cube MX ver.5.6.1
  • Atollic TrueSTUDIO® for STM32, Built on Eclipse Neon.1a. Version: 9.3.0 
  • NUCLEO-F767ZI

私のgithubのレポジトリをご参考ください。

大雑把に流れをお伝えすると
  • まずCubeMXのMiddlewareの欄にあるLWIPとFREERTOSを有効化
  • SystemCore欄にあるSYSのDebugをSerial Wireにし、Timebase SourceをTIM1あたりにしておく(ここは適当に
  • んで、GENERATE CODE!
  • 次に生成されたソースをIDEで開く
  • LWIPのdoxygenサイトに書いてある様にmain.cに追加していく
  • example_do_connect内のmqtt_client_connect()関数にbeebotteのIPアドレスを与える
  • example_do_connect内のci.client_id付近に ci.client_user = {beebotteのトークン名} を追加する
  • それぞれpublish,subscribe関数にトピック名を設定する{(beebotteの例)"test/res"}
  • (DHCPを設定している人向け)lwip.cに移動し、dhcp_start(&gnetif);の下部にある/* USER CODE BEGIN 3 */内に以下のコードを追加する。
  int mscnt =0;
  while (gnetif.ip_addr.addr==0) {
		   sys_msleep(DHCP_FINE_TIMER_MSECS);
		   dhcp_fine_tmr();
		   mscnt += DHCP_FINE_TIMER_MSECS;
		   if (mscnt >= DHCP_COARSE_TIMER_SECS*1000) {
				  dhcp_coarse_tmr();
				  mscnt = 0;
		   }
	}
  1. 有線LANケーブルをNucleoにぶっ刺して、Nucleoプログラムを書き込む
こんな感じです。
9、10番目でやってることはDHCPからIPアドレスやルート情報を取得するまで待機させています。(参考: AVR lwIP Example: How to enable a DHCP client on EVK1100)
これやらないと接続を確立できません(言われてみれば当たり前ですが、その仕様に気づかず頭を抱えました(笑)
あと私のgithubのレポジトリにあるようにdnsを用いてみるのも楽でいいと思います。


beebotteとIFTTTとGoogle Assistantを連携させればこの様にアクションを起こすことが出来ます。
 活用の幅が広がりますねぇ...フムフム
 ぜひ皆さんもお試しくださいませ。
実はDHCP問題がわからなかった頃に一度Micropythonに逃げてみたのですが、
 Micropythonで同じことをすると1分ぐらいでエラー吐いて落ちまくったり、
書き込みにくかったりと 沼沼で、諦めてC言語にしていろいろ悩み直して解決した次第でした。
 それでも定期的に応答しなくなるようなので、10分に1回ぐらいブローカーに再接続する処理を入れるといいのかと思います。  
気が向いたらMicropythonの方もブログネタにしようかと思います。 
ラズパイではなくマイコンボードでこのようなことをする最大のメリットは低消費電力である点かなと思います。 
 
そしてこの手の開発はESP32が情報量が多いし、安くていいと思います(超高速手のひら返し