概述
上节Android手把手编写儿童手机远程监控App之项目设计作为信令服务器,负责转发嘟妈与嘟宝的信令,建立两者视频会话通道。服务器需要安装EMQX与Coturn两种服务。
EMQX概述
EMQX 是一个统一的 MQTT 平台,面向实时 AI 与物联网数据流场景。它能连接、处理数百万设备的数据,并将其流式传输至云、AI 和分析平台。支持 MQTT 3.1.1 和 5.0 版本,包括 MQTT over WebSocket 和 QUIC;以及 NATS、CoAP、LwM2M 和 100 多种工业协议。
EMQX安装
EMQX支持多平台安装,主流的Linux、Windwos系统都可以轻松安装。在Linux安装方式有很多种,以Debian系统为例,安装方式如下:
- 通过docker安装
- 通过源码编译安装
- 通过软件源仓库安装
- 通过二进制程序安装 以下通过软件源安装,注意网络是否畅通,很多不成功大都是因为网络问题。
安装EMQX
sudo apt update sudo apt install -y emqx 启动 EMQX 服务 sudo systemctl start emqx 设置 EMQX 开机自启 sudo systemctl enable emqx 查看服务运行状态 sudo systemctl status emqx
EMQX常用服务与默认端口
| 默认端口 | 服务 | 说明 |
|---|---|---|
| 1883 | MQTT | 非加密的端口,客户端连接最常用的端口,嘟宝与平台通信所用端口 |
| 8883 | MQTT over SSL/TLS | 加密的 MQTT 连接端口,需配置 SSL 证书,用于安全场景 |
| 8083 | MQTT over WebSocket(非加密) | Web应用WebSocket连接,嘟妈与平台通信所用 |
| 8084 | MQTT over WebSocket(加密) | 需要安全的WebSocket连接,需SSL证书 |
1883与8883一对,8083与8084是一对,所不同在于通信时是否对数据加密。若采用加密的通信方式,需正式申请域名与企业证书,在项目正式上线需采用加密的通信方式,免除信息泄露问题。
MQTT工作原理
MQTT 是基于发布-订阅模式的通信协议,由 MQTT 客户端通过主题(Topic)发布或订阅消息,通过 MQTT Broker 集中管理消息路由,并依据预设的服务质量等级(QoS)确保端到端消息传递可靠性。
- MQTT 客户端,指嘟宝、嘟妈,通过发布主题消息,服务器转发消息给订阅消息的客户端
- MQTT Broker指我们搭建的EMQX服务器
MQTT 主题
MQTT 协议根据主题来转发消息。主题通过 / 来区分层级,类似于 URL 路径,例如:
- chat/room/1
- sensor/10/temperature
- sensor/+/temperature MQTT 主题支持以下两种通配符:+ 和 #。 +:表示单层通配符,例如 a/+ 匹配 a/x 或 a/y。 #:表示多层通配符,例如 a/# 匹配 a/x、a/b/c/d。 注意:通配符主题只能用于订阅,不能用于发布。 通过MQTT客户端演示+与#的使用说明。
- 打开两个MQTT客户端,A、B
- A可以订阅多个主题,订阅二个主题,分别/a、/#
- B分别向三个主题发布消息/a、/b。
图例一,:效果如图:
左A右B,
- 订阅主题为/#,能收到所有主题发布的消息
- 订阅主题为/a,只能收到主题为/a的消息
图例二,效果如图
A定义主题/a/+,它只能收到/a/v或者/a/t,这样主题的消息,如主题为/a、/b则收不到。
MQTT 遗嘱消息
如果 MQTT 客户端异常离线(在断开连接前没有向服务器发送 DISCONNECT 消息),MQTT 服务器会发布遗嘱消息。
嘟宝作为后台程序,应一直与中心平台保持持久连接,一旦连接异常断线,应向嘟妈发送离线消息,该消息称为遗嘱消息。
配置遗嘱消息,应在连接平台之前配置,如下图:
当异常离线后,MQTT会发布主题:/offline,内容是b离线了的消息。
Coturn
概述
Coturn是一个开源的 TURN 和 STUN 服务器实现,解决网络地址转换(NAT)环境下的点对点通信问题。
当嘟宝与嘟妈通过MQTT消息通信需要打开音视频通信时,需要建立一条专门的,一对一音视频通信通道,由于我们的设备都在nat下,无法直接通信。这就需要Coturn帮助建立一条这样的通道。
Coturn安装
Coturn安装方式很多种,这里选择软件源安装,若安装不成功,应考虑网络问题,大都是由于网络不通的。 sudo apt update sudo apt install coturn -y 启动 Coturn服务 sudo systemctl start coturn 设置 Coturn开机自启 sudo systemctl enable coturn 查看服务运行状态 sudo systemctl status coturn
Coturn服务与默认端口
| 端口好 | 协议 | 说明 |
|---|---|---|
| 3478 | TCP / UDP | STUN/TURN 默认端口,用于客户端与服务器之间建立连接、进行 NAT 穿透协商 |
| 5349 | TCP / UDP | STUN/TURN 默认端口,URN over TLS/DTLS 用于 TLS 加密的 TURN 连接、进行 NAT 穿透协商 |
| 49152 - 65535 | UDP | 动态中继端口,Coturn 会从这个范围内分配端口给每个客户端会话 |
- 端口是3478,5349是一对,所不同在于通信时是否对数据加密 。若采用加密的通信方式,需正式申请域名与企业证书,在项目正式上线需采用加密的通信方式,免除信息泄露问题。
- 49152 - 65535|用于嘟宝与嘟妈通信时可以分配的端口,也就是说,嘟宝与嘟妈一对一通信时,所打通隧道所用端口。
Coturn测试工具
在线测试地址:地址。
如下测试搭建Coturn服务器,截图:
重要内容在红框内,红框内列出的地址,都是本机可用地址,它会选择最优的线路与对方通信。
Time Type Foundation Protocol Address Port Priority URL (if present) relayProtocol (if present)
0.003 host 1890004555 udp 192.168.37.1 62627 126 | 32542 | 255
0.004 host 356602878 udp 192.168.147.1 62628 126 | 32286 | 255
0.004 host 3880328078 udp 192.168.188.47 62629 126 | 32030 | 255
0.054 srflx 646401220 udp 125.38.58.150 62629 100 | 32030 | 255 stun:52.68.14.76:3478
0.131 host 241749203 tcp 192.168.37.1 9 90 | 32542 | 255
0.131 host 1804513638 tcp 192.168.147.1 9 90 | 32286 | 255
0.131 host 2575759638 tcp 192.168.188.47 9 90 | 32030 | 255
39.899 Done