上篇文章《【Joytag 香蕉派】在香蕉派M3上安装和使用Mosquitto》中我们探讨了如何在香蕉派M3上安装Mosquitto, mosquitto-clients. 本文将对如何使用做一个简单的了解。
关于MQTT
如果你清楚MQTT是啥,那么可以参考如下两个链接
https://en.wikipedia.org/wiki/MQTT
http://mqtt.org/faq
笔者英语水平有限,就不献丑翻译,误导大家啦。
消息代理(Broker): 作为服务器接受订阅、处理和分发消息。
客户端(Client): 订阅消息、发布消息。
本地测试
(一) 启动Broker
本例中我们使用Mosquitto作为Broker, 参考前文, 启动mosquitto:
- mosquitto -c /etc/mosquitto/mosquitto.conf -d
(二) 订阅消息
mosquitto-clients中,包含两个工具
mosquitto_sub,用于订阅消息
mosquitto_pub,用于发布消息
我们使用mosquitto_sub订阅一个主题下的消息
- mosquitto_sub -v -t "topic/joytag/bananapi" -h localhost &
(三) 发布消息
我们使用mosquitto_pub发布一条新消息
- mosquitto_pub -t "topic/joytag/bananapi" -m "Hello Joytag BPI" -h localhost
现在我们就可以在终端收到我们发送的消息喽。
- topic/joytag/bananapi Hello Joytag BPI
上述例子,我们在一个终端窗口下使用如下例子,但实际上消息从发布者-》Broker-》订阅者。
所以我们可以开启两个终端(可以是不同的用户),一个作为订阅者,一个作为发布者,来观察消息的传递情况。
局域网内测试
我们可以在局域网内使用三台设备来进行如下测试:
设备1:作为Broker
设备2:作为订阅者
设备3:作为发布者
与之前测试的区别在于,我们需要在订阅和发布命令中之指定Broker的地址。
在我的局域网中,使用香蕉派M3作为Broker,局域网IP地址为192.168.249.82
所以,我们分别在三台设备上执行如下命令:
设备一:启动mosquittoBroker
- mosquitto -c /etc/mosquitto/mosquitto.conf -d
设备二:订阅主题
- mosquitto_sub -v -t "topic/joytag/bananapi" -h 192.168.249.82 &
设备三:发布消息
-
mosquitto_pub -t "topic/joytag/bananapi" -m "Hello Joytag BPI" -h 192.168.249.82
-
发布成功后我们可以在设备二上收到上述消息。
公网测试
在公网上我们测试订阅和发布消息,来进一步理解MQTT的消息传递机制。
由于将香蕉派M3放到公网上涉及DDNS以及NAT等,本例暂不做讨论。
我们使用eclipse提供的sandbox,详情参考:
http://iot.eclipse.org/getting-started#sandboxes
设备二:订阅主题
- mosquitto_sub -v -t "topic/joytag/bananapi" -h iot.eclipse.org &
设备三:发布消息
-
mosquitto_pub -t "topic/joytag/bananapi" -m "Hello Joytag BPI" -h iot.eclipse.org
-
与我们上述例子的区别就在于-h后的地址使用iot.eclipse.org
发现的问题
在之后的一系列测试中,我们发现在(iot.eclipse.org)的订阅连接,每两秒就被踢出,需要对其进行判断并进行重连。
(通过esp8266 arduino MQTT client测试发现)
估计是为了保证所有测试者可以正常连接,eclipse煞费苦心啊。
我在Amazon的ec2上安装了Mosquitto,测试发现并不存在此问题。
如果使用esp8266 arduino MQTT client,以及如何在Amazon的ec2上安装了Mosquitto,就不在本文讨论了。
更进一步
如果想了解mosquitto_sub, mosquitto_pub的更深入用法,请参考对应手册。
-
man mosquitto_sub
- man mosquitto_pub
总结
本文简单介绍了Mosquitto,mosquitto_sub, mosquitto_pub的使用,分别在同一台主机上,局域网内,以及公共网(Internet)上进行了测试。
并介绍了eclipse提供的sandbox。
谨以本文抛砖引玉,希望大家折腾出更好玩的东西