[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 群聊 服务端->>服务端: 原消息留档后,重构消息,发送给群里所有人。
end 服务端 ->> SDK: 消息送达 服务端 ->> 厂商: 根据是否开启推送以及sdk是否在线,决定是否需要厂商推送 厂商 ->> APP: 厂商推送 SDK ->> SDK: 去重(?修改状态,是同id消息,还是消息体体现)
、存表 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消息,还是消息体体现)
、存表 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 ```