赞
踩
目 录
7.9 libpaho-mqtt3as测试(SSL双向加密)
7.11 libpaho-mqtt3cs测试(SSL双向加密)
通过测试了解SylixOS对开源MQTT协议上的C库客户端当前1.3.10版本的中间件是否完成了设计要求的相关功能,软件的性能和稳定性能否达到设计要求或者用户所需。
注:每次测试只需要一个服务器和一个客户端即可。
MQTT开MQTT协议(低带宽)
MQTT (Message Queuing Telemetry Transport ),消息队列遥测传输,由IBM开发的即时通讯协议,相比来说比较适合物联网场景的通讯协议。
MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与设备之间消息的转发。
MQTT在协议设计时就考虑到不同设备的计算性能的差异,所以所有的协议都是采用二进制格式编解码,并且编解码格式都非常易于开发和实现。
最小的数据包只有2个字节,对于低功耗低速网络也有很好的适应性。
有非常完善的QOS机制,根据业务场景可以选择最多一次、至少一次、刚好一次三种消息送达模式。
运行在TCP协议之上,同时支持TLS(TCP+SSL)协议,并且由于所有数据通信都经过云端,安全性得到了较好地保障。
在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。
使用MQTT应用程序来测试Paho C客户端包含四个库是否正常运行:(编译成功后可在lib_paho-mqtt-c/Debug目录下查看)
测试中图片会出现地址IP为192.168.1.192和192.168.9.192 ,是因为写文档时分了两次测试。用户在测试中,遇到这两个IP名,都为服务器的IP名。替换即可!!!
SylixOS Base勾选组件:
libsylixos:SylixOS 内核组件,SylixOS Base 工程必选;
libcextern:SylixOS 的 c 库,可选组件,一般也推荐包含在 SylixOS Base 工程中;
openssl:开源 SSL 加密实现库;(MQTT库需要依赖openssl库)
图 7-1 Base工程信息
图 7-2 MQTT的库文件
打开虚拟机或开发板系统,直接Upload上传即可。
或者
2.把下载的EMQX解压,得到一个emqx文件夹(解压名字不一样,可自行改为emqx。注意:解压的目录不应有中文字符,解压的目录最好是目标磁盘下的第一级文件)。
3.Win10 系统的 【开始】 【右键】 进入win10 系统的 【Windows PowerShell(管理员)】
4.进入 命令: cd H:\emqx\bin
cd H:\emqx\bin |
./emqx install |
./emqx start |
./emqx stop |
如果停止服务器出现下图问题,无法停止
Node 'emqx@127.0.0.1' not responding to pings. |
解决办法:移至官网下载对应版本的LICENSE
下载后解压放进目录emqx/etc下,然后重新启动EMQ服务器。
因为此时EMQX服务器正在windows电脑运行,无法关闭。所以请重启电脑,再次从第三步:进入win10 系统的 【Windows PowerShell(管理员)】对emqx服务器进行开启和关闭。
启动后即可访问 localhost:18083 进入登入页面 默认用户名:admin,密码:public
进入
此时可以用MQTTX来创建一个客户端。(注:当前网络适配器配置的ip都可当作服务端使用,包括虚拟网卡ip)。
连接成功可在服务器查看详细情况
有4种安装包:
Win64 OpenSSL v1.1.1i Light,安装Win64 OpenSSL v1.1.1i最常用的软件包
Win64 OpenSSL v1.1.1i,安装Win64 OpenSSL v1.1.1i完整软件包
Win32 OpenSSL v1.1.1i Light,安装Win32 OpenSSL v1.1.1i最常用的软件包
Win32 OpenSSL v1.1.1i,安装Win32 OpenSSL v1.1.1i完整软件包
对下载的Win64OpenSSL-1_1_1i.exe,进行安装。
一般默认安装,但安装步骤中有一步,“Select Additional Tasks”,让选择OpenSSL的dll拷贝到什么地方,如下:
建议,不要拷贝到系统目录下,如果其他软件使用的OpenSSL版本与你安装这个版本不同,可能导致该软件无法使用。所以让这些dll待在OpenSSL安装目录下即可。
最后一步,是否捐款,如下:
看个人情况,全取消就是不捐。
安装完毕。
安装目录下内容:
验证安装是否正确
直接在cmd中,输入命令,查看OpenSSL版本
openssl version |
如果看到的并不是自己安装的1.1.1版本
原因: 如果电脑上已经安装过其他软件,比如Git、VMware、Strawberry等,那么他们都自带了openssl,如下:
所以,当你在cmd中使用openssl命令时,可能会调用到其他版本的openssl。
解决办法: 将openssl 1.1.1i版本命令行工具路径添加到,系统变量Path第一条,以保证它首先被找到。
再次验证,查看OpenSSL版本正确。
无脑安装即可
安装完毕后可用120.25.213.14来测试MQTTX是否正常。
在双向认证中,一般都使用自签名证书的方式来生成服务端和客户端证书,因此本文就以自签名证书为例。
通常来说,我们需要数字证书来保证 TLS 通讯的强认证。数字证书的使用本身是一个三方协议,除了通讯双方,还有一个颁发证书的受信第三方,有时候这个受信第三方就是一个 CA。和 CA 的通讯,一般是以预先发行证书的方式进行的。也就是在开始 TLS 通讯的时候,我们需要至少有 2 个证书,一个 CA 的,一个 EMQX 的,EMQX 的证书由 CA 颁发,并用 CA 的证书验证。
在这里,我们假设您的系统已经安装了 OpenSSL。使用 OpenSSL 附带的工具集就可以生成我们需要的证书了。
进入OpenSSL-Win64\bin目录中,输入cmd。
首先,我们需要一个自签名的 CA 证书。生成这个证书需要有一个私钥为它签名,可以执行以下命令来生成私钥:
openssl genrsa -out ca.key 2048 |
这个命令将生成一个密钥长度为 2048 的密钥并保存在 ca.key 中。有了这个密钥,就可以用它来生成 EMQX 的根证书了:
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem |
根证书是整个信任链的起点,如果一个证书的每一级签发者向上一直到根证书都是可信的,那个我们就可以认为这个证书也是可信的。有了这个根证书,我们就可以用它来给其他实体签发实体证书了。
实体(在这里指的是 EMQX)也需要一个自己的私钥对来保证它对自己证书的控制权。生成这个密钥的过程和上面类似:
openssl genrsa -out emqx.key 2048 |
新建 openssl.cnf 文件,
req_distinguished_name :根据情况进行修改,
alt_names: BROKER_ADDRESS 修改为 EMQX 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com
注意:IP 和 DNS 二者保留其一即可,如果已购买域名,只需保留 DNS 并修改为你所使用的域名地址。
[req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_req prompt = no [req_distinguished_name] countryName = CN stateOrProvinceName = Zhejiang localityName = Hangzhou organizationName = EMQX commonName = CA [req_ext] subjectAltName = @alt_names [v3_req] subjectAltName = @alt_names [alt_names] IP.1 = BROKER_ADDRESS DNS.1 = BROKER_ADDRESS |
下图是我改的配置文件,可做参考模板。(我只用了IP地址)。
然后以这个密钥和配置签发一个证书请求:
openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr |
然后以根证书来签发 EMQX 的实体证书:
openssl x509 -req -in ./emqx.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf |
双向连接认证还需要创建客户端证书,首先需要创建客户端密钥:
openssl genrsa -out client.key 2048 |
使用生成的客户端密钥来创建一个客户端请求文件:
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=JiangSu/L=NanJing/O=EMQX/CN=client" |
最后使用先前生成好的服务端 CA 证书来给客户端签名,生成一个客户端证书:
openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem |
准备好服务端和客户端证书后,我们就可以在 EMQX 中启用 TLS/SSL 双向认证功能。
在 EMQX 中 mqtt:ssl 的默认监听端口为 8883。
将前文中通过 OpenSSL 工具生成的 emqx.pem、emqx.key 及 ca.pem 文件拷贝到 EMQX 的 etc/certs/ 目录下,并参考如下配置修改 emqx.conf:
## listener.ssl.$name is the IP address and port that the MQTT/SSL ## Value: IP:Port | Port listener.ssl.external = 8883 ## Path to the file containing the user's private PEM-encoded key. ## Value: File listener.ssl.external.keyfile = etc/certs/emqx.key ## 注意:如果 emqx.pem 是证书链,请确保第一个证书是服务器的证书,而不是 CA 证书。 ## Path to a file containing the user certificate. ## Value: File listener.ssl.external.certfile = etc/certs/emqx.pem ## 注意:ca.pem 用于保存服务器的中间 CA 证书和根 CA 证书。可以附加其他受信任的 CA,用来进行客户端证书验证。 ## Path to the file containing PEM-encoded CA certificates. The CA certificates ## Value: File listener.ssl.external.cacertfile = etc/certs/ca.pem ## A server only does x509-path validation in mode verify_peer, ## as it then sends a certificate request to the client (this ## message is not sent if the verify option is verify_none). ## ## Value: verify_peer | verify_none listener.ssl.external.verify = verify_peer ## Used together with {verify, verify_peer} by an SSL server. If set to true, ## the server fails if the client does not have a certificate to send, that is, ## sends an empty certificate. ## ## Value: true | false listener.ssl.external.fail_if_no_peer_cert = true |
原本的emqx.conf文件:
改过之后的emqx.conf文件:
生成的所需ca.pem、emqx.key、emqx.pem在OpenSSL-Win64/bin中,将这三个文本拷贝进emqt/etc/certs中。
当配置完成并重启 EMQX 后,我们使用 MQTT 客户端工具 - MQTT X(该工具跨平台且支持 MQTT 5.0),来验证 TLS 双向认证服务是否正常运行。(MQTT X 版本要求:v1.3.2 及以上版本)。
先将OpenSSL-Win64\bin目录中的(自签名证书中生成的) ca.pem 文件,(客户端证书)client.pem文件 和(客户端密钥 )client.key 文件拷贝到emqt/etc/certs中。
参照下图在 MQTT X 中创建 MQTT 客户端(Host 输入框里的 192.168.7.192 需替换为实际的 EMQX 服务器 IP)。
此时 Certificate 一栏需要选择 Self signed ,并携带自签名证书中生成的 ca.pem 文件, 客户端证书 client.pem 和客户端密钥 client.key 文件。
点击 Connect 按钮,连接成功后,如果能正常执行 MQTT 发布/订阅 操作,则 SSL 双向连接认证配置成功。
开发板中所上传的库,每个动态库的名字需要另外用shell命令来cp成后缀加.1.(如cp libpaho-mqtt3a.so libpaho-mqtt3a.so.1)。移植Linux中这几个库带有软链接,在SylixOS中需要手动添加。
图 7-3 板子的lib目录mqtt库
2.如要测MQTTS的SSL双向加密功能,App应用程序文件,将OpenSSL-Win64\bin目录中的(自签名证书中生成的) ca.pem 文件,(客户端证书)client.pem文件 和(客户端密钥 )client.key 文件也上传到apps目录下。如图 7-4所示:
图 7-4 板子的apps目录 mqtt 测试程序
3.在每个测试应用程序中需要手动根据自己的电脑进行配置服务器IP,端口号。服务器IP和端口号需要与MQTTX桌面客户端工具中的服务器IP,端口号一致。(测试电脑IP为192.168.1.192),测试代码中的服务器IP宏和MQTTX软件配置信息如图 7-5 所示:
图 7-5 测试代码中的服务器IP宏和MQTTX软件配置信息
测试libpaho-mqtt3c的功能是否正常。
使用MQTTClient_publish.c、MQTTClient_subscribe.c 和 MQTTClient_publish_async.c:MQTT客户端简单代码示例,测试libpaho-mqtt3c的功能是否正常。
ifconfig en1 inet 192.168.1.236 //设置 IP 地址 ifconfig en1 gateway 192.168.1.1 //设置网关 |
图 7-6 开发板和电脑同网段
3.此时测试代码的服务器地址应该配置为:#define ADDRESS "tcp://192.168.1.192:1883",服务器地址为192.168.1.192,端口号为1883,最后点击Connect即可,配置服务器信息如图 7-7所示。
图 7-7 MQTTX服务器配置
4. 执行测试指令,先执行MQTTClient_subscribe订阅,再执行MQTTClient_publish和MQTTClient_publish_async发布,此时需要打开两个终端,观察分析输出测试结果,如图 7-8所示。
终端1输入shell命令:./MQTTClient_subscribe //订阅 终端2输入shell命令:./MQTTClient_publish //发布 |
图 7-8 输出测试结果
5.测试结果
测试MQTTClient_publish和 MQTTClient_publish_async发布,MQTTClient_subscribe订阅都能够收到消息,测试成功,libpaho-mqtt3c的功能正常。
测试libpaho-mqtt3a的功能是否正常。
2.测试方法
使用MQTTAsync_publish.c、MQTTAsync_subscribe.c :MQTT异步简单代码示例,测试libpaho-mqtt3a的功能是否正常。
3.测试步骤
1 ) 使用编译出的libpaho-mqtt3a库文件和自带的测试程序MQTTAsync_publish.c、MQTTAsync_subscribe.c 上传到开发板的 SylixOS 系统上,进行测试。
2 ) 执行测试指令,先执行MQTTAsync_subscribe订阅,再执行MQTTAsync_publish发布,观察分析输出测试结果,如图 7-9所示。
终端1输入shell命令:./MQTTAsync_subscribe //订阅 终端2输入shell命令:./MQTTAsync_publish //发布 |
图 7-9 输出测试结果
4.测试结果
测试MQTTAsync_publish发布,MQTTAsync_subscribe订阅都能够收到消息,测试成功,libpaho-mqtt3a的功能正常。
测试libpaho-mqtt3as的功能是否正常。
2.测试方法
使用paho_c_pub.c、paho_c_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3as的功能是否正常。
3.测试步骤
1 ) 使用编译出的libpaho-mqtt3as库文件和自带的测试程序paho_c_pub.c、paho_c_sub.c上传到开发板的 SylixOS 系统上,进行测试。
2 ) 执行测试指令,先执行paho_c_sub订阅,再执行paho_c_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果,如图 7-10所示。
终端1输入shell命令:./paho_c_sub -t topic -c "tcp://192.168.7.192:8883" //订阅 终端2输入shell命令:./paho_c_pub -t topic -c "tcp://192.168.7.192:8883" //发布 |
图 7-10 输出测试结果
4.测试结果
测试paho_c_pub连续发布,paho_c_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3as的功能正常。
测试libpaho-mqtt3as的ssl加密功能是否正常。
2.测试方法
使用paho_c_pub.c、paho_c_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3as的功能是否正常。
3.测试步骤
1 ) 使用编译出的libpaho-mqtt3as库文件和自带的测试程序paho_c_pub.c、paho_c_sub.c上传到开发板的 SylixOS 系统上,进行测试。
2 ) 执行测试指令,先执行paho_c_sub订阅,再执行paho_c_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果,如图 7-10所示。
终端1输入shell命令:./paho_cs_sub -t topic -c "ssl://192.168.7.192:8883" //订阅 终端2输入shell命令:./paho_cs_pub -t topic -c "ssl://192.168.7.192:8883" //发布 |
图 7-10 输出测试结果
4.测试结果
测试paho_c_pub连续发布,paho_c_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3as的SSL加密功能正常。
测试libpaho-mqtt3cs的功能是否正常。
2.测试方法
使用paho_cs_pub.c、paho_cs_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3cs的功能是否正常。
3.测试步骤
1 ) 使用编译出的libpaho-mqtt3cs库文件和自带的测试程序paho_cs_pub.c、paho_cs_sub.c上传到开发板的 SylixOS 系统上,进行测试。
2 ) 执行测试指令,先执行paho_cs_sub订阅,再执行paho_cs_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果,如图 7-11所示。
终端1输入shell命令:./paho_cs_sub -t topic -c "ssl://192.168.7.192:8883" //订阅 终端2输入shell命令:./paho_cs_pub -t topic -c "ssl://192.168.7.192:8883" //发布 |
图 7-11 输出测试结果
4.测试结果
测试paho_cs_pub连续发布,paho_cs_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3cs的功能正常。
测试libpaho-mqtt3cs的ssl加密功能是否正常。
2.测试方法
使用paho_cs_pub.c、paho_cs_sub.c和pubsub_opts.c :MQTT异步简单代码示例,测试libpaho-mqtt3cs的功能是否正常。
3.测试步骤
1 ) 使用编译出的libpaho-mqtt3cs库文件和自带的测试程序paho_cs_pub.c、paho_cs_sub.c上传到开发板的 SylixOS 系统上,进行测试。
2 ) 执行测试指令,先执行paho_cs_sub订阅,再执行paho_cs_pub发布,在发布端可随意输入想要发布的信息。观察分析输出测试结果,如图 7-11所示。
终端1输入shell命令:./paho_cs_sub -t topic -c "ssl://192.168.7.192:8883" //订阅 终端2输入shell命令:./paho_cs_pub -t topic -c "ssl://192.168.7.192:8883" //发布 |
图 7-11 输出测试结果
4.测试结果
测试paho_cs_pub连续发布,paho_cs_sub订阅能够连续接收消息,测试成功,libpaho-mqtt3cs的ssl加密功能正常。
1. lib_paho-mqtt-c 在翼辉信息的 RealEvo-IDE 5.0.2 软件中可以编译成功生成库工程。
2. 在 SylixOS 32/64位操作系统中,均可以完成消息传递的且正确无误。
3.本次测试是在32位虚拟机和64位虚拟机测试的。详情配置可参考《RealEvo-Simulator使用手册》。
注意在a9的板子上需要加上这段代码:
否则会出现
的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。