imx6ull/linux应用编程学习(15) 移植MQTT客户端库/测试

1. 准备开发环境

确保你的Ubuntu系统已经安装了必要的工具和依赖项。打开终端并运行以下命令:

sudo apt update
sudo apt install build-essential cmake git

2. 获取MQTT库

git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c

3. 编译MQTT库

mkdir build
cd build
cmake ..
make
sudo make install

4. 配置交叉编译

cd paho.mqtt.c
mkdir build-cross
cd build-cross
cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc ..
make

5.传输和部署

编译完成后,将生成的库文件和相关的头文件传输到开发板

scp -r book@192.168.137.12:/home/book/linux/tool/mqtt/paho.mqtt.c/build-cross/src/libpaho-mqtt3c.so /home/root/tool/mqttscp -r book@192.168.137.12:/home/book/linux/tool/mqtt/paho.mqtt.c/build-cross/src/libpaho-mqtt3a.so /home/root/tool/mqttscp -r book@192.168.137.12:/home/book/linux/tool/mqtt/paho.mqtt.c/build-cross/src /home/root/tool/mqttscp -r book@192.168.137.12:/home/book/linux/tool/mqtt/paho.mqtt.c/src /home/root/tool/mqtt/include

注意

其库文件位置:

ubuntu:

/home/book/linux/tool/mqtt/paho.mqtt.c/build-cross/src

开发板:

/home/root/tool/mqtt/src

其头文件位置:

ubuntu:

/home/book/linux/tool/mqtt/paho.mqtt.c/src

开发板:

/home/root/tool/mqtt/include/src

但是这样子是不是觉得很乱,所以我们将其进行调整

在ubuntu的paho.mqtt.c创建install文件夹,文件夹内创建lib和include

将头文件存入include库文件存入lib

所以在ubuntu,头文件和库文件路径为:

/home/book/linux/tool/mqtt/paho.mqtt.c/install/include    //头文件
/home/book/linux/tool/mqtt/paho.mqtt.c/install/lib      //库文件

然后对开发板也进行修改

在mqtt文件夹执行(头文件)

