20_paho.mqtt.c-ar项目README

<< 点击显示目录 >>

主页  MQTT使用助手 > 20_贝加莱AR作为订阅者与发布者 > 22_基于paho.mqtt.c的客户端 >

20_paho.mqtt.c-ar项目README

目录

来源

介绍

使用 IotMqtt 说明

发布示例:此示例显示如何连接并将MQTT消息发布到主题

订阅示例:展示了如何连接、订阅主题并读取 MQTT 消息

RegPar 发布和订阅示例:该示例演示了如何使用这两个功能块发送 json 序列化 PLC 结构(发布),以及如何接收并解析发送到 PLC 结构的 json 消息(订阅)

库配置:此示例说明如何更改库使用的日志记录行为和文件设备

网络参数

DNS 服务

默认网关

文件设备和CA证书

日志文件

永久保持变量Persistence

例程

 

来源

https://github.com/br-automation-com/paho.mqtt.c-ar

 

基于eclipse/paho.mqtt.c 的MQTT客户端贝加莱AR库

 

介绍

此存储库包括用于Automation SDK的编译二进制MQTT客户端库。    

OpenSSL

paho.mqtt.c

库有两种不同的形式

IotMqtt → 推荐使用此版本

oIotMqtt是一个基于功能块的库,具有发布和订阅功能,可以在 CYCLIC IEC 环境中轻松使用。基本上,当您想要使用MQTT与代理进行通信时,这就是您所需要的。此客户端基于MQTTASync,它能够在同一PLC上同时运行多个连接。

PahoMQTT → 老版本兼容

oPahoMQTT 是一个静态库,可使用 IotMqtt 库作为驱动程序来直接调动 paho.mqtt.c API。

oPahoMQTT库只应在特殊情况下使用,在这种情况下,您需要从mqtt堆栈启用特殊命令。它为以前使用过 https://github.com/br-automation-com/PahoMQTT_Library 存储库中的PahoMQTT的项目提供基本兼容性,而这些应用程序需要进行一些小的修改。请参阅与旧PahoMQTT版本的兼容性以了解有关此的更多信息。

 

使用 IotMqtt 说明

IotMqtt库可以在IEC程序中简单使用。它由3种不同类型的功能块组成:

Client

Publisher

Subscriber

 

每次需要与MQTT代理建立新连接时,必须使用 IotMqttClient FUB。然后,根据发布/订阅需求,可以关联 0 到 50 个 IotMqttPublishIotMqttSubscribe FUB。IotMqttRegParPublishIotMqttRegParSubscribe 也算作 IotMqttPublishIotMqttSubscribe

 

这里有一些简单的示例。在运行它们之前,重要的是将 ClientID 参数更改为自定义参数,因为 ClientID 在代理中必须是唯一的。

 

发布示例:此示例显示如何连接并将MQTT消息发布到主题

 

PROGRAM _CYCLIC

    IotMqttParameters.ServerUri     := 'broker.hivemq.com';

    IotMqttParameters.Port          := 1883;

    IotMqttParameters.ClientID      := 'B&R_SimplePublishSample';

      

    IotMqttClient_0.Enable          := TRUE;

    IotMqttClient_0.Connect         := TRUE;

    IotMqttClient_0.IotMqttLink     := ADR(IotMqttLink);

    IotMqttClient_0.Parameters      := IotMqttParameters;

    IotMqttClient_0();

  

    PublishMessage                  := 'This is a sample message being sent';

    IotMqttPublish_0.Enable         := TRUE;

    IotMqttPublish_0.IotMqttLink    := IotMqttClient_0.IotMqttLink;

    IotMqttPublish_0.Topic          := ADR('B&R_TestTopic/SimplePublishSample');

    IotMqttPublish_0.Buffer         := ADR(PublishMessage);

    IotMqttPublish_0.BufferLength   := brsstrlen(ADR(PublishMessage));

    IotMqttPublish_0();

END_PROGRAM

 

PROGRAM _EXIT

    IotMqttClient_0(Enable := FALSE);

    IotMqttPublish_0(Enable := FALSE); 

END_PROGRAM

 

publish_sample-new

 

订阅示例:展示了如何连接、订阅主题并读取 MQTT 消息

 

PROGRAM _CYCLIC

    IotMqttParameters.ServerUri         := 'broker.hivemq.com';

    IotMqttParameters.Port              := 1883;

    IotMqttParameters.ClientID          := 'B&R_SimpleSubscribeSample';

  

    IotMqttClient_0.Enable              := TRUE;

    IotMqttClient_0.Connect             := TRUE;

    IotMqttClient_0.IotMqttLink         := ADR(IotMqttLink);

    IotMqttClient_0.Parameters          := IotMqttParameters;

    IotMqttClient_0();

 

    IotMqttSubscribe_0.Enable           := TRUE;

    IotMqttSubscribe_0.IotMqttLink      := IotMqttClient_0.IotMqttLink; 

    IotMqttSubscribe_0.Topic            := ADR('B&R_TestTopic/SimpleSubscribeSample');

    IotMqttSubscribe_0.RecievedTopic    := ADR(ReceivedTopic); 

    IotMqttSubscribe_0.RecievedTopicSize:= SIZEOF(ReceivedTopic);

    IotMqttSubscribe_0.QueueSize        := 50;

    IotMqttSubscribe_0.Buffer           := ADR(ReceiveBuffer); 

    IotMqttSubscribe_0.BufferSize       := SIZEOF(ReceiveBuffer);

    IotMqttSubscribe_0();

END_PROGRAM

 

PROGRAM _EXIT

    IotMqttClient_0(Enable := FALSE);

    IotMqttSubscribe_0(Enable := FALSE);

END_PROGRAM

 

subscribe_sample-new

 

