MQTTのサンプルがNuttxで動くそうなので、CDCECM接続したSTM32F103RCの載ったボードで動作確認をやってみました。こちらを参考にさせていただきました。ありがとうございます。なお、linuxはDebian/11, Nuttxは9.1.xです。
それでは早速設定です。まず最初にnuttx/appsに対するMQTTパッチを取得し適用します。
それでは早速設定です。まず最初にnuttx/appsに対するMQTTパッチを取得し適用します。
mkdir /usr/src/tmp cd /usr/src/tmp wget https://gist.githubusercontent.com/mickey-happygolucky/8f311691be2b8000f82628b56ded435c/raw/aabf945b67914c2bfd5137cdac0d85d474db22f1/nuttx_mqtt.patch cd /usr/src/nuttx/apps patch -p1 < /usr/src/tmp/nuttx_mqtt.patch続いて、先にCDCECMデバイスを接続させるLinux機にmosquittoをインストールし、最小限の設定をしておきます。
sudo apt-get install mosquitto mosquitto-clients # 新規作成: $ sudo vi /etc/mosquitto/conf.d/bind-10.0.0.1.conf allow_anonymous true bind_address 10.0.0.1 $ sudo systemctrl restart mosquittoCDCECMのコンフィグは以下の様にしました。
$ cd /usr/src/nuttx/nuttx $ mkdir -p boards/arm/stm32/f103rcbb/configs/cdcecm_mqtt $ vi nuttx/boards/arm/stm32/f103rcbb/configs/cdcecm_mqtt/defconfig # CONFIG_DISABLE_ENVIRON is not set # CONFIG_DISABLE_POSIX_TIMERS is not set # CONFIG_NSH_DISABLEBG is not set # CONFIG_NSH_DISABLESCRIPT is not set # CONFIG_NSH_DISABLE_DD is not set # CONFIG_NSH_DISABLE_EXEC is not set # CONFIG_NSH_DISABLE_EXIT is not set # CONFIG_NSH_DISABLE_GET is not set # CONFIG_NSH_DISABLE_IFCONFIG is not set # CONFIG_NSH_DISABLE_LOSETUP is not set # CONFIG_NSH_DISABLE_MKRD is not set # CONFIG_NSH_DISABLE_PS is not set # CONFIG_NSH_DISABLE_PUT is not set # CONFIG_NSH_DISABLE_WGET is not set # CONFIG_NSH_DISABLE_XD is not set CONFIG_ARCH="arm" CONFIG_ARCH_BOARD="f103rcbb" CONFIG_ARCH_BOARD_F103RCBB=y CONFIG_ARCH_CHIP="stm32" CONFIG_ARCH_CHIP_STM32=y CONFIG_ARCH_CHIP_STM32F103RC=y CONFIG_ARCH_STACKDUMP=y CONFIG_BOARD_LOOPSPERMSEC=5483 CONFIG_BUILTIN=y CONFIG_DEBUG_FULLOPT=y CONFIG_DEBUG_SYMBOLS=y CONFIG_DEFAULT_SMALL=n CONFIG_FS_PROCFS=y CONFIG_FS_RAMMAP=y CONFIG_INTELHEX_BINARY=y CONFIG_MAX_TASKS=8 CONFIG_MAX_WDOGPARMS=2 CONFIG_NFILE_DESCRIPTORS=8 CONFIG_NFILE_STREAMS=8 CONFIG_NSH_ARCHINIT=y CONFIG_NSH_BUILTIN_APPS=y CONFIG_NSH_FILE_APPS=y CONFIG_NXFLAT=y CONFIG_PREALLOC_MQ_MSGS=4 CONFIG_PREALLOC_TIMERS=4 CONFIG_PREALLOC_WDOGS=16 CONFIG_RAM_SIZE=49152 CONFIG_RAM_START=0x20000000 CONFIG_RAW_BINARY=y CONFIG_RR_INTERVAL=200 CONFIG_SCHED_HPWORK=y CONFIG_SCHED_WAITPID=y CONFIG_SDCLONE_DISABLE=y CONFIG_STDIO_BUFFER_SIZE=0 CONFIG_STM32_BKP=y CONFIG_STM32_JTAG_FULL_ENABLE=y CONFIG_STM32_PWR=y CONFIG_STM32_RTC=y CONFIG_STM32_USART1=y CONFIG_SYMTAB_ORDEREDBYNAME=y CONFIG_SYSTEM_MQTTC=y CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_PING=y CONFIG_TASK_NAME_SIZE=16 CONFIG_USART1_RXBUFSIZE=128 CONFIG_USART1_SERIAL_CONSOLE=y CONFIG_USART1_TXBUFSIZE=128 CONFIG_USER_ENTRYPOINT="nsh_main" CONFIG_WDOG_INTRESERVE=0 CONFIG_USBDEV=y CONFIG_BOARDCTL_USBDEVCTRL=y CONFIG_STM32_USB=y CONFIG_NET=y CONFIG_NET_BROADCAST=y CONFIG_NET_CDCECM=y CONFIG_NET_ICMP=y CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_SOCKOPTS=y CONFIG_NET_TCP=y CONFIG_NET_UDP=y CONFIG_NETDEV_PHY_IOCTL=y CONFIG_NETDEVICES=y CONFIG_NETINIT_DHCPC=y CONFIG_NETINIT_DNS=y CONFIG_NETINIT_NETLOCAL=n CONFIG_NETINIT_NOMAC=y CONFIG_NETINIT_SWMAC=y CONFIG_NETINIT_THREAD=y CONFIG_NETDB_DNSCLIENT=y CONFIG_NETUTILS_DHCPC=y CONFIG_NETUTILS_MQTTC=yconfigの作成が済んだら以前の投稿と同様にビルド・書き込みを行ってください。
$ make distclean; tools/configure.sh f103rcbb/cdcecm_mqtt; make $ openocd.exe -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "init" -c "reset halt" \ -c "flash write_image erase nuttx.bin 0x08000000 bin" -c shutdownなお、macアドレスは、こちらの投稿で紹介したように、cpuidの一部が疑似マックアドレスとして使用されるので、個体ごとにmacアドレスを指定し、ビルドする必要はありません。 書き込みが終わったらnuttx機を再起動します。続いてmqttブローカ兼サブスクライバーのlinuxマシンで以下のコマンドを実行します。
$ mosquitto_sub -h 10.0.0.1 -t "datetime" -v続いてNuttx機でPublishingを行います。
nsh>mqtt 10.0.0.1 nsh: mqtt: command not found nsh>mqttc 10.0.0.1 mqttc is ready to begin publishing the time. Press ENTER to publish the current time. Press CTRL-D (or any other key) to exit. mqttc published : "The time is 1970-01-01 00:35:45" packet_id = 0x00005150,536904096正常にpublishできているとサブスクライバー側で以下の様に表示されます。
$ mosquitto_sub -h 10.0.0.1 -t "datetime" -v datetime The time is 1970-01-01 00:35:45追記2021/03/13: 今回のmqtt clientはsslなしですので、user名とパスワードを平文で送るのはよくないのですが、ハードコーディングする場合は以下の様にします。
$ cd /usr/src/nuttx/apps $ diff -urN system/mqttc/simple_publisher.c.orig system/mqttc/simple_publishe r.c --- system/mqttc/simple_publisher.c.orig 2021-03-12 18:36:56.605612500 +0900 +++ system/mqttc/simple_publisher.c 2021-03-13 08:11:41.320000000 +0900 @@ -83,7 +83,8 @@ uint8_t sendbuf[2048]; /* sendbuf should be large enough to hold multiple whole mqtt messages */ uint8_t recvbuf[1024]; /* recvbuf should be large enough any whole mqtt message expected to be received */ mqtt_init(&client, sockfd, sendbuf, sizeof(sendbuf), recvbuf, sizeof(recvbuf), publish_callback); - mqtt_connect(&client, "publishing_client", NULL, NULL, 0, NULL, NULL, 0, 400); +// mqtt_connect(&client, "publishing_client", NULL, NULL, 0, NULL, NULL, 0, 400); + mqtt_connect(&client, "publishing_client", NULL, NULL, 0, "user", "pass", 0, 400); /* check that we don't have any errors */ if (client.error != MQTT_OK) {やってみてわかったことですが、mqttを実際に使うにはセキュリティーの設定等をしっかりしないといけないなと、思いました。今回は以上です。それでは。
コメント
コメントを投稿