i.mx嵌入式linux编程,基于i-mx287 ARM9的嵌入式linux上 交叉编译paho.mqtt.embedded-c库

本文参考https://blog.csdn.net/sqshining/article/details/70193354

参考上述连接进行自己的ARM9开发板上实现paho.mqtt.embedded-c库的编译,实现测试例程在周立功的i-mx287A开发板上正常运行,在交叉编译mqtt库期间遇到一些坑,在此记录并说明一番,给自己的学习之路添加一些垫脚石,也希望能对后来人一点启发提示。

一、首先编译MQTT协议包封装库:

项目mqtt源码包可以在如下链接下载

git clone https://github.com/eclipse/paho.mqtt.embedded-c.git

解压paho.mqtt.embedded-c-master.zip之后,进入目录,

修改Makefile:

1、修改第70行CC ?=gcc为:

CC ?=arm-linux-gcc

2、第43行SOURCE_FILES_C = $(srcdir)/*.c改为:

SOURCE_FILES_C = $(wildcard $(srcdir)/*.c )

OBJS = $(addsuffix .o,$(basename $(SOURCE_FILES_C)))

这个是把那个目录下的所有.c文件都编译进去,不然,后面引用这个库的时候会出错。

3、第95行rm -rf ${blddir}/* 改为:

rm -rf ${blddir}/* $(OBJS) ${srcdir}/../samples/transport.o

4、第110行

${EMBED_MQTTLIB_C_TARGET}: ${SOURCE_FILES_C} ${HEADERS_C}

改为

${EMBED_MQTTLIB_C_TARGET}: $(OBJS) ${HEADERS_C}

第111行

${CC} ${CCFLAGS_SO} -o $@ ${SOURCE_FILES_C} ${LDFLAGS_C}

改为

${CC} ${CCFLAGS_SO} -o $@ $(OBJS) ${LDFLAGS_C}

这是把所有的.o文件都链接到动态库中。

不然,后面引用动态库的时候会报错误说缺少相关引用。

注意前面都有个tab键符

4、在121行install: build 下面添加:

-mkdir -p $(DESTDIR)${libdir}

-mkdir -p $(DESTDIR)${includedir}

cp -r $(HEADERS) $(DESTDIR)${includedir}

这是创建安装目录、复制头文件。

5、

make

编译好后:

3f288ee285423cc6e29fa526842ca321.png

编译结果你可以看到用的指定的编译工具并不是arm-linux-gcc,仔细看了Makefile才知道,

有个系统参数需要再make后面添加。

执行如下make指令,编译出来的库就是能在arm板上调用的库文件:

make CC=arm-linux-gcc

编译结果如下图:

3f288ee285423cc6e29fa526842ca321.png

6、下面进行库在本机的安装:

make install DESTDIR=/usr/local/arm/paho.mqtt.embedded-c prefix=

这里指定prefix(前缀)为空。,不然安装的时候,会在我们指定的目录后加入usr/local这个子路径。

安装好后可以在安装目录下查看到安装的库的头文件和库文件

就安装到了主机的/usr/local/arm/paho.mqtt.embedded-c目录下了,这个目录下有两个子目录:

1)、include,这个在我们编译自己的程序的时候需要用到;

2)、lib子目录:

注意,如果库文件夹中的软连接不全,需要手动补齐

3f288ee285423cc6e29fa526842ca321.png

这个是我们编译自己的程序需要链接的动态库,照例,把它复制到arm板的文件系统的/usr/lib中。

二、尝试编译client和样例程序:

1、进入MQTTClient-C/samples目录,把linux子目录复制一份命名为mx287

cp -r linux mx287

进入mx287目录,编辑build.sh

把里面的内容都删掉,改为:

cp ../../src/MQTTClient.c .

cp ../../src/linux/MQTTLinux.c .

cp ../../src/linux/MQTTLinux.h .

sed '/^#include "MQTTPacket.h"/i\#include "MQTTLinux.h"' ../../src/MQTTClient.h > MQTTClient.h

make

sed ‘/^#include “MQTTPacket.h”/i#include “MQTTLinux.h”’ ../../src/MQTTClient.h > MQTTClient.h

这句的意思是读入../../src/MQTTClient.h 文件,然后搜#include “MQTTPacket.h”,然后在它的下一行插入#include “MQTTLinux.h”

然后把所有内容写入MQTTClient.h保存在当前目录。

因为要引用后面那个头文件,不加入,会出错。

下面来写一个Makefile,内容如下:

TOPDIR = ../..

CC=arm-linux-gcc

INCDIR :=-I /usr/local/arm/paho.mqtt.embedded-c/include

COMPILE.c= $(CC) $(CFLAGS) $(INCDIR) -MMD -c

LINK.c= $(CC) $(LDFLAGS) -lpthread -lrt

.PHONY: all

%.o:%.c

$(COMPILE.c) $< -o $@

SRC_FILE :=

MQTTClient.c

MQTTLinux.c

stdoutsub.c

OBJS := $(addsuffix .o, $(basename $(SRC_FILE)))

DEPS :=$(OBJS:.o=.d)

all:mqtt

mqtt:$(OBJS)

$(LINK.c) $(OBJS) -lpaho-embed-mqtt3c -L /usr/local/arm/paho.mqtt.embedded-c/lib -o $@

cp $@ /home/nfs/share/src/c_project/embed_mqtt_test

clean:

rm -f $(OBJS) mqtt

distclean:clean

rm -f $(DEPS)

-include $(DEPS)

2、然后修改stdoutsub.c。

第213行 Client c;改为:

MQTTClient c;

第218行NewNetwork(&n);改为:

NetworkInit(&n);

第219行ConnectNetwork(&n, opts.host, opts.port);改为:

NetworkConnect(&n, opts.host, opts.port);

第220行MQTTClient(&c, &n, 1000, buf, 100, readbuf, 100);改为:

MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);

第248行n.disconnect(&n);改为:

NetworkDisconnect(&n);

然后保存、退出,执行脚本:

./build.sh

这个脚本只需要执行一次,后面可以使用make来编译了。

结果如下:

3f288ee285423cc6e29fa526842ca321.png

已经编译好,并拷贝到arm板的/usr/my目录中了,可执行文件名字叫mqtt。

此mqtt运行只有订阅功能,mqtt客户端连接mqtt服务器的client参数在stdoutsub.c文件中的91行的opts参数中修改你自己的测试服务器。修改保存退出后重新运行make,生成的文件就是可以连接到你自己的mqtt服务器的程序,运行如下:

d7bcd794234007af610547f1dec16295.png

至此,基于i-mx287a的paho.mqtt.embedded-c库的编译移植和测试告一段落,接下来可以结合mqtt例程实现远程控制硬件接口的一些应用的开发,比如远程开关板子上的灯,板子连接传感器采集某些数据传输给远端服务器或者管理平台等待,展开你的想象,去实现这些好玩的功能吧,再会。。。。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值