Paho C を使用して MQTT クライアントを接続する

テキストコピッド

導入事例

このガイドは、あなたが使用するのに役立ちますクリプトパホクライアントはMQTTブローカーに接続し、メッセージを公開します。 トピックを購読します。 軽量で、C で書かれ、MQTT v3.1.1 と v5.0 をサポート 埋め込まれ、IoTアプリケーションお問い合わせ

前提条件

開始する前に、次の設定を必ず設定してください。

  • Eclipseパホ Cライブラリをインストールしました。
  • Linux ベースのプラットフォーム
  • git クローン --branch v1.3.14 https://github.com/eclipse/paho.mqtt.c.git
    cd paho.mqtt.c
    メイク
    sudo make インストール

  • ウィンドウズのため
  • mkdirビルド。 パフォ
    cdビルド。 パフォ
    "C:\Program Files (x86)\Microsoft を呼び出す ビジュアルスタジオ 14.0\VC\vcvarsall.bat x64
    make -G "NMake Makefiles" -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_DOCUMENTATION=FALSE -DPAHO_BUILD_SAMPLES=TRUE -DPAHO_BUILD_SAMPLES=TRUE -DPAHO_BUILD_FALSE -DPAHO_BUILD_SAMPLES=TRUE -D -DPAHO -D -D -D -D -DPAHO -D -D -D -D -D -D -DPAHO -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -D -DCMAKE_BUILD_TYPE=リリース -DCMAKE_VERBOSE_MAKEFILE=TRUE .
    メニュー

MQTTブローカーに接続する

このセクションでは、接続する複数の方法について説明しますMQTTについてお問い合わせ ブローカーの詳細(ホスト名、ポート、ユーザー名/パスワード、CA証明書)が便利です。

基本TCP コネクション

#define ADDRESS "tcp://public-mqtt-broker.bevywise.com:1883"
#define CLIENTID "testclient4" は、
MQTTAsyncクライアント;
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL) の使い方
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
int の rc;
if ((rc = MQTTAsync_connect(client, &conn_opts))) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("Connect, return code %d\n", rc" を起動できません)
出口(EXIT_FAILURE);
お問い合わせ

認証と接続

MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL) の使い方
conn_opts.username = "your-mqtt-username";
conn_opts.password = "your-mqtt-password";

TLS/SSL に接続

MQTTAsync_SSLOptions ssl_opts = MQTTAsync_SSLOptions_initializer;
ssl_opts.verify = 0;ssl_opts.slVersion = MQTT_SSL_VERSION_TLS_1_2;
ssl_opts.enableServerCertAuth = 1 ;
ssl_opts.verify = 1 ;
conn_opts.sl = &ssl_opts;

WebSocketを介して接続

#define アドレス
"ws://freemqttbroker.sfodo.mqttserver.com:10443" "

MQTT出版

#define TOPIC "デバイス/ステータス"
#define PAYLOAD "ON" は、
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
int の rc;
pubmsg.ペイロード = PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
パブmsg.qos = 1;
pubmsg.retained = 0;
渡された = 0;
もし(rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts)) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf(" sendMessage を開始できなかった, 戻りコード %d\n", rc);
出口(EXIT_FAILURE);
お問い合わせ

MQTTの特長 会員登録

