基于ARM平台交叉编译MQTT-C客户端的百度云IOT接入流程记录

基于ARM平台交叉编译MQTT-C客户端的百度云IOT接入流程记录

Paho MQTT嵌入式c客户端编译实践[百度云MQTT客户端兼容PAHO,PAHO也是一个开源的MQTT协议项目]:

1.参见以下网页:

http://blog.csdn.net/rambomatrix/article/details/62892151

Paho MQTT 嵌入式c客户端研究笔记

在百度物接入的“MQTT Client SDK”支持网页

https://cloud.baidu.com/doc/IOT/MQTTClientSDK.html

选择“Embedded C/C++”支持页,在网页"https://github.com/eclipse/paho.mqtt.embedded-c"中下载paho.mqtt.embedded-c-master.zip源码文件;

//--------------------------------------

2.参见

http://blog.csdn.net/sqshining/article/details/70193354

基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(七)交叉编译paho.mqtt.embedded-c库和嵌入式linux样例程序

进行基于ARM平台的paho.mqtt.embedded-c官方的源代码交叉编译.

Paho MQTT 嵌入式c客户端研究笔记 (二)[介绍paho.mqtt.embedded-c-master源码包里头发布消息、订阅消息的示例pub0sub1]

http://blog.csdn.net/rambomatrix/article/details/64906310

//--------------------------------------

3.把paho.mqtt.embedded-c-master.zip复制到ZLG交叉编译环境的路径/home下;

解压:

unzip paho.mqtt.embedded-c-master.zip

得到paho.mqtt.embedded-c-master文件夹,大小1.1M;

//------------------------------------------------------------------------------

4.编译MQTT协议包封装:

修改Makefile文件[使用"Makefile[编译库文件用-修改后可编译成功]"文件]

4-1.修改第70行CC ?= gcc为:

CC = arm-linux-gnueabihf-gcc

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

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

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

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

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

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

4-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文件都链接到动态库中。不然,后面引用动态库的时候会报错误说缺少相关引用。

4-5.在121行install: build下面添加:

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

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

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

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

4-6.编译:make,过程如下:

root@Linux-host:/home/paho.mqtt.embedded-c-master# make

mkdir -p build/output/samples

mkdir -p build/output/test

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTConnectClient.o MQTTPacket/src/MQTTConnectClient.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTConnectServer.o MQTTPacket/src/MQTTConnectServer.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTDeserializePublish.o MQTTPacket/src/MQTTDeserializePublish.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTFormat.o MQTTPacket/src/MQTTFormat.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTPacket.o MQTTPacket/src/MQTTPacket.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTSerializePublish.o MQTTPacket/src/MQTTSerializePublish.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTSubscribeClient.o MQTTPacket/src/MQTTSubscribeClient.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTSubscribeServer.o MQTTPacket/src/MQTTSubscribeServer.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTUnsubscribeClient.o MQTTPacket/src/MQTTUnsubscribeClient.c

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/MQTTUnsubscribeServer.o MQTTPacket/src/MQTTUnsubscribeServer.c

arm-linux-gnueabihf-gcc -g -fPIC -Os -Wall -fvisibility=hidden -DLINUX_SO -o build/output/libpaho-embed-mqtt3c.so.1.0 MQTTPacket/src/MQTTConnectClient.o MQTTPacket/src/MQTTConnectServer.o MQTTPacket/src/MQTTDeserializePublish.o MQTTPacket/src/MQTTFormat.o1

ln -s libpaho-embed-mqtt3c.so.1.0  build/output/libpaho-embed-mqtt3c.so.1

ln -s libpaho-embed-mqtt3c.so.1 build/output/libpaho-embed-mqtt3c.so

arm-linux-gnueabihf-gcc  -fPIC  -c -o MQTTPacket/src/../samples/transport.o MQTTPacket/src/../samples/transport.c

arm-linux-gnueabihf-gcc -o build/output/samples/pub0sub1 MQTTPacket/src/../samples/pub0sub1.c MQTTPacket/src/../samples/transport.o -lpaho-embed-mqtt3c -I MQTTPacket/src  -L build/output

arm-linux-gnueabihf-gcc -o build/output/samples/qos0pub MQTTPacket/src/../samples/qos0pub.c MQTTPacket/src/../samples/transport.o -lpaho-embed-mqtt3c -I MQTTPacket/src  -L build/output

arm-linux-gnueabihf-gcc -g -o build/output/test/test1 MQTTPacket/src/../test/test1.c -lpaho-embed-mqtt3c -I MQTTPacket/src  -L build/output

root@Linux-host:/home/paho.mqtt.embedded-c-master# 

//--------------------------------------

4-7-1.make install执行如下指令:

make install DESTDIR=/home/paho.mqtt.embedded-c-master prefix= 

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

就安装到了主机的/home/paho.mqtt.embedded-c-master目录下了,这个目录下会多出两个子目录: 

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

2)、lib子目录,这个是我们编译自己的程序需要链接的动态库[libpaho-embed-mqtt3c.so.1.0],后期应用时把它复制到arm板根文件系统的/usr/lib中。

运行信息如下:

root@Linux-host:/home/paho.mqtt.embedded-c-master# make install DESTDIR=/home/paho.mqtt.embedded-c-master prefix= 

mkdir -p build/output/samples

mkdir -p build/output/test

mkdir -p /home/paho.mqtt.embedded-c-master/lib

mkdir -p /home/paho.mqtt.embedded-c-master/include

