Codeblock Onlinehilfe

TbeCbMQTTClient

TbeCbMQTTClient

Eine Komponente für das MQTT Netzwerkprotokoll. Für Codeblock Umgebungen ohne Formular muss der Codeblock persistent ausgeführt werden. Andernfalls wird das Objekt nach Beendigung des Codeblocks zerstört.

Eigenschaften

Eigenschaft

Beschreibung

CbActive:L

Startet den MQTT Client und stellt eine Verbindung zum eingestellten Host her CbProtocol muss gesetzt sein bevor CbActive gesetzt wird!

CbAdvancedHeartbeatInterval:N

>0 sendet asynchron alle x Sekunden einen Ping an den MQTT Broker. Wird auch ausgeführt, wenn komplexe / lange Prozesse im Hauptthread laufen.

CbBasePath:C

Pfad der zusätzlich zum Host verwendet wird (z.B. ‘/mqtt’). Aktuell nur für WebSocket (bmqttpWebsocket) Verbidungen

CbCertFile:C

Nur in Verbindung mit bmqttpAWSIOT Pfad zum ` .pem ` Datei

CbCustomAuthentication_Enabled:L

Nur in Verbindung mit bmqttpAWSIOT benutzerdefinierten Authentifizierung aktivieren

CbCustomAuthentication_Headers:C

Nur in Verbindung mit bmqttpAWSIOT benutzerdefinierten Header. Werte müssen mit CRLF getrennt sein

CbCustomAuthentication_Parameters:C

Nur in Verbindung mit bmqttpAWSIOT Abfrageparameter die an den Server übergeben werden

CbCustomAuthentication_UseWebSockets:L

Nur in Verbindung mit bmqttpAWSIOT Verbindung über Websocket oder TCP

CbHeartBeatInterval:N

>0 sendet alle x Sekunden einen Ping an den MQTT Server/Broker

CbHost:C

MQTT Server/Broker/AWS IoT Endpoint

CbKeyFile:C

Nur in Verbindung mit bmqttpAWSIOT Pfad zum ` .key ` Privaten-Schlüssel Datei

CbPassword:C

Passwort für Authentifizierung Bemerkung: momentan nicht für AWS IoT

CbPort:N

Port

CbProtocol:N

bmqttpMQTT bmqttpWebsocket bmqttpAWSIOT- Amazon AWS IoT

CbTLS:L

TLS ein-/ausschalten Bemerkung: für AWS IoT ist TLS immer an

CbUser:C

Benutzername für Authentifizierung Bemerkung: momentan nicht für AWS IoT

Name:C


Tag:N


Methoden

Methode

Beschreibung

CbPing()

Ping an MQTT Server/Broker senden nicht vorhanden für AWS IoT

CbSubscribe(aTopic:C, aQoS:N):N


CbUnSubscribe(aTopic:C):N


CbPublish(aTopic:C, aText:C, aQoS:N, aRetain:L):N

cTopic:C cText:C nQoS:N lRetain:L

CbPublishAndWait(aTopic:C, aText:C, aQoS:N, aRetain:L, aTimeout:N):L

cTopic:C cText:C nQoS:N lRetain:L nTimeout:N

Beispiel

SetPersistent(true),

//******************************************************************************
function ClientPublish(oClient, cTopic, cText)
  Meld('ClientPublish: ' + cTopic + ' / ' + cText),
end,

//******************************************************************************
// Globalen MQTTClient instanziieren
// Der Codeblock muss persistent ausgeführt werden, andernfalls wird der
// MQTT Client am Ende des Codeblocks wieder zerstört und ist dann nicht mehr
// verfügbar/aktiv
//******************************************************************************
function InitMQTTClient(cEndpoint, nPort)
   if empty(gl_MQTTClient) then
      startseq
         gl_MQTTClient := CreateObject('TbeCbMQTTClient',, Application),

         AssignEvent(gl_MQTTClient, "OnPublish", "ClientPublish"),

         gl_MQTTClient.CbHost     := cEndpoint,
         gl_MQTTClient.CbPort     := nPort,
         gl_MQTTCLient.CbProtocol := bmqttpAWSIoT,
         gl_MQTTCLient.CertFile   := '\\..\..\..pem',
         gl_MQTTCLient.KeyFile    := '\\..\..\..private.key',
         gl_MQTTClient.CbActive   := true,

         writeln('MQTTClient initalisiert'),
      onerror
         Log(GetErrorText(GetErrorObj()), llError),
         writeln('Allgemeiner Fehler: ' + GetErrorText(GetErrorObj())),
      stopseq,
   else
      writeln('MQTTClient bereits initalisiert'),
   endif,
