このトピックでは、Go用のPaho Message Queuing Telemetry Transport (MQTT) ライブラリを使用してデバイスをIoT Platformに接続し、メッセージングを有効にする方法について説明します。
使用状況ノート
このトピックでは、共通ユーザーの権限を使用してすべての操作を実行します。 管理者権限を必要とする特定の操作を実行する場合は、sudoコマンドを実行します。
前提条件
プロダクトとデバイスは、IoT Platformコンソールで作成されます。 デバイス証明書が取得されます。 デバイス証明書情報には、ProductKey、DeviceName、およびDeviceSecretが含まれます。 詳細については、以下のトピックをご参照ください。
開発環境の準備
Go言語パッケージをインストールします。
macOSで、次のコマンドを実行します。
brew install goUbuntuで、次のコマンドを実行します。
sudo apt-get install golang-goWindowsでは、公式Go Webサイトからインストールパッケージをダウンロードし、Go言語パッケージをインストールします。
説明中国本土に居住している場合は、仮想プライベートネットワーク (VPN) を使用して公式のGo Webサイトにアクセスする必要があります。
Go用のPaho MQTTライブラリをダウンロードする
Pahoプロジェクトとサポートされているプログラミング言語の詳細については、「Eclipse Paho Downloads」をご参照ください。
次のコマンドを実行して、Go用のPaho MQTTライブラリと関連する依存関係をダウンロードします。
go ge t github.com/eclipse/paho.mqtt.golang
go ge t github.com/gorilla/websocket
go ge t golang.org/x/net/proxy デバイスから IoT Platform への接続
Alibaba Cloudが提供するMqttSign.goファイルをダウンロードします。 ファイルには、MQTT接続パラメータを取得するために必要なソースコードが含まれています。
MqttSign.goファイルは、MQTT接続パラメーターの取得に使用される関数を定義します。 デバイスをIoT Platformに接続するには、関数を呼び出す必要があります。
定義は下記の通りです。
タイプAuthInfo struct { パスワード、ユーザー名、mqttClientId文字列; } func calculate_sign(clientId、productKey、deviceName、deviceSecret、timeStamp文字列) AuthInfo;説明:
この関数は、MQTT接続パラメーターusername、password、およびmqttClientIdを取得するために使用されます。
入力パラメータ:
パラメーター
タイプ
説明
productKey
String
デバイスが属するプロダクトのProductKey。 このパラメーターは、IoT Platformのデバイスを識別するために使用されます。
deviceName
String
デバイスのDeviceName。 このパラメーターは、IoT Platformのデバイスを識別するために使用されます。
deviceSecret
String
デバイスのDeviceSecret。 このパラメーターは、IoT Platformのデバイスを識別するために使用されます。
clientId
String
デバイスの ID IDの長さは最大64文字です。 デバイスのメディアアクセス制御 (MAC) アドレスまたはシリアル番号 (SN) をIDとして使用することを推奨します。
timeStamp
String
現在の時刻のタイムスタンプ。 単位:ミリ秒。
Output parameters:
この関数は、
AuthInfo構造体を返します。 構造には、次の表に示すパラメーターが含まれています。パラメーター
タイプ
説明
ユーザー名
String
MQTT接続を確立するために使用されるユーザー名。
パスワード
String
MQTT接続を確立するために使用されるパスワード。
mqttClientId
String
MQTTクライアントのID。
デバイスをIoT Platformに接続できるプログラムファイルを追加します。
MQTT接続パラメーターを取得するには、MqttSign.goファイルで関数を呼び出すプログラムを記述する必要があります。
このセクションでは、デバイスの開発方法とサンプルコードについて説明します。
デバイス情報を指定します。
// デバイス情報を設定し、プロダクトキー、デバイス名、およびデバイスシークレットを含めます var productKey string = "a1Zd7n5 ***" var deviceName string = "testdevice" var deviceSecret string = "UrwclDV33NaFSmk0JaBxNTqgSrJW ****" // timestamp、clientid、subscribe topic、publish topic var timeStamp string = "1528018257135" var clientId string = "192.168.****" var subTopic string = "/" + productKey + "/" + deviceName + "/user/get"; var pubTopic string = "/" + productKey + "/" + deviceName + "/user/update";MQTT接続情報を指定します。
MqttSign.goファイルでcalculate_sign() 関数を呼び出します。 この関数は、clientId、productKey、deviceName、deviceSecret、およびtimeStamp入力パラメーターの値に基づいて、username、password、およびmqttClientIdパラメーターを返します。 次に、結果をopts構造に追加します。
// ログインブローカーのurlを設定する var raw_brokerバイト。バッファ raw_broker.WriteString("tls://") raw_broker.WriteString(productKey) raw_broker.WriteString(".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883") opts := MQTT.NewClientOptions().AddBroker(raw_broker.String()); // ログイン認証情報を計算し、接続オプションに設定します auth := calculate_sign(clientId、productKey、deviceName、deviceSecret、timeStamp) opts.SetClientID(auth.mqttClientId) opts.SetUsernam e(auth.usの名前) opts.SetPassword(auth.password) opts.SetKeepAlive(60*2 * 時間秒) opts.SetDefaultPublishHandler(f)重要古いバージョンのパブリックインスタンスを使用する場合は、
raw_broker.WriteString(".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883")のcn-shanghaiをデバイスが存在するリージョンのIDに置き換えます。 リージョンIDについては、「リージョン」をご参照ください。Enterprise Editionインスタンスまたは新しいバージョンのパブリックインスタンスを使用する場合は、
opts := MQTT.NewClientOptions().AddBroker(raw_broker.String());のraw_broker.String()を$<MQTT endpoint>:1833に置き換えます。 例:opts := MQTT.NewClientOptions().AddBroker("iot-*** .mqtt.iothub.aliyuncs.com:1883");MQTTエンドポイントの取得方法については、「新しいバージョンのパブリックインスタンスまたはEnterprise Editionインスタンスのエンドポイントの表示」をご参照ください。
IoT Platformインスタンスの詳細については、「インスタンスの概要」をご参照ください。
GoのPaho MQTTライブラリのConnect() 関数を呼び出して、デバイスをIoT Platformに接続します。
// 上記のClientOptionsを使用してクライアントを作成して開始する c := MQTT.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() ! =nil { パニック (token.Error()) } fmt.Print("Connect aliyun IoT Cloud Success\n");Publish() 関数を呼び出して、メッセージを発行します。 メッセージを公開するトピックとメッセージのペイロードを指定する必要があります。
// 5つのメッセージをpubTopicに公開します ("/a1Zd7n5 ****/deng/user/update") for i := 0; i < 5; i ++ { fmt.Println("publish msg:", i) text := fmt.Sprintf("ABC #% d", i) token := c.Publish(pubTopic, 0, false, text) fmt.Println("publish msg: ", text) token.Wait() time.Sleep(2 * time.Second) }トピックの詳細については、「トピックとは」をご参照ください。
Subscribe() 関数を呼び出してトピックをサブスクライブし、IoT Platformからメッセージを受信します。
// subTopic("/a1Zd7n5 ***/deng/user/get") をサブスクライブし、メッセージの配信をリクエストします if token := c.Subscribe(subTopic, 0, nil); token.Wait() &token.Error() ! =nil { fmt.Println(token.Error()) os.Exit (1) } fmt.Print("Subscribe topic" + subTopic + "success\n");
デバイス、サーバー、およびIoT Platformの通信方法については、「デバイス、IoT platform、およびサーバー間の通信の概要」をご参照ください。
プロジェクトをコンパイルします。
サンプルコード
サンプルコードを使用して、デバイスをIoT Platformに接続できます。
デモパッケージのダウンロードと解凍。
次の表に、aiot-go-demoパッケージのファイルを示します。
ファイル
説明
MqttSign.go
このファイルには、MQTT接続パラメータを取得するために使用されるコードが含まれます。 iot.goファイルを実行すると、calculate_sign() 関数が呼び出され、username、password、およびmqttClientIdパラメーターが取得されます。
iot.go
このファイルには、デバイスをIoT Platformに接続して通信を有効にするために使用されるロジックコードが含まれています。
x509
IoT Platformのルート証明書。 この証明書は、デバイスをIoT Platformに接続するために必要です。
説明MQTTクラウドゲートウェイを使用してデバイスをIoT Platformに接続する場合、カスタム証明書を使用してデバイスIDを検証できます。 詳細については、「手順1: カスタム証明書の生成」をご参照ください。
iot.goファイルのデバイス情報をデバイス情報に置き換えます。
Linux viなどのツールを使用して、iot.goファイルを変更できます。
productKey、deviceName、およびdeviceSecretパラメーターの値をデバイス証明書情報に置き換えます。
オプションです。 timeStampおよびclientIdパラメーターを設定します。 clientIdパラメーターの値をデバイスのMACアドレスまたはSNに置き換えることができます。
上記のパラメーターを設定しない場合でも、IoT Platformに接続できます。 ただし、パラメーターの値を実際の値に置き換えることを推奨します。
デバイスをIoT Platformに接続するために使用されるMQTT接続パラメーターを変更します。 詳細については、このトピックの「デバイスをIoT Platformに接続する」セクションの手順2を参照してください。
コマンドプロンプトで次のコマンドを実行し、iot.goファイルを実行します。
go run iot.go MqttSign.goファイルを実行すると、次のローカルログが生成されます。
clientId192.168。**** deviceNametestdeviceproductKeya1Zd7n5 **** timestamp1528018257135 1b865320fc183cc747041c9faffc9055fc45 **** aliyun IoTクラウドの成功を接続 トピックを購読する /a1Zd7n5 ****/testdevice/user/get success publish msg: 0 publish msg: ABC #0 publish msg: 1 publish msg: ABC #1 publish msg: 2 パブリッシュmsg: ABC #2 publish msg: 3 パブリッシュmsg: ABC #3 publish msg: 4 パブリッシュmsg: ABC #4 公開msg: 5 パブリッシュmsg: ABC #5IoT Platformコンソールで、デバイスのステータスとログを表示できます。
を選択します。 [デバイス] ページには、デバイスがオンライン状態であることが表示されます。
を選択します。 次に、[クラウド実行ログ] または [デバイスローカルログ] タブをクリックしてログを表示します。 詳細については、「IoT Platformログ」および「ローカルデバイスログ」をご参照ください。
エラーコード
デバイスがIoT PlatformへのMQTT接続を確立できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。