MQTT学习笔记
前言
在学习阿里物联平台过程中,发现主流都推荐使用mqtt方式实现设备与平台间的通信.
特整理了下mqtt服务的搭建,方便理解.
Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发,它为我们提供了非常棒的轻量级数据交换的解决方案。本文的主旨在于记录Mosquitto服务的安装和使用,以备日后查阅。
若初次接触MQTT协议,可先理解以下概念:
【MQTT协议特点】——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
【MQTT协议角色】——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者,代理器(服务器)和订阅者。
【MQTT协议消息】——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。
【MQTT协议主题】——MQTT中的主题可理解为相同类型或相似类型的消息集合。
安装
从http://mosquitto.org/files/source/下载 Linux 版本 mosquitto-1.5.1.tar.gz
tar -zxvf mosquitto-1.5.1.tar.gz 习惯解压到/usr/local/目录下
cd /usr/local/mosquitto
编译并安装
make && make install
完成之后会在系统命令行里发现mosquitto、mosquitto_passwd、mosquitto_pub和mosquitto_sub四个工具,分别用于启动服务、管理密码、发布消息和订阅消息。
测试
1 配置文件:/etc/mosquitto/mosquitto.conf
禁止匿名用户登录 allow_anonymous false
指定用户密码文件:password_file /etc/mosquitto/pwfile.example
2 创建测试用户
创建用户admin: mosquitto_passwd -c /etc/mosquitto/pwfile.example admin
创建用户mosquitto: mosquitto_passwd -c /etc/mosquitto/pwfile.example mosquitto
3 指定配置文件并后台启动
mosquitto -c /etc/mosquitto/mosquitto.conf -d
4 订阅主题:
mosquitto_sub -h localhost -u mosquitto -P mosquitto -p 1884 -t test
-P为密码,
-p为端口.端口默认为1883,可以在配置文件里指定
-t 为topic
5 启动另一个终端发布主题并发布信息:
mosquitto_pub -t test -u mosquitto -P mosquitto -p 1884 -m “hello world”
这时候会在订阅终端看到订阅的消息
测试成功.
问题记录
1、报错./mosquitto_sub: error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
解决:执行以下命令:
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
ldconfig
2 遇到报用户密码不对的时候,请确认是否有正确添加用户,同时检查连接的端口是否是你配置的.
附录
mosquitto_sub选项:
-d, –debug :开启debug选项
-f, –file:把一个文件的内容做为消息的内容发送。经测试,支持txt文件,不支持doc等其他形式文件。
-h, –host:说明所连接到的域名,默认是localhost
-i, –id:客户端的ID号,如果没有指定,默认是mosquitto_pub_加上客户端的进程id,不能和–id_prefix同时使用。
-I, –id-prefix :指定客户端ID的前缀,与客户端的进程ID连接组成客户端的ID,不能和–id同时使用。
-l, –stdin-line:从总段读取输入发送消息,一行为一条消息,空白行不会被发送。
-m, –message:从命令行发送一条消息,-m后面跟发送的消息内容。
-n, –null-message:发送一条空消息。
-p, –port:连接的端口号,默认是1883.
-P, –pw:指定密码用于代理认证,使用此选项时必须有有效的用户名。
-q, –qos:指定消息的服务质量,可以为0,1,2,默认是0.
–quiet:如果指定该选项,则不会有任何错误被打印,当然,这排除了无效的用户输入所引起的错误消息。
-r, –retain:如果指定该选项,该条消息将被保留做为最后一条收到的消息。下一个订阅消息者将能至少收到该条消息。
-s, –stdin-file:从标准输入接收传输的消息内容,所有输入做为一条消息发送。
-t, –topic:指定消息所发布到哪个主题。
-u, –username:指定用户名用于代理认证。
–will-payload:如果指定该选项,则万一客户端意外和代理服务器断开,则该消息将被保留在服务端并发送出去,该选项必须同时用–will-topic指定主题。
–will-qos:指定Will的服务质量,默认是0.必须和选项 –will-topic同时使用.
–will-retain:如果指定该选项,则万一客户端意外断开,已被发送的消息将被当做retained消息。必须和选项 –will-topic同时使用.
–will-topic:指定客户端意外断开时,Will消息发送到的主题。
mosquitto_pub 选项:
命令:
mosquitto_sub 订阅到主题,接收到消息时打印
选项:
-c, –disable-clean-session:禁止’clean session’选项,即如果客户端断开连接,这个订阅仍然保留来接收随后到的QoS为1和2的消息,当改客户端重新连接之后,它将接收到已排在队列中的消息。建议使用此选项时,客户端id选项设为–id
-d, –debug:开启debug选项
-h, –host:说明所连接到的域名,默认是localhost
-i, –id:客户端的ID号,如果没有指定,默认是mosquitto_pub_加上客户端的进程id,不能和–id_prefix同时使用。
-I, –id-prefix:指定客户端ID的前缀,与客户端的进程ID连接组成客户端的ID,不能喝–id同时使用。
-k, –keepalive:给代理发送PING命令(目的在于告知代理该客户端连接保持且在正常工作)的间隔时间,默认是60s
-p, –port:说明客户端连接到的端口,默认是1883
-P, –pw:指定密码用于代理认证,使用此选项时必须有有效的用户名。
-q, –qos:指定消息的服务质量,可以为0,1,2,默认是0.
–quiet:如果指定该选项,则不会有任何错误被打印,当然,这排除了无效的用户输入所引起的错误消息。
-t, –topic:指定订阅的消息主题,允许同时订阅到多个主题
-u, –username:指定用户名用于代理认证。
-v, –verbose:冗长地打印收到的消息。若指定该选项,打印消息时前面会打印主题名——“主题 消息内容”,否则,只打印消息内容
–will-payload:如果指定该选项,则万一客户端意外和代理服务器断开,则该消息将被保留在服务端并发送出去,该选项必须同时用–will-topic指定主题。
–will-qos:指定Will的服务质量,默认是0.必须和选项 –will-topic同时使用.
–will-retain:如果指定该选项,则万一客户端意外断开,已被发送的消息将被当做retained消息。必须和选项 –will-topic同时使用.
–will-topic:指定客户端意外断开时,Will消息发送到的主题。