cp -r include/src/* /home/root/tool/mqtt/install/include

然后再执行(库文件)

 cp -r src/* /home/root/tool/mqtt/install/lib

成功!

测试:

我们接下来编写测试程序,实现开发板作为客户端,向电脑发送消息

其中电脑mqtt设置为:

主机名/服务器地址:broker.hivemq.com

端口:1883

客户端id:429266196527478f9112b1b5dbc4ad8d(自己定就行)

点击apply后关掉

连接后,将主题定为led

订阅led

之后在开始编写程序啦!

在ubuntu系统,创建一个test存放我们的程序文件,

touch CMakeLists.txt,创建CMakeLists.txt文件

cmake_minimum_required(VERSION 3.5)
project(mqtt_test)# 添加包含头文件目录,在ubuntu编译,所以是ubuntu上的目录
include_directories(/home/book/linux/tool/mqtt/paho.mqtt.c/install/include)# 添加可执行文件,相对于${CC} -o mqtt_test mqtt_test.c,当然还是不一样的,
add_executable(mqtt_test mqtt_test.c)# 链接MQTT库,第一个mqtt_test是之后生成的文件名字,和上条语句对应,后面则是库文件目录/libpaho-mqtt3c.so 根据手册得libpaho-mqtt3c.so是同步模式mqtt库
target_link_libraries(mqtt_test /home/book/linux/tool/mqtt/paho.mqtt.c/install/lib/libpaho-mqtt3c.so)

具体里面有注释。

touch  toolchain-arm.cmake,创建toolchain-arm.cmake文件

##################################
# 配置 ARM 交叉编译
##################################
set(CMAKE_SYSTEM_NAME Linux) # 设置目标系统名字
set(CMAKE_SYSTEM_PROCESSOR arm) # 设置目标处理器架构# 指定交叉编译器
set(TOOLCHAIN_DIR /home/book/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/arm-linux-gnueabihf-g++)# 为编译器添加编译选项
set(CMAKE_C_FLAGS "-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")
set(CMAKE_CXX_FLAGS "-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7")# 设置查找路径模式
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
##################################
# end
##################################

里面交叉编译器路径改为自己的路径

touch mqtt_test.c,创建mqtt_test.c文件

#include <stdio.h>
#include <string.h>
#include "MQTTClient.h"#define ADDRESS     "tcp://broker.hivemq.com:1883"
#define CLIENTID    "a8612686ad69471daffc67a538def753"
#define TOPIC       "led"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000Lint main(int argc, char* argv[])
{MQTTClient client;MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;int rc;MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);conn_opts.keepAliveInterval = 20;conn_opts.cleansession = 1;if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS){printf("Failed to connect, return code %d\n", rc);return rc;}MQTTClient_message pubmsg = MQTTClient_message_initializer;MQTTClient_deliveryToken token;pubmsg.payload = PAYLOAD;pubmsg.payloadlen = strlen(PAYLOAD);pubmsg.qos = QOS;pubmsg.retained = 0;MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);printf("Waiting for up to %d seconds for publication of %s\n""on topic %s for client with ClientID: %s\n",(int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);printf("Message with delivery token %d delivered\n", token);MQTTClient_disconnect(client, 10000);MQTTClient_destroy(&client);return rc;
}

意思为:网址为tcp://broker.hivemq.com:1883,注意加上tcp因为是利用tcp协议进行连接的,端口1883,

客户端id:a8612686ad69471daffc67a538def753,这个自己定义,意思是开发板创建的客户端id为a8612686ad69471daffc67a538def753。

指定主题为:led     ,发送消息为“hello world”

传输质量为1     超时设为10000L。

后创建build文件夹,然后进入

执行cmake 

cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc ..

含义:

-DCMAKE_SYSTEM_NAME=Linux

-D 选项用于传递定义给 CMake。在这里,它定义了 CMAKE_SYSTEM_NAME 变量为 Linux,告诉 CMake 构建的目标系统是 Linux。

-DCMAKE_SYSTEM_PROCESSOR=arm

这个选项定义了 CMAKE_SYSTEM_PROCESSOR 变量为 arm,告诉 CMake 构建目标处理器架构是 ARM。

-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc

这个选项定义了 CMAKE_C_COMPILER 变量为 arm-linux-gnueabihf-gcc,指定使用的交叉编译器是 arm-linux-gnueabihf-gcc

..

这个选项表示要使用的 CMakeLists.txt 文件所在的上级目录。也就是说,当前命令是在 build 目录中执行的,而 CMakeLists.txt 文件在其上级目录。

当然,如果你环境配置好的话也可以直接用cmake ../

然后make

发现已经生成了mqtt_test

利用scp传入开发板。

scp -r book@192.168.137.12:/home/book/project/APP/app/33_mqtt/test/build/mqtt_test /home/root/mqtt_test

执行./mqtt_test,显示发送成功

电脑成功收到:

测试成功!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 开发中,异步渲染和异步绘制

在 iOS 开发中&#xff0c;异步渲染&#xff08;Asynchronous Rendering&#xff09;和异步绘制&#xff08;Asynchronous Drawing&#xff09;虽然有相似之处&#xff0c;但它们并不是完全相同的概念。 异步渲染&#xff08;Asynchronous Rendering&#xff09; 异步渲染主要…

【SVN的使用- SVN的基本命令-SVN命令简写-注意事项-解决冲突 Objective-C语言】

一、SVN的更新命令:update 1.服务器如果新建了一个文件夹,yuanxing,版本变成6了, 我现在本地还只有三个文件夹,版本5, 终端里边,我们敲一个svn update, 我这儿就多了一个yuanxing文件夹, 这个就是更新,就是把服务器最新的代码下载下来, 假设服务器上大家提交了这…

react VS vue

什么是react 用于构建用户界面的js库 什么是vue 用于构建用户界面的渐进式js库 react是基于mvvm设计还是mvc设计 1、react是基于mvc设计的&#xff0c;但也不是完整的mvc模式 2、react把自己定义为view 3、组件逻辑定义为Controller层 4、虽然react不是完整的mvc模式&a…

KNIME 5.2.5 版本界面切换

1、安装完KNIME后&#xff0c;点击“Create workflow in your local space.” 2、发现是这个样子 4、进行切换。点击“menu”&#xff0c;最后点击“Switch to classic user interfaceto” 5、最终显示结果&#xff1a;

补光灯LED照明 2.7V4.2V5V升60V80V100V升压恒流芯片IC-H6902B

H6902B升压恒流芯片IC确实是一款为LED照明应用设计的稳定且可靠的解决方案。这款芯片具有以下几个显著特点&#xff1a; 高效率&#xff1a;效率高达95%以上&#xff0c;这意味着在驱动LED灯时&#xff0c;电源到LED的能量转换效率非常高&#xff0c;减少了能量损失&#xff0…

代码随想录算法训练营:30/60

非科班学习算法day30 | LeetCode452:用最少数量的箭引爆气球 &#xff0c;Leetcode435:无重叠区间 &#xff0c;Leetcode763:划分字母区间 介绍 包含LC的两道题目&#xff0c;还有相应概念的补充。 相关图解和更多版本&#xff1a; 代码随想录 (programmercarl.com)https:/…

centos磁盘空间满了-问题解决

报错问题解释&#xff1a; CentOS系统在运行过程中可能会出现磁盘空间不足的错误。这通常发生在以下几种情况&#xff1a; 系统日志文件或临时文件过大导致磁盘空间不足。 安装了大量软件或文件而没有清理无用文件。 有可能是某个进程占用了大量磁盘空间。 问题解决方法&a…

多服务下,服务与服务之间的调用(SpringCloudAlibaba入门一)

多服务下&#xff0c;服务与服务之间的调用&#xff08;SpringCloudAlibaba入门一&#xff09; 说明直接看代码 说明 在SpringBoot情况下&#xff0c;如果我们有多个子模块而且代码之间没有相互引用&#xff0c;那么子项目与子项目之间的调用方式就只能通过http请求的方式去调用…

必看!微信小程序必备证书!

微信小程序必备SSL证书。在日益增长的数字经济中&#xff0c;微信小程序已成为商家与消费者之间重要的交互平台。由于其便捷性和广泛的用户基础&#xff0c;越来越多的企业选择通过小程序来提供服务。然而&#xff0c;在开发和部署微信小程序时&#xff0c;确保数据安全是一个不…

Ubuntu22.04.4 LTS系统/安装Anaconda【GPU版】

安装过程 1.wget命令行下载 下载Anaconda并保存文件至本地指定目录 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh -P ~/Downloads/anaconda3 查看是否下载好了 2.安装Anaconda 2.1 bash命令安装 bash后面是anaconda3下载好的路径 bash …

学生选课管理系统(Java+MySQL)

技术栈 Java: 用于实现系统的核心业务逻辑。MySQL: 作为关系型数据库&#xff0c;用于存储系统中的数据。JDBC: 用于Java程序与MySQL数据库之间的连接和交互。Swing GUI: 用于创建图形用户界面&#xff0c;提升用户体验。 系统功能 我们的学生选课管理系统主要针对学生和管理…

AIGC 与软件开发:是助力还是取代?

《AIGC 与软件开发&#xff1a;是助力还是取代&#xff1f;》 在当今的软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的崛起无疑是一场变革性的浪潮。从代码生成到错误检测&#xff0c;再到自动化测试&#xff0c;AI 工具正以前所未有的方式融入开发者…

vue3源码(六)渲染原理-runtime-core

1.依赖关系 runtime-dom 依赖于runtime-core,runtime-core 依赖于reactivity和sharedruntime-core提供跨平台的渲染方法createRenderer&#xff0c;用户可以自己传递节点渲染的渲染方法renderOptions&#xff0c;本身不关心用户使用什么APIruntime-dom提供了为浏览器而生的渲染…

MSI打包后门成安装包

目录 浏览器下载地址 启动>next 选择后门所在路径&#xff0c;和生成安装包后存放路径 next>Hidden 配置变量 Look up随便找个伪装&#xff0c;然后点击一下Creat New ​注册表Registry导入 ​点击否&#xff0c;不购买专业版 ​安装包生成成功​编辑 浏览器下…

Mybatis进阶の常用配置级联查询

2 Mybatis常用配置 mybatis-config.xml中除了可以配置数据库服务器的环境以外&#xff0c;还可以配置其他的操作&#xff0c;帮助开发人员简化配置代码。常见的配置信息有以下内容&#xff1a; 1 配置内容 SqlMapConfig.xml中配置的内容和顺序如下&#xff1a;properties&am…

(自用)共享单车服务器(一):服务器项目配置

项目目录结构 conf:用来存放配置文件 git:用来存放从git上克隆的项目 src:用来存放项目源文件 test:用来存放测试文件 third:用来存放第三方头文件、第三方库 安装iniparser(关于iniparser的使用需进一步学习) 1.项目目录中创建git文件夹&#xff0c;用于存放GitHub上克隆…

计算机网络-IGMPv1工作原理简介

一、IGMPv1的原理简介 前面我们大致了解了IGMP用于在连接组播组成员的组播路由器总通过交互IGMP报文生成IGMP组表项和IGMP路由表项。IGMP报文封装在IP报文中。到目前为止&#xff0c;IGMP有三个版本&#xff1a;IGMPv1、IGMPv2、IGMPv3。 今天主要学习IGMPv1的作用和工作原理。…

深度学习论文: LLaMA: Open and Efficient Foundation Language Models

深度学习论文: LLaMA: Open and Efficient Foundation Language Models LLaMA: Open and Efficient Foundation Language Models PDF:https://arxiv.org/pdf/2302.13971.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 1 概述 本文介绍了LLaMA&#xff0…

浅谈重要组件JSR223介绍

浅谈重要组件JSR223介绍 JSR223 脚本组件是一个极其强大的特性&#xff0c;它允许用户利用各种脚本语言编写复杂的测试逻辑&#xff0c;极大地增强了 JMeter 的灵活性和功能。本文将对 JSR223 进行详细介绍&#xff0c;并解释如何在 JMeter 测试计划中有效地应用它。 JSR223 …

数据开源 | Magic Data大模型高质量十万轮对话数据集

能够自然的与人类进行聊天交谈&#xff0c;是现今的大语言模型 (LLM) 区别于传统语言模型的重要能力之一&#xff0c;近日OpenAI推出的GPT-4o给我们展示了这样的可能性。 对话于人类来说是与生俱来的&#xff0c;但构建具备对话能力的大模型是一项不小的挑战&#xff0c;收集高…