客户端/服务器模式 vs 发布/订阅模式
传统的网络通信模式几乎都是基于客户端/服务器模式的:客户端直接和一个服务端建立连接,通信来获取数据,数据源和数据目的地双方直接连接。比如在Web应用程序中,浏览器直接和Web服务器通过HTTP协议通信,浏览器需要知道服务器的IP和端口号。
而发布/订阅模式解耦了客户端,客户端分为2种角色:发布者(Publisher)和订阅者(Subscriber)。每一个发布者(Publisher)可以发送不同类型的消息,我们把消息的类型叫做主题(topic),MQTT通信中的消息都属于某一个主题 ,而只有订阅了这个主题的订阅者(Subscriber)才能收到属于这个主题的消息。发布者和订阅者不需要在意和知道对方的存在(不需要知道对方的IP和端口),也不需要直接与对方建立连接。因为通信中存在着一个叫代理(MQTT broker)的第三种角色,也可以叫MQTT服务器(MQTT server)。
发布者、订阅者只需要知道MQTT 服务器的IP和端口即可,并和它直接建立连接通信。MQTT代理作为消息的中转,它过滤所有接受到的消息,并按照一定的机制(MQTT标准规定是基于主题的消息过滤派发方式,而具体的MQTT服务器软件也提供了其他的派发方式)分发它们,使得所有注册到MQTT代理的订阅者只接收到他们订阅了的消息,而不会收到他不关心的消息。
当发布者发布一条消息的时候,他必须同时指定消息的主题和消息的负载。MQTT代理在收到发布者发过来的消息时,无需访问消息负载,他只是访问消息的主题信息,然后根据这主题派发给订阅者。需要注意的是,一个客户端可以同时既当发布者又当订阅者。比如一个开发板连接了一盏LED灯,它可以发布灯的暗/亮状态信息,也可以从其他节点订阅对灯的控制消息。
# 安装服务端
sudo apt-get install mosquitto
# 安装客户端 (订阅sub 与 发布pub)
sudo apt-get install mosqutitto-client
# 安装调试器
sudo apt-get install mosquitto-dbg
## 查看状态
sudo service mosquitto status
## 开启 mosquitto
sudo service mosquitto start
## 关闭 mosquitto
sudo service mosquitto stop
#启动代理服务
mosquitto -c /etc/mosquitto/mosquitto.conf
mosquitto -v
【-v】打印更多的调试信息
#订阅主题
mosquitto_sub -v -t sensor -h 192.168.228.130 -p 1883
mosquitto_sub -h localhost -t "test" -u "" -P ""
【-t】指定主题,此处为sensor
【-v】打印更多的调试信息
【-h】指定代理服务的IP地址
【-p】指定代理服务的端口号
#发布内容
mosquitto_pub -t sensor -m test_one -h 192.168.228.130 -p 1883
mosquitto_pub -h localhost -t "test" -m "hello world" -u "" -P ""
【-t】指定主题,此处为sensor
【-m】指定消息内容,此处为test_one
【-h】指定代理服务的IP地址
【-p】指定代理服务的端口号
用emq作为mqtt Broker
ubuntu 安装 emq (zip方式)
1.去 https://www.emqx.io/downloads/broker/?osType=Linux 下载一个自己ubuntu对应版本的zip压缩包
2.上传到服务器解压
3.进入解压后的文件 /etc
## 启动emqx
## ./bin/emqx start
## 检查运行状态
## ./bin/emqx_ctl status
## 停止emqx
## ./bin/emqx stop
## 启动停止
systemctl start|stop|restart emqx.service
# 设置用户密码:
vi /emqx/etc/emqx.conf
修改true为false
allow_anonymous = false
# 导入模块
./bin/emqx_ctl plugins load emqx_auth_username
# 输入账号密码
./bin/emqx_ctl users add <账号> <密码>
比如: ./bin/emqx_ctl users add person 123456
修改配置文件后要先关闭emqx服务,然后再重新启动
ps -ef |grep emq
kill -9 port
./bin/emqx start