基于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测试,相关图片:
来至:https://dueros.baidu.com/forum/topic/show/261030