Android手把手编写儿童手机远程监控App之MQTT与Coturn详解

0 阅读6分钟

概述

上节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常用服务与默认端口

默认端口服务说明
1883MQTT非加密的端口,客户端连接最常用的端口,嘟宝与平台通信所用端口
8883MQTT over SSL/TLS加密的 MQTT 连接端口,需配置 SSL 证书,用于安全场景
8083MQTT over WebSocket(非加密)Web应用WebSocket连接,嘟妈与平台通信所用
8084MQTT 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服务与默认端口

端口好协议说明
3478TCP / UDPSTUN/TURN 默认端口,用于客户端与服务器之间建立连接、进行 NAT 穿透协商
5349TCP / UDPSTUN/TURN 默认端口,URN over TLS/DTLS 用于 TLS 加密的 TURN 连接、进行 NAT 穿透协商
49152 - 65535UDP动态中继端口,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