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/mqtt

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

scp -r book@192.168.137.12:/home/book/linux/tool/mqtt/paho.mqtt.c/build-cross/src /home/root/tool/mqtt

 scp -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     10000L

int 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,显示发送成功

电脑成功收到:

测试成功!

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 17:44:03       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 17:44:03       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 17:44:03       90 阅读
  4. Python语言-面向对象

    2024-07-10 17:44:03       98 阅读

热门阅读

  1. springboot中在filter中用threadlocal存放用户身份信息

    2024-07-10 17:44:03       32 阅读
  2. LDAP技术解析:打造安全、高效的企业数据架构

    2024-07-10 17:44:03       24 阅读
  3. android 替换设置-安全里面的指纹背景图片

    2024-07-10 17:44:03       29 阅读
  4. Node.js的应用场景

    2024-07-10 17:44:03       26 阅读
  5. 并发请求的艺术:Postman中实现高效API测试

    2024-07-10 17:44:03       32 阅读
  6. 关于TCP的三次握手流程

    2024-07-10 17:44:03       28 阅读
  7. stm32毫秒ms延时,HAL_Delay()

    2024-07-10 17:44:03       25 阅读