みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

NuttX STM32F4Discovery+ENC28J60でMQTT

はじめに

STM32F4DiscoveryでEthernetが使えるようになったのでMQTTを動かしてみる。

既にNuttXでMQTTを動作させた例がないかWebで調べたところ、こんなものを見つけた。

リンク先では、MQTT-Cを動かそうとしていて問題が発生したというissueで、最終的には動作したということだった。

その時にdarcygさんが作成したパッチが参照できるので、これを参考に作業することにした。

パッチの修正

MQTT-Cはアプリケーションになるため、appsのリポジトリに対しての修正となる。

このパッチはそのままではうまく当たってくれないので、修正する必要がある。

パッチをそのまま載せると長いので、Gistに貼る。

コンフィグレーション

MQTT-Cを組み込むために、次のコンフィグレーションを有効化する.

CONFIG_NETUTILS_MQTTC

Application Configuration
  -> Network Utilities
    -> MQTTC client library

CONFIG_SYSTEM_MQTTC

Application Configuration
  -> System Libraries and NSH Add-Ons
    -> 'mqttc' command

動作確認

UbuntuにMosquittoをインストールしSubscriberを実行し、NuttX側でPublishする。

IPアドレス
PC 192.168.10.1
NuttX 192.168.10.100

Mosquittoのインストール

次のコマンドでインストールする。

$ sudo apt install mosquitto mosquitto-clients

Subscriberの実行

MQTT-CのPublisherのサンプルがdatetimeというトピックをPublishするので、それをSubscribeする。

$ mosquitto_sub -t datetime

Publisherの実行

NuttX側で次のコマンドを実行する。パラメータにPC側のIPアドレスを指定する。

$ mqttc 192.168.10.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.

これ以降、Enterキーを押すごとにデータがPublishされる。

mqttc published : "The time is 1970-01-01 00:00:34"
packet_id = 0x0000B405,268456040
mqttc published : "The time is 1970-01-01 00:00:35"
packet_id = 0x0000EE02,268456020
mqttc published : "The time is 1970-01-01 00:00:36"
packet_id = 0x00007701,268456000
mqttc published : "The time is 1970-01-01 00:00:37"
packet_id = 0x00008F80,268455980
mqttc published : "The time is 1970-01-01 00:00:38"
packet_id = 0x000047C0,268455960
mqttc published : "The time is 1970-01-01 00:00:39"
packet_id = 0x000023E0,268455940
mqttc published : "The time is 1970-01-01 00:00:39"
packet_id = 0x000011F0,268455920
mqttc published : "The time is 1970-01-01 00:00:40"
packet_id = 0x000008F8,268455900

現在時刻をPublishしているが、RTCなどがないためでたらめな時刻となっている。

PC側でNuttXからのデータがきちんとSubscribeできていればOK。

$ mosquitto_sub -t datetime
The time is 1970-01-01 00:00:34
The time is 1970-01-01 00:00:35
The time is 1970-01-01 00:00:36
The time is 1970-01-01 00:00:37
The time is 1970-01-01 00:00:38
The time is 1970-01-01 00:00:39
The time is 1970-01-01 00:00:39
The time is 1970-01-01 00:00:40

リポジトリのクローン

この環境を組み込んだリポジトリのクローンをGithubに作成した。

使用する場合はnuttxのリポジトリとして次のものを使用する。

$ git clone https://github.com/mickey-happygolucky/nuttx.git -b mqtt
$ git clone https://github.com/mickey-happygolucky/apps.git -b mqtt
$ cd nuttx
$ tools/configure.sh -l configs/stm32f4discovery/nsh_enc28j60_mqtt
$ make -j4
$ st-flash write nuttx.bin 0x8000000