end,

//******************************************************************************
// Globale MQTTClient Instanz zerstören
//******************************************************************************
function DestroyMQTTClient()
   if not empty(gl_MQTTClient) then
      DestroyObject(gl_MQTTClient),
      gl_MQTTClient := nil,
      writeln('MQTTClient zerstört'),
   endif,
end,

DestroyMQTTClient(),
InitMQTTClient('127.0.0.1', 1883),
SetPersistent(true)

//******************************************************************************
function ClientException(oClient, oException)
  meld('ClientException: ' + GetErrorText(oException)),
end,

//******************************************************************************
function ClientBeforeConnect(oClient, lCleanSession, cClientIdentifier)
  writeln('ClientBeforeConnect: ' + cClientIdentifier),
end,

//******************************************************************************
function ClientConnect(oClient, lSession, nReasonCode, cReasonName)
  Meld('ClientConnect: ' + Str(nReasonCode) + ' / ' + cReasonName),

  oClient.CbSubscribe('TestTopic', bmqttqsAtMostOnce),

  Meld(Str(oClient.CbPublish('TestTopic', 'TestMessage', bmqttqsAtMostOnce, false))),
  if oClient.CbPublishAndWait('TestTopic', 'TestMessage mit Wait', bmqttqsAtMostOnce, false, 1000) then
     Meld('Message Verschickt'),
  else
     Meld('Message nicht verschickt'),
  endif,
end,

//******************************************************************************
function ClientDisconnect(oClient, nReasonCode, cReasonName)
  Meld('ClientDisconnect: ' + cReasonName),
end,

//******************************************************************************
function ClientPublish(oClient, cTopic, cText)
  Meld('ClientPublish: ' + cTopic + ' / ' + cText),
end,

//******************************************************************************
function ClientPing(oClient)
   Meld('ClientPing'),
end,

//******************************************************************************
function ClientSubscribe(oClient, nPacketIdentifier)
  Meld('ClientSubscribe: ' + Str(nPacketIdentifier)),
end,

//******************************************************************************
function ClientUnsubscribe(oClient, nPacketIdentifier)
  Meld('ClientUnsubscribe: ' + str(nPacketIdentifier)),
end,

//******************************************************************************
function ClientPubAck(oClient, nPacketIdentifier, nReasonCode, cReasonName)
  meld('ClientPubAck'),
end,

//******************************************************************************
function ClientPubRec(oClient, nPacketIdentifier, nReasonCode, cReasonName)
  meld('ClientPubRec'),
end,

//******************************************************************************
function ClientPubRel(oClient, nPacketIdentifier, nReasonCode, cReasonName)
  meld('ClientPubRel'),
end,

//******************************************************************************
function ClientPubComp(oClient, nPacketIdentifier, nReasonCode, cReasonName)
  meld('ClientPubComp'),
end,

