esp-open-rtosを使ってみる

MQTT Client(Paho MQTTライブラリ)

example/mqtt_clientにMQTTクライアントのサンプルが含まれています。
ソースを見てみましたが、以下のMQTTライブラリが使えます。
mqtt_client_new()
mqtt_connect()
mqtt_publish()
mqtt_subscribe()
mqtt_unsubscribe()
mqtt_disconnect()
mqtt_yield()

これらの関数はextras/paho_mqtt_cにソース、ヘッダーが有ります。
lwIPにもMQTT Client-APIがありますが、どうやら別の物の様です。

また、MQTTのために以下の関数が用意されています。
mqtt_network_new(mqtt_network_t* n)
network構造体の初期化

mqtt_network_connect(mqtt_network_t* n, const char* host, int port)
Brokerへ接続。関数内部ではsocket()とconnect()のSocket APIを使っています。

mqtt_network_disconnect(mqtt_network_t* n)
Brokerの切断。関数内部ではclose()のSocket APIを使っています。



このサンプルはなかなかよくできていて、test.mosquitto.orgのBrokerを使って、Pub/Subの両方が動きます。

beat_task
1000Tick毎にpublish_queueにQueueを積みます。
このタスクは少し凝っていて、単純なvTaskDelay()ではなく、vTaskDelayUntil()を使って時間待ちをしています。
mqtt_taskがPublishするタイミングを作っています。

mqtt_task
publish_queueにQueueが積まれたら、「/beat」のTopickをPublishします。
Subscribeされたメッセージはmqtt_yield()で受け取った後、topic_received()のCallBack関数が呼ば れます。

wifi_task
APの接続状態を監視しています。
このタスクも少し凝っていて、APに接続中は「wifi_alive」のSemaphoreを許可し続けます。
xSemaphoreGive()をひたすら呼び出しているので気になって調べてみましたが、
Semaphore値は1以上にはなりません。

起動すると以下の表示となります。
APの接続が完了したら、mqtt_taskがBrokerに接続します。
その後、publish_queueにQueueが積まれたら、「/beat」のTopicをPublishしています。
SDK version:0.9.9
mode : sta(18:fe:34:d4:2f:77)
add if0
mqtt_task: started
mqtt_task: (Re)connecting to MQTT server test.mosquitto.org ... error: -1
xLastWakeTime=1
WiFi: connecting to WiFi
wifi_task: status = 1
scandone
wifi_task: status = 1
add 0
aid 7
cnt

connected with aterm-e625c0-g, channel 11
dhcp client start...
wifi_task: status = 1
wifi_task: status = 1
ip:192.168.10.154,mask:255.255.255.0,gw:192.168.10.1
wifi_task: status = 5
WiFi: Connected
mqtt_task: started
mqtt_task: (Re)connecting to MQTT server test.mosquitto.org ... done
Send MQTT connect ... done
beat
got message to publish
beat
got message to publish
beat

別のマシンを使って、以下のコマンドを実行すると、Subscriveしたメッセージを表示します。
mosquitto_pub -h test.mosquitto.org -p 1883 -t /esptopic -m "Hello World"
Received: /esptopic = mqtt test
beat
got message to publish
Received: /esptopic = mqtt test
beat
got message to publish
beat
got message to publish
Received: /esptopic = Hello World

beatタスクを少し変えるだけで、汎用的なMQTTアプリケーションとして使うことができます。

続く....