0%

从零构建物联网平台-实现WebSocket通信


从零构建物联网平台系列文章:

  1. 从零构建物联网平台-给个理由先
  2. 从零构建物联网平台-平台架构
  3. 从零构建物联网平台-需求规划、技术选型和系统设计
  4. 从零构建物联网平台-环境构建
  5. 从零构建物联网平台-MQTT消息代理(Message Broker)
  6. 从零构建物联网平台-构建关键组件
  7. 从零构建物联网平台-实现WebSocket通信

上一篇中我们已经实现了物联网平台的一些基础功能,并通过REST API为这些功能增加了开放接口。
在本篇中,我们将修改MQTT代理的配置并使其发挥出更大作用:

  • 了解WebSocket和MQTT之间的区别
  • 为什么使用WebSocket
  • 将WebSocket功能添加到代理中并进行测试
  • 添加访问级别控制等安全策略

WebSocket和普通MQTT之间的区别

WebSocket提供了长链接方式的通信信道,而不是使用普通HTTP的信道,后者以每个请求为粒度开启/关闭信道。WebSocket提供了一个全双工通信信道,但不一定要遵循MQTT协议。你可以实现一个普通的(不基于MQTT协议)WebSocket,并让两个设备进行通信。但你也可以在MQTT协议基础上实现WebSocket,达到两种通信技术的强强联手,实现1+1>2。

WebSocket之上的MQTT添加了强大的功能。它使WebSocket客户端通过消息订阅的方式来选择他们想要接收的内容。它还增加了通过代理将消息从客户端发布到其他几个客户端的功能,在通常情况下,使用基本的WebSocket通信实现这一功能是非常繁琐的。除此之外,MQTT的其它特性使其更加强大,如遗言、QoS、LWT等。

为什么使用WebSocket

  1. 系统扩展性
    从我们构建的物联网平台的角度来看,提供多种通信方案将平台连接到各种设备是一个基本的需求。这就是我们选择HTTP REST和MQTT的原因。但是由于协议和技术都有各自的优缺点,因此能够将它们结合起来可以显著提高系统架构的可扩展性。

  2. WEB应用
    通过WebSocket+MQTT,每个浏览器都可以是一个MQTT设备。由于MQTT的发布/订阅模式,只要订阅了相关的主题,当事件(实际上是世界上任何地方的事件)发生时,就会实时推送到浏览器。对于面向WebSocket编程方面,基于浏览器的JS语言有丰富的WS代码库。

  3. 安全性
    任何其他不想使用1883/8883端口而希望通过HTTP/HTTPS的应用,可以减少被防火墙阻塞的可能,因为大多数防火墙将允许HTTP通信通过。

MQTT中添加WebSocket配置

在MQTT代理中添加WebSocket支持很简单。在从零构建物联网平台-环境构建一章中,详细记述了如何向不同的端口添加监听器。我们添加了一个本地端口和一个用于通信的安全端口。现在我们将在配置文件中添加另一个监听器端口定义,如下所示。

mosquitto.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置不允许任何人访问,连接时需要用户名和密码
allow_anonymous false #false表示不允许匿名连接
password_file /mosquitto/passwd
acl_file /mosquitto/acl

persistence true

# 将数据持久化及日志保存到指定目录
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log

# 默认端口是 1883
port 1883

# 以下两行表示可以通过9001端口以websocket的方式连接mosquitto服务
listener 9001
protocol websockets

前两部分与前面相同,添加一个本地监听器和一个安全MQTT端口。第三部分在端口9001上添加了一个监听器,在下一行中,它将该端口声明为以下WebSocket。另外生产环境建议开启TSL签名配置,具体配置也很简单,请自行百度,就不在这里赘述。

现在我们已经为MQTT启用了新的WebSocket端口,必须在docker-compose文件中添加这个端口,然后重新启动。

1
2
3
4
5
6
7
8
mosquitto:
image: eclipse-mosquitto:latest # 指定镜像版本
container_name: mosquitto # 命名容器
restart: always # 在容器退出时总是重启容器
network_mode: host # 共享主机的network namespace
ports:
- "1883:1883" # 映射端口
- "9001:9001" # WebSocket端口
1
2
3
# docker-compose down

# docker-compose up
坚持原创技术分享,您的支持将鼓励我继续创作!