基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(七)交叉编译paho.m

2019-07-13 05:23发布

本篇将把paho.mqtt.embedded-c官方的源代码交叉编译成数据包封装库和应用程序两部分,并把样例应用程序在mini2440上运行。 一、首先编译MQTT协议包封装库: 解压paho.mqtt.embedded-c-master.zip之后,进入目录, 
修改Makefile: 
1、修改第70行CC ?=gcc为: CC ?=arm-linux-gcc
1
2、第43行SOURCE_FILES_C = $(srcdir)/*.c改为: SOURCE_FILES_C = $(wildcard $(srcdir)/*.c )
OBJS = $(addsuffix .o,$(basename $(SOURCE_FILES_C)))
1
2
这个是把那个目录下的所有.c文件都编译进去,不然,后面引用这个库的时候会出错。 3、第95行rm -rf ${blddir}/* 改为:     rm -rf ${blddir}/* $(OBJS) ${srcdir}/../samples/transport.o
1
4、第110行 ${EMBED_MQTTLIB_C_TARGET}: ${SOURCE_FILES_C} ${HEADERS_C}
1
改为 ${EMBED_MQTTLIB_C_TARGET}: $(OBJS) ${HEADERS_C}
1
第111行 ${CC} ${CCFLAGS_SO} -o $@ ${SOURCE_FILES_C} ${LDFLAGS_C}
1
改为:     ${CC} ${CCFLAGS_SO} -o $@ $(OBJS) ${LDFLAGS_C}
1
这是把所有的.o文件都链接到动态库中。 
不然,后面引用动态库的时候会报错误说缺少相关引用。 注意前面都有个tab键符 4、在121行nstall: build 下面添加:     -mkdir -p $(DESTDIR)${libdir}
    -mkdir -p $(DESTDIR)${includedir}
    cp -r $(HEADERS) $(DESTDIR)${includedir}
1
2
3
这是创建安装目录、复制头文件。 5、 make
1
编译好后: 
6、 make install DESTDIR=/usr/local/arm/paho.mqtt.embedded-c prefix= 
1
这里指定prefix(前缀)为空。,不然安装的时候,会在我们指定的目录后加入usr/local这个子路径。 
安装好后如下: 
就安装到了主机的/usr/local/arm/paho.mqtt.embedded-c目录下了,这个目录下有两个子目录: 
1)、include,这个在我们编译自己的程序的时候需要用到; 
2)、lib子目录: 
这个是我们编译自己的程序需要链接的动态库,照例,把它复制到arm板根文件系统的/usr/lib中。 二、尝试编译client和样例程序: 1、进入MQTTClient-C/samples目录,把linux子目录复制一份命名为mini2440 cp -r linux mini2440
1
进入mini2440目录,编辑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
1
2
3
4
5
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 $@ /work/rootfs/usr/my/ clean:
    rm -f $(OBJS) mqtt distclean:clean
    rm -f $(DEPS)
-include $(DEPS)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2、然后修改stdoutsub.c。 第213行 Client c;改为: MQTTClient c;
1
第218行NewNetwork(&n);改为: NetworkInit(&n);
1
第219行ConnectNetwork(&n, opts.host, opts.port);改为: NetworkConnect(&n, opts.host, opts.port);
1
第220行MQTTClient(&c, &n, 1000, buf, 100, readbuf, 100);改为: MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);
1
第248行n.disconnect(&n);改为: NetworkDisconnect(&n);
1
然后保存、退出,执行脚本: ./build.sh
1
这个脚本只需要执行一次,后面可以使用make来编译了。 结果如下: 已经编译好,并拷贝到arm板的/usr/my目录中了,可执行文件名字叫mqtt。 
下面步骤来验证这个mqtt程序能否接收到domoticz发布的消息。 三、启动mini2440,在串口下,在根目录下启动mosquitto和domoticz。 对了,要说一下启动mosquitto,前面说到用 mosquitto  -c /etc/mosquitto/mosquitto.conf -v &
1
来启动,因为前面调试要看打印信息。 
现在不要看这些信息了,启动时让它屏蔽打印信息,可以用 mosquitto  -c /etc/mosquitto/mosquitto.conf -v -d
1
这一条命令来启动。 然后: /etc/init.d/domoticz.sh start &
1
domoticz已经启动了。 进入/usr/my目录,然后执行一下./mqtt可以看到: 
Usage: stdoutsub topicname , where options are: 
–host (default is localhost) 
–port (default is 1883) 
–qos (default is 2) 
–delimiter (default is ) 
–clientid (default is hostname+timestamp) 
–username none 
–password none 
–showtopics (default is on if the topic has a wildcard, else off) 对应我们的可执行文件,用法是: 
mqtt 主题名 <其他参数> 
参数用法是 
–host <要链接的主机名> (默认是 localhost) 
–port<端口号>(默认是1883) 
…… 我们现在就可以全部使用默认参数,因为要连接的mosquitto就在本机,其他默认参数都是对应的。 接下来,运行,注意这只是个sub客户端程序。 
对应我们的可执行文件,用法是: ./mqtt  domoticz/out
1
这就是订阅 本机的MQTT broker发布的 domoticz/out主题消息。 
启动结果如下: 
打开浏览器,进入: 
http://192.168.1.230:8080 然后点到开关那个选项: 
然后点那个灯泡,点亮它。 可以看到mini2440这边已经收到了消息。 再关闭: 两次消息只有nvalue有变化。 
这个就是开关量的值。 Android手机客户端APP操作,也会得到相同的结果: 到此,paho.mqtt.embedded-c客户端的程序,基本上得到了验证。 下一篇就是真正使用客户端程序来控制mini2440上的LED灯了。
--------------------- 
作者:假面侠 
来源:CSDN 
原文:https://blog.csdn.net/sqshining/article/details/70193354 
版权声明:本文为博主原创文章,转载请附上博文链接!