华为云IoT智慧物流案例08 | 应用端MQTT开发(Openssl) 构建嵌入式硬件与服务器的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/
|