嵌入式linux应用初步移植mqtt到ubuntu和linux开发板(代码片段)

韦东山 韦东山     2023-03-03     561

关键词:

1. 概述

​ 本篇主要是记录将MQTT移植安装到百问网STM32MP157开发板上,并且是跑一下MQTT的一个例程来验证,要完成本次移植安装,必须要保证电脑和开发板都能上网。。

2. 软件平台

​ 本次使用的是Ubuntu18.04,是由百问网提供的,并且是按照他们的手册搭建好了交叉编译环境,花了一点时间将Linux内核编译好之后才进行的LVGL移植,本次移植必须搭建好嵌入式Linux的交叉编译环境且内核也必须编译好,否则无法完成移植。

3. 移植所需要的资源

​ 本次实验主要是要将paho mqtt的官方库克隆到本地pc,将其编译后得到链接库,然后安装到本地pc以及开发板上,这样才能运行paho mqtt编译后的可执行文件,paho mqtt的官方仓库地址:

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

在Ubuntu的/home/book目录下新建一个工作区用来保存工程和开发资料:

cd /home/book
book@100ask:~$ mkdir workspace && cd workspace
book@100ask:~/workspace$ mkdir mqtt && cd mqtt

/home/book/workspace/mqtt下讲paho mqtt的仓库克隆下来:

book@100ask:~/workspace/mqtt$ git clone https://github.com/eclipse/paho.mqtt.c.git

等待下载完成:

Cloning into 'paho.mqtt.c'...
remote: Enumerating objects: 11797, done.
remote: Counting objects: 100% (1741/1741), done.
remote: Compressing objects: 100% (485/485), done.
remote: Total 11797 (delta 1272), reused 1628 (delta 1204), pack-reused 10056
Receiving objects: 100% (11797/11797), 9.27 MiB | 6.78 MiB/s, done.
Resolving deltas: 100% (8385/8385), done.

4. 安装mqtt到ubuntu

4.1 修改Makefile适配GCC环境

进入刚才克隆下来的这个仓库paho.mqtt.c,修改Makefile:

book@100ask:~/workspace/mqtt$ cd paho.mqtt.c/
book@100ask:~/workspace/mqtt/paho.mqtt.c$ vim Makefile

进入vim后如果要显示行号首先按下键盘的ESC键,然后键入:set nu就可以显示行号了:

我们需要关注的有两个地方:

  • 编译器:Makefile的126行
  • 库安装路径:Makefile的70行


如果我们只需要在Ubuntu里面使用paho mqtt的话,这些都不需要改变,直接在/home/book/workspace/mqtt/paho.mqtt.c目录下执行下面两条命令即可:

make
sudo make install

4.2 编译和安装库文件

执行make后会在当前目录下创建一个build目录,源码和例程编译出来的可执行文件都在里面,然后再执行sudo make install

这条指令会将mqtt程序依赖的库文件安装到/usr/local下的binlibincludeshare下。

4.3 体验测试

​ 我们可以将官方的示例代码copy过来,改成我们自己的配置,比如iot的url、客户端ID、用户名和密码这些,改成我们自己的mqtt服务器的信息测试下。

​ 我们去/home/book/workspace目录下新建一个测试工程,取名就叫’mqtt_test’吧:

book@100ask:~/workspace$ cd /home/book/workspace
book@100ask:~/workspace$ mkdir mqtt_test
book@100ask:~/workspace$ cd mqtt_test

paho.mqtt.c下的src和sample里面的随意一个示例代码copy过来:

book@100ask:~/workspace/mqtt_test$ cp -r /home/book/workspace/mqtt/paho.mqtt.c/src ./
book@100ask:~/workspace/mqtt_test$ cp src/samples/MQTTAsync_subscribe.c  ./