#define フィルター "your-topic-filter"
#QOSの定義 1
if ((rc = MQTTAsync_subscribe(client、FILTER、QOS、NULL))) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("サブスクリプションに失敗し、コードを%d\n、rcを返す);
出口(EXIT_FAILURE);
お問い合わせ

退会のため:

#define フィルター "your-topic-filter"
if ((rc = MQTTAsync_unsubscribe(client, FILTER, NULL)) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("unsubscribe, 戻りコード%d\n", rc);
お問い合わせ

MQTTの切断

クリーンな切断により、ブローカーが結びつくリソースを解放します セッションは、リングソケット接続を避けます。

MQTTAsync_disconnect(クライアント、NULL);
MQTTAsync_destroy(&client) ディレクティブ

サンプル MQTTv311 の顧客

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "MQTTAsync.h" の読み込み
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "testclientC4" ディレクティブ
#define TOPIC "センサー/温度"
#define PAYLOAD "180"
#QOSの定義 1
#define タイムアウト 10000L
int 通知 = 0;
終了 = 0;
onDisconnect(void*文脈) を変換します。 MQTTAsync_successData* 応答
お問い合わせ
printf("Successful disconnection\n");;;;
終了 = 1;
お問い合わせ
onSubscribe(void*文武) を省略します。 MQTTAsync_successData* 応答
お問い合わせ
printf("Subscribe は成功しました\n");
お問い合わせ
onConnectFailure(void* ́∀`) は、 MQTTAsync_failureの使い方 データ* 応答
お問い合わせ
printf("Connect が rc %d\n", response->code : 0 ); を呼び出します。
終了 = 1;
お問い合わせ
void onConnect(void* 文字列) MQTTAsync_successData* 応答
お問い合わせ
printf("関連成功\n");
お問い合わせ
int msgarrvd(void *context、char *topicName、int トピックレン、MQTTAsync_message *message)
お問い合わせ
コンテンツ
char* のペイロードプター
printf("""""") は、
printf(" トピック: %s\n", トピック名);
printf(") メッセージ: ");
ペイロードプラー=メール-> ペイロード
用(i=0; i<message->payloadlen;i++)
お問い合わせ
パットチャー(* ペイロードプラー++)
お問い合わせ
パチャー('\n');
MQTTAsync_freeMessage(&メッセージ)。
MQTTAsync_free(ユーザー名)
終了 = 1;
リターン1;
お問い合わせ
int main(int argc, char* argv[)] の
お問い合わせ
// クライアント
MQTTAsync クライアント
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)の使い方
MQTTAsync_setCallback(クライアント、NULL、NULL、msgarrvd、NULL)
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
ご利用規約 ================================================================================================================================================================================================================================================================ 1) 1
お問い合わせ
conn_opts.username = "dev2";
conn_opts.password = "key2";
お問い合わせ
conn_opts.keepAliveインターバル = 60;
conn_opts.cleansession = 1 ;
conn_opts.onの成功 = onConnect;
電子メール = onConnectFailure
conn_opts.context = クライアント;
の rc の
if ((rc = MQTTAsync_connect(client, &conn_opts))) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("Connect, return code %d\n", rc" ) は、
終了(EXIT_FAILURE)
お問い合わせ
睡眠(1);
// リクエスト
MQTTAsync_responseOptions sub_opts = MQTTAsync_responseOptions_initializer;
sub_opts.onの成功 = onSubscribe;
sub_opts.context = クライアント;
if ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, ◀_opts)))) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("" に に に に " を を を を を を を を を を を を を を を を を を を を を を を ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); );
終了(EXIT_FAILURE)
お問い合わせ
// 公開
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
ログイン ペイロード
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, NULL)))) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf(" sendMessage を呼び出します。, 戻りコード %d\n", rc);
終了(EXIT_FAILURE)
お問い合わせ
!(!終了)
お問い合わせ
#if 定義(WIN32) | 定義(WIN64)
睡眠(100);
ログイン
usleep(10000L);
よくあるご質問
お問い合わせ
MQTTAsync_destroy(&client) ディレクティブ
アーク
お問い合わせ


コードをそのまま保存mqtt4 クライアント

コンパイル:

mqtt4client mqtt4Client.c -lpaho-mqtt3a -lpaho-mqtt3as


実行:

./mqtt4 クライアント

サンプル MQTTv5 の顧客

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "MQTTAsync.h" の読み込み
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "testClientC5" は、
#define TOPIC "センサー/湿気"
#define PAYLOAD "20.3"
#QOSの定義 1
#define タイムアウト 10000L
int 通知 = 0;
終了 = 0;
onDisconnect(void*文脈) を変換します。 MQTTAsync_successData* 応答
お問い合わせ
printf("Successful disconnection\n");;;;
終了 = 1;
お問い合わせ
onConnectFailure(void* ́∀`) は、 MQTTAsync_failureの使い方 データ* 応答
お問い合わせ
printf("Connect が rc %d\n", response->code : 0 ); を呼び出します。
終了 = 1;
お問い合わせ
void onConnect(void* 文字列) MQTTAsync_successData* 応答
お問い合わせ
printf("関連成功\n");
お問い合わせ
int msgarrvd(void *context、char *topicName、int トピックレン、MQTTAsync_message *message)
お問い合わせ
コンテンツ
char* のペイロードプター
printf("""""") は、
printf(" トピック: %s\n", トピック名);
printf(") メッセージ: ");
ペイロードプラー=メール-> ペイロード
用(i=0; i<message->payloadlen;i++)
お問い合わせ
パットチャー(* ペイロードプラー++)
お問い合わせ
パチャー('\n');
MQTTAsync_freeMessage(&メッセージ)。
MQTTAsync_free(ユーザー名)
終了 = 1;
リターン1;
お問い合わせ
int main(int argc, char* argv[)] の
お問い合わせ
// クライアント
MQTTAsync クライアント
MQTTAsync_createOptions create_opts = MQTTAsync_createOptions_initializer;
create_opts.MQTTVersion = MQTTVERSION_5;
int rc = MQTTAsync_createWithOptions(&client、ADDRESS、CLIENTID、MQTTCLIENT_PERSISTENCE_NONE、NULL、&create_opts)
MQTTAsync_setCallback(クライアント、NULL、NULL、msgarrvd、NULL)
// CONNECT の設定
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer5;
ご利用規約 ================================================================================================================================================================================================================================================================ 1) 1
お問い合わせ
conn_opts.username = "dev2";
conn_opts.password = "key2";
お問い合わせ
conn_opts.keepAliveInterval = 20;
conn_opts.cleanstart = 1 ;
conn_opts.onの成功 = onConnect;
電子メール = onConnectFailure
conn_opts.context = クライアント;
MQTTProperties props = MQTTProperties_initializer;
// // セッションの定義
MQTTプロパティ1;
プロパティ1.identifier = MQTTPROPERTY_CODE_SESSION_EXPIRY_INTERVAL;
プロパティ1.value.integer2 = 90;
MQTTProperties_add(&props、&property1);
プロパティ = &props
if ((rc = MQTTAsync_connect(client, &conn_opts))) != MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("Connect, return code %d\n", rc" ) は、
終了(EXIT_FAILURE)
お問い合わせ
睡眠(1);
// リクエスト
!= MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("" に に に に " を を を を を を を を を を を を を を を を を を を を を を を ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); ); );
終了(EXIT_FAILURE)
お問い合わせ
睡眠(1);
// 公開
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
ログイン ペイロード
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
// 公開ディレクトリ
MQTTAsync_responseOptions pub_opts = MQTTAsync_responseOptions_initializer;
pub_opts.context = クライアント;
MQTTProperties pub_props = MQTTProperties_initializer;
MQTTプロパティ3;
プロパティ3.identifier = MQTTPROPERTY_CODE_TOPIC_ALIAS;
プロパティ3.value.integer4 = 90;
MQTTProperties_add(&pub_props、&property3)。
pub_opts.properties = pub_props;
!= MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf(" sendMessage を呼び出します。, 戻りコード %d\n", rc);
終了(EXIT_FAILURE)
お問い合わせ
睡眠(1);
!= MQTTASYNC_SUCCESS(マクタスイック)
お問い合わせ
printf("unsubscribe, 後方コード%d\n", rc);
終了(EXIT_FAILURE)
お問い合わせ
!(!終了)
お問い合わせ
#if 定義(WIN32) | 定義(WIN64)
睡眠(100);
ログイン
usleep(10000L);
よくあるご質問
お問い合わせ
MQTTAsync_destroy(&client) ディレクティブ
アーク
お問い合わせ


コードをそのまま保存mqtt5 クライアント

コンパイル:

mqtt5client mqtt5lient.c -lpaho-mqtt3a -lpaho-mqtt3as


実行:

./mqtt5clientの

トラブルシューティング

  • もし、MQTTについてURL が間違っているか、到達できないか、プログラムが接続例外をスローする可能性があります。
  • TLS を使用する場合は、必ずポートを 8883 に設定してください。

CでIoTをスケール!

スマート・コネクティビティを有効にする
Cアプリケーション用

MQTT のメッセージングを予測可能、安全、そして容易に管理することで、デバイスの通信を制御できます。