//******************************************************************************
// Globalen MQTTClient instanziieren
// Der Codeblock muss persistent ausgeführt werden, andernfalls wird der
// MQTT Client am Ende des Codeblocks wieder zerstört und ist dann nicht mehr
// verfügbar/aktiv
//******************************************************************************
function InitMQTTClient(cHost, nPort)
   if empty(gl_MQTTClient) then
      startseq
         gl_MQTTClient := CreateObject('TbeCbMQTTClient',, Application),

         AssignEvent(gl_MQTTClient, "OnException", "ClientException"),
         AssignEvent(gl_MQTTClient, "OnBeforeConnect", "ClientBeforeConnect"),
         AssignEvent(gl_MQTTClient, "OnConnect", "ClientConnect"),
         AssignEvent(gl_MQTTClient, "OnDisconnect", "ClientDisconnect"),
         AssignEvent(gl_MQTTClient, "OnPublish", "ClientPublish"),
         AssignEvent(gl_MQTTClient, "OnPing", "ClientPing"),
         AssignEvent(gl_MQTTClient, "OnSubscribe", "ClientSubscribe"),
         AssignEvent(gl_MQTTClient, "OnUnsubscribe", "ClientUnsubscribe"),

         AssignEvent(gl_MQTTClient, "OnPubAck", "ClientPubAck"),
         AssignEvent(gl_MQTTClient, "OnPubRec", "ClientPubRec"),
         AssignEvent(gl_MQTTClient, "OnPubRel", "ClientPubRel"),
         AssignEvent(gl_MQTTClient, "OnPubComp", "ClientPubComp"),

         gl_MQTTClient.CbHost     := cHost,
         gl_MQTTClient.CbPort     := nPort,
         gl_MQTTCLient.CbProtocol := bmqttpMQTT,
         gl_MQTTClient.CbActive   := true,

         writeln('MQTTClient initalisiert'),
      onerror
         Log(GetErrorText(GetErrorObj()), llError),
         writeln('Allgemeiner Fehler: ' + GetErrorText(GetErrorObj())),
      stopseq,
   else
      writeln('MQTTClient bereits initalisiert'),
   endif,
end,

//******************************************************************************
// Globale MQTTClient Instanz zerstören
//******************************************************************************
function DestroyMQTTClient()
   if not empty(gl_MQTTClient) then
      DestroyObject(gl_MQTTClient),
      gl_MQTTClient := nil,
      writeln('MQTTClient zerstört'),
   endif,
end,

DestroyMQTTClient(),
InitMQTTClient('127.0.0.1', 1883),

writeln(gl_MQTTClient.CbSubscribe('TestTopic2', bmqttqsAtMostOnce)),
gl_MQTTClient.CbPublish('TestTopic2', 'Testmessage', bmqttqsAtMostOnce, false),
writeln(gl_MQTTClient.CbUnSubscribe('TestTopic2')),

gl_MQTTClient.CbPing(),
|lIsResident:P1, gl_MQTT:_U:=nil, oOwner|

function MyClient_OnPublish(Client, Topic, Text)
   log('MyClient Publish - ' + Topic + ': ' + Text, llFatal),
end,

function MyClient_OnConnect()
   log('MyClient Connect', llFatal),
end,

function MyClient_OnDisconnect()
   log('MyClient Disconnect', llFatal),
end,

function MyClient_OnPing()
   log('MyClient Ping', llFatal),
end,

if not Empty(gl_MQTT) then
    DestroyObject(gl_MQTT),
endif,

if not Empty(lIsResident) and lIsResident then
   writeln('Resident'),
   oOwner := nil,
else
   if LoadedModule <> belmbeas then
      lIsResident := True,
      SetPersistent(True),
   endif,

   oOwner := Application,
endif,

gl_MQTT                             := CreateObject('TbeCbMQTTClient',,oOwner,,true),
gl_MQTT.CbHeartBeatInterval         := 600,
gl_MQTT.CbAdvancedHeartBeatInterval := 120,
gl_MQTT.CbHost                      := "127.0.0.1",
gl_MQTT.CbPort                      := 1883,
gl_MQTT.CbProtocol                  := bmqttpMQTT,
gl_MQTT.CbActive                    := true,
if lIsResident then
   AssignEvent(gl_MQTT, 'OnPublish', 'MyClient_OnPublish'),
   AssignEvent(gl_MQTT, 'OnConnect', 'MyClient_OnConnect'),
   AssignEvent(gl_MQTT, 'OnDisconnect', 'MyClient_OnDisconnect'),
   AssignEvent(gl_MQTT, 'OnPing', 'MyClient_OnPing'),
endif,
CallResident('My_MQTT_Client', true),