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,显示发送成功
电脑成功收到:
测试成功!