今回の記事ではBeckhoff TwinCATのTF6701を使用し、Azure Iot Hubに登録されたデバイスにデータを送信します。
さ、はじめよう!
Azure Iot Hub?
Microsoft Azure IoT Hubは、Azureクラウド内のIoTスイートで、IoTデバイスをAzureサービスと接続したり、受信メッセージを処理したり、デバイスにメッセージを送信したりするための複数のサービスを提供しています。
また、デバイスの観点から見ると、Microsoft Azure IoT Hubの機能性は、デバイスとAzure IoT Hub間の双方向通信を実装することで、IoTデバイスとAzureサービスのシンプルで安全な接続を可能にします。
Azure IoT Hub and TwinCAT IoT
Microsoft Azure IoT Hubは、メッセージを受信または送信するための複数の通信インターフェースを提供すると、先程も説明しました(例えばMQTT)。
したがって、TwinCAT IoTを使用して、Microsoft Azure IoT Hubにメッセージを送信したり、Microsoft Azure IoT Hubからメッセージを受信したり、Device Twinを制御したり、デバイスに対してメソッドコールを実行したりすることができます。
注意するのは構造体fbMqttClient.stTLS.sAzureSas は、Azure IoT Explorer で生成できる SAS Tokenの転送を可能にします。
IoT HubにデータをPublishする場合、Topicは以下の形式で指定する必要があります。
devices /deviceId/messages/events/readpipe |
Implementation
今回の記事ではPLC で MQTT Function Blockを使用して Microsoft Azure IoT Hub に接続し、データを送信するExampleを紹介します。注意するのはMessage Brokerには MQTT 経由でアクセスでき、Azure IoT Explorer などを使用して Azure IoT Hub プラットフォームから生成できる SAS Tokenによる認証が必要です。
AZURE Side
Add IotHub
Microsoft AzureをLoginし、All Resourcesを開きます。
Createで新しいIot Hubを作成します。
Iot hubを検索し、CreateのDrop-listを開きます。
Iot Hubをクリックしましょう。
Done!新しいIot Hubが作成できました。
こちらはIot HubのDashboardです。
Add Devices
次はDevicesを追加するため、Devices Management>Devicesをクリックします。
Add Devicesで新しいデバイスを追加しましょう。
Device IDを入力し、Auto-generate keysのCheckboxを入れて、Saveします。
RefreshでDashboardを更新しましょう。
Done!先ほど追加したデバイスが登録されました。
こちらはデバイスのDashboardになります。
Window Side
MQTT経由でMicrosoft Azure IoT Hubへの接続を確立する場合、CA証明書の指定が必須で、Baltimore Cyber Trust Root CAは、CA証明書として使用できます。
Start menu でrunコマンドを起動します。
mmc.exeを起動します。
Consoleが起動しました。
File>Add/Remove Snap-inをクリックします。
Snap-insの構築画面が表示されました。
Certificatesを選び、Add>でCertificatesを追加します。
証明書を管理権限を定義し、Finishで設定を保存します。
Local Computerを選び>Finishで完成します。
Done!最後はOKボタンをクリックします。
それで証明書が作成しました。
Trusted Root Certification Authorities>CertificatesでDigiCert Global Root CAを選びます。
DigiCert Global Root CAを右クリック>All Tasks>Exportで証明書をExportします。
Nextで進みます。
証明書のExport Formatを選び、Nextで進みます(今回はDER Formatを使用します)。
Export先を設定すればOKです。
最後はExportした証明書を以下のDirectoryに格納してください。
c:\TwinCAT\3.1\Config\Certificates\c2.cer |
BeckhoffのOnline Helpでは、CAはデフォルトの場所で検索されるため、CAの場所はOptionalであると書いていますが、CAファイルは指定された場所か・もしくはデフォルトの場所に格納する必要があります。CAファイルはPEMフォーマットで、ファイルの拡張子は問わないんです。
ここで少し digital certificate filesの話をしますが、digital certificate filesは.crt、.cer、.pem、.derなど、さまざまなファイル名拡張子を持っています。これらの拡張は一般に、X.509証明書と鍵の2つの主要なエンコーディング方式に対応しています。
- PEM (Base64 ASCII)
- PEM(元々は “Privacy Enhanced Mail”)は、X.509証明書、CSR、暗号鍵の最も一般的なフォーマットであり、Base64 ASCIIエンコーディングの1つ以上のアイテムを含むテキストファイルで、各アイテムはプレーンテキストのヘッダーとフッター(例えば、—–BEGIN CERTIFICATE—– と —–END CERTIFICATE—–) を持っています。一つのPEMファイルにはエンドエンティティ証明書、秘密鍵、あるいは完全な信頼の連鎖を形成する複数の証明書が含まれます。SSL.comからダウンロードされるほとんどの証明書ファイルはPEMフォーマットです。
- PEMファイルは通常.crt、.pem、.cer、.key(秘密鍵用)という拡張子で見られますが、違う拡張子で見られることもあります。例えば、SSL.com CAバンドルファイルは証明書オーダーのダウンロードテーブルから入手でき、拡張子は.ca-bundleです。
- DER (バイナリ)
- DER(Distinguished Encoding Rules)は、X.509証明書と秘密鍵のバイナリ・エンコードである。PEM とは異なり、DER エンコードされたファイルには —–BEGIN CERTIFICATE—– のようなプレーンテキスト文は含まれません。DERファイルは、Javaのコンテキストで最もよく見られます。
- DERエンコードされたファイルは通常、拡張子.derと.cerなどになります。
Azure Iot Explorer
Azure Iot Explorerを下記のLinkでDownloadし、ツールをインストールしてください。
https://github.com/Azure/azure-iot-explorer/releases
Connect via Iot Hub connection stringをクリックします。
Add ConnectionでIot hubの新しい接続を追加します。
Connection Stringの設定画面が表示されます。
Iot HubsのDashboardにアクセスし、Security settings>Shared access policiesをクリックします。
iothubownerをクリックします。
Primary connection stringをCopyします。
Azure Iot ExplorerのConnection stringに貼り付け、設定をSaveします。
iothubが追加されたら、View devices in this hubをクリックします。
Done!いまiothubに設定されたDevicesを一覧できます。
先程追加した03Chungをクリックします。
デバイス03Chungと接続する情報を一覧できます。
TwinCAT TF6701とAzure Iot Hubを接続するにはSAS Tokenを設定する必要があり、Connection String with SAS tokenを展開します。
SAS Tokenの生成するOptionが表示されました。
Symmetic keyのDrop-ListからPrimary keyやSecondary keyからSAS Tokenの生成を選択できます。
Expirationは生成されたSAS tokenの有効期限を設定できます。
最後はGenerateをクリックしSAS tokenを生成しましょう。
Done!そのSAS tokenをCopyしNotepadなどに保存しましょう。
TwinCAT3 Side
次はTwinCAT3側を構築します。
Add Library
今回記事では使用するFB_IotMqttClientライブラリを追加します。
MAIN
今回のコードでは、Azure IoT Hubへの接続を確立するために必要なパラメータを示しています。パラメーターは基本的に静的パラメーターで、またMQTT クライアントのインスタンス化時に宣言部で指定することもできます。
VAR
PROGRAM MAIN VAR fbMqttClient : FB_IotMqttClient; bSetParameter : BOOL := TRUE; bConnect : BOOL := TRUE; sTopicPub : STRING(255):=’devices/03Chung/messages/events/readpipe’; sPayloadPub : STRING(255); i : UDINT; fbTimer : TON := (PT:=T#10S); fbMessageQueue : FB_IotMqttMessageQueue; fbMessage : FB_IotMqttMessage; bSubscribed:BOOL; END_VAR |
CODE
IF bSetParameter THEN bSetParameter := FALSE; fbMqttClient.sHostName := ’07chungiothub.azure-devices.net’; fbMqttClient.stTLS.sAzureSas:=’YourSAS’; fbMqttClient.nHostPort := 8883; fbMqttClient.sTopicPrefix := ”; fbMqttClient.ipMessageQueue := fbMessageQueue; fbMqttClient.stTLS.bNoServerCertCheck:=TRUE; fbMqttClient.stTLS.sCA := ‘c:\TwinCAT\3.1\Config\Certificates\c2.cer’; END_IF fbMqttClient.Execute(bConnect); IF fbMqttClient.bConnected THEN fbTimer(IN:=TRUE); IF fbTimer.Q THEN // publish new payload every second fbTimer(IN:=FALSE); i := i + 1; sPayloadPub := CONCAT(‘MyMessage’, TO_STRING(i)); fbMqttClient.Publish( sTopic:= sTopicPub, pPayload:= ADR(sPayloadPub) ,nPayloadSize:= LEN2(ADR(sPayloadPub))+1 ,eQoS:= TcIotMqttQos.AtMostOnceDelivery , bRetain:= FALSE, bQueue:= FALSE ); END_IF END_IF |
Hostname
HostnameはIot HubのDashboardから確認できます。
HostnameはsHostNameに設定してください。
CA Location
stTLS.sCAは先程Exportした証明書の格納先に設定してください。
Result
プロジェクトをTwinCAT RuntimeにDownloadし、bConnectedがTRUEになった場合、TwinCAT RuntimeとAzure Iot Hubと接続済みです。
Azure Iot HubのDashboardからデバイスの接続状態を確認するため、Devices management>Devicesをクリックします。
Edit columnsをクリックします。
Last activityとLast reported connection stateのColumnsを追加します。
下図のようにColumnsの表示順番を調整できます。
最後はSaveをクリックし設定を保存します。
Last report connections status=Connected、つまりデバイス03ChungはAzure Iot Hubと接続しました。
今度はOverviewをクリックします。
こちらはIot HubsのDashboardです。
Connected DevicesのFieldからいまAzure Iot Hubと接続されているデバイス数を確認できます。またDevice to cloud messageでデバイスからAzure Iot Hubに送信したメッセージ数を確認できます。
今度はAzure Iot Explorerを起動し>Telemetry機能を使用します。
Startボタンをクリックします。
Done!TwinCAT3から送信したデータが見えました。
IF can not connect..
Azure IoT Hubと接続できない場合は、ファイアウォールの設定を確認してください。また、Azure IoT Hub と MQTT 通信を行うには、MQTT クライアント(Tc3_IotBase を実行するIPC)で、発信 TCP ポート(8883)がデフォルトで使用可能である必要があります。
Tc3_IotBaseが使用されている場合、ポート・コンフィギュレーションは、Function Block FB_IotMqttClientの入力パラメータnHostPortをチェックしてください。