• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
WGP CGR实柏
帮助1

第一章 交叉编译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. 修改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
学新通
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 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/

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfkijai
系列文章
更多 icon
同类精品
更多 icon
继续加载