スキップしてメイン コンテンツに移動

Testing mqtt on Nuttx with cdcecm

MQTTのサンプルがNuttxで動くそうなので、CDCECM接続したSTM32F103RCの載ったボードで動作確認をやってみました。こちらを参考にさせていただきました。ありがとうございます。なお、linuxはDebian/11, Nuttxは9.1.xです。
それでは早速設定です。まず最初に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 mosquitto
CDCECMのコンフィグは以下の様にしました。
$ 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=y
configの作成が済んだら以前の投稿と同様にビルド・書き込みを行ってください。
$ 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を実際に使うにはセキュリティーの設定等をしっかりしないといけないなと、思いました。今回は以上です。それでは。

コメント

このブログの人気の投稿

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかもしれませ

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-