【嵌入式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
在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
下的bin
、lib
、include
和share
下。
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
,我们需要指定路径,不然在当前目录下是找不到这个头文件的,我们已经将这个头文件所在的官方源文件文件夹src
copy过来了,所以只需要改成:
#include "src/MQTTAsync.h"
然后修改url和客户端id这些信息,原来的参数是这样的:
32 #define ADDRESS "tcp://mqtt.eclipseprojects.io:1883"33 #define CLIENTID "ExampleClientSub"34 #define TOPIC "MQTT Examples"
我们要修改ADDRESS
和CLIENTID
以及订阅的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应用】初步移植MQTT到Ubuntu和Linux开发板相关推荐
- Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核)
Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核) 文章目录 Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4 ...
- 支持4k输出的linux开发板,Linux 5.12率先开始支持SiFive的RISC-V FU740开发板
原标题:Linux 5.12率先开始支持SiFive的RISC-V FU740开发板 来源:cnBeta.COM Linux 5.12合并窗口在本周末即将结束,而今早送来的是RISC-V的更新,这足以 ...
- Ubuntu 交叉编译国产开发板香橙派的环境配置
Ubuntu 交叉编译国产开发板香橙派的环境配置 一.目的 二.准备工具 三.操作步骤 1. ubuntu安装交叉编译工具 2. 建一个demo程序 a.c 3. 编译 4. 检查文件信息 四.开发板 ...
- 移植spca5xx-v4l1goodbye到立宇泰ARMSYS244O开发板
前面我讲解了如何移植spca5xxle到立宇泰ARMSYS244O开发板.但是spca5xxle只能输出JPG格式的图像数据,如果我们想要 RGB格式的数据就必须自己解码,如果移植的是完整的spca5 ...
- qt 4.8.4 linux,Tslib和Qt 4.8.4与在开发板上的移植
这篇博客算是接着Linux 下编译.安装.配置 QT这篇的,搞完PC平台的就来弄一下嵌入式平台的,Linux的东西搞起来麻烦的地方就在于太杂.太散,像QT,各版本之间都有很多差异,因此在网络上查找资料 ...
- x210开发板linux驱动开发,移植Qt与Tslib到X210开发板的体会
1.将QT移植到X210上,让X210开发板可以运行QT东西,需要几个东西.tslib QT源码编译后的lib库等 (1)tslib移植: @1:下载tslib,官方上下就可以. @2:解压.比如解压 ...
- armplayer/android6410/android 6410/wince/linux/ubuntu/s3c6410/arm11 开发板
店主:嵌入式系统工程师 联系方式: QQ:1141256841/774295611 技术qq群: 40605090 大连嵌入式商城群 121393599 android6410(一)群 ...
- ubuntu下S5PV210开发板嵌入式开发环境搭建
本教程所使用的开发板是GEC210开发板,核心板资源概述:CPU:S5PV210,SDRAM:512MB,Flash:8MB,NandFlash:256MB. 本教程搭建的环境可以用于uboot移植. ...
- debian linux 内核 3.14-1 显示器 很暗,Ubuntu 与 Linux Mint 用户安装 Kernel 3.14.1 内核
Ubuntu 与 Linux Mint 用户安装 Kernel 3.14.1 内核 Mark Do 2014年4月16日 暂无评论 阅读 3,928 次 最新稳定版本的Linux内核 Kernel 3 ...
最新文章
- ios开发之UIView和UIViewController
- how to improve efficiency of graphic neural network?
- 2015.08.17 Ubuntu 14.04+cuda 7.5+caffe安装配置
- hi3798mv300是什么手机_华为海思电视芯片hi3798mv300 硬件参数如何?
- 基坑监测日报模板_刚刚!温州瓯海突发塌陷,初步判断为临近地块地下室基坑支护桩移位...
- exists hive中如何使用_07045.16.2如何使用Hive合并小文件
- Python 面向对象高级编程——定制类
- react中父子组件数据传递,子组件之间的数据传递
- 接口测试用例怎么写?
- 核方法(kernel method)的主要思想
- 联机侠控制台JAVA_联机侠控制台常见问题 | 我的世界 | MC世界侠
- 使用ps修改图片大小不影响清晰度的方法
- android h5 唤醒微信,H5唤醒App,用通用连接解决在微信打开APP的问题
- 人流量统计管理平台汇总显示方案_实现在场人数管控
- JVM菜鸟进阶高手之路十(基础知识开场白)
- 【学习笔记】使用OpenSSL生成CA证书-配置Nginx代理服务器使用HTTPS协议
- ubuntu折腾笔记【三】
- 中文词性标注的简单实现
- JAVA毕业设计公立医院绩效考核系统计算机源码+lw文档+系统+调试部署+数据库
- Win10 20H1及以上文件误删恢复
热门文章
- HBuilderX连接不上海马玩模拟器
- 网页版连连看(JS jQuery)
- 这世界无非是“人人为我,我为人人”
- [前端系列]vue3修改模板变量间隔符
- 阿里云发送邮件(mail)失败
- word打开出现乱码要如何解决呢?
- 前端期末大作业 HTML+CSS 动漫主题网页作业 (1)
- 【开发教程9】疯壳·开源蓝牙心率防水运动手环-心率监测
- cuda必须装在c盘吗_软件安装到C盘会影响计算机运行速度吗?一个问题引发的思考...
- 微博html5版打不开,PC端网页版微博就是打不开是什么问题啊!缓 – 手机爱问