华为云IoT智慧物流案例09 | 应用端MQTT开发(Openssl+Paho-MQTT) 构建嵌入式硬件与服务器的MQTT通信

举报
实柏 发表于 2021/08/04 22:40:20 2021/08/04
【摘要】 第一章 交叉编译Openssl一、Openssl作用:目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。下载链接:https://www.openssl.org/so...

第一章 交叉编译Openssl

一、Openssl
作用:
目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。
下载链接:https://www.openssl.org/source/
openssl
交叉编译Openssl
1. 创建交叉编译后的库路径文件夹
在这里插入图片描述
2. 解压openssl压缩包后配置其config编译条件
./config配置生成Makefile,-shared 表示生成动态库,也可通过参数 -prefix=xxx 自行指定安装目录,如下不配置则为默认安装路径
open

3. 命令:./config no-asm -shared --prefix=/home/wgpcgr/libs_build/openssl/build_arm no-async
配置
4. 修改OpensslMakefile文件,配置其make的编译器

vim Makefile

修改编译器:arm-linux-gnueabihf-gcc/arm-linux-gnueabihf-g++
修改
搜索-m64选项并删除,共两处(否则make后会报错)

:/-m64

在这里插入图片描述
5.makemake install
会安装在./config时指定的路径
安装完成后如下图
在这里插入图片描述

第二章 Paho mqtt客户端

下载链接:http://www.eclipse.org/paho/index.php?page=downloads.php
paho
1. 解压后在VS Code打开,修改Makefile文件
-指定交叉编译器arm-linux-gnueabihf-gcc

  • 指定openssl路径
    makefile
    2. 打开路径:MQTTPacket/sample/pub0sub1.c
    填入华为云平台MQTT地址(iot-mqtts.cn-north-4.myhuaweicloud.com)与端口号(1883
    地址
    3. 填入自己的三元组信息clientID、username、password
    三元组
    4. 填入自己的订阅和发布Topic
    topic
    5. 更改第一个参数payload要传入的消息(json字段)通过命令行的方式输入(通过命令行测试客户端通讯,后边QT应用开发时程序设计依据这个传入json数据)
	//char* payload = "{\"a\":60}";  这里改为命令行输入
	char* payload = argv[1];   //第一个参数 为json格式的数据包

在这里插入图片描述

6. make编译输出文件
在这里插入图片描述
7. scp库文件到开发板并且配置好客户端所依赖的库文件及库路径
scp
此次我存放库文件到路径:/usr/local/paho-mqtt
配置库路径:vi /etc/ld.so.conf ,添加上自己的库路径
添加完后输入命令 /sbin/ldconfig 缓存路径配置
库
缓存

8. scp发送至开发板测试MQTT客户端能否正常通讯
scp
9. 运行客户端文件并写入json数据进行测试(step.5 将输入第一个参数作为json数据发送)
命令:

./pub0sub1 {"test":123}

可以看到json数据已经发送给了华为云平台,我们打开华为云平台查看追踪消息
mqtt
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 writerjson数据封装,格式化为字符串
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/

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。