===== N O T I C E =====
ICS's SSL is enabled by default, which is required for MQTT to function. However, with SSL enabled, the compiled EXE file will increase significantly. **If SSL is not use, it can be disabled by commenting out __{$DEFINE USE_SSL}__ inside \Source\Include\OverbyteIcsDefs.inc file. This is in #273 in ICS v9.4**
----
**Using ICS v9.3**
- Add IcsMQTTClient component
** if not receiving msg from any subscribe topic, set SSLCLISECURITY to sslclisecnone and AUTOSUBSCRIBE to TRUE
To connect:
MQTTClient.Host := 'hostname';
MQTTClient.Port := 1883;
MQTTClient.Activate (true);
To subscribe:
mqttclient.Subscribe('topic',qtAT_LEAST_ONCE);
*note, DO NOT subscribe immediately after activate. Give some time first, if want to do almost immediate add this setting in mqttclient:
mqttclient.AutoSubscribe := true;
To Publish:
MQTTClient.Publish('topic', msgstring , qtAT_LEAST_ONCE, true);
Taken from ICS demo, to show some info on the connection:
procedure TForm1.btnshowClick(Sender: TObject);
var
j : integer;
x : cardinal;
begin
mmo1.Lines.Add ('');
mmo1.Lines.Add('------ Client ' + string (MQTTClient.Parser.ClientID) + ' -------');
mmo1.Lines.Add (format ('Username "%s" Password "%s"', [MQTTClient.Parser.Username, MQTTClient.Parser.Password]));
mmo1.Lines.Add (format ('Keep Alive "%d" Retry Time "%d" Max Retries "%d"', [MQTTClient.Parser.KeepAlive, MQTTClient.Parser.RetryTime, MQTTClient.Parser.MaxRetries]));
mmo1.Lines.Add (format ('Will Topic "%s" Message "%s" @ %s', [MQTTClient.Parser.WillTopic, MQTTClient.Parser.WillMessage, QosNames [MQTTClient.Parser.WillQos]]));
mmo1.Lines.Add ('Subscriptions ----');
for j := 0 to MQTTClient.Subscriptions.Count - 1 do
begin
x := cardinal (MQTTClient.Subscriptions.Objects[j]) and $03;
if (cardinal (MQTTClient.Subscriptions.Objects[j]) shr 8) and $ff = $ff then
mmo1.Lines.Add (' "' + MQTTClient.Subscriptions[j] + '" @ ' + QOSNames[TMQTTQOSType (x)] + ' Acked.')
else
mmo1.Lines.Add (' "' + MQTTClient.Subscriptions[j] + '" @ ' + QOSNames[TMQTTQOSType (x)]);
end;
end;
Below is fully working sample:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OverbyteIcsMQTT, OverbyteIcsWndControl,
OverbyteIcsSslX509Certs,McJSON;
type
Tiotmqttsql = class(TForm)
mmo: TMemo;
mqttclient: TIcsMQTTClient;
edtpublish: TEdit;
btnpublish: TButton;
slx509crts1: TSslX509Certs;
icsmqtclnt1: TIcsMQTTClient;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure mqttclientMsg(Sender: TObject; aTopic: UTF8String; const aMessage: String; aQos: TMQTTQOSType; aRetained: Boolean);
procedure btnpublishClick(Sender: TObject);
procedure mqttclientOnline(Sender: TObject);
procedure mqttclientOffline(Sender: TObject; Graceful: Boolean);
procedure mqttclientClientID(Sender: TObject;
var aClientID: UTF8String);
private
{ Private declarations }
public
{ Public declarations }
end;
var
iotmqttsql: Tiotmqttsql;
const
mqtttopic : string = 'topicname';
mqtthost : string = 'sample.com';
implementation
{$R *.dfm}
procedure Tiotmqttsql.FormShow(Sender: TObject);
begin
mmo.lines.clear;
mqttclient.AutoSubscribe := true;
mqttclient.host := mqtthost;
mqttclient.Port := 1883;
mqttclient.KeepAlive := 10;
mqttclient.Activate(true);
mqttclient.Subscribe(mqtttopic,qtAT_LEAST_ONCE);
end;
procedure Tiotmqttsql.FormClose(Sender: TObject; var Action: TCloseAction);
begin
mqttclient.Destroy;
end;
procedure Tiotmqttsql.mqttclientMsg(Sender: TObject; aTopic: UTF8String; const aMessage: String; aQos: MQTTQOSType; aRetained: Boolean);
begin
mmo.Lines.Add(FormatDateTime('yyyy-MM-dd',now())+': '+aMessage+#13#10);
end;
procedure Tiotmqttsql.btnpublishClick(Sender: TObject);
begin
mqttclient.Publish(mqtttopic,edtpublish.Text,qtAT_LEAST_ONCE,true);
end;
procedure Tiotmqttsql.mqttclientOnline(Sender: TObject);
begin
// mmo.Lines.add('Online');
end;
procedure Tiotmqttsql.mqttclientOffline(Sender: TObject; Graceful: Boolean);
begin
// mmo.Lines.add('Offline');
end;
procedure Tiotmqttsql.mqttclientClientID(Sender: TObject; var aClientID: UTF8String);
begin
mmo.Lines.add('Client ID: '+aClientID);
end;
end.