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

本篇将把paho.mqtt.embedded-c官方的源代码交叉编译成数据包封装库和应用程序两部分,并把样例应用程序在mini2440上运行。css

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

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

修改Makefile:

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

CC ?=arm-linux-gcc

二、第43行SOURCE_FILES_C = $(srcdir)/*.c改成:浏览器

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

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

这个是把那个目录下的全部.c文件都编译进去,否则,后面引用这个库的时候会出错。ruby

三、第95行rm -rf ${blddir}/* 改成:bash

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

四、第110行dom

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

改成svg

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

第111行ui

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

改成:spa

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

这是把全部的.o文件都连接到动态库中。

否则,后面引用动态库的时候会报错误说缺乏相关引用。

注意前面都有个tab键符

四、在121行nstall: build 下面添加:

-mkdir -p $(DESTDIR)${libdir} -mkdir -p $(DESTDIR)${includedir} cp -r $(HEADERS) $(DESTDIR)${includedir}

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

五、

make

编译好后:

fc4908684123a2f790b07039844a92b5.png

六、

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

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

安装好后以下:

de7c98c3fba3d9b794a30b290e4e3316.png

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

1)、include,这个在咱们编译本身的程序的时候须要用到;

2)、lib子目录:

a7213645c93562c01826b714ae365cd8.png

这个是咱们编译本身的程序须要连接的动态库,照例,把它复制到arm板根文件系统的/usr/lib中。

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

一、进入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.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 $@ /work/rootfs/usr/my/

clean:

rm -f $(OBJS) mqtt

distclean:clean

rm -f $(DEPS)

-include $(DEPS)

二、而后修改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来编译了。

结果以下:

225021cd84658eecc4be9e105127e9c1.png

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

下面步骤来验证这个mqtt程序可否接收到domoticz发布的消息。

3、启动mini2440,在串口下,在根目录下启动mosquitto和domoticz。

对了,要说一下启动mosquitto,前面说到用

mosquitto -c /etc/mosquitto/mosquitto.conf -v &

来启动,由于前面调试要看打印信息。

如今不要看这些信息了,启动时让它屏蔽打印信息,能够用

mosquitto -c /etc/mosquitto/mosquitto.conf -v -d

这一条命令来启动。

85329bd4371a5befad5ee3bff4f10d47.png

而后:

/etc/init.d/domoticz.sh start &

9303b5213f780113acc36a7e16d241f0.png

domoticz已经启动了。

进入/usr/my目录,而后执行一下./mqtt能够看到:

82bc38d764e1a658a7891d4d72c11a52.png

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主题消息。

启动结果以下:

ad9e9016f9f09019a4392881899da37f.png

而后点到开关那个选项:

5da302c193a6f47d79a5f9a653a38abd.png

而后点那个灯泡,点亮它。

a245af1533557e21dc235ad7a54fcf9f.png

能够看到mini2440这边已经收到了消息。

再关闭:

5670dcedbea587cefeb364202298db78.png

两次消息只有nvalue有变化。

这个就是开关量的值。

Android手机客户端APP操做,也会获得相同的结果:

55cba88294c61cf535835f5f05cdf518.png

165d650abcf501f671b0770135e781ec.png

到此,paho.mqtt.embedded-c客户端的程序,基本上获得了验证。

下一篇就是真正使用客户端程序来控制mini2440上的LED灯了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值