最近......算了干笔者这行的就是一块砖,哪里缺往哪垫。
简单说就是要往一款产品上用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下
创建过程中,需要输入账号&密码&是否允许匿名访问:
<3> 进入目录E:\mqtt_server_1,执行artemis run启动MQTT服务器:
启动成功提示:
打开浏览器输入地址:http://local:8161/console/login可以登录到HTTP的界面
dos窗口在服务器运行期间不能关闭
<4>下载个MQTT客户端工具,例如mqtt.fx,可以测试与MQTT服务器进行订阅发布等操作测试:
目标<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文件夹下找到,拷贝到开发板
其中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”:
开发板提示:
mqtt.fx转到publish界面,随便publish点啥:
开发板提示:
<2> windows下的MQTT服务器作为代理,开发板发布消息,mqtt.fx订阅消息
直接使用mosquitto_pub失败,提示:
跟了下代码,在 mosquitto lib下的util__random_bytes函数执行失败,看来是一个生成随机数的接口,根据配置不同调用不同方式,强制改为最屌丝的random方式,重新编译生成libmosquitto.so.1,替换开发板上的相同文件;
再次从开发板向windows服务器发布消息:主题“board_msg” 负载 “20200421/17:XX”:
服务器的message count增加:
mqtt.fx订阅服务器消息,可以看到有消息接收到:
暂时可以用了