基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(七)交叉编译paho.mqtt.embedded-c库和嵌入式linux样例程序
来源:互联网 发布:淘宝卖面膜名字店面 编辑:程序博客网 时间:2024/05/17 08:49
本篇将把paho.mqtt.embedded-c官方的源代码交叉编译成数据包封装库和应用程序两部分,并把样例应用程序在mini2440上运行。
一、首先编译MQTT协议包封装库:
解压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}/* ${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行nstall: build 下面添加:
-mkdir -p $(DESTDIR)${libdir} -mkdir -p $(DESTDIR)${includedir} cp -r $(HEADERS) $(DESTDIR)${includedir}
这是创建安装目录、复制头文件。
5、
make
编译好后:
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子目录:
这个是我们编译自己的程序需要链接的动态库,照例,把它复制到arm板根文件系统的/usr/lib中。
二、尝试编译client和样例程序:
1、进入MQTTClient-C/samples目录,把linux子目录复制一份命名为mini2440
cp -r linux mini2440
进入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.hmake
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-gccINCDIR :=-I/usr/local/arm/paho.mqtt.embedded-c/includeCOMPILE.c = $(CC) $(CFLAGS) $(INCDIR) -MMD -cLINK.c = $(CC) $(LDFLAGS) -lpthread -lrt .PHONY: all%.o:%.c $(COMPILE.c) $< -o $@SRC_FILE := \ MQTTClient.c \ MQTTLinux.c \ stdoutsub.cOBJS := $(addsuffix .o, $(basename $(SRC_FILE)))DEPS :=$(OBJS:.o=.d)all:mqttmqtt:$(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) mqttdistclean: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来编译了。
结果如下:
已经编译好,并拷贝到arm板的/usr/my目录中了,可执行文件名字叫mqtt。
下面步骤来验证这个mqtt程序能否接收到domoticz发布的消息。
三、启动mini2440,在串口下,在根目录下启动mosquitto和domoticz。
对了,要说一下启动mosquitto,前面说到用
mosquitto -c /etc/mosquitto/mosquitto.conf -v &
来启动,因为前面调试要看打印信息。
现在不要看这些信息了,启动时让它屏蔽打印信息,可以用
mosquitto -c /etc/mosquitto/mosquitto.conf -v -d
这一条命令来启动。
然后:
/etc/init.d/domoticz.sh start &
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 \n)
–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
这就是订阅 本机的MQTT broker发布的 domoticz/out主题消息。
启动结果如下:
打开浏览器,进入:
http://192.168.1.230:8080
然后点到开关那个选项:
然后点那个灯泡,点亮它。
可以看到mini2440这边已经收到了消息。
再关闭:
两次消息只有nvalue有变化。
这个就是开关量的值。
Android手机客户端APP操作,也会得到相同的结果:
到此,paho.mqtt.embedded-c客户端的程序,基本上得到了验证。
下一篇就是真正使用客户端程序来控制mini2440上的LED灯了。
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(七)交叉编译paho.mqtt.embedded-c库和嵌入式linux样例程序
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(四)交叉编译OpenSSL、c-ares、e2fsprogs和mosquitto
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(五)交叉编译并安装zlib、curl、boost和domoticz
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(三)编译并安装cmake和git工具
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(一)前言
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(二)前期准备
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(八)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(一)
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(九)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(二)
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(十)使用domoticz+mosquitto+Android客户端实现控制STM32板上的LED(一)
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(十一)使用domoticz+mosquitto+Android客户端实现控制STM32板上的LED(二)
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(六)使用domoticz联合arm上的mosquitto实现Android客户端远程控制
- 交叉编译OpenSSL和paho.mqtt.c
- 基于openSUSE11.0交叉编译嵌入式linux系统产品
- Paho MQTT 嵌入式c客户端研究笔记 (二)
- Paho MQTT 嵌入式c客户端研究笔记
- 在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。文章通过一个具体的例子说明了这些嵌入式交叉编译开发工具的制作过程。 随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来
- 嵌入式linux交叉编译jrtplib库
- 嵌入式linux下交叉编译库文件
- 图像增强知识总结
- kubernetes之store(一)
- 跨站请求伪造CSRF防护方法
- 120.黑名单的添加
- 彩色图像处理总结
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(七)交叉编译paho.mqtt.embedded-c库和嵌入式linux样例程序
- redhat 7.0 64位安装rabbitmq问题说明
- 121.黑名单拦截的实现
- 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(八)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(一)
- 8.Django中views.py详解
- # 整理4种实现tab选项卡的方式 by angular
- 挥泪告别巡视组,袁萌不是问题人
- 【测试缺陷报告】
- C++ Iterator设计模式的思考 (Boolan学习笔记第13周)