|
<< 点击显示目录 >> 主页 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 个 IotMqttPublish 或 IotMqttSubscribe FUB。IotMqttRegParPublish 和 IotMqttRegParSubscribe 也算作 IotMqttPublish 或 IotMqttSubscribe。
这里有一些简单的示例。在运行它们之前,重要的是将 ClientID 参数更改为自定义参数,因为 ClientID 在代理中必须是唯一的。
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

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

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


库使用默认参数,使其使用可选。
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关联。
网络参数
当通过主机名而不是IP地址访问服务器时(通常当代理在Internet上时),需要激活和配置DNS服务。

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

文件设备和CA证书
一些MQTT连接需要使用证书。它们可以存储在项目的证书存储中或用户定义的文件设备中。
根据它们的位置,我们需要在程序中为证书名称添加前缀。
使用证书存储时,我们将根据它们所在的容器使用以下前缀:

如果证书存储在文件系统中,则前缀是文件设备的名称:
![]()
如果证书存储在默认文件设备中,则不需要将文件设备作为前缀写入。
日志文件
IotMqtt能够生成日志文件来帮助我们诊断连接或简单地记录连接错误。对于此功能,它将使用File Device `IOTMQTT`作为默认值,用户需要在在项目中CPU配置中进行配置。

在客户端程序的`_INIT`部分使用函数`IotMqttConfig`,可以更改默认的文件设备,以及选择日志级别(详细程度)、输出文件的名称,以及是否还希望将日志消息写入日志记录器(Logger)。
这个函数只会在第一次调用时产生效果,所以不可能在运行时调整这些参数。
永久保持变量Persistence
发送或接收的QoS(服务质量Quality of Service)> 0 的消息有可能被存储在PLC的闪存或CF中,直到它们被正确处理。这将在网络出现问题的情况下保持消息活动,并在到达确认传递时删除它们。
要使用此功能,必须在客户端参数结构中启用。它将使用文件设备`IOTMQTT`作为默认值,但可以使用函数`IotMqttConfig`进行更改。
![]()
例程
除了上面显示的发布和订阅示例外,Samples目录中还提供了更多示例。在那里,您可以找到以下示例程序:
•Azure IoT Hub:连接、发布和订阅
•Amazon Web Services IoT:连接、发布和订阅
•Google IoT
•IotMqttRegParPublish 和 IotMqttRegParSubscribe的示例使
•使用Web套接字连接