|
@@ -0,0 +1,366 @@
|
|
|
+[TOC]
|
|
|
+
|
|
|
+> 消息协议需要调研一下,需求可以服务端转发消息
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 消息体
|
|
|
+
|
|
|
+## 基础结构
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "id": "",
|
|
|
+ "from": "",
|
|
|
+ "to": "",
|
|
|
+ "tenantNo": "",
|
|
|
+ "target": "",
|
|
|
+ "type": "Type",
|
|
|
+ "content": {
|
|
|
+
|
|
|
+ },
|
|
|
+ "timestamp": 1675416709033,
|
|
|
+ "isBackground": false
|
|
|
+}
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+> 部分说明
|
|
|
+>
|
|
|
+> id 为发送端随机数,用来去重
|
|
|
+>
|
|
|
+> `单聊` -> from 发送者 to 接收者 服务器直接转发
|
|
|
+>
|
|
|
+> `群聊`-> 发送消息体:from发送者、to群、target接收者;接收消息体:from群、to接收者、target发送者
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### Type
|
|
|
+
|
|
|
+```java
|
|
|
+public enum MsgType {
|
|
|
+ UNKNOWN(-1), // 未知消息
|
|
|
+ TEXT(0), // 文本消息
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 异常上报
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 文本(text)
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "text": ""
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 图片(image)
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "storageId": "",
|
|
|
+ "thumbnail": "",
|
|
|
+ "thumbnailWidth": 100,
|
|
|
+ "thumbnailHeight": 100
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 语音(audio)
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "storageId": "",
|
|
|
+ "duration": 152
|
|
|
+}
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 视频
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "storageId": "",
|
|
|
+ "fileName": "",
|
|
|
+ "fileSize": "",
|
|
|
+ "duration": 100,
|
|
|
+ "thumbnail": "",
|
|
|
+ "thumbnailWidth": 100,
|
|
|
+ "thumbnailHeight": 100
|
|
|
+}
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 文件
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "storageId": "",
|
|
|
+ "fileName": "",
|
|
|
+ "fileSize": "",
|
|
|
+ "duration": 100,
|
|
|
+ "mimeType": "video/3gpp" // 非必须
|
|
|
+}
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 位置
|
|
|
+
|
|
|
+```json
|
|
|
+```
|
|
|
+
|
|
|
+### 通知
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "title": "",
|
|
|
+ "content": "",
|
|
|
+ "action": "",
|
|
|
+ "appid": "",
|
|
|
+ "appName": "",
|
|
|
+ "appLogo": "",
|
|
|
+ "url": ""
|
|
|
+}
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+### 后台运行
|
|
|
+
|
|
|
+> 组织架构类,大数据,后台更新
|
|
|
+>
|
|
|
+> 视频通话邀请
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "type": "",
|
|
|
+ "content": {}
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 音视频通话
|
|
|
+
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "status": "",
|
|
|
+ "avType": "",
|
|
|
+ "uid": "",
|
|
|
+ "roomId": "",
|
|
|
+ "timestamp": 1675416709033,
|
|
|
+ "useTime": 1675416709033,
|
|
|
+ "agoraKey": 1675416709033
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+>
|
|
|
+>status
|
|
|
+>
|
|
|
+> //邀请invite 拒绝refuse 取消cancel 超时timeout 占线busy
|
|
|
+>
|
|
|
+> // 已在其他设备接听other_answer(256推送消息)
|
|
|
+>
|
|
|
+> // 已在其他设备拒绝other_refuse(根据fromid == account判断)
|
|
|
+>
|
|
|
+> uid // 前端展示邀请人所用
|
|
|
+>
|
|
|
+> useTime //本地纪录的用时,单位秒
|
|
|
+>
|
|
|
+> agoraKey //声网key
|
|
|
+
|
|
|
+```java
|
|
|
+enum OsType {
|
|
|
+ IOS(1),
|
|
|
+ ANDROID(2),
|
|
|
+ WEB(3),
|
|
|
+ WINDOWS(4),
|
|
|
+ UNKNOWN(-1);
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 应用消息
|
|
|
+
|
|
|
+> 区分子应用,提高分配效率
|
|
|
+>
|
|
|
+> 处方单
|
|
|
+
|
|
|
+```json
|
|
|
+{
|
|
|
+ "title": "",
|
|
|
+ "content": "",
|
|
|
+ "action": "",
|
|
|
+ "appid": "",
|
|
|
+ "appName": "",
|
|
|
+ "appLogo": "",
|
|
|
+ "url": ""
|
|
|
+}
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 扩展
|
|
|
+
|
|
|
+> 应对未定义消息,细微拓展。
|
|
|
+>
|
|
|
+
|
|
|
+```json
|
|
|
+{}
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 消息收发机制
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+```mermaid
|
|
|
+sequenceDiagram
|
|
|
+Title: 基础流程(MQTT)
|
|
|
+actor APP
|
|
|
+actor SDK
|
|
|
+actor 服务端
|
|
|
+actor 厂商
|
|
|
+
|
|
|
+critical 启动
|
|
|
+ SDK -->> SDK: 获取设备信息、生成唯一码、获取对应厂商的pushTOken,缓存本地
|
|
|
+ APP ->> SDK: 服务初始化,提供userId
|
|
|
+ SDK ->> 服务端: 提供设备信息、唯一码、pushToken以及userId,注册im服务
|
|
|
+ 服务端 -->> 服务端: 保证每一个唯一码只有一个对应的pushToken等信息(历史唯一码标识只为注销),生成account。
|
|
|
+ 服务端 ->> SDK: 返回account,im服务器信息(域名,端口等)
|
|
|
+ SDK -->> SDK: 连接im服务,订阅account
|
|
|
+end
|
|
|
+
|
|
|
+critical 发送消息
|
|
|
+ APP ->> SDK: 发送消息api
|
|
|
+ SDK ->> 服务端: 整理消息发送
|
|
|
+ alt 单聊
|
|
|
+ 服务端->>服务端: 原消息留档后发送
|
|
|
+ else 群聊
|
|
|
+ 服务端->>服务端: 原消息留档后,重构消息,发送给群里所有人。<br/>
|
|
|
+ end
|
|
|
+ 服务端 ->> SDK: 消息送达
|
|
|
+ 服务端 ->> 厂商: 根据是否开启推送以及sdk是否在线,决定是否需要厂商推送
|
|
|
+ 厂商 ->> APP: 厂商推送
|
|
|
+ SDK ->> SDK: 去重(?修改状态,是同id消息,还是消息体体现)<br/>、存表
|
|
|
+ SDK ->> APP: 通知消息送达
|
|
|
+ alt im推送
|
|
|
+ APP ->> APP: 根据实际情况,决定是直接使用通知里的消息,还是查表获取。
|
|
|
+ else 厂商推送
|
|
|
+ APP ->> APP: 点击通知栏动作(服务端可以配置)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+critical 应用消息
|
|
|
+ Note right of 服务端: 第三方服务获取token(权限认证,类似有appId获取autoTOken之类)
|
|
|
+ Note right of 服务端: 设置群组api、标签api等
|
|
|
+ Note right of 服务端: 调用发送消息api
|
|
|
+ alt 单聊、群聊
|
|
|
+ 服务端->>服务端: 原消息留档后发送指定人员或者群组
|
|
|
+ else 所有人
|
|
|
+ 服务端->>服务端: 原消息留档后,发送到所有用户
|
|
|
+ end
|
|
|
+ 服务端 ->> SDK: 消息送达
|
|
|
+ 服务端 ->> 厂商: 根据是否开启推送以及sdk是否在线,决定是否需要厂商推送
|
|
|
+ 厂商 ->> APP: 厂商推送
|
|
|
+ SDK ->> SDK: 去重(?修改状态,是同id消息,还是消息体体现)<br/>、存表
|
|
|
+ SDK ->> APP: 通知消息送达
|
|
|
+ alt im推送
|
|
|
+ APP ->> APP: 根据实际情况,决定是直接使用通知里的消息,还是查表获取。
|
|
|
+ else 厂商推送
|
|
|
+ APP ->> APP: 点击通知栏动作(服务端可以配置)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+critical 历史消息、离线消息
|
|
|
+
|
|
|
+ alt 历史消息
|
|
|
+ APP ->> SDK: 获取离线消息api
|
|
|
+ SDK ->> 服务端: 获取离线消息(开始时间)
|
|
|
+ 服务端 ->> SDK: 消息送达
|
|
|
+ SDK ->> APP: 通知消息送达
|
|
|
+ APP ->> APP: 查表获取
|
|
|
+ else 离线消息
|
|
|
+ APP ->> SDK: 获取历史消息api
|
|
|
+ SDK ->> 服务端: 获取离线消息
|
|
|
+ 服务端 ->> 服务端: 根据target判断是获取所有还是单人
|
|
|
+ 服务端 ->> SDK: 消息送达
|
|
|
+ SDK ->> APP: 通知消息送达
|
|
|
+ APP ->> APP: 查表获取
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+critical 注销、停用推送
|
|
|
+ par 停用推送
|
|
|
+ APP ->> SDK: 请求关闭推送
|
|
|
+ SDK ->> 服务端: 请求关闭推送
|
|
|
+ 服务端 -->> 服务端: 关闭推送标识(或者直接删除pushtoken?)
|
|
|
+ and 注销
|
|
|
+ APP ->> SDK: 注销
|
|
|
+ SDK ->> 服务端: 注销
|
|
|
+ 服务端 -->> 服务端: 针对这个account对应的唯一码,修改状态为已注销
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|