华为云IoT智慧物流案例09 | 应用端MQTT开发(Openssl+Paho-MQTT) 构建嵌入式硬件与服务器的MQTT通信
第一章 交叉编译Openssl
一、Openssl
作用:
目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。
下载链接:https://www.openssl.org/source/
交叉编译Openssl
1. 创建交叉编译后的库路径文件夹
2. 解压openssl压缩包
后配置其config
编译条件
./config配置生成Makefile,-shared 表示生成动态库,也可通过参数 -prefix=xxx 自行指定安装目录,如下不配置则为默认安装路径
3. 命令:./config no-asm -shared --prefix=/home/wgpcgr/libs_build/openssl/build_arm no-async
4. 修改Openssl
的Makefile
文件,配置其make
的编译器
vim Makefile
修改编译器:arm-linux-gnueabihf-gcc/arm-linux-gnueabihf-g++
搜索-m64
选项并删除,共两处(否则make
后会报错)
:/-m64
5.make
及make install
会安装在./config
时指定的路径
安装完成后如下图
第二章 Paho mqtt客户端
下载链接:http://www.eclipse.org/paho/index.php?page=downloads.php
1. 解压后在VS Code
打开,修改Makefile
文件
-指定交叉编译器arm-linux-gnueabihf-gcc
- 指定openssl路径
2. 打开路径:MQTTPacket/sample/pub0sub1.c
填入华为云平台MQTT地址(iot-mqtts.cn-north-4.myhuaweicloud.com
)与端口号(1883
)
3. 填入自己的三元组信息clientID、username、password
4. 填入自己的订阅和发布Topic
5. 更改第一个参数payload
将要传入的消息(json字段)通过命令行的方式输入(通过命令行测试客户端通讯,后边QT应用开发时程序设计依据这个传入json数据)
//char* payload = "{\"a\":60}"; 这里改为命令行输入
char* payload = argv[1]; //第一个参数 为json格式的数据包
6. make
编译输出文件
7. scp
库文件到开发板并且配置好客户端所依赖的库文件及库路径
此次我存放库文件到路径:/usr/local/paho-mqtt
配置库路径:vi /etc/ld.so.conf
,添加上自己的库路径
添加完后输入命令 /sbin/ldconfig
缓存路径配置
8. scp
发送至开发板测试MQTT客户端能否正常通讯
9. 运行客户端文件并写入json数据
进行测试(step.5 将输入第一个参数作为json数据
发送)
命令:
./pub0sub1 {"test":123}
可以看到json数据
已经发送给了华为云平台,我们打开华为云平台查看追踪消息
10. 华为云平台显示MQTT客户端所上报的json数据
,验证客户端与平台间的通讯成功
第三章 完善QT应用,通过Qprocess与外部软件(MQTT客户端)交互
1. 添加控件open_btn
进行控制
2. 通过定时处理串口数据函数封装json数据
根据json上报数据的格式
定义Json::A B C root writer
A["service_id"] = "Sensor";
//将service_id与自己定义的物模型的服务ID相对应
B["Temperature"] = temperature; B["Humidity"] = humidity; B["Light"] = light;
//将获取的传感器数据与自己的属性ID相对应
A["properties"]=B;
//将B的json数据打包封装成A的格式
append writer
将json数据
封装,格式化为字符串
QString
将格式化后的字符串转为QString字符串
qDebug
打印出转化后的QString字符串
Json::Value root;
Json::Value A;
Json::Value B;
Json::Value C;
Json::FastWriter writer;
B["Longitude"] = gpsLong;
B["Latitude"] = gpslat;
A["service_id"] = "Track";
A["properties"]=B;
root["services"].append(A);
B["Temperature"] = temperature;
B["Humidity"] = humidity;
B["Light"] = light;
A["service_id"] = "Sensor";
A["properties"]=B;
root["services"].append(A);
std::string json_file = writer.write(root);
QString qstr = QString::fromStdString(json_file); //std::string 转QString
qDebug() << "mqtt--->start--->" << qstr;
3. 打开串口读取数据按钮时定时调用gpsparse函数
4. 用QProcess
开启线程,实现Qt应用调用MQTT客户端
QProcess *process = new QProcess(); //开启新线程,调用MQTT
5.
QString
定义mqtt客户端
文件的名字- 定义
QStringList列表类型
设置后面process
要传递给这个外部程序的参数。 - 设置外部文件的路径(相对于Qt执行程序的相对路径,也可以改成绝对路径)
- 设置传递的参数为
QString
(实时变化的参数,json数据
)
QString str_exe;
QStringList args;
str_exe = "./pub0sub1"; //相对于Qt执行程序的相对路径,也可以改成绝对路径
args << qstr; //传递的参数,可以改成实时变化的
6. process->start
启动外部程序(MQTT客户端,设置跟随主程序退出而退出)
str_exe
:要启动的外部程序
args
:QStringList类型,设置要传递给这个外部程序的参数
process->start(str_exe,args); // 外部程序启动后,将随主程序的退出而退出。
7. 编译构建应用且传输至开发板测试
8. 应用运行效果:
打开串口按钮button
后串口打印json数据
(QString类型
)
9. 华为云平台数据实时接收显示成功
技术指导:
华为云社区与华为云学院:https://edu.huaweicloud.com/
- 点赞
- 收藏
- 关注作者
评论(0)