|
<< 点击显示目录 >> 主页 MQTT使用助手 > 20_贝加莱AR作为订阅者与发布者 > 21_基于libemqtt的客户端 > 00_从C源代码移植libemqtt至ARlibemqtt至AR |
目录
•简介
•下载链接
•说明
•第一步:在 github 上找代码
•第二步:移植
•第三步:测试
简介
此文档作者为陈巍,介绍如何从 libemqtt 的C源代码,手动移植到贝加莱项目中,使用仿真ARSim作为发布者与订阅者,并搭配群辉NAS的Mosquitto作为中介服务器进行测试。
下载链接
•Github上C代码
•移植至贝加莱PLC中的C代码
说明
•MQTT (Message Queue Telemetry Transport),翻译成中文就是,遥测传输协议,其主要提供了订阅/ 发布两种消息模式,更为简约、轻量,易于使用,特别适合于受限环境(带宽低、网络延迟高、网 络通信不稳定)的消息分发,属于物联网(Internet of Thing)的一个标准传输协议。
•随着近年来 IT 与 OT 的加速融合,原来越多的工业应用场景有了“互联网+”的需求。来自 IT 行业的人才、资金涌进了传统的工业领域,一时间市面上如雨后春笋般的涌现了一大批 “数据采集盒子”,PLC+盒子的方案成为了市场主流。
•本文介绍了一种新的路径,在现有的 PLC 硬件平台上,通过源代码移植,为 PLC 增加目 前物联网常用的 MQTT 通讯协议。这样就把传统的 PLC 控制功能和物联网的通讯能力整合在同一个硬件平台下,使得 IT 工程师和自动化工程师有了共同的平台
第一步:在 github 上找代码
•因为贝加莱平台除了支持 IEC 规定的六种自动化编程语言之外,还支持 C/C++语言开发,所以我们先在 Github 上搜索 MQTT,从结果中挑选了一个名为 libemqtt 的 C 语言 代码。
•看介绍很合适:“Embedded C client library for the MQTT protocol”。嵌入式平 台的代码一般都是轻量级的,更容易移植到 PLC。
•再看一下授权是 LGPL,这是允许代码通过类库引用供商业软件使用的,且开发的商业软件不要求开源。

第二步:移植
libemqtt 贴心的提供了 pub.c 和 sub.c 两个例程。通过分析例程,发现这个库的回调 (callback)函数只有一个 send(),用于发送 tcp 报文。

其它的几个函数 init_socket(),close_socket(),read_packet()都只是在例程中调用。
我们第一步先实现 send 回调函数,例程源代码用的是 socket 方式通讯,贝加莱平台也有 EthSock 库可以直接使用 socket 函数编程。同时还有 astcp 库,提供更加简化的 TCP 通讯函 数,这次我用 astcp 库来实现 TCP 通讯。
下图是 astcp 库的函数列表

从表中可以看出,这个库可是支持 SSL 加密通讯的。
利用 astcp 库重写的回调函数 send()的代码实现如下:

主程序需要调用 astcp 库的函数来建立 tcp 连接,调用 libemqtt 库的函数来发送报文,接收 报文后也需要调用 libemqtt 库的函数来解析报文,在此就不赘叙。
完成后的任务视图如下,libemqtt.c 和 libemqtt.h 来自 github,不做任何修改。Main.c 程序就是自己写的主程序。

为了发送数据跨平台的可用性,我写了一个自动把变量数据转为 Json 格式字符串的函数 JsonStrPutPV(),所以上传的内容为 Json 格式的变量内容。下图是引用方式,填入要解析的变量名,会自动把变量内容转换为 Json 格式字符串,支持复杂类型如结构体嵌套等。

上传变量的数据类型如图,我特意定义了一个嵌套结构体,目的为了测试 json 的语法解析 是否正常。

第三步:测试
测试的硬件平台可以选择贝加莱任意一款带有网络接口的 PLC,本例中我们用贝加莱 PLC 仿真器来测试。如下图:

MQTT 服务器采用搭建在家中的群晖 NAS 服务器上安装的 Mosquitto

电脑端再安装一个 MQTT.fx 软件用来充当另一个客户端,注册 hello/test 标题的报文监听

从图中我们可以看到,从 PLC 发送的 Json 格式的字符串已经可以被正确解析。 然后我们测试接收,先从 MQTT.fx 软件发送内容”test ABC”
然后到 PLC 在线监控窗口查看接收到了同样内容的报文。

至此测试完成,收发功能均正常。