我们这里copy的是MQTTAsync开头的例程,其表示的是MQTT的异步通信收发,依赖的库是libpaho-mqtt3a,如果是MQTTClient开头的,依赖的库就是libpaho-mqtt3c,如果自己写代码还会用到SSL的话,依赖的库就会变成libpaho-mqt3cs或者ibpaho-mqtt3as。如何确定使用的是Async还是Client呢,根据自己写的代码里面包含的头文件是MQTTAsync.h还是MQTTClient.h,比如我刚才copy的例程MQTTAsync_subscribe.c

​ 我们现在来修改这个示例代码。首先是头文件MQTTAsync.h,我们需要指定路径,不然在当前目录下是找不到这个头文件的,我们已经将这个头文件所在的官方源文件文件夹srccopy过来了,所以只需要改成:

#include "src/MQTTAsync.h"

然后修改url和客户端id这些信息,原来的参数是这样的:

 32 #define ADDRESS     "tcp://mqtt.eclipseprojects.io:1883"
 33 #define CLIENTID    "ExampleClientSub"
 34 #define TOPIC       "MQTT Examples"

我们要修改ADDRESSCLIENTID以及订阅的TOPIC,还要添加阿里云物联网平台设备的用户名USERNAME和密码PASSWORD

鉴于阿里云物联网平台的要求,我们需要将连接控制包的keepAliveInterval设置位60,并且对控制包的用户名username和密码password赋值为我们宏定义的值:

/* void connlost(void *context, char *cause) */ 
conn_opts.username = USERNAME;
conn_opts.password = PASSWORD;
conn_opts.keepAliveInterval = 60;

/* int main(int argc, char* argv[]) */
conn_opts.username = USERNAME;
conn_opts.password = PASSWORD;
conn_opts.keepAliveInterval = 60;

然后保存退出(ESC–>:wq)。

​ 编译修改号之后的MQTTAsync_subscribe.c

book@100ask:~/workspace/mqtt_test$ gcc MQTTAsync_subscribe.c -lpaho-mqtt3a
book@100ask:~/workspace/mqtt_test$ ls
a.out  MQTTAsync_subscribe.c  src

可以看到生成了一个a.out,我们执行整个文件:

book@100ask:~/workspace/mqtt_test$ ./a.out 

如果连接成功了且订阅也成功了会打印如下信息:

这时候我们从阿里云服务器下发一条消息看看:

回到我们的终端看是否有收到消息:

这就说明我们在Ubuntu下已经成功移植了paho mqtt,接下来我们将它移植到Linux开发板上,这里使用的是百问网的100ASK STM32MP157开发板。

5. 移植mqtt到linux开发板

5.1 查看自己的编译环境

book@100ask:~/workspace/mqtt$ echo $ARCH
arm
book@100ask:~/workspace/mqtt$ echo $CROSS_COMPILE 
arm-buildroot-linux-gnueabihf-
book@100ask:~/workspace/mqtt$ echo $PATH
/home/book/.vscode-server/bin/30d9c6cd9483b2cc586687151bcbcd635f373630/bin/remote-cli:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

检查下编译器是否生效可用:

book@100ask:~/workspace/mqtt$ arm-buildroot-linux-gnueabihf-gcc -v

5.2 修改Makefile

  • 修改编译器

改成自己的编译器,比如这里将其改成:CC ?=arm-buildroot-linux-gnueabihf-gcc

book@100ask:~/workspace/mqtt$ cd /home/book/workspace/mqtt/paho.mqtt.c

再修改之前先将原先用gcc编译的clean清除掉:

book@100ask:~/workspace/mqtt/paho.mqtt.c$ make clean
rm -rf build/output/*
rm -rf build/

然后去修改Makefile:

  • 修改库安装路径

    参考gcc下是将库安装到了/user里面的,所以我们也要将路径指定到我们自己编译链下的usr中,比如百问网的工具链/usr/local就是如下所示

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf

所以原本的

就改成下图所示的这样:

这里太长没有截图显示全,然后保存退出编辑。

5.3 编译源文件且安装库文件

​ 在paHo.mqtt.c中再重新执行一遍下面的命令:

book@100ask:~/workspace/mqtt/paho.mqtt.c$ make
book@100ask:~/workspace/mqtt/paho.mqtt.c$ sudo make install

5.4 安装库文件到开发板

​ 在上一步make之后就生成了arm-gcc编译后的库文件.so文件,保存在paho.mqtt.c/build/output里面

我们将其复制到挂载共享目录/home/book/nfs_rootfs里面去,为了方便管理我们需要现在这个目录下创建一个文件夹来存放mqtt的库,取名就叫mqtt_lib吧:

book@100ask:~$ cd nfs_rootfs/
book@100ask:~/nfs_rootfs$ mkdir mqtt_lib
book@100ask:~/nfs_rootfs$ cd mqtt_lib/

我们把mqtt的库文件copy过去:

book@100ask:~/workspace/mqtt/paho.mqtt.c$ sudo cp build/output/libpaho-mqtt3* ~/nfs_rootfs/mqtt_lib

接着将开发板的/mnt挂载到虚拟机的nfs_rootfs目录:

mount -t nfs -o nolock,vers=3 192.168.50.12:/home/book/nfs_rootfs /mnt

使用install或者mv指令将/mnt/mqtt_lib中的所有mqtt库文件安装到开发板的/lib目录下:

install /mnt/mqtt_lib/libpaho-mqtt3* /lib

5.5 重新编译测试文件

book@100ask:~$ cd /home/book/workspace/mqtt_test
book@100ask:~/workspace/mqtt_test$ arm-buildroot-linux-gnueabihf-gcc MQTTAsync_subscribe.c -lpaho-mqtt3a

将重新编译出来的执行文件a.out复制到nfs_rootfs中去:

book@100ask:~/workspace/mqtt_test$ cp a.out ~/nfs_rootfs/

然后回到开发板,将/mnt目录下的a.out复制到根目录,然后执行:

# cp /mnt/a.out ./
# ./a.out

可以看到,开发板也能成功的和阿里云物联网设备通过MQTT协议通信了,最后这里就不再下发数据测试了。

嵌入式linux应用开发squarelinestudio与lvgl模拟器(代码片段)

...辅助工具,以及利用这些工具将LVGL制作UI之后移植到嵌入式Linux开发板上显示。温湿度监控系统应用开发所有文章【嵌入式Linux应用开发】移植LVGL到Linux开发板【嵌入式Linux应用开发】初步移植MQTT到Ubuntu和Linux开发板【嵌入式L... 查看详情

嵌入式linux高级案例-移植lvgl到linux开发板(代码片段)

...核编译好之后才进行的LVGL移植,本次移植必须搭建好嵌入式Linux的交叉编译环境且 查看详情

交叉编译vim并移植到arm嵌入式linux系统

   原创作品,允许转载,转载时请务必以超链接形式标明文章、作者信息和本声明,否则将追究法律责任。   众所周知,vim是vi的增强版本,实际体验要比vi好用很多,由于笔者为ARM系统制作的基于busybox的文件系统... 查看详情

uboot研读笔记|03-初步移植uboot2012.04到jz2440(修改时钟,配置串口)(代码片段)

...:https://github.com/Mculover666/uboot-jz24400.教程完整目录00-嵌入式Linux系统中Bootloader的作用和基本运行原理01-下载uboot源码并使用VSCode远程查看源码、编译uboot(2012.04.01版本)02-详细探索uboot启动过程(基于S3C2410处理器&# 查看详情

《基于armcortex-a9的嵌入式linux内核移植研究与实现》

[1]罗名驹.基于ARMCortex-A9的嵌入式Linux内核移植研究与实现[D].广东工业大学,2017.文章目录​​移植环境搭建​​​​设备树​​​​uboot​​​​内核移植​​​​根文件系统构建​​移植环境搭建1.ubuntu安装嵌入式开发通常是在... 查看详情

嵌入式linux根文件系统移植——根文件系统简介

嵌入式Linux根文件系统移植(二)——根文件系统简介    根文件系统是内核启动时挂载的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的... 查看详情

嵌入式linux系统移植——bsp分析

嵌入式Linux系统移植——BSP分析一、BSP简介    嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌... 查看详情

嵌入式linux应用开发设计温湿度采集mcu子系统(代码片段)

...的温湿度监控系统。温湿度监控系统应用开发所有文章【嵌入式Linux应用开发】移植LVGL到Lin 查看详情

u-boot-2016.07移植(第一篇)初步分析

U-BOOT-2016.07移植 (第一篇) 初步分析目录U-BOOT-201607移植 第一篇 初步分析目录编译和移植环境更新交叉编译工具1下载arm-linux-gcc4432安装arm-linux-gcc443安装环境Ubuntu910下载u-boot-201607并解压分析顶层Makefile1找出目标依赖关系2总结... 查看详情

i.mx6ull应用移植|移植wpa_supplicant到linux开发板(2.7版本)(代码片段)

...xff0c;支持WEP、WPA和WPA2(IEEE802.11i).。可以在桌面、笔记本、嵌入式系统中使用。wpa_supplicant是在客户端使用的IEEE802.1X/WPA组件,支持与WPAAuthenticator的交互, 查看详情

sourceinsight安装在linux上啊(虚拟机环境)求具体步骤!望各位高手不吝赐教!谢谢

...C编程基础linuxC语言环境概述Gcc使用方法Gdb调试技术。4、嵌入式系统开发基础嵌入式系统概述交叉编译配置TFTP服务配置NFS服务下载Bootloader和内核嵌入式Linux应用软件开发。4、嵌入式系统移植Linux内核代码平台相关代码分析ARM平台... 查看详情

深度剖析mqtt协议的整个通信流程

...然MQTT很火,但是目前对MQTT的很少,尤其是在如何移植到嵌入式上来。大部分的平台商的做法都是跟模块商合作把MQTT协议集成到WiFi模块 查看详情

移植qt5.6到嵌入式开发板(史上最详细的qt移植教程)

...用了很长一段时间的qt5.6forwindows,本文就来介绍一下QT在嵌入式环境的搭建。 移植以到JZ2440为例,使用韦老大提供的ubuntu9.10虚拟机作为移植环境。当然,其它虚拟机也是可以的,我同样在ubuntu14.04移植成功,只不过需要 查看详情

如何将 MFC 应用程序移植到 Windows Embedded Compact 7?

...1-0310:10:41【问题描述】:我正在尝试将MFC应用程序移植到嵌入式嵌入式7中。我将MFC应用程序作为子项目添加到我使用VisualStudio2008中的平台构建器创建的操作系统设计中。但出现以下错误。致命错误:C 查看详情

docker初步体验

...拟机的内核版本是3.10以上的一、概念Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker镜像(Images)Docker镜像... 查看详情

嵌入式linux第二部分-裸机开发/系统移植/驱动开发/内核开发

本部分主要专注构建从0到1的嵌入式Linux学习知识体系。主要涉及Linux环境配置,嵌入式Linux裸机开发,Linux文件系统及系统移植,驱动开发等部分。目前持续更新中,更新时间:2022年11月27日【嵌入式Linux】裸机开发篇LinuxC语言及M... 查看详情

将 Android 移植到 nanoTesla A8

...间】:2016-11-1715:40:43【问题描述】:我们的组织中有一个嵌入式设备,它有一个nanoTeslaA8板并运行linux。我们想在设备上运行android来为我们的设备开发android应用程序。可以在nanoTesla上运行Android吗?nanoTesla上是否有任何可用于Andro... 查看详情

保姆级快速搭建一套基于linux环境下的mqtt开发程序模版(基于腾讯云iotexplorer)...(代码片段)

点击上方“嵌入式应用研究院”,选择“置顶/星标公众号”干货福利,第一时间送达!来源|嵌入式应用研究院整理&排版 |嵌入式应用研究院在这里,测试的MQTT客户端环境我已经帮大家搭建好了:https://github.com/... 查看详情