• 【嵌入式Linux应用】初步移植MQTT到Ubuntu和Linux开发板


    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
    
    • 1

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

    cd /home/book
    book@100ask:~$ mkdir workspace && cd workspace
    book@100ask:~/workspace$ mkdir mqtt && cd mqtt
    
    • 1
    • 2
    • 3

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

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

    等待下载完成:

    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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    
    • 1
    • 2

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

    在这里插入图片描述

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

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

    在这里插入图片描述
    在这里插入图片描述

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

    make
    sudo make install
    
    • 1
    • 2

    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
    
    • 1
    • 2
    • 3

    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  ./
    
    • 1
    • 2

    我们这里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"
    
    • 1

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

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

    我们要修改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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后保存退出(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
    
    • 1
    • 2
    • 3

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

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

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    这就说明我们在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    在这里插入图片描述

    5.2 修改Makefile

    • 修改编译器

    在这里插入图片描述

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

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

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

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

    然后去修改Makefile:

    在这里插入图片描述

    • 修改库安装路径

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

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

    所以原本的

    在这里插入图片描述

    就改成下图所示的这样:

    在这里插入图片描述

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

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

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

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

    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/
    
    • 1
    • 2
    • 3

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

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

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

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

    在这里插入图片描述

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

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

    在这里插入图片描述

    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
    
    • 1
    • 2

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

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

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

    # cp /mnt/a.out ./
    # ./a.out
    
    • 1
    • 2

    在这里插入图片描述

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

  • 相关阅读:
    【EI会议征稿】第四届传感器与信息技术国际学术会议(ICSI 2024)
    数据结构之【动态数组】
    如何快速通过pmp考试,求攻略?
    如何使用FirewallD限制网络访问
    最大子列和+最大子矩阵和
    JSP实现数据传递与保存(一)
    一次 MDIO 配置 switch 的调试过程,88e1512 switch mv88e6xxx
    二维相位解包理论算法和软件【全文翻译- 质量分布图(3.3)】
    SpringCloud原生组件之Ribbon负载均衡和远程调用
    【每日一题】ABC311G - One More Grid Task | 单调栈 | 简单
  • 原文地址:https://blog.csdn.net/thisway_diy/article/details/125557534