生存報告

仕事でバックエンド、趣味でフロントエンド・デザイン

C言語でMQTT通信

はじめに

頭のいい人が作ったMQTTライブラリを使って、ローカル環境でMQTT通信してみます。

ローカル環境

MQTT brokerのインストール

MQTT通信をやるためにはMQTT brokerと呼ばれるサーバを動作させておく必要があるみたい。

  • Homebrewを使ってインストールします。
brew install mosquitto
  • 以下のコマンドでサーバを立ち上げます。
/usr/local/sbin/mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf

MQTTライブラリのインストール

opensslというライブラリも必要ですので一緒にインストールします。

brew install openssl
git clone https://github.com/eclipse/paho.mqtt.c.git

サンプルコードの変更、ビルドとインストール

paho.mqtt.c/src/samplesMQTTClient_publish.cMQTTClient_subscribe.cがあるのでこちらを使用します。 今回はローカルで通信するので、どちらのソースコードも通信するアドレスを以下のように変更します。

#define ADDRESS     "127.0.0.1:1883"

ライブラリのトップディレクトリでビルドとインストールを行います。

cd paho.mqtt.c
make
make install

makeMakefileに従ったビルドを行います。make installをすることでOSの共有includeディレクトリにライブラリがインストールされ、ライブラリとして使用することが可能になります。

Publish, Subscribeしてみる

paho.mqtt.c/build/output/samples/に実行ファイルができてます。 MQTTClient_publishでPublishして、MQTTClient_subscribeでSubscribeしてみましょう。

  • Subscribeで待ち受ける
./MQTTClient_subscribe
  • Publishで3回メッセージを送ってみました
./MQTTClient_publish
./MQTTClient_publish
./MQTTClient_publish
  • 実行結果(Sub側)
Message arrived
     topic: MQTT Examples
   message: Hello World!
Message arrived
     topic: MQTT Examples
   message: Hello World!
Message arrived
     topic: MQTT Examples
   message: Hello World!
  • 実行結果(Pub側)
iMac:samples user$ ./MQTTClient_publish
Waiting for up to 10 seconds for publication of Hello World!
on topic MQTT Examples for client with ClientID: ExampleClientPub
Message with delivery token 0 delivered
iMac:samples user$ ./MQTTClient_publish
Waiting for up to 10 seconds for publication of Hello World!
on topic MQTT Examples for client with ClientID: ExampleClientPub
Message with delivery token 0 delivered
iMac:samples user$ ./MQTTClient_publish
Waiting for up to 10 seconds for publication of Hello World!
on topic MQTT Examples for client with ClientID: ExampleClientPub
Message with delivery token 0 delivered

ちなみにMQTT brokerを立ち上げたターミナルでは以下のようなログが出ます。

1615900025: mosquitto version 2.0.9 starting
1615900025: Config loaded from /usr/local/etc/mosquitto/mosquitto.conf.
1615900025: Starting in local only mode. Connections will only be possible from clients running on this machine.
1615900025: Create a configuration file which defines a listener to allow remote access.
1615900025: Opening ipv4 listen socket on port 1883.
1615900025: Opening ipv6 listen socket on port 1883.
1615900025: mosquitto version 2.0.9 running
1615900030: New connection from 127.0.0.1:62674 on port 1883.
1615900030: New client connected from 127.0.0.1:62674 as ExampleClientSub (p2, c1, k20).
1615900035: New connection from 127.0.0.1:62676 on port 1883.
1615900035: New client connected from 127.0.0.1:62676 as ExampleClientPub (p2, c1, k20).
1615900035: Client ExampleClientPub disconnected.
1615900036: New connection from 127.0.0.1:62677 on port 1883.
1615900036: New client connected from 127.0.0.1:62677 as ExampleClientPub (p2, c1, k20).
1615900036: Client ExampleClientPub disconnected.
1615900037: New connection from 127.0.0.1:62679 on port 1883.
1615900037: New client connected from 127.0.0.1:62679 as ExampleClientPub (p2, c1, k20).
1615900037: Client ExampleClientPub disconnected.

参考記事様方

github.com

qiita.com

最後に

本当は今回やったことをAndroid上でやりたかったのでした。 頭のいい人教えて下さい。完