RegPar 发布和订阅示例:该示例演示了如何使用这两个功能块发送 json 序列化 PLC 结构(发布),以及如何接收并解析发送到 PLC 结构的 json 消息(订阅)

PROGRAM _CYCLIC

 pvname := 'RegParPub:testVar';

 testVar;

 

 IotMqttParameters.ServerUri             := 'broker.hivemq.com';

 IotMqttParameters.Port                  := 1883;

 IotMqttParameters.ClientID              := 'B&R_SimplePublishSample585';

  

 IotMqttClient_0.Enable                  := TRUE;

 IotMqttClient_0.Connect                 := TRUE;

 IotMqttClient_0.IotMqttLink             := ADR(IotMqttLink);

 IotMqttClient_0.Parameters              := IotMqttParameters;

 IotMqttClient_0();

 

 IotMqttRegParPublish_0.Enable           := TRUE;

 IotMqttRegParPublish_0.IotMqttLink      := IotMqttClient_0.IotMqttLink;

 IotMqttRegParPublish_0.Topic            := ADR('B&R_TestTopic/RegParPublishSample');

 IotMqttRegParPublish_0.PvName           := ADR(pvname);

 IotMqttRegParPublish_0.PublishMode      := IOTMQTT_PUB_MODE_TRIGGER;

 IotMqttRegParPublish_0.DataFormat       := IOTMQTT_VAR_JSON;

 IotMqttRegParPublish_0();

 

 IotMqttRegParSubscribe_0.Enable         := TRUE;

 IotMqttRegParSubscribe_0.IotMqttLink    := IotMqttClient_0.IotMqttLink;

 IotMqttRegParSubscribe_0.DataFormat     := IOTMQTT_VAR_JSON;

 IotMqttRegParSubscribe_0.Topic          := ADR('B&R_TestTopic/RegParSubscribeSample');

 IotMqttRegParSubscribe_0.QoS            := 0;

 IotMqttRegParSubscribe_0.QueueSize      := 50;

 IotMqttRegParSubscribe_0.ReceiveBufferSize := 50000;

 IotMqttRegParSubscribe_0();

END_PROGRAM

 

PROGRAM _EXIT

 IotMqttClient_0(Enable := FALSE);

 IotMqttRegParPublish_0(Enable := FALSE); 

END_PROGRAM

 

regpar_publish_sample-new

 

regpar_subscribe_sample-new

 

库配置:此示例说明如何更改库使用的日志记录行为和文件设备

库使用默认参数,使其使用可选。

 

PROGRAM _INIT

    IotMqttConfigParams.UseLogger             := TRUE;

    IotMqttConfigParams.LoggerName            := 'IotMqtt';

    IotMqttConfigParams.UseFile               := TRUE;

    IotMqttConfigParams.LogFileDevice         := 'USER';

    IotMqttConfigParams.LogFileName           := 'IotMqttLog';

    IotMqttConfigParams.AppendTimestamp       := FALSE;

    IotMqttConfigParams.OverwritteLogs        := TRUE;

    IotMqttConfigParams.LogLevel              := IOTMQTT_LOG_LEVEL_PROTOCOL;

    IotMqttConfigParams.PersistenceFileDevice := 'PERSIST';

    IotMqttConfig(ADR(IotMqttConfigParams));

END_PROGRAM

 

可以使用多个客户端,只需声明一个新的IotMqttLink变量,一个新的参数变量,并将它们与新的IotMqttClient FUB关联。

 

网络参数

DNS 服务

当通过主机名而不是IP地址访问服务器时(通常当代理在Internet上时),需要激活和配置DNS服务。

clip0081

如果PLC使用DHCP服务器获取其IP地址,则可以设置从DHCP服务器获取DNS选项,否则必须提供至少一个DNS服务器。

 

默认网关

如果使用 DHCP 服务器或我们的代理在本地网络中,则可以留空。否则,必须在该字段中写入提供互联网访问的设备(通常是调制解调器或路由器)的 IP 地址:

clip0082

 

文件设备和CA证书

一些MQTT连接需要使用证书。它们可以存储在项目的证书存储中或用户定义的文件设备中。

根据它们的位置,我们需要在程序中为证书名称添加前缀。

使用证书存储时,我们将根据它们所在的容器使用以下前缀:

clip0083

如果证书存储在文件系统中,则前缀是文件设备的名称:

clip0084

如果证书存储在默认文件设备中,则不需要将文件设备作为前缀写入。

 

日志文件

IotMqtt能够生成日志文件来帮助我们诊断连接或简单地记录连接错误。对于此功能,它将使用File Device `IOTMQTT`作为默认值,用户需要在在项目中CPU配置中进行配置。

clip0085

在客户端程序的`_INIT`部分使用函数`IotMqttConfig`,可以更改默认的文件设备,以及选择日志级别(详细程度)、输出文件的名称,以及是否还希望将日志消息写入日志记录器(Logger)。

这个函数只会在第一次调用时产生效果,所以不可能在运行时调整这些参数。

 

永久保持变量Persistence

发送或接收的QoS(服务质量Quality of Service)> 0 的消息有可能被存储在PLC的闪存或CF中,直到它们被正确处理。这将在网络出现问题的情况下保持消息活动,并在到达确认传递时删除它们。

要使用此功能,必须在客户端参数结构中启用。它将使用文件设备`IOTMQTT`作为默认值,但可以使用函数`IotMqttConfig`进行更改。

clip0086

 

例程

除了上面显示的发布和订阅示例外,Samples目录中还提供了更多示例。在那里,您可以找到以下示例程序:

Azure IoT Hub:连接、发布和订阅

Amazon Web Services IoT:连接、发布和订阅

Google IoT

IotMqttRegParPublish 和 IotMqttRegParSubscribe的示例使

使用Web套接字连接