このトピックでは、組み込みC用のオープンソースのPaho MQTTプロジェクトを使用して、デバイスをIoT Platformに接続し、メッセージングを有効にする方法について説明します。
使用状況ノート
このトピックでは、共通ユーザーの権限を使用してすべての操作を実行します。 管理者権限を必要とする特定の操作を実行する場合は、sudoコマンドを実行します。
前提条件
プロダクトとデバイスは、IoT Platformコンソールのインスタンスに作成されます。 デバイス証明書とMQTTエンドポイントが取得されます。 デバイス証明書情報には、ProductKey、DeviceName、およびDeviceSecretが含まれます。 詳細については、以下のトピックをご参照ください。
開発環境の準備
この例では、Ubuntu 16.04-LTSを使用して開発環境を構築します。 次のコマンドを実行して、開発環境を構築します。
sudo apt-getアップデート
sudo apt-get install build-essential git sed cmake C用のPaho MQTTライブラリをダウンロードする
次のコマンドを実行して、C用のPaho MQTTライブラリを複製します。
git clone https://github.com/eclipse/paho.mqtt.embedded-c.gitこのトピックでは、masterブランチを使用してサンプルコードを開発します。 コミットIDは29ab2aa29c5e47794284376d7f8386cfd54c 3eedです。
埋め込みC用のPaho MQTTプロジェクトには、次のサブプロジェクトが含まれます。
MQTTPacket: MQTTデータパケットといくつかのヘルパー関数のシリアル化と逆シリアル化を提供します。
MQTTClient: MQTTPacketによって生成される高レベルのC ++ クライアントプログラムをカプセル化します。
MQTTClient-C: MQTTPacketによって生成される高レベルCクライアントプログラムをカプセル化します。
MQTTClient-Cプロジェクトには、次のディレクトリとファイルが含まれます。
â ─ CMakeLists.txt ○ ─ ─ サンプル │ ├─ ─ CMakeLists.txt │ ├─ ─ FreeRTOS │ ures ─ ─ linux â ─ ─ src │ ├─ ─ CMakeLists.txt │ ├─ ─ FreeRTOS │ ├─ ─ MQTTClient.c │ ├─ ─ MQTTClient.h │ ├─ ─ cc3200 │ ures ─ ─ linux └ ─ ─ テスト â ─ ─ CMakeLists.txt └ ─ ─ test1.csamplesディレクトリは、FreeRTOSおよびLinuxシステムのサンプルコードを提供します。
srcディレクトリには、FreeRTOS、CC3200、およびLinuxに移植するためのMQTTClientおよびネットワークドライバーを実装するためのサンプルコードがあります。
Paho MQTT APIの詳細については、「MQTTClient.h」をご参照ください。
クライアントをIoT Platformに接続する
aiot_mqtt_sign.cをクリックし、Alibaba Cloudが提供するソースコードをコピーしてMQTT接続パラメーターを取得します。 次に、オンプレミスでaiot_mqtt_sign.cという名前のファイルを作成し、コードをファイルに貼り付けます。
aiot_mqtt_signal.cファイルは、aiotMqttSign() 関数を定義します。
定義は下記の通りです。
int aiotMqttSign(const char * productKey、const char * deviceName、const char * deviceSecret、 char clientId[150], char username[65], char password[65]);説明
このクラスを使用すると、MQTT接続パラメーターusername、password、clientidを取得できます。
入力パラメータ:
パラメーター
タイプ
説明
productKey
const char *
デバイスが属するプロダクトのProductKey。 このProductKeyは、IoT Platformコンソールでデバイスを識別するために使用されます。
deviceName
const char *
デバイスのDeviceName。 このDeviceNameは、IoT Platformコンソールでデバイスを識別するために使用されます。
deviceSecret
const char *
デバイスのDeviceSecret。 このDeviceSecretは、IoT Platformコンソールでデバイスを識別するために使用されます。
出力:
パラメーター
タイプ
説明
ユーザー名
char *
MQTT接続を確立するために使用されるユーザー名。
パスワード
char *
MQTT接続を確立するために使用されるパスワード。
clientId
char *
MQTTクライアントのID。
応答コード
応答コード
説明
0
呼び出しは成功しました。
-1
呼び出しが失敗しました。
デバイスをIoT Platformに接続できるプログラムファイルを追加します。
IoT PlatformへのMQTT接続を確立するために必要なパラメーターを取得するには、aiot_mqtt_sign.cファイルにaiotMqttSign() 関数を呼び出すプログラムを記述する必要があります。
このセクションでは、開発手順とサンプルコードについて説明します。
aiotMqttSign() 関数を呼び出して、clientId、username、およびpasswordパラメーターを初期化します。
# definate EXAMPLE_PRODUCT_KEY "a11xsrW ****" # definalサンプル_DEVICE_NAME "paho_****" # definateサンプル_DEVICE_SECRET "Y877Bgo8X5owd3lcB5wWDjryNPoB ****" extern int aiotMqttSign(const char * productKey、const char * deviceName、const char * deviceSecret、 char clientId[150], char username[65], char password[65]); /* aiotMqttSignを呼び出してmqtt接続パラメーターを生成します * / char clientId[150] = {0}; char username[65] = {0}; char password[65] = {0}; if ((rc = aiotMqttSign(EXAMPLE_PRODUCT_KEY, EXAMPLE_DEVICE_NAME, EXAMPLE_DEVICE_SECRET, clientId, username, password) < 0)) { printf("aiotMqttSign -% 0x4x\n" 、-rc); リターン-1; } printf("clientid: % s\n", clientId); printf("username: % s\n", username); printf("password: % s\n", password);クライアントをIoT Platformに接続します。
次の操作を実行します。
NetworkInit() およびNetworkConnect() 関数を呼び出して、TCP接続を確立します。
MQTTClientInit() 関数を呼び出して、MQTTクライアントを初期化します。
MQTT接続パラメーターを含むMQTTPacket_connectData構造を設定します。
サンプルコード:
/* ネットワークinitとaliyun IoTプラットフォームへのネットワークの確立 * / NetworkInit(&n); rc = NetworkConnect(&n、ホスト、ポート); printf("NetworkConnect % d\n" 、rc); /* init mqttクライアント * / MQTTClientInit(&c、&n、1000、buf、sizeof(buf) 、readbuf、sizeof(readbuf)); /* デフォルトのメッセージハンドラーを設定する * / c.de faultMessageHandler = messageArrived; /* mqtt接続パラメータを設定 * / MQTTPacket_connectDataデータ=MQTTPacket_connectData_initializer; data.willFlag = 0; data.MQTTVersion = 3; data.clientID.cstring = clientId; data.us ername.cstring = username; data.password.cstring=パスワード; data.keepAliveInterval = 60; data.cleansession = 1; printf("% s % d\nへの接続" 、ホスト、ポート); rc = MQTTConnect(&c、&データ); printf("MQTTConnect % d, Connect aliyun IoT Cloud Success!\n", rc);メッセージを公開します。
MQTTPublish() 関数を呼び出して、指定したカスタムトピックにカスタム形式のメッセージをパブリッシュします。
トピックの詳細については、「トピック」をご参照ください。
char * pubTopic = "/" EXAMPLE_PRODUCT_KEY "/" EXAMPLE_DEVICE_NAME "/user/update"; int cnt = 0; 符号なしint msgid = 0; while (!toStop) { MQTTYield(&c、1000); if (++ cnt % 5 == 0) { MQTTMessage msg = { QOS1, 0, 0, 0, "こんにちは世界" 、 strlen (「ハローワールド」) 、 }; msg.id = ++ msgid; rc = MQTTPublish(&c、pubTopic、&msg); printf("MQTTPublish % d, msgid % d\n", rc, msgid); } }IoT Platformからメッセージを受信するトピックをサブスクライブします。
void messageArrived(MessageData * md) { MQTTMessage * message = md->message; printf("%.* s\t", md->topicName->lenstring.len, md->topicName->lenstring.data); printf("%.* s\n", (int)message->payloadlen, (char *)message->payload); } char * subTopic = "/" EXAMPLE_PRODUCT_KEY "/" EXAMPLE_DEVICE_NAME "/user/get"; printf("% s\nにサブスクライブする" 、サブトピック); rc = MQTTSubscribe(&c, subTopic, 1, messageArrived); printf("MQTTSubscribe % d\n", rc);
デバイス、サーバー、およびIoT Platformの通信方法については、「デバイス、IoT platform、およびサーバー間の通信の概要」をご参照ください。
aiot_mqtt_signal.cファイルと手順2で変更されたファイルをにコピーします。./paho.mqtt.embedded-c/MQTTClient-C/samples/linux 次に、プロジェクトをコンパイルします。
サンプルコード
サンプルコードを実行してIoT Platformに接続できます。
デモパッケージをダウンロードして解凍します。
次のファイルが取得されます。
証明書ファイル
説明
aiot_mqtt_sign.c
このファイルには、MQTT接続パラメータを取得するために使用されるコードが含まれます。 aiot_c_demo.cファイルを実行すると、aiotMqttSign() 関数が呼び出され、username、password、およびclientIdパラメーターの値が取得されます。
aiot_c_demo.c
このファイルには、IoT Platformに接続して通信するために使用されるロジックコードが含まれています。
aiot_c_demo.cファイルで、デバイス情報をデバイス情報に置き換えます。
EXAMPLE_PRODUCT_KEY、EXAMPLE_DEVICE_NAME、およびEXAMPLE_DEVICE_SECRETパラメーターの値をデバイス証明書情報に置き換えます。
#define「製品のProductKey」 # definite EXAMPLE_DEVICE_NAME「デバイスのDeviceName」 # define「デバイスのDeviceSecret」char * host = EXAMPLE_PRODUCT_KEY ".iot-as-mqtt.cn-shanghai.aliyuncs.com"のエンドポイントを変更します。パブリックインスタンスおよびEnterprise Editionインスタンスのエンドポイントとエンドポイントの形式の詳細については、「インスタンスのエンドポイントの表示」をご参照ください。
aiot_mqtt_signal.cおよびaiot_c_demo.cファイルをに移動します。./paho.mqtt.embedded-c/MQTTClient-C/samples/linuxプロジェクトのディレクトリ。
プロジェクトをコンパイルしてプログラムを実行します。
次のいずれかの方法を使用して、プロジェクトをコンパイルできます。
CMakeツールを使用します。
aiot_c_demo.cとaiot_mqtt_signal.cを /paho.mqtt.embedded-c/MQTTClient-C/samples/linuxディレクトリのCMakeLists.txtファイルに追加します。
次のコードは、CMakeLists.txtファイルを変更する方法を示しています。
add_executable () stdoutsubc stdoutsub.c ) add_executable (add_executable) aiot_c_demo aiot_c_demo.c aiot_mqtt_sign.c ) target_link_libraries(stdoutsubc paho-embed-mqtt3cc paho-embed-mqtt3c) target_include_directories(stdoutsubc PRIVATE "../../src" ../../src/linux ") target_compile_definitions(stdoutsubc PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h) target_link_libraries(aiot_c_demo paho-embed-mqtt3cc paho-embed-mqtt3c) target_include_directories(aiot_c_demo PRIVATE "../../src" ../../src/linux ") target_compile_definition (aiot_c_demoプライベートMQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h)/paho.mqtt.embedded-cディレクトリに戻り、次のコマンドを実行してプロジェクトをコンパイルします。
mkdir build.paho cd build.paho cmake .. 作る/paho.mqtt.embedded-c/build.pahoディレクトリに移動し、次のコマンドを実行してプログラムを実行します。
. /MQTTClient-C /サンプル /linux/aiot_c_demo
build.shファイルを使用します。
/paho.mqtt.embedded-c/MQTTClient-C/samples/linuxディレクトリでbuild.shファイルを開きます。
build.shファイルで、
stdoutsub.cをaiot_mqtt_sign.c aiot_c_demo.cに、-o stdoutsubを-o aiot_c_demoに置き換えます。 次に、build.shファイルを保存します。/paho.mqtt.embedded-c/MQTTClient-C/samples/linuxディレクトリに移動し、
を実行します。/build.shコマンド。コンパイル後、aiot_c_demo実行可能ファイルが生成されます。
を実行します。/aiot_c_demoコマンドを実行します。
ファイルを実行すると、次のローカルログが生成されます。
clientid: paho_mqtt&a11xsrW **** | timestamp=2524608000000、_v=sdk-c-1.0.0、securemode=3、signmethod=hmacsha256、lan=C | ユーザー名: paho_mqtt&a11xsrW **** パスワード: 36E955DC3D9D012EF62C80657A29328B1CFAE6186C611A17DC7939FAB637 **** NetworkConnect 0 a11xsrW **** .iot-as-mqtt.cn-shanghai.aliyuncs.com 443への接続 MQTTConnect 0、接続aliyun IoTクラウド成功! /a11xsrW ****/paho_mqtt/user/getにサブスクライブする MQTTSubscribe 0 MQTTPublish 0、msgid 1 MQTTPublish 0、msgid 2 MQTTPublish 0、msgid 3 MQTTPublish 0、msgid 4 MQTTPublish 0, msgid 5 ...IoT Platformコンソールで、デバイスのステータスとログを表示できます。
を選択します。 [デバイス] ページには、デバイスがオンライン状態であることが表示されます。
を選択します。 次に、[クラウド実行ログ] または [デバイスローカルログ] タブをクリックしてログを表示します。 詳細については、「IoT Platformログ」および「ローカルデバイスログ」をご参照ください。
エラーコード
デバイスがIoT PlatformへのMQTT接続を確立できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。