[HI3516DV300开发笔记]嵌入式linux下MQTT移植

最近......算了干笔者这行的就是一块砖,哪里缺往哪垫。

简单说就是要往一款产品上用MQTT,而目前产品的开发板还没拿到,所以先在现有的HI3516DV300上移植一个MQTT和服务器联动起来

所以真的是标题党,和人家HI3516没啥关系


本章目标:

<1>在windows主机上搭建MQTT服务器方便调试等

<2>移植MQTT到HI3516开发板

<3>开发板与windows主机进行MQTT通讯


目标<1>:在windows主机上搭建MQTT服务器

笔者的虚拟机访问起来不方便,为了进行MQTT通讯的验证,将MQTT的服务器搭建在windows上

相关的博客内容网上比较多,但还是记录一下懒得下次再去找:

<1> 在 https://downloads.apache.org/ 下载 apache-artemis-2.11.0-bin.zip;找个合适的位置解压即可,路径不要带中文

例如我解压的路径是:G:\mqtt server\apache-artemis-2.11.0

<2> 在dos下进入解压的路径,用红框部分的命令创建自己的MQTT服务器实例,我放在了E:\mqtt_server_1下

创建过程中,需要输入账号&密码&是否允许匿名访问:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第1张图片

<3> 进入目录E:\mqtt_server_1,执行artemis run启动MQTT服务器:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第2张图片

 

启动成功提示:

打开浏览器输入地址:http://local:8161/console/login可以登录到HTTP的界面

dos窗口在服务器运行期间不能关闭

<4>下载个MQTT客户端工具,例如mqtt.fx,可以测试与MQTT服务器进行订阅发布等操作测试:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第3张图片

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第4张图片


目标<2>:移植MQTT到HI3516开发板

这些内容网络上也有,然而为了防止以后找不到,还是记录一下,勤快一次可以懒无数次

<0> 当前笔者的开发板的编译工具路径/opt/hisi-linux/x86-arm/arm-himix200-linux/

 

<1> 交叉编译openSSL,过程:

①下载源码到虚拟机编译环境:https://www.openssl.org/source/

②解压:tar -xvzf openssl-1.1.1f.tar.gz  ; cd openssl-1.1.1f

③配置:./config no-asm shared --prefix=/opt/com/openssl

注意:有博主把安装目录放在 $(pwd)/__install 也就是openssl的源码目录下,但是后面编译mosquitto会不方便,

因此笔者放到了/opt/openssl,当然也可以放到编译工具路径下

④修改Makefile

笔者的编译工具路径是:/opt/hisi-linux/x86-arm/arm-himix200-linux/,因此:

CROSS_COMPILE=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-

并将 CNF_CFLAGS CNF_CXXFLAGS后的-m64去掉

保存Makefile & make & make install

⑤编译完成后,笔者的路径/opt/com/openssl下了openssl相关的头文件,动态库等;

 

<2>  交叉编译mosquitto

①下载源码到虚拟机编译环境:http://mosquitto.org/download/

②解压:tar -xvzf mosquitto-1.6.9.tar.gz; cd mosquitto-1.6.9/

③修改config.mk

WITH_SRV:=no;WITH_WEBSOCKETS:=no;WITH_DOCS:=no;

上一步生成的openssl文件在路径/opt/com/openssl/,因此:

CFLAGS+=-I/opt/com/openssl/include/

LDFLAGS+=-L/opt/com/openssl/lib -lssl -lcrypto (注意:+=与“CFLAGS”“LDFLAGS”之间不要有空格)

根据笔者的交叉编译路径,修改STRIP

STRIP?=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gnueabi-strip

④ 编译

根据交叉编译路径,执行

make CC=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-gcc CXX=/opt/hisi-linux/x86-arm/arm-himix200-linux/bin/arm-himix200-linux-g++

编译完成之后 make install

 

<3>  拷贝相关交叉编译后的文件到开发板

将以下文件从编译完成的openssl以及mosquitto文件夹下找到,拷贝到开发板

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第5张图片

 

其中openssl的lib下的库文件拷贝到HI3516开发板的/lib路径下

mqtt的libmosquitto.so.1拷贝到HI3516开发板的/lib路径下

剩余的 mosquitto_pub mosquitto_rr mosquitto_sub mosquitto mosquitto_passwd等文件是可执行文件,将在下一步用于与windows上的MQTT服务器通讯

至此,移植完毕


目标<3>:开发板与windows主机进行MQTT通讯

到目前为止,windows主机的MQTT服务器已经运行起来;而开发板上也有了mqtt的几个demo执行文件,可以随手做几个测试:

<0> 笔者的开发板IP 10.168.1.200 windows主机IP 10.168.1.65

<1> 开发板作为MQTT代理broker,由mqtt.fx向代理发布与订阅消息

在开发板运行:useradd mosquitto (需要新建一个用户,否则无法运行)

./mosquitto -v & (开始运行mosquitto代理在后台),开发板提示监听1883端口,所以若是有其它进程占用1883请kill掉:

在windows下修改地址与端口,连接开发板的MQTT,并subscribe一条信息“123456”:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第6张图片

开发板提示:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第7张图片

mqtt.fx转到publish界面,随便publish点啥:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第8张图片

开发板提示:

 

<2> windows下的MQTT服务器作为代理,开发板发布消息,mqtt.fx订阅消息

直接使用mosquitto_pub失败,提示:

跟了下代码,在 mosquitto lib下的util__random_bytes函数执行失败,看来是一个生成随机数的接口,根据配置不同调用不同方式,强制改为最屌丝的random方式,重新编译生成libmosquitto.so.1,替换开发板上的相同文件;

再次从开发板向windows服务器发布消息:主题“board_msg” 负载 “20200421/17:XX”:

服务器的message count增加:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第9张图片

mqtt.fx订阅服务器消息,可以看到有消息接收到:

[HI3516DV300开发笔记]嵌入式linux下MQTT移植_第10张图片

暂时可以用了

 

你可能感兴趣的:(物联网,海思音视频方案)