TF6701とは?
今回はTF6701を使ってAWS IOT Core BrokerにMessageをPublishします。TF6701を使えばMQTTを使ってBrokerと接続できます。BrokerはLocalなものだけではなくCloud ServicesのAWS・Google・MS Azureなども可能です。
Manual
下記のLinkでManualをダウンロードしてください。
Manualはいつもあなたの友達です。
System Requirement
ちなみにTF6701は別途のインストール必要ないです。
使用パッケージ
今回はTF6701だけですが、次はTF6720でも紹介したいと思います。
AWS IoT Core は、インターネットに接続されたデバイスから、クラウドアプリケーションやその他のデバイスに簡単かつ安全に通信するためのマネージド型クラウドサービスです。 AWS IoT Core では数十億個のデバイスと数兆件のメッセージをサポートしており、それらのメッセージを AWS エンドポイントや他のデバイスに確実かつセキュアに処理してルーティングします。AWS IoT Core を使用すれば、アプリケーションがインターネットに接続されていない場合でも、すべてのデバイスを常に追跡して通信できます。
AWS IOT Core構築
詳しくはこちらの記事を参考してください。
SiemensのC712構築説明のものですが、AWSのあたりは同じです。
Function Block
今回はTc3_IotBaseのFB_IotMqttClient Function Blockを使用しAWS IOT Coreと接続すると考えています。
TF6701の中にあるFB_IotMqttClientを使えば、TwinCAT Runtimeを簡単にLocal・Cloud Brokerと繋がれます。
VAR_INPUT
sClientId | STRING(255) | このClient IDはAWS IOT Coreだと”Things”の名前に該当します。 |
sHostName | STRING(255) | BrokerのURLです。AWS IOT CoreだとEndpointです。 |
nHostPort | UINT | Default1883ですが、TLS使用する場合は8883になります。 |
sTopicPrefix | STRING(255) | すべてのPublish・Subscribeするときに自動追加されるCommand |
nKeepAlive | UINT | Watchdog時間(s) |
sUserName | STRING(255) | Broker接続するときUsername(オプション) |
sUserPassword | STRING(255) | Broker接続するときPassword(オプション) |
stWill | ST_IotMqttWill | Brokerと接続切れたときになに”遺言”をするか |
stTLS | ST_IotMqttTls | TLS-secured connectionでBrokerと接続するなら設定する必要があります。 |
ipMessageFiFo | I_IotMqttMessageFiFo | FB_IotMqttMessageQueueのインスタを割り付けできます。(これはちょっとわからない) |
ST_IotMqttWill
このDUTはMessageはQos・Payloadなどの設定ができます。
sTopic | STRING(255) | MessageのTopic |
pPayload | PVOID | Payloadのアドレス |
nPayloadSize | UDINT | PayloadのByte数 |
eQoS | TcIotMqttQos | Qos(Quality of Service)のLevel設定になります。 |
bRetain | BOOL | TrueだとBrokerはデータを順番で保存します。 |
ST_IotMqttTls
MQTTのTLS security設定になります。
CA(certificate authority)・PSK(PreSharedKey) が使用できます。
sCA | STRING(255) | certificate authority (CA)のPath |
sCert | STRING(255) | Client certificateのPath |
sKeyFile | STRING(255) | ClientのPrivate Key Path |
sKeyPwd | STRING(255) | そのPrivate KeyのPassword(オプション) |
sCrl | STRING(255) | certificate revocation listのPath |
sCiphers | STRING(255) | |
sVersion | STRING(80) | TLSのバージョン。‘tlsv1’・ ‘tlsv1.1’・‘tlsv1.2’・‘tlsv1.3’ |
bNoServerCertCheck | BOOL | Server証明書の有効性Checkするか |
sPskIdentity | STRING(255) | TLS PSK 接続のPreSharedKey identity |
aPskKey | ARRAY[1..64] OF BYTE | TLS PSK 接続のPsk Key |
nPskKeyLen | USINT | そのPsk keyのByte数 |
sAzureSas | STRING(511) | Microsoft Azure IoT Hub接続のときに使う |
VAR_OUTPUT
bError | BOOL | FBがエラー発生するとTrueになります。 |
hrErrorCode | PVOID | エラーCode |
eConnectionState | ETcIotMqttClientState | いまの接続状態 |
bConnected | BOOL | Brokerと接続したかどうか |
Method
Execute
このMethodは周期でCallする必要があります。
VAR_INPUT
bConnect | BOOL | 1=接続する |
Publish
MQTT BrokerにPublish動作するMethodです。
VAR_IN
sTopic | STRING | PushlishのTopic |
pPayload | PVOID | MQTT Messageのアドレス |
nPayloadSize | UDINT | Payloadのサイズ |
eQoS | TcIotMqttQos | Qosの設定 |
bRetain | BOOL | |
bQueue | BOOL | Spare |
RETRUN
Publish | BOOL | 1=Publish成功 |
Subscribe
BrokerからTopicのSubscription用のMethodです。今回は使用しないので、次回説明します。
Unsubscribe
Subscriptionを削除するMethodです。
VAR_INPUT
sTopic | STRING | Subscriptionを削除するTopicです。 |
Return
Unsubscribe | BOOL | 1=Unsubscribe成功 |
ActivateExponentialBackoff
Backoff 機能使用するMethodです。使うときまた説明します。
DeactivateExponentialBackoff
Backoff 機能不使用するMethodです。使うときまた説明します。
実装
説明は長くなりました。これからは実装するプログラムなどを説明します。
Library追加
TwinCAT ProjectからReferences>Add libraryします。
Tc3_IotBaseを検索し、OKで追加します。
同じく、Tc2_Utilitiesを検索し、OKで追加します。
Program
次はプログラム作成ですね。やってるのはまずパラメタ設定で(証明書・Private Key・EndPoint、Port、Clientid、そしてMqttClientを呼び出しAWS IOT Coreと接続し、最後はMessageをPublishします。
VAR
ここで必要な変数を定義します。
VAR MqttClient :FB_IotMqttClient; bPublish :BOOL:=FALSE; sTopicEmail :STRING(255) := ‘TwinCAT/TF6701/Devices1’; bSend :BOOL; sPayloadEmail :STRING(255) := ‘{“default”: “Hello from TwinCAT”,”message”: “Hello from TwinCAT”}’; bConnect :BOOL; bsetPars :BOOL; icoun :INT; MessageQueue :FB_IotMqttMessageQueue; END_VAR |
MAIN
MqttClient.nHostPortはAWS IOT CoreのEndpoint URLです。
MqttClient.nHostPortはMQTT TLS Seure使用しますので8883にしてください。
MqttClient.sClientIdはAWS IOT Coreの”Things”の名前です。
sCertやsKeyFileは”Things”作成したときダウンロードしたものです。
IF bsetPars THEN MqttClient.stTLS.sCA:=’c:\Cert\aws\AmazonRootCA1.pem’; MqttClient.stTLS.sCert:=’c:\Cert\aws\ccf8d8b84f-certificate.pem.crt’; MqttClient.stTLS.sKeyFile:=’c:\Cert\aws\ccf8d8b84f-private.pem.key’; MqttClient.sHostName:=’a30hlb7uyo754j-ats.iot.us-east-2.amazonaws.com’; MqttClient.nHostPort:=8883; MqttClient.sClientId:=’mythings’; MqttClient.ipMessageQueue:=MessageQueue; MqttClient.sTopicPrefix:= ”; END_IF; MqttClient.Execute(bConnect:=bConnect); IF MqttClient.bConnected THEN icoun:=icoun+1; END_IF IF bPublish THEN MqttClient.Publish( sTopic:= sTopicEmail ,pPayload:= ADR(sPayloadEmail) ,nPayloadSize:=LEN2(ADR(sPayloadEmail)) ,eQoS:= TcIotMqttQos.AtMostOnceDelivery ,bRetain:= FALSE ,bQueue:= FALSE); bPublish:=False; END_IF |
結果
AWS Iot Core Consoleを開いて、Test>Subscribe to a topicで
TwinCAT/TF6701/Devices1を入力し、Subscribeします。
bPublishをTrueしますと。ここでPushlishされたメッセージが見えます!
Sampleプロジェクト
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20Project1_TF6701_aws.tnzip
最後に
もしMQTT_ERR_TLS_CA_NOFOUNDなど出たら大体証明書もPath間違ってるどうか。そういうとき証明書やPrivate keyのPath再確認しましょう。
あとつながるまでずっとMQTT_ERR_NOMEMのStateです。自分の場合はThingsのPolicyちゃんと設定できなかったから繋がりなく、ずっとその状態>Disconnectの繰り返しでした。
https://github.com/eclipse/paho.mqtt.python/issues/392
Qosについて
そういえば、先Function Blockを使ってるときにOosという単語が出てきますね。それについて少し補足説明しますね。
QosはQuality of ServiceでSenderとReceiverの間でメッセージのやり取りの”保証”の設定になります。MQTTは3つのQos Levelがあります:
- 0:Not more than once
- 1:At least once
- 2:Exactly once
Qos0:Not more than once
ReceiverはAckしませんし二回目の送りしません。
Qos1:At least once
Qos1だとシステムはReceiverへが最低限一回Message到達すると保証します。SenderがMessageを内部に保存しReceiverのPUBACK MessageからACKもらうまでです。もしPUBACKが一定時間内にReceiverもらえないのであればSenderがMessageが再送します。
Qos2:Exactly once
Qos2は一番安全なレベルでシステム上でReceiverが一回だけSenderからMessageもらうと保証します。(ですが一番遅い)MQTTではHandShakeを行います。
ReceiverがQos Level2のメッセージもらったら、まずPUBREC MessageでAck を返しします。 Senderは内部でそのメッセージをReceiverからPUBREC もらうまでずっと保存します。Level1と一番大きな違いはQos2はメッセージの再送防止できます。
SenderがReceiverからもrったPUBRECを内部で保存しPUBREL Messageを返しします。そしてReceiverがPUBRELがもらったら、Receiverがいま保存してるStatusをリセットし、PUBCOMPをSenderに返しします。もし途中で通信失敗したら、一定時間内にMessageを再送するようにします。
はーい、お疲れ様です。
もしなにか質問あれば、メール・コメント・Twitterなどでもどうぞ!
Twitterのご相談:@3threes2
メールのご相談:soup01threes*gmail.com (*を@に)