MQTT协议和MQTT在Delphi上打开客户端项目


MQTT 协议用于在物联网上进行消息传递。首先,它很有趣,因为它受到最大的云服务提供商的支持,例如IBM,Microsoft,Amazon。
您可以免费获得这些服务的帐户,在该处设置接收MQTT消息的服务,并通过这些服务(例如,在智能家居中)观察设备的使用寿命。此外,通过这些服务,设备可以相互通信。

包括客户机到IBM Bluemix云的MQTT服务的连接的演示。



简短说明。


MQTT非常原始:具有短头,没有完整性控制,它不对结构,编码或数据方案施加任何限制。每个数据包中唯一的数据要求是它们必须随附信息信道的标识符。规范中的此标识符称为主题名称或更简单的主题。数据通过TCP传输到数据包。数据包中的数据量可以从一个字节到268,435,455字节。非常灵活!尽管公共云服务施加了更严格的限制,但高达几千字节。
MQTT协议需要一个数据代理。这是技术的中心思想。所有设备仅将数据发送给代理,也仅从代理接收数据。代理是充当具有动态数据库的TCP服务器的程序。

经纪人的数据库特别包含一个表,其中包含所有收到的包,并按这些包的主题进行索引。收到软件包后,代理将根据其订阅将其发送到网络上的所有设备。为了使设备能够从代理接收某些内容,它必须订阅该主题。主题在订阅时或带有此主题的程序包到达时动态出现。您也可以退订该主题。因此,主题是一种组织不同类型关系的便捷机制:一对多,多对一和多对多。如果包裹没有订户,则将其丢弃。如果未连接订户,则该包将立即在代理的数据库中删除,或者等待订户连接配置中指定的一段时间。该行为由数据包的QoS属性确定。

这里还有什么重要的。


•设备是第一个与经纪人建立联系的设备。即设备可能位于网络地址转换器(NAT)的后面,并且可能没有静态IP地址,因此不会干扰通信。
•SSL可用于加密流量。但是,即使没有IBM服务,您也可以不使用SSL,这使调试更加容易。
•在极端困难的情况下,MQTT代理允许您通过端口80上的WebSocket协议连接到它们。
•标准MQTT协议的端口也可以任意更改。
•具有图形用户界面的一个或多个客户端和代理都可以位于同一台计算机上。即该解决方案可以绝对是本地的,只需单击一下即可扩展到全局。
•不同的代理可以通过彼此订阅消息来相互连接。
•主题的概念非常适合NoSQL数据库技术。出于相同的目的,云服务鼓励用户使用JSON数据编码。

公开项目


MQTT经纪人的选择非常多。但是奇怪的是,在Windows下实际上没有方便的客户端使用窗口用户界面。而且,这样的客户必须掌握MQTT协议,因为经纪人的工作有许多细微的差别,超出了规范的范围,所有这些东西都需要以某种方式进行研究和测试。
决定在Delphi上实现MQTT客户端。
Google for Delphi只能提供TMQTTClient组件。但这是一个古老且无法正常工作的组件。用Delphi用Java,Erlang,Haskell,Javscript编写的大多数其他客户端都很难集成。
找到了唯一合适的项目-Mosquitto
用纯C-i编写。它针对不同的操作系统进行编译。它具有Visual Studio的项目生成脚本。在Windows下的出口处,我们获得具有客户端和代理功能实现的dll文件。就速度而言,使用C令人鼓舞。用C编写的动态库可以轻松连接到Delphi程序。
以Embarcadero RAD Studio XE8为代表的Delphi本身是一个非常强大的工具,可为Windows创建灵活方便的用户界面,尤其是当它配备DevExpress,TeeChart,RxLib,FireDAC等时。

必备工具


我们将需要MS Visual Studio 2015开发环境。它将编译Mosquitto项目以及Mosquitto依赖的所有支持项目。另外,可以使用Cygwin软件包编译用于Windows的Mosquitto,但Visual Studio似乎更方便。 要生成Visual Studio项目文件,您需要下载并安装Cmake实用程序。来源cmake.org 当然,您需要RAD Studio XE8。此外,在RAD Studio中,必须安装不低于14.2.2DevExpress VCL组件软件包版本。

尽管这并不是根本性的重要性,但是可以轻松地为标准RAD Studio组件重新制作用户界面设计。

软件安装步骤


Mosquitto依赖于几个第三方项目,它们是:
OpenSSL v 1.0.2e。来源- http://slproweb.com/download/Win32OpenSSL-1_0_2e.exe
并行线程v 2.9.1。来源- ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip
Libwebsockets 1.4版。来源-https: //github.com/warmcat/libwebsockets

下载这些项目。
我们不编译OpenSSL,但立即从那里获取两个必要的文件:bin目录中的libeay32.dllssleay32.dll。通常,它们已从其他项目安装在计算机上。必须对此进行检查。线程
我们也不编译,而是dll \ x86目录中获取已编译的pthreadVC2.dll文件Libwebsockets没有预编译的文件,也没有用于Visual Studio的项目,但是它具有CMakeLists.txt配置文件。在这种情况下,我们使用Cmake实用程序在单独的目录(libwebsockets_VS_proj目录)中生成Visual Studio项目文件。然后在Visual Studio中打开生成的项目文件进行编译。我们得到了所需的websockets.dll文件 完成上述所有步骤后,您可以编译Mosquitto项目

。在这里,您还首先需要从附加的CMakeLists.txt配置文件生成Visual Studio项目文件(Mosquitto_VS_proj目录)。生成的项目效果不佳,您将不得不更改一些外部头文件和库的路径,在项目中包含一些宏,并稍稍修改源文本。结果,我们得到了mosquitto.dll文件
为简单起见,所有带有上述项目的文件和目录结构都包含在本文所附的存档文件中。
与客户端库一起,编译Mosquitto项目将为我们提供MQTT代理可执行文件mosquitto.exe
因此,我们立即获得了客户和MQTT经纪人,即 组织有效的物联网所需的几乎所有内容。

在Delphi中创建MQTT客户端项目



要将mosquitto.dll库集成到Delphi中,需要在Object Pascal上创建一个库函数声明模块要做到这一点,文件转换已经完成mosquitto.h文件MOSQUITTO.PAS
客户端项目非常简单,仅包含4个源文件。客户端演示了连接和断开连接,形成遗嘱(Will),使用PUBLISH包将数据发送代理,使用PUBLISH从经纪人接收数据,进行订阅和取消订阅的过程。
程序将所有连接属性(由术语配置文件引用)保存在磁盘上存储的配置文件表中。接收和发送的PUBLISH数据包的日志也分别保存到磁盘

客户使用方法



运行文件TMQTTC.exe
为了让别人沟通的试运行经纪人团队Run_mosquitto.cmd目录Mosquitto_1_4_5_bin。为方便起见,将代理配置为无需SSL和密码验证即可连接
填写屏幕快照中的字段。



密码和用户名是可选的。在导航器中,单击提交按钮以将数据保存在表中。然后单击“ 连接”按钮
连接后,发布和订阅命令将变为可用。命令PING客户Mosquitto自动生成。
为了使客户端获得某些东西,您应该再次使用其他客户端标识符运行TMQTTC.exe程序,并订阅一个客户端以从另一个客户端接收数据。

连接到IBM Bluemix



要做的第一件事是在Bluemix中获得一个帐户。
收到帐户后,我们转到Bluemix上的控制面板。在这里,您必须立即切换到美国南部地区。为此,请单击右上角的帐户图标,然后在“ 区域”字段中更改值。总共有三个地区,但是美国南方提供了体验大多数服务的机会。接下来,创建Space。屏幕应该看起来像下面的屏幕快照。这创造了一个组织INDEMSYS空间INDEMSYS空间


现在,单击顶部菜单中的“ 目录 ”。我们走到最底部选择物联网基金会


默认情况下,我们不更改建议的字段,然后单击创建


物联网基金会 -这是一项服务,其中包括MQTT代理和该代理的用户界面。
在出现的窗口中创建后,点击标有启动仪表板的按钮



这是一个物联网控制面板。现在我们需要创建设备。点击添加设备。在出现的对话框中,创建一个设备类型(Create device type),为其命名为Type1,为简单起见,请不要填写其余字段。单击下一步->下一步->创建->下一步。将名称命名为设备Device1。下一步下一步->下一步->下一步->添加。结果,我们得到以下窗口:


就这样,在这里,我们获得了将我们的第一个设备连接到MQTT代理Bluemix的所有详细信息
我们将测试客户端是否可以连接到它。在客户端窗口中输入详细信息。


如您所见,客户端成功连接到Bluemix。在这里,您应注意主机名。它以创建物联网基金会时获得组织ID开头用户ID字段也是复合的,编码为:d:< 组织ID >:< 设备类型 >:< 设备ID >。用户名字包含固定字符串use-token-auth
Mosquitto代理不同,Bluemix代理的消息主题不能包含任意数据。它们根据某些规则进行编码。这些规则应在物联网基金会的文档中进行研究屏幕截图显示了可能的有效主题之一。

项目存储库:https : //github.com/Indemsys/Delphi_MQTT_mosquitto

Source: https://habr.com/ru/post/zh-CN388231/


All Articles