Shujima Blog

Apple製品,技術系の話をするブログ

Raspberry Pi同士でインターネット双方向通信【CloudMQTT】(#4 C言語Mosquitto送信編)

f:id:masa_flyu:20190216134218p:plain

各記事リンク

  1. 説明編
  2. Broker準備編
  3. Node-RED編
  4. C言語Mosquitto送信編(本記事です)
  5. C言語Mosquitto受信編

本編へ

以前の記事からの続きで,前回までに用意・確認したCloudMQTT環境を使います.

また送信プログラムのテストにNode-REDを使用します.

それらについては以前の記事を参照してください.

環境

  • Raspberry Pi 3 Model B (2台)
  • Raspbian stretch 9.4
  • Ethernetでそれぞれインターネットに接続

Mosquittoライブラリ

Mosquittoとは

本記事で作成するMQTTクライアントのC言語プログラムはMosquittoというライブラリを用いています.

MosquittoはEclipseプロジェクトによるMQTTの実装で,非常に多くの場所で使用されています.

mosquitto.org

Mosquittoライブラリを用いたC言語プログラムを作ることで,簡単に通信を実装できます.

f:id:masa_flyu:20190217140718p:plain

Mosquittoのインストール方法

まず,Raspberry PiにMosquittoライブラリをインストールする必要があります.

ターミナルで以下のコマンドを実行することでできました(こちらを参考にしています).

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get install libmosquitto-dev

2行目でエラーっぽい表記がでたのですが,3行目の準備なので,3行目が実行できたのであれば問題ないかと.

私はこの手順で無事使用できました.

送信プログラム

送信側のRaspberry Piで以下のCプログラムを作成してください.

ファイル名はなんでも構いませんが,私は「MQTTpub.c」としました.

#include <stdio.h>
#include <stdlib.h>
#include <string.h> //strlen();
#include <unistd.h> //sleep();
#include <signal.h> //signal();

//mosquittoライブラリが必要です
//$ sudo apt-get install software-properties-common
//$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
//$ sudo apt-get install libmosquitto-dev
#include <mosquitto.h>

void endCatch(int);
struct mosquitto *mosq;


int main()
{
    //↓↓↓ここからを編集する↓↓↓

    //MQTT Brokerの設定 (CloudMQTT)
    const char *ip = "ほげほげ.cloudmqtt.com"; //サーバのIPアドレスまたはドメイン名
    const int port = 54321; //サーバのポート番号
    const char *username = "username"; //サーバのユーザネーム
    const char *password = "password"; //サーバのパスワード

    //MQTTの設定
    const char *id = "RasPi1"; //発信者ごとに変える
    const char *topic = "topic1/sub1"; //送信するデータを区別するためのもの(受信側と統一する)
    const char *message = "Hello MQTT"; //送信文字列

    //↑↑↑ここまでを編集する↑↑↑

    //Ctrl + Cなどによって強制終了するときに、終了時用の処理を呼び出す設定
    signal(SIGINT , endCatch );

    printf("Prepareing mosquitto...\n");
    //mosquittoの最初に呼び出す初期化関数
    mosquitto_lib_init();
    //mosquitto実態の作成
    mosq = mosquitto_new(id, 0, NULL);
    //失敗してたら
    if(!mosq){
        perror("Failed to create mosquitto\n");
        mosquitto_lib_cleanup();
        return -1;
    }

    //ユーザ名、パスワードを教える
    mosquitto_username_pw_set(mosq, username, password);
    //サーバーに登録する
    mosquitto_connect(mosq, ip, port, 60);

    printf("Server connected!\n");

    //送信処理
    while(1)
    {
        mosquitto_publish(mosq, NULL, topic, strlen(message) , message, 0, 0 );
        printf("Publish \"%s\" about \"%s\" from %s to %s:%d\n", message, topic, id, ip, port );
        sleep(1);
    }
    return 0;
}

//プログラム終了時の処理
void endCatch(int sig)
{
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();
    printf("End Program\n\n");
    exit(0);
}

これをコマンドでビルドします.

Cファイルを作成した場所で以下のコマンドを実行します.

gcc MQTTpub.c -o MQTTpub -lmosquitto

コマンドの意味は * gcc : C言語をビルドするコマンド * MQTTpub.c : Cのファイル名(自分で作成したもの) * -o : ビルドした後の実行ファイルの名前を指定 * MQTTpub : ビルドした後の実行ファイルの名前 * -lmosquitto : ライブラリ「mosquitto」を使用する

です.

エンターキーを押して,エラーなどが出なければ成功です.

以下のコマンドでプログラムを実行します.

sudo ./MQTTpub

以下のように1秒ごとに表示されれば送信できていることになります.

f:id:masa_flyu:20190215214632j:plain

送信プログラムのチェック

送信プログラムをチェックします.

受信側のRaspberry PiでNode-REDを立ち上げて,受信側の構成を作ってください(以前の記事を参照).

デプロイ後にデバッグの欄に「Hello MQTT」が1秒ごとに表示されていれば成功です.

f:id:masa_flyu:20190215215425j:plain

次に受信プログラムを示します.

参考

MQTT Client -C言語- - Qiita http://altenergy-system.com/archives/4172

C言語でMQTTクライアントを動作させる(paho.mqtt.embedded-c) - Symfoware

GitHub - CloudMQTT/mosquitto: Eclipse Mosquitto

当ブログをご利用いただく際には免責事項をお読みください。