cp -r MQTTPacket/src/*.h /home/paho.mqtt.embedded-c-master/include

install -m 644  build/output/libpaho-embed-mqtt3c.so.1.0 /home/paho.mqtt.embedded-c-master/lib

/sbin/ldconfig /home/paho.mqtt.embedded-c-master/lib

ln -s libpaho-embed-mqtt3c.so.1 /home/paho.mqtt.embedded-c-master/lib/libpaho-embed-mqtt3c.so

查看文件属性

root@Linux-host:/home/paho.mqtt.embedded-c-master#cd lib

root@Linux-host:/home/paho.mqtt.embedded-c-master/lib# file libpaho-embed-mqtt3c.so.1.0 

libpaho-embed-mqtt3c.so.1.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x74193a6d0336685b41df06518daa3c4c6cddbf4a, not stripped

root@Linux-host:/home/paho.mqtt.embedded-c-master/lib#

//--------------------------------------

4-7-2:

注意:在/home/paho.mqtt.embedded-c-master/build/output/samples下2个程序生成:

qos0pub和pub0sub1;

根据网页[http://blog.csdn.net/rambomatrix/article/details/62892151]介绍:

运行qos0pub,会发送一条消息.

  运行pub0sub1,会显示收到qos0pub之前发的那条消息.

根据"4-6.编译:make,过程如下:"查看的生成过程,确定对应的源码分别为

paho.mqtt.embedded-c-master/MQTTPacket/samples/qos0pub.c

paho.mqtt.embedded-c-master/MQTTPacket/samples/pub0sub1.c文件;

注意:基于工控主板EPC-6G2C-L的实践,详见第"8"点;

查看文件属性:

root@Linux-host:/home/paho.mqtt.embedded-c-master/build/output/samples# file pub0sub1 

pub0sub1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.1.1, BuildID[sha1]=0xdec52d7baf0ab871992fa0232c231917c24c4f2b, not stripped

root@Linux-host:/home/paho.mqtt.embedded-c-master/build/output/samples# file qos0pub 

qos0pub: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.1.1, BuildID[sha1]=0x0982f0b41549485d1dc1563bef352824b84c8ea8, not stripped

root@Linux-host:/home/paho.mqtt.embedded-c-master/build/output/samples# 

//------------------------------------------------------------------------------

8.基于工控主板EPC-6G2C-L的MQTT-C客户端发送Pub实践:

8-1.交叉编译设置,请先参见以上"Paho MQTT嵌入式c客户端编译实践"部分的1,2,3,4小结;

8-2.在/home/paho.mqtt.embedded-c-master/build/output/samples下2个程序生成:

qos0pub和pub0sub1;

根据网页[http://blog.csdn.net/rambomatrix/article/details/62892151]介绍:

运行qos0pub,会发送一条消息.

  运行pub0sub1,会显示收到qos0pub之前发的那条消息.

根据"4-6.编译:make,过程如下:"查看的生成过程,确定对应的源码分别为

paho.mqtt.embedded-c-master/MQTTPacket/samples/qos0pub.c

paho.mqtt.embedded-c-master/MQTTPacket/samples/pub0sub1.c文件;

8-3-1.针对qos0pub.c文件,修改main函数里头的:

host(域名),data.username.cstring(用户名),

data.password.cstring(秘钥),

topicString.cstring(主题),payload(消息)变量,参照如下8-3-2的相关参数修改,然后重新编译:

cd /home/paho.mqtt.embedded-c-master/

make clean

make

cd /home/paho.mqtt.embedded-c-master/build/output/samples

得到新生成的qos0pub可执行文件;

8-3-2.[百度物接入IOT,华南-广州区]:

[不需要加密认证方式]tcp://endpoint_rn_test01.mqtt.iot.gz.baidubce.com:1883

用户名(全名,登录用):endpoint_rn_test01/thing01

主题(topic): mytopic/device01 

权限(permission):发布(PUB)_publish 订阅(SUB)_subscribe

秘钥:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

8-4-1.开发板连接有线网络并网络校时;

//设置网卡地址和默认网关[修改/etc/init.d/S90start_userapp.sh文件,在最后修改如下]

# you can add your app start_command here

ifconfig eth0 192.168.0.116 netmask 255.255.255.0

#route add default gw 192.168.0.1

ifconfig eth1 10.10.40.117 netmask 255.255.255.0

route add default gw 10.10.40.254

//网络校时

ntpdate 120.25.115.20

8-4-2.开发板设置设置DNS[创建或修改 /etc/resolv.conf 文件]

wr Vi/etc/resolv.conf” 文件后在其中添加 DNS 配置, 可以添加多行, 

若首选DNS及备用DNS(可以不写)分别为 10.10.40.254 和 192.168.0.1,则其示例配置如下所示:

# nameserver ip address

nameserver 10.10.40.254

nameserver 192.168.0.1

保存文件后DNS信息即刻生效,使用route命令查看如下[第一行default默认网关为SL-IR3.SL-IR3(10.10.40.254路由器的名字)]:

[root@EPC-M6G2C opt]# route

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

default         SL-IR3.SL-IR3   0.0.0.0         UG    0      0        0 eth1

10.10.40.0 * 255.255.255.0 U 0 0 0 eth1

192.168.0.0 * 255.255.255.0 U 0 0 0 eth0

8-5。把qos0pub文件和库文件libpaho嵌-mqtt3c.so.1(可以放置到ARM板根文件系统的/ usr / lib中中)/家庭/ paho.mqtt.embedded-C-主/建/输出/]

这两个文件复制到开发板上的/ opt路径下,设置qos0pub为可执行属性;

8-6测试,相关图片:

ARM客户端发送测试-1.jpg

MQTT.fx软件-1客户端连接设置.JPG

MQTT.fx软件-2接收测试.JPG

百度IOT的Websockets客户端接收测试图-1.jpg

来至:https://dueros.baidu.com/forum/topic/show/261030 

猜你喜欢

转载自blog.csdn.net/mianhuantang848989/article/details/83688931