之前做MQTT项目,现把测试环境搭建记录一下。
物联网设备很多会用到MQTT协议,我们的项目也用到了,需要把消息报警数据通过MQTT协议上传到第三方平台。设备端只要用到publish协议即可,但是,设备端程序开发完成后,需要自行测试通过后,才能与第三方平台对接,这样提高对接效率。
MQTT服务端采用mosquitto,先到mosquitto官方网站下载安装程序和源码。
Eclipse Mosquitto
最初,我们选择Windows安装包,安装完成后,在安装目录双击mosquitto.exe,把服务端运行起来,默认端口1883。安装目录还有另外两个测试程序,mosquitto_pub和mosquitto_sub,这两个程序需要通过命令行来运行。然后,通过mosquitto_pub程序发布消息,mosquitto_sub订阅消息,mosquitto_sub能收到消息,看起来一切正常。
但是,mosquitto_pub 加参数-P 密码运行的时候,提示测试程序不支持密码模块,mosquitto_sub也有同样的问题,我们对接第三方是要密码认证的,由于下载的是安装包程序,没有办法,通过源码在Linux平台上编译吧。
把源码解压,到解压目录,直接make,过一会说找不到cjson头文件,怎么需要cjson呢,有点奇怪,然后在代码根目录找到README-compiling.md,里面说cjson是可选的,然后找到config.mk,搜索CJSON的行,把yes改为no,再make,编译OK。测试程序生成在client目录下。
编译出来的测试程序支持密码参数的,通过Linux的mosquitto_pub程序,发布到Windows的服务端,死活连不上,但是可以ping通,有点奇怪。然后,直接telnet 到Windows的1883端口,也不行,那说明不是测试程序问题。Windows本地可以连,说明是listen的时候绑定的回环地址。查看,资源管理器,果然是bind了回环地址。
修改安装目录下的配置文件mosquitto.conf,搜索listener,然后增加一句 listener 端口 IP,重新运行mosquitto,通过Linux测试程序,可以连接上了。但是,加了-P参数,提示报错,拒绝连接。网上搜了一下,需要配置用户和密码。
找到安装目录下mosquitto_passwd.exe,通过mosquitto_passwd.exe生成密码文件,publish和sub都一起生成了。注意,下面那行不要带-c参数,否则会重新生成pwfile文件,分别输密码就可以了。
mosquitto_passwd.exe -c pwfile pub_user
mosquitto_passwd.exe pwfile sub_user
密码文件生成后,打开配置文件,找到password_file这行, 增加一行 password_file pwfile,保存,重新运行服务端程序。Linux 测试程序pub和sub都可以发布和订阅消息了,测试环境搭建完成。板子就可以与服务端调试了。