00_从C源代码移植libemqtt至ARlibemqtt至AR

<< 点击显示目录 >>

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

00_从C源代码移植libemqtt至ARlibemqtt至AR

 

目录

简介

下载链接

说明

第一步:在 github 上找代码

第二步:移植

第三步:测试

 

简介

此文档作者为陈巍,介绍如何从 libemqtt 的C源代码,手动移植到贝加莱项目中,使用仿真ARSim作为发布者与订阅者,并搭配群辉NAS的Mosquitto作为中介服务器进行测试。

 

下载链接

Github上C代码

libemqtt C代码 Github仓库链接

libemqtt C代码,本地打包下载

移植至贝加莱PLC中的C代码

libemqtt 在贝加莱AR4.7中可用项目代码

 

说明

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,这是允许代码通过类库引用供商业软件使用的,且开发的商业软件不要求开源。

clip0029

 

第二步:移植

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

clip0030

 

其它的几个函数 init_socket(),close_socket(),read_packet()都只是在例程中调用。

我们第一步先实现 send 回调函数,例程源代码用的是 socket 方式通讯,贝加莱平台也有 EthSock 库可以直接使用 socket 函数编程。同时还有 astcp 库,提供更加简化的 TCP 通讯函 数,这次我用 astcp 库来实现 TCP 通讯。

下图是 astcp 库的函数列表

clip0031

从表中可以看出,这个库可是支持 SSL 加密通讯的。

利用 astcp 库重写的回调函数 send()的代码实现如下:

clip0032

主程序需要调用 astcp 库的函数来建立 tcp 连接,调用 libemqtt 库的函数来发送报文,接收 报文后也需要调用 libemqtt 库的函数来解析报文,在此就不赘叙。

完成后的任务视图如下,libemqtt.c 和 libemqtt.h 来自 github,不做任何修改。Main.c 程序就是自己写的主程序。

clip0033

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

clip0034

 

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

clip0035

第三步:测试

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

clip0036

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

clip0037

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

clip0038

从图中我们可以看到,从 PLC 发送的 Json 格式的字符串已经可以被正确解析。 然后我们测试接收,先从 MQTT.fx 软件发送内容”test ABC”

然后到 PLC 在线监控窗口查看接收到了同样内容的报文。

clip0039

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