Delphi MQTT 2019/09/01
IoT 通信プラットフォームサービス SenseWay (センスウェイ)の LoRaWAN MQTT接続に関するマニュアル を Delphi でやってみました。
Delphi の Getit パッケージマネージャからインストールできる 「Trial - TMS MQTT」 コンポーネントを使っています。
Delphi で MQTT サーバからのデータ取得 (Subscribe)、書き込み (Publish) ができます。
SenseWay Mission Connect から行える「デバイスへのデータ送信」が、Delphi でも行えるということです。
で、具体的に何に使うのか・・・。
例えば、
・ Delphi で作った Android アプリで IoT 端末から送信された(その時点の)データを見る。
・ Delphi で作った Android アプリから IoT 端末へデータを送信する。→ 端末デバイスで出力値、設定値を変えるとか。
IoT 端末に Arduino を使っているので、いろんなことに使えそうです。
// Delphi 10.3 Community Edition unit TMQTT_TESTUnit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, TMS.MQTT.Global, Vcl.StdCtrls, TMS.MQTT.Client; type TForm4 = class(TForm) TMSMQTTClient1: TTMSMQTTClient; Button1: TButton; Memo1: TMemo; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure TMSMQTTClient1SubscriptionAcknowledged(ASender: TObject; APacketID: Word; ASubscriptions: TTMSMQTTSubscriptions); procedure Button2Click(Sender: TObject); procedure TMSMQTTClient1PublishReceived(ASender: TObject; APacketID: Word; ATopic: string; APayload: TArray<System.Byte>); procedure TMSMQTTClient1PublishReceivedEx(ASender: TObject; APacketID: Word; ATopic: string; APayload: TTMSMQTTBytes); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } FSubscribeRequestPacketId : Word; end; var Form4: TForm4; implementation {$R *.dfm} const HostName = 'mqtt.senseway.net'; UserName = 'xxxxx'; PassWord = 'yyyyyyyyy'; devEUI = 'zzzzzzzzzzzzzz'; procedure TForm4.Button1Click(Sender: TObject); // 接続 begin TMSMQTTClient1.BrokerHostName := HostName; TMSMQTTClient1.BrokerPort := 1883; TMSMQTTClient1.ClientID := UserName; TMSMQTTClient1.Credentials.Username := UserName; TMSMQTTClient1.Credentials.Password := PassWord; TMSMQTTClient1.LastWillSettings.Topic := ''; // 接続 TMSMQTTClient1.Connect(); end; procedure TForm4.Button2Click(Sender: TObject); // Subscribe begin // MQTTでSubscribeすればデータを取得することができる if TMSMQTTClient1.IsConnected then begin Memo1.Lines.Clear; FSubscribeRequestPacketId := TMSMQTTClient1.Subscribe( 'lora/' + UserNAme + '/+/#', // ワイルドカード(すべてのデータ) //'lora/'+ UserName+ '/+/rx', // 受信データのみの時 TTMSMQTTQoS.qosAtMostOnce ); end; end; procedure TForm4.Button3Click(Sender: TObject); // Publish var APayload : TBytes; s : string; begin // データ書き込み s := '{"conf":false,"ref":"fghij","port":16,"data":"04d2"}'; APayload := TEncoding.ANSI.GetBytes(s); if TMSMQTTClient1.IsConnected then begin TMSMQTTClient1.Publish( 'lora/' + UserName + '/' + devEUI + '/tx', APayload, TTMSMQTTQoS.qosAtMostOnce, True ); end; end; procedure TForm4.Button4Click(Sender: TObject); // Disconnect begin // 切断 if TMSMQTTClient1.IsConnected then begin TMSMQTTClient1.Disconnect; end; end; procedure TForm4.TMSMQTTClient1PublishReceived(ASender: TObject; APacketID: Word; ATopic: string; APayload: TArray<System.Byte>); begin Memo1.Lines.Add(#13#10 + 'Topic = ' + ATopic); Memo1.Lines.Add('Payload = ' + TEncoding.ANSI.GetString(APayload)); end; procedure TForm4.TMSMQTTClient1PublishReceivedEx(ASender: TObject; APacketID: Word; ATopic: string; APayload: TTMSMQTTBytes); begin // こちらも同じ結果 Memo1.Lines.Add(#13#10 + FormatDateTime('YYYY/MM/DD hh:nn:ss', Now)); Memo1.Lines.Add('TopicEx = ' + ATopic); Memo1.Lines.Add('PayloadEx = ' + TEncoding.ANSI.GetString(APayload)); end; procedure TForm4.TMSMQTTClient1SubscriptionAcknowledged(ASender: TObject; APacketID: Word; ASubscriptions: TTMSMQTTSubscriptions); begin if (APacketID = FSubscribeRequestPacketId) and ASubscriptions[0].Accepted then begin Memo1.Lines.Add('We are subscribed!'); end; end; end.