# Table of Contents - [小米即时消息云介绍 · GitBook](#-gitbook) - [SDK下载 · GitBook](#sdk-gitbook) - [联系我们 · GitBook](#-gitbook) - [安全认证 · GitBook](#-gitbook) - [适用场景 · GitBook](#-gitbook) - [是否收费 · GitBook](#-gitbook) - [开发工作 · GitBook](#-gitbook) - [通知栏提醒 · GitBook](#-gitbook) - [关于UI · GitBook](#-ui-gitbook) - [推荐消息格式 · GitBook](#-gitbook) - [跨应用聊天 · GitBook](#-gitbook) - [WebJS · GitBook](#webjs-gitbook) - [C++ · GitBook](#c-gitbook) - [iOS · GitBook](#ios-gitbook) - [Android Java · GitBook](#android-java-gitbook) - [C++ · GitBook](#c-gitbook) - [无限大群 · GitBook](#-gitbook) - [消息回调 · GitBook](#-gitbook) - [普通群组 · GitBook](#-gitbook) - [历史消息 · GitBook](#-gitbook) - [会话列表 · GitBook](#-gitbook) - [黑名单 · GitBook](#-gitbook) - [创建应用 · GitBook](#-gitbook) - [排查问题 · GitBook](#-gitbook) - [iOS · GitBook](#ios-gitbook) - [C# · GitBook](#c-gitbook) - [Go · GitBook](#go-gitbook) - [消息推送 · GitBook](#-gitbook) - [Android Java · GitBook](#android-java-gitbook) - [更新日志 · GitBook](#-gitbook) --- # 小米即时消息云介绍 · GitBook [小米即时消息云介绍](https://admin.mimc.chat.xiaomi.net/docs/) ====================================================== 小米即时消息云介绍 ========= 一、MIMC愿景 -------- ### 让你有能力连接一切人和设备 小米即时消息云MIMC:Xiaomi Messaging Cloud MIMC是小米自研的一种安全、可靠、易用的分布式IM云服务。为广大开发者提供免费快捷的即时通讯接入服务。MIMC基于多年小米通讯技术积累,让即时通讯不再复杂。 目前开发者可在PC端打开小米开放平台链接查看小米即时消息云的介绍、API接入文档、SDK下载等。 https://dev.mi.com/platform/mimc 二、使用场景 ------ 1. 实现基础聊天功能 网页、app内等应用场景下轻松实现基础聊天功能,包括单聊、群聊、聊天室等,无论你是社交app单聊,还是游戏内玩家公会聊天接入MIMC都可以轻松实现。 2. 实现在线客服功能 利用MIMC的一对一聊天通道实现在线客服的业务逻辑功能。 3. 实现系统消息功能 利用MIMC的消息下发功能实现系统消息的推送。 4. 实现在线直播等其他功能 MIMC的灵活易扩展的消息类型方便实现类似直播等其他各种不同类型的消息的传送。 三、我们的优势 ------- ##### 完全免费 海量并发 消息必达 消息漫游 全球接入 零成本接入 全平台支持 1. APP方账号体系完美契合 目前市场上的消息云,APP开发者需要额外申请一套某信账号,并在服务端明文存储某信账号/密码,维护成本高昂,安全风险极高。 如果接入MIMC,APP开发者丝毫感知不到MIMC账号体系,所有收发都是用APP账号,无缝契合,安全性高。 2. 适用场景广泛 目前市场上的消息云,大都只能适用于聊天场景,其他消息场景不能支持。MIMC则可以支持智能硬件信令/聊天/客服/推送等任何消息传递场景。 3. 全平台支持 Android/iOS/Web/C/C#/Java/Go等全平台/多语言支持,一期支持Android/iOS/Web三平台,后续会根据用户需要支持更多平台/语言。 4. 消息格式100%自定义高灵活度 目前市场上的消息云大都聊天内容/格式自定义程度低,扩展性差。MIMC不对消息内容/格式进行限制,APP可根据自己需求,灵活定制消息格式,传递更契合APP自身需求的数据。 5. 极简API设计 基于全新的API设计大大简化了app开发者的接入成本,3分钟即可实现聊天功能。 results matching "" =================== No results matching "" ====================== --- # SDK下载 · GitBook [SDK下载](https://admin.mimc.chat.xiaomi.net/docs/) ================================================== SDK下载 ----- `目前已支持如下SDK,并且绝大部分SDK代码已经开源,如果需要其他SDK支持请单独联系我们。` | SDK | 描述 | 备注 | 下载链接 | 文档 | | --- | --- | --- | --- | --- | | WebJS | 同一个用户允许同时登录多个UA | 消息多平台多终端同步 | [WebJS SDK](https://github.com/Xiaomi-mimc/mimc-webjs-sdk) | [文档](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html) | | iOS | 同一个用户允许同时登陆多个设备 | 消息多平台多终端同步 | [iOS SDK](https://github.com/Xiaomi-mimc/mimc-ios-sdk) | [文档](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html) | | Android Java | 同一个用户允许同时登录多个设备 | 消息多平台多终端同步 | [Android Java SDK](https://github.com/Xiaomi-mimc/mimc-android-java-sdk) | [文档](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html) | | C# | 同一个用户允许同时登录多个设备 | 消息多平台多终端同步 | [C# SDK](https://github.com/Xiaomi-mimc/mimc-csharp-sdk) | [文档](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html) | | C++ | 同一个用户允许同时登录多个设备 | 消息多平台多终端同步 | [C++ SDK](https://github.com/Xiaomi-mimc/mimc-cpp-sdk) | [文档](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html) | | Go | 同一个用户允许同时登录多个设备 | 消息多平台多终端同步 | [Go SDK](https://github.com/Xiaomi-mimc/mimc-go-sdk) | [文档](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html) | ### PS `虽然目前我们官方暂时没有人员和精力对微信小程序做出支持,但是一些优秀的开发小伙伴对MIMC做出了贡献,下面这个链接就是某个开发小伙伴改出的支持微信小程序的JS库代码,如果有需要的小伙伴可以用一下,在此再次表示感谢。` ##### 链接 [开发者修改的支持微信小程序的JS库](https://gitee.com/fulusco/mimc-uniapp-sdk) [开发者修改的Flutter库](https://github.com/chenxianqi/flutter_mimc) results matching "" =================== No results matching "" ====================== --- # 联系我们 · GitBook [联系我们](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 联系我们 ---- `我们推荐加入QQ群的方式与我们直接对接,我们将对您进行一对一技术支持以及业务上的设计建议。` #### 1\. 邮箱 mimc-help@xiaomi.com #### 2\. 微信公众号 ![](https://admin.mimc.chat.xiaomi.net/docs/img-folder/MIMC-Official-Accounts.jpg) #### 3\. MIMC官方QQ群(603298752) ![](https://admin.mimc.chat.xiaomi.net/docs/img-folder/MIMC-QQGroup2.jpeg) results matching "" =================== No results matching "" ====================== --- # 安全认证 · GitBook [安全认证](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [安全认证机制](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81%E6%9C%BA%E5%88%B6) * [整体流程](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E6%95%B4%E4%BD%93%E6%B5%81%E7%A8%8B) * [服务端实现代理认证服务](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%90%86%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1) * [应用端实现安全认证接口](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E5%BA%94%E7%94%A8%E7%AB%AF%E5%AE%9E%E7%8E%B0%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81%E6%8E%A5%E5%8F%A3) * [如何调用小米认证服务](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E5%A6%82%E4%BD%95%E8%B0%83%E7%94%A8%E5%B0%8F%E7%B1%B3%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1) * [如何处理token泄露](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86token%E6%B3%84%E9%9C%B2) 安全认证 ---- ### 安全认证机制 #### 整体流程 ![](https://admin.mimc.chat.xiaomi.net/docs/img-folder/fetchtoken.png) ##### 名词解释 App: 开发者开发之应用 SDK: MIMC SDK appProxyService: 代理认证服务 TokenService: 小米认证服务 appId: 应用ID,小米开放平台申请分配 appKey: 应用Key,小米开放平台申请分配 appSec: 应用Sec,小米开放平台申请分配 appAccount: 应用账号系统内用户账号ID,应用账号系统内唯一 token: 小米认证服务(TokenService)下发Token #### 服务端实现代理认证服务 服务端实现代理认证服务(appProxyService),顺序做以下事情: 1. 代理认证服务存储appKey/appSec等敏感数据 访问小米认证服务需要appKey/appSec等,这些数据非常敏感, 如果放在应用端代码中会非常容易泄露,而且一旦泄漏无法更新, 而存储在代理认证服务,则泄露风险很低,一旦泄露也可以快速更新。 2. 代理认证服务做账号合法性认证 代理认证服务需要保证登录的appAccount在其账号系统内是合法有效的 3. 调用小米认证服务(TokenService) 代理认证服务在保证用户合法以后,调用小米认证服务, 并将[小米认证服务下发的原始数据]适当封装后,返回给安全认证接口 #### 应用端实现安全认证接口 **应用端实现安全认证接口,做以下事情:** 1. 访问代理认证服务(appProxyService) 2. 代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回 **注意:** 访问代理认证服务(appProxyService)传入的appAccount, 必须与User构造函数传入的appAccount相同 **各语言平台SDK安全认证接口实现逻辑:** Android: Java: C++: 实现MIMCTokenFetcher.fetchToken(),同步访问代理认证服务, 从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回 WebJS: 实现function fetchMIMCToken(),同步访问代理认证服务, 从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回 C#: 实现IMIMCTokenFetcher.fetchToken(),同步访问代理认证服务, 从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回 iOS: 初始化NSMutableURLRequest,用于异步访问应用代理认证服务 实现parseTokenDelegate,从NSMutableURLRequest异步返回结果中 解析[小米认证服务下发的原始数据]并返回 GO: 实现FetchToken() *string,同步访问代理认证服务, 从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回 ### 如何调用小米认证服务 ###### 参数列表 | Variable | Meanings | | --- | --- | | $appId | 小米开放平台申请的AppId | | $appKey | 小米开放平台申请的AppKey | | $appSecret | 小米开放平台申请的AppSecret | | $appPackage | 小米开放平台申请的AppPackage | | $regionKey | 表示地区关键词,不传时默认为REGION\_CN。REGION\_CN(中国)、REGION\_US(美国)、REGION\_RU(俄罗斯) 、REGION\_IN(印度)、REGION\_DE(法兰克福)、REGION\_SGP(新加坡) | | $appAccount | 用户在APP账号系统内唯一ID | | $chid | MIMC服务的标识,为常量9 | | $uuid | $appAccount在MIMC内对应userId,开发者可忽略 | | $token | $appAccount在MIMC系统中的token | * HTTP 请求 接口1: curl "https://mimc.chat.xiaomi.net/api/account/token" -XPOST -d '{"appId":$appId,"appKey":$appKey,"appSecret":$appSecret,"appAccount":$appAccount}' -H "Content-Type: application/json" 接口2: curl "https://mimc.chat.xiaomi.net/api/account/token" -XPOST -d '{"appId":$appId,"appKey":$appKey,"appSecret":$appSecret,"appAccount":$appAccount,"regionKey":$regionKey}' -H "Content-Type: application/json" * JSON结果 { "code": 200, "message": "success", "data": { "appId": $appId, "appPackage": $appPackage, "appAccount": $appAccount, "miChid": $chid, "miUserId": $uuid, "miUserSecurityKey": $appSecret, "token": $token, "regionBucket": $regionBucket, "feDomainName": $feDomainName, "relayDomainName": $relayDomainName } } ###### 备注:对于以上JSON结果,应用方不需要理解其格式,最终通过安全认证接口原样返回即可 ### 如何处理token泄露 当小米安全认证的token信息泄露时,可以调用如下的kick接口使已泄露token过期。 ###### 参数列表 | Variable | Meanings | | --- | --- | | $appId | 小米开放平台申请的AppId | | $appKey | 小米开放平台申请的AppKey | | $appSecret | 小米开放平台申请的AppSecret | | $appAccount | 用户在APP账号系统内唯一ID | | $appAccountEncode | 用户在APP账号系统内唯一ID | | $userToken | token泄露的appAccount的token(使用user.getToken()获取) | **注意:** token的获取使用User.getToken()方法。 身份认证有两种方式:1.token; 2.app信息,app账号($appKey,$appSecret,$appAccount)。 当两种认证信息都存在时,优先验证前者。前者一般用于app客户端,后者一般用于app服务端。下面给出了这两种的使用方式。 以下所有的http接口中,如果传入的appAccount是-H参数且含有中文,那么就需要做下面两件事(不含中文则不需要): (1)将appAccount进行base64编码之后再传入; (2)需要加上appAccountEncode参数,表示对appAccount进行了base64编码; -H "appAccountEncode:base64" * HTTP 请求 curl "https://mimc.chat.xiaomi.net/api/account/kick" -XPOST -H "Content-Type: application/json" -H "appId:$appId" -H "token:$userToken" curl "https://mimc.chat.xiaomi.net/api/account/kick" -XPOST -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" * JSON结果 { "code": 200, "message": "success" } [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 适用场景 · GitBook [适用场景](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 适用于一切基于长连接的信息传递场景,包括不限于: ------------------------ 即时通讯:单聊/群聊/在线客服/等 论坛:私信/留言等 IoT:信令传递等 其他:网页扫码登录等 results matching "" =================== No results matching "" ====================== --- # 是否收费 · GitBook [是否收费](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= #### 是否收费 即时消息服务将会一直供大家免费使用,解除开发者后顾之忧 即时消息云中的所有功能,我们都不做限制,免费供大家使用,包括但不限于: 发送消息数,注册用户数,多终端登录,创建群个数,群历史消息,实时/离线消息回调,推送消息数等 当然,对于恶意使用者,我们仍然保留封禁的权利 #### 默认qps限制 > 默认qps是服务器默认设定的,如果有特殊需求,可以联系我们 | 聊天类型 | qps | | --- | --- | | p2p(单聊) | 50 | | p2t(普通群聊) | 20 | | p2u(无限大群) | 50 | results matching "" =================== No results matching "" ====================== --- # 开发工作 · GitBook [开发工作](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [开发者工作](https://admin.mimc.chat.xiaomi.net/docs/0503-howtouse.html#%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E4%BD%9C) * [常见问答](https://admin.mimc.chat.xiaomi.net/docs/0503-howtouse.html#%E5%B8%B8%E8%A7%81%E9%97%AE%E7%AD%94) * [1\. 为什么不提供聊天界面](https://admin.mimc.chat.xiaomi.net/docs/0503-howtouse.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E6%8F%90%E4%BE%9B%E8%81%8A%E5%A4%A9%E7%95%8C%E9%9D%A2) * [2\. 为什么需要开发者自定义消息格式](https://admin.mimc.chat.xiaomi.net/docs/0503-howtouse.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E5%BC%80%E5%8F%91%E8%80%85%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B6%88%E6%81%AF%E6%A0%BC%E5%BC%8F) * [3\. 为什么开发者不需要维护账号映射](https://admin.mimc.chat.xiaomi.net/docs/0503-howtouse.html#%E4%BB%80%E4%B9%88%E5%BC%80%E5%8F%91%E8%80%85%E4%B8%8D%E9%9C%80%E8%A6%81%E7%BB%B4%E6%8A%A4%E8%B4%A6%E5%8F%B7%E6%98%A0%E5%B0%84) 开发者工作 ----- ##### 1\. 开发者需要自己实现聊天界面 ##### 2\. 开发者需要接入消息云安全认证 ##### 3\. 开发者需要自己定义消息体格式 常见问答 ---- ##### 为什么不提供聊天界面 我们不提供统一的聊天UI,基于以下理由: 1. APP都有自己的风格,万紫千红才是春,一套UI显然不能满足大家需求 2. UI对于开发者而言,开发成本并不高 3. 开发者自行开发UI,可100%自定义界面和功能 所以,我们认为由开发者根据自己APP的风格来自定义UI比较合适 ##### 为什么需要开发者自定义消息格式 我们不提供统一的消息格式,而由开发者自定义消息格式,基于以下理由: 1. APP所需消息功能各异 有的需要已读,有的则不需要已读功能,所以我们提供了推荐的消息格式, 由开发者根据自己情况定义最适合自己的消息格式 2. MIMC(小米即时消息云)应用场景广泛 IM聊天只是MIMC的一个特殊使用场景,还存在IoT信令传递等各种消息传递场景 所以,我们认为由开发者根据自己APP的实际需求,参考我们推荐的消息格式,来定义消息体格式比较合适 ##### 什么开发者不需要维护账号映射 MIMC用户登录/消息收发等都使用APP账号系统里的账号ID,MIMC账号体系对APP开发者透明! APP开发者接入其他IM提供商时,要访问IM提供商服务,主动为每一个appAccount注册一个新的ID, 开发者还需要在自己的后台系统储存以下信息: 1. appAccount --> IM提供商系统内ID 2. IM提供商系统内ID + IM提供商系统内登录密码(明文) 这样做有以下弊端: 1. 开发者维护账号映射成本高,一旦出错难以修正 2. 明文存储登录密码,安全性极差,开发者承担极高的安全风险 所以,MIMC(小米即时消息云)没有采取以上方案,MIMC自维护账号映射,保证MIMC ID对开发者透明 这不仅降低了开发者负担,增强了账号安全性,还能让开发者感觉MIMC就是"自己的"消息系统 ###### 举例说明: 假设开发者拥有某APP叫"言士文学",集成了MIMC(小米即时消息云)服务 假设"言士文学"在小米开放平台注册的appId为"580012345678" 某用户A登录"言士文学"所用账号名为手机号"13800000001" 某用户B登录"言士文学"所用账号名为手机号"13800000002" 当用户A首次登录"言士文学": userA = new User("580012345678", "13800000001"); userA.login(); MIMC后台服务会为A创建MIMC ID("8049600000000001"),并维护以下映射: "580012345678" + "13800000001" --> "8049600000000001" 然后,用户A给用户B发消息: userA.sendMessage("13800000002", "Hello B"); 由于B还未登录过"言士文学",所以MIMC会自动为B创建创建MIMC ID("8049600000000002") 并维护以下映射: "580012345678" + "13800000002" --> "8049600000000002" 并将消息"Hello B"暂存在服务器(七天后过期) 用户B登录"言士文学"时: userB = new User("580012345678", "13800000002"); userB.login(); 因为B在MIMC已经有了ID,所以MIMC后台服务不会再为其分配新ID MIMC后台服务检测到B登录,下发离线消息"Hello B"给B [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/0503-howtouse.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 通知栏提醒 · GitBook [通知栏提醒](https://admin.mimc.chat.xiaomi.net/docs/) ================================================== #### APP在后台收不到消息如何处理 iOS平台下,APP进入后台时,进程代码执行会暂停,连接过一段时间后也会被关闭(当前Android也慢慢趋同于iOS) 在APP后台运行被限制越来越严格的大背景下,如何让APP在后台运行时仍然可以"收到"消息呢? 我们建议以下方案: 1. 开发者开发线上服务OfflineMessageService,接收MIMC服务回调的离线消息 2. OfflineMessageService将接收到的离线消息,通过小米推送将离线消息提醒下发到用户手机通知栏 3. 用户点击手机通知栏提醒,APP被启动进入前台,MIMC会自动重连接收离线消息 results matching "" =================== No results matching "" ====================== --- # 关于UI · GitBook [关于UI](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 关于UI组件 ------ ##### 目前MIMC的Demo UI 比较粗糙,仅作为功能演示使用,公共开源的通用UI组件正在开发过程中,小伙伴们暂时可通过其他方式自己处理设计UI。 results matching "" =================== No results matching "" ====================== --- # 推荐消息格式 · GitBook [推荐消息格式](https://admin.mimc.chat.xiaomi.net/docs/) =================================================== 目录 -- * [1.检查用户在线](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E6%A3%80%E6%9F%A5%E7%94%A8%E6%88%B7%E5%9C%A8%E7%BA%BF) * [2.文本消息](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF) * [3.多媒体消息](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E5%A4%9A%E5%AA%92%E4%BD%93%E6%B6%88%E6%81%AF) * [4.撤回消息](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E6%92%A4%E5%9B%9E%E6%B6%88%E6%81%AF) * [5.已读消息](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E5%B7%B2%E8%AF%BB%E6%B6%88%E6%81%AF) * [6.添加好友](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E6%B7%BB%E5%8A%A0%E5%A5%BD%E5%8F%8B) * [7.其他自定义消息功能](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E5%85%B6%E4%BB%96%E8%87%AA%E5%AE%9A%E4%B9%89%E6%B6%88%E6%81%AF%E5%8A%9F%E8%83%BD) #### MIMC系统不对传输的消息格式/内容进行理解,在MIMC看来传输的都是二进制数据,消息格式由APP开发者自定义自解析 #### 我们建议开发者参考以下样例来定义自己的消息格式 #### 检查用户在线 * 用户A`通过MIMC`发送ping给用户B * 用户B接收到ping后,`通过MIMC`发送pong给用户A 服务器上存储的用户状态会有延迟,所以要获取最精确的用户在线状态,一般用端到端ping-pong方式 ###### 检查用户在线ping bizType: "PING" // PING|PONG|... payload: { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "PING_12345", // APP业务层面自维护消息ID timestamp: "1516763973000", // 建议精确到毫秒 payload: "appAccount_A", } ###### 检查用户在线pong bizType: "PONG", // PING|PONG|... payload: { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "PONG_12345", // APP业务层面自维护消息ID timestamp: "1516763973000", // 建议精确到毫秒 payload: "appAccount_B", } #### 文本消息 * 用户A`通过MIMC`发送文本消息`(msgId="TEXT_12345")`给用户B * 用户B接收文本消息`(msgId="TEXT_12345")` bizType: "TEXT" // TEXT|PIC_FILE|AUDIO_FILE|BIN_FILE|... payload: { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "TEXT_12345", // APP业务层面自维护消息ID timestamp: "1516763973000", // 建议精确到毫秒 payload: "欢迎使用小米即时消息云(MIMC)", } #### 多媒体消息 * 用户A将图片文件/语音文件/视频文件`(非实时语音视频聊天)`上传到文件存储服务器,获得一个URL * 用户A`通过MIMC`发送多媒体消息`(msgId="PIC_FILE_12345", payload=URL)`给用户B * 用户B接收多媒体消息`(msgId="PIC_FILE_12345", payload=URL)`,通过URL下载图片文件/语音文件/视频文件 bizType: "PIC_FILE" // TEXT|PIC_FILE|AUDIO_FILE|BIN_FILE|... payload: { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "PIC_FILE_12345", // APP业务层面自维护消息ID timestamp: "1516763973000", // 建议精确到毫秒 payload: "https://github.com/Xiaomi-mimc/operation-manual/blob/master/img-folder/MIMC-Official-Accounts.jpg", } #### 撤回消息 * 用户A发送文本消息`(msgId="TEXT_12345")`给用户B * 用户B接收文本消息`(msgId="TEXT_12345")` * 用户A发送撤回消息`(msgId="TEXT_RECALL_12345")`给用户B * 用户B接收撤回消息`(msgId="TEXT_RECALL_12345")`并删除文本消息`(msgId="TEXT_12345")` bizType: "TEXT_RECALL" // TEXT|PIC_FILE|AUDIO_FILE|BIN_FILE|... payload: { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "TEXT_RECALL_12345", // APP业务层面自维护消息ID timestamp: "1516763973090", // 建议精确到毫秒 payload: {recall_msgId: "TEXT_12345"}, // 撤回msgId为TEXT_12345的消息 } #### 已读消息 * 用户A发送文本消息`(msgId="TEXT_12345")`给用户B * 用户B接收文本消息`(msgId="TEXT_12345")` * 用户B发送已读消息`(msgId="TEXT_READ_12345")`给用户A * 用户A接收已读消息`(msgId="TEXT_READ_12345")`并标记文本消息`(msgId="TEXT_12345")`已读 bizType: "TEXT_READ" payload: { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "TEXT_READ_12345", // APP业务层面自维护消息ID timestamp: "1516763973134", // 建议精确到毫秒 payload: {read_msgId: "TEXT_12345"}, // 已读msgId为TEXT_12345的消息 } #### 添加好友 * 用户A发送添加好友请求`(msgId="ADD_FRIEND_REQUEST_12345")`给用户B * 用户B接收添加好友请求`(msgId="ADD_FRIEND_REQUEST_12345")` * 用户B同意/拒绝好友添加请求,则回复同意/拒绝`(msgId="ADD_FRIEND_RESPONSE_12345")`给用户A,并更新服务器好友数据 ###### 发送添加好友请求 bizType: "ADD_FRIEND_REQUEST" // 添加好友请求 payload: { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "ADD_FRIEND_REQUEST_12345", // APP业务层面自维护消息ID timestamp: "1516763973134", // 建议精确到毫秒 payload: {add_requester: "accountA"}, } ###### 回复同意/拒绝好友 bizType: "ADD_FRIEND_RESPONSE" // 同意添加好友 { version: 0, // 建议保留version字段,方便后续协议升级兼容 msgId: "ADD_FRIEND_RESPONSE_12345", // APP业务层面自维护消息ID timestamp: "1516763973134", // 建议精确到毫秒 payload: {add_responser: "accountB", accepted:true/false}, } #### 其他自定义消息功能 * 参考以上,设置对应的bizType/payload [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/06-msgformat.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 跨应用聊天 · GitBook [跨应用聊天](https://admin.mimc.chat.xiaomi.net/docs/) ================================================== 跨应用聊天 ----- #### 实现两个不同的APP之间聊天,使用同一个appId/appKey/appSecret即可。 results matching "" =================== No results matching "" ====================== --- # WebJS · GitBook [WebJS](https://admin.mimc.chat.xiaomi.net/docs/) ================================================== 目录 -- * [引入头文件](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%BC%95%E5%85%A5%E5%A4%B4%E6%96%87%E4%BB%B6) * [用户初始化](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E7%94%A8%E6%88%B7%E5%88%9D%E5%A7%8B%E5%8C%96) * [安全认证](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81) * [登录](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E7%99%BB%E5%BD%95) * [在线状态变化回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%9C%A8%E7%BA%BF%E7%8A%B6%E6%80%81%E5%8F%98%E5%8C%96%E5%9B%9E%E8%B0%83) * [发送单聊消息](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%8F%91%E9%80%81%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF) * [发送群聊消息](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%8F%91%E9%80%81%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF) * [服务器响应回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%93%8D%E5%BA%94%E5%9B%9E%E8%B0%83) * [接收消息回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E6%8E%A5%E6%94%B6%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [无限大群](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [创建无限大群](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%88%9B%E5%BB%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [创建无限大群回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%88%9B%E5%BB%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E5%9B%9E%E8%B0%83) * [加入无限大群](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%8A%A0%E5%85%A5%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [加入无限大群回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%8A%A0%E5%85%A5%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E5%9B%9E%E8%B0%83) * [退出无限大群](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E9%80%80%E5%87%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [退出无限大群回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E9%80%80%E5%87%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E5%9B%9E%E8%B0%83) * [群主解散无限大群](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E7%BE%A4%E4%B8%BB%E8%A7%A3%E6%95%A3%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [群主解散无限大群回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E7%BE%A4%E4%B8%BB%E8%A7%A3%E6%95%A3%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E5%9B%9E%E8%B0%83) * [解散无限大群通知群成员回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E8%A7%A3%E6%95%A3%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E9%80%9A%E7%9F%A5%E7%BE%A4%E6%88%90%E5%91%98%E5%9B%9E%E8%B0%83) * [发送无限大群消息](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E5%8F%91%E9%80%81%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E6%B6%88%E6%81%AF) * [接收无限大群消息回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E6%8E%A5%E6%94%B6%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [连接断开回调](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E8%BF%9E%E6%8E%A5%E6%96%AD%E5%BC%80%E5%9B%9E%E8%B0%83) * [注销](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E6%B3%A8%E9%94%80) * [示例代码](https://github.com/Xiaomi-mimc/mimc-webjs-sdk/tree/master/demo) 引入头文件 ----- 用户初始化 ----- 默认支持多设备登录,根据浏览器UserAgent做设备区分 user = new MIMCUser(appId, appAccount); user.registerFetchToken(fetchMIMCToken); //获取token回调 user.registerStatusChange(statusChange); //登录结果回调 user.registerServerAckHandler(serverAck); //发送消息后,服务器接收到消息ack的回调 user.registerP2PMsgHandler(receiveP2PMsg); //接收单聊消息回调 user.registerGroupMsgHandler(receiveP2TMsg); //接收群聊消息回调 user.registerPullNotificationHandler(pullNotificationHandler); //拉取离线消息回调 user.registerDisconnHandler(disconnect); //连接断开回调 user.registerUCDismissHandler(ucDismiss); //解散无限大群回调 user.registerUCJoinRespHandler(ucJoinResp); //加入无限大群回调 user.registerUCMsgHandler(ucMessage); //接收无限大群消息回调 user.registerUCQuitRespHandler(ucQuitResp); //退出无限大群回调 安全认证 ---- #### 参考 [安全认证](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html) ,实现以下API: /** * 同步访问代理认证服务(appProxyService), * 从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回 **/ function fetchMIMCToken() { } 登录 -- user.login(); 在线状态变化回调 -------- /** * @param[bindResult] bool: true/false 表示登录成功/失败 * @param[errType] string: 登录失败类型 * @param[errReason] string: 登录失败原因 * @param[errDesc] string: 登录失败描述 **/ function statusChange(bindResult, errType, errReason, errDesc) { } 发送单聊消息 ------ /** * @param[appAccount] string: 消息接收者在App账号系统的账号ID * @param[payload] string UTF-8: 用户自定义消息体 * @param[bizType] string: 消息类型,默认空字符串 * @param[isStore] bool: 消息是否存储在mimc服务端,true 存储, false 不存储, 默认存储 # @return string: 由客户端生成的消息ID **/ var packetId = user.sendMessage(appAccount, payload, isStore); var packetId = user.sendMessage(appAccount, payload, bizType, isStore); 发送群聊消息 ------ /** * @param[groupId] string: 群ID,也名为topicId * @param[payload] string UTF-8: 用户自定义消息体 * @param[bizType] string: 消息类型,默认空字符串 * @param[isStore] bool: 消息是否存储在mimc服务端,true 存储, false 不存储, 默认存储 # @return string: 由客户端生成的消息ID **/ var packetId = user.sendGroupMessage(groupId, payload, isStore); var packetId = user.sendGroupMessage(groupId, payload, bizType, isStore); 服务器响应回调 ------- /** * @param[packetId] string: 成功发送到服务器消息的packetId,即sendMessage(,)的返回值 * @param[sequence] string: 服务器生成,单用户空间内递增唯一,可用于排序(升序)/去重 * @param[timeStamp] string: 消息到达服务器时间(ms) * @param[errMsg] string: 服务器返回的错误信息 **/ function serverAck(packetId, sequence, timeStamp, errMsg) { } 接收消息回调 ------ /** * @param[P2PMsg] object: 接收到的P2P消息体 **/ function receiveP2PMsg(P2PMsg) { P2PMsg.getPacketId(); // 客户端生成的消息ID P2PMsg.getSequence(); // 由服务器生成,用于去重排序(升序) P2PMsg.getFromAccount(); // 消息发送者在APP账号系统的账号ID P2PMsg.getTimeStamp(); // 消息发送时间戳 P2PMsg.getBizType(); //消息类型 P2PMsg.getPayload(); // payload为用户自定义消息,UTF-8 string类型 } 接收群聊消息回调 -------- /** * @param[P2TMsg] object: 接收到的P2T消息体 **/ function receiveP2TMsg(P2TMsg) { P2TMsg.getPacketId(); // 客户端生成的消息ID P2TMsg.getSequence(); // 由服务器生成,用于去重排序(升序) P2TMsg.getFromAccount(); // 消息发送者在APP账号系统的账号ID P2TMsg.getTopicId(); // 群ID P2TMsg.getTimeStamp(); // 消息发送时间戳 P2TMsg.getBizType(); //消息类型 P2TMsg.getPayload(); // payload为用户自定义消息,utf-8 string类型 } 拉取离线消息通知回调 ---------- /** * 通知主动拉取离线消息,拉取区间:(minSequence, maxSequence] * 默认情况,当用户处于离线状态时,最多保留近7天内的离线消息,直到用户上线,持续下发缓存的离线消息。 * 若积压的离线消息过多,会一直下发离线消息,从而导致长时间无法接收最新消息,直到离线消息接收完毕为止。 * 我们支持设置一个阈值来控制离线消息是否持续下发,比如阈值设置为offlineMsgMaxCount=500,表示当离线消息达到500条时,触发onPullNotification(...) * 回调,当回调接口返回true时,服务端会跳过离线消息,直接下发最新的实时消息,应用方可根据回调形参单独去拉取离线消息。 * 1)首先拉取会话列表; * 2)然后用会话列表中的"sequence"字段和回调接口的“minSequence”形参进行比对,当sequence > minSequence时,说明需要拉取该会话的历史消息; * 3)最后拉取历史消息,其中"fromAccount"字段从会话列表中提取即可。 * 会话列表:https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html * 历史消息:https://admin.mimc.chat.xiaomi.net/docs/11-history.html */ /** * @param[minSequence] String: 离线消息最小的sequence * @param[maxSequence] String: 离线消息最大的sequence **/ function pullNotificationHandler(minSequence, maxSequence) {} 无限大群 ---- #### 创建无限大群 /** * @param[groupName] string: 群名称 * @param[createUCGroupCB] func: 创建无限大群回调 * @param[context] : 用户自定义内容,通过回调函数原样传出 **/ user.createUnlimitedGroup(groupName, createUCGroupCB, context); #### 创建无限大群回调 /** * @param[topicId] string: 群id * @param[topicName] string: 群名称 * @param[isSuccess] bool: 是否创建成功 * @param[errMsg] string: 错误信息 * @param[context] : 用户自定义传入的内容 **/ function createUCGroupCB(topicId, topicName, isSuccess, errMsg, context) #### 加入无限大群 /** * @param[topicID] string: 群id,必须为string类型 * @param[context] : 用户自定义内容,通过回调函数原样传出 **/ user.joinUnlimitedGroup(topicID, context); #### 加入无限大群回调 /** * @param[topicId] string: 群id * @param[code] int: 返回码,0为成功,其他为失败 * @param[msg] string: 错误信息 * @param[context] : 用户自定义传入的内容 **/ function ucJoinResp(topicId, code, msg, context) #### 退出无限大群 /** * @param[topicID] string: 群id,必须为string类型 * @param[context] : 用户自定义内容,通过回调函数原样传出 **/ user.quitUnlimitedGroup(topicID, context); #### 退出无限大群回调 /** * @param[topicId] string: 群id * @param[code] int: 返回码,0为成功,其他为失败 * @param[msg] string: 错误信息 * @param[context] : 用户自定义传入的内容 **/ function ucQuitResp(topicId, code, msg, context) #### 群主解散无限大群 /** * @param[topicID] string: 群id,必须为string类型 * @param[dismissUCGroupCB] func: 解散无限大群回调 * @param[context] : 用户自定义内容,通过回调函数原样传出 **/ user.dismissUnlimitedGroup(topicID, dismissUCGroupCB, context); #### 群主解散无限大群回调 /** * @param[isSuccess] bool: 是否解散成功 * @param[topicId] string: 群id * @param[context] : 用户自定义传入的内容 **/ function dismissUCGroupCB(isSuccess, topicId, context) #### 解散无限大群通知群成员回调 /** * @param[topicId] string: 群id **/ function ucDismiss(topicId) #### 发送无限大群消息 /** * @param[topicID] string: 群id,必须为string类型 * @param[payload] string UTF-8: 用户自定义消息体 * @param[bizType] string: 消息类型,默认空字符串 * @param[isStore] bool: 是否存储历史消息,默认false # @return string: 由客户端生成的消息ID **/ user.sendUnlimitedGroupMessage(topicID, payload, isStore = false); user.sendUnlimitedGroupMessage(topicID, payload, bizType, isStore = false); #### 接收无限大群消息回调 /** * @param[groupMsg] object: 接收到的P2T消息体 **/ function ucMessage(groupMsg) groupMsg.getPacketId(); // 客户端生成的消息ID groupMsg.getSequence(); // 由服务器生成,用于去重排序(升序) groupMsg.getFromAccount(); // 消息发送者在APP账号系统的账号ID groupMsg.getFromResource(); // 消息发送者resource groupMsg.getTopicId(); // 群ID groupMsg.getTimeStamp(); // 消息发送时间戳 groupMsg.getPayload(); // payload为用户自定义消息,UTF-8 string类型 连接断开回调 ------ function disconnect() { } 注销 -- user.logout(); [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/0403-webjs.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # C++ · GitBook [C++](https://admin.mimc.chat.xiaomi.net/docs/) ================================================ 目录 -- * [编译](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%BC%96%E8%AF%91) * [编译工具](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7) * [下载源码](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E4%B8%8B%E8%BD%BD%E6%BA%90%E7%A0%81) * [编译库](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%BC%96%E8%AF%91%E5%BA%93) * [编译示例代码](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%BC%96%E8%AF%91%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81) * [编译测试用例](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%BC%96%E8%AF%91%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B) * [用户创建及初始化](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%94%A8%E6%88%B7%E5%88%9B%E5%BB%BA%E5%8F%8A%E5%88%9D%E5%A7%8B%E5%8C%96) * [创建用户](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7) * [注册回调函数](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E6%B3%A8%E5%86%8C%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0) * [登录](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%99%BB%E5%BD%95) * [发送消息](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF) * [接收消息](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E6%8E%A5%E6%94%B6%E6%B6%88%E6%81%AF) * [注销](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E6%B3%A8%E9%94%80) * [示例代码](https://github.com/Xiaomi-mimc/mimc-cpp-sdk) 编译 -- #### 编译工具 编译工具使用[bazel](https://bazel.build/) #### 下载源码 git clone git@github.com:Xiaomi-mimc/mimc-cpp-sdk.git #### 编译库 cd mimc-cpp-sdk bazel build :mimc_cpp_sdk #### 编译示例代码 **即时消息** cd mimc-cpp-sdk bazel build :mimc_cpp_demo **实时流** cd mimc-cpp-sdk bazel build :rts_cpp_demo #### 编译测试用例 **即时消息** cd mimc-cpp-sdk bazel build :mimc_cpp_test **实时流** cd mimc-cpp-sdk bazel build :rts_cpp_test 用户创建及初始化 -------- **注意:此流程务必全部走完,否则无法登录!** #### 创建用户 /** * @param[appId]: 应用ID,小米开放平台申请分配 * @param[appAccount]: 用户在APP账号系统内的唯一账号ID * @param[resource]: 用户设备的标识 * 如不指定,SDK自动生成并支持多设备登录 * 如开发者指定,则需支持多设备登录: * 同一台设备,resource要保持不变 * 不同设备,resource要相互不同 * @param[cachePath]: 用户配置信息缓存的路径 * 如不指定,则默认以当前运行路径为缓存路径 * 如开发者指定,则以此路径为缓存路径 */ User(int64_t appId, std::string appAccount, std::string resource = "", std::string cachePath = ""); #include std::string appId = "2882303761517479657"; std::string appAccount1 = "LeiJun"; User* user = new User(atoll(appId.c_str()), appAccount1); #### 注册回调函数 ##### 安全认证 参考[安全认证](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html) 文档实现: class MIMCTokenFetcher { public: /** * 同步访问代理认证服务(appProxyService), * 从代理认证服务返回结果中获取[小米认证服务下发的原始数据]并返回 */ virtual std::string fetchToken() = 0; }; #include #include ··· using namespace std; class TestTokenFetcher : public MIMCTokenFetcher { public: string fetchToken() { curl_global_init(CURL_GLOBAL_ALL); CURL *curl = curl_easy_init(); CURLcode res; /** * 当前示例代码直接访问小米认证服务(TokenService) * 实际生产环境上,应该访问代理认证服务(appProxyService) */ const string url = "https://mimc.chat.xiaomi.net/api/account/token"; const string body = "{\"appId\":\"" + this->appId + "\",\"appKey\":\"" + this->appKey + "\",\"appSecret\":\"" + this->appSecret + "\",\"appAccount\":\"" + this->appAccount + "\"}"; string result; if (curl) { curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); ··· res = curl_easy_perform(curl); ··· curl_easy_cleanup(curl); } curl_global_cleanup(); return result; } TestTokenFetcher(string appId, string appKey, string appSecret, string appAccount) { this->appId = appId; this->appKey = appKey; this->appSecret = appSecret; this->appAccount = appAccount; } private: string appId; string appKey; string appSecret; string appAccount; }; user->registerTokenFetcher(new TestTokenFetcher(appId, appKey, appSecret, appAccount1)); ##### 用户在线状态变化通知 class OnlineStatusHandler { public: /** * @param[status]: 登录状态,Online 在线,Offline 离线 * @param[type]: 状态变化类型 * @param[reason]: 状态变化原因 * @param[desc]: 状态变化描述信息 */ virtual void statusChange(OnlineStatus status, std::string type, std::string reason, std::string desc) = 0; }; #include #include class TestOnlineStatusHandler : public OnlineStatusHandler { public: void statusChange(OnlineStatus status, std::string type, std::string reason, std::string desc) { XMDLoggerWrapper::instance()->info("In statusChange, status is %d, type is %s, reason is %s, desc is %s", status, type.c_str(), reason.c_str(), desc.c_str()); } }; user->registerOnlineStatusHandler(new TestOnlineStatusHandler()); ##### 消息通知 class MessageHandler { public: /** * @param[MIMCMessage]: 单聊消息 * MIMCMessage.packetId: 消息ID * MIMCMessage.sequence: 服务器为消息分配的递增ID,可用于去重/排序 * MIMCMessage.fromAccount: 发送方账号 * MIMCMessage.fromResource: 发送方设备标识 * MIMCMessage.toAccount: 接收方账号 * MIMCMessage.toResource: 接收方设备标识 * MIMCMessage.payload: 消息体 * MIMCMessage.bizType: 消息类型 * MIMCMessage.timestamp: 发送时间戳 */ //接收单聊消息通知 virtual void handleMessage(std::vector packets) = 0; /** * @param[MIMCGroupMessage]: 群聊消息 * MIMCGroupMessage.packetId: 消息ID * MIMCGroupMessage.sequence: 服务器为消息分配的递增ID,可用于去重/排序 * MIMCGroupMessage.fromAccount: 发送方账号 * MIMCGroupMessage.fromResource: 发送方设备标识 * MIMCGroupMessage.topicId: 群ID * MIMCGroupMessage.payload: 消息体 * MIMCGroupMessage.bizType: 消息类型 * MIMCGroupMessage.timestamp: 发送时间戳 */ //接收群聊消息通知 virtual void handleGroupMessage(std::vector packets) = 0; /** * @param[packetId]: 客户端生成的消息ID * @param[sequence]: 服务器为消息分配的递增ID,可用于去重/排序 * @param[timestamp]: 消息发送到服务器的时间(单位:ms) * @param[desc]: 服务器返回的描述信息 */ //发送消息成功或失败通知 virtual void handleServerAck(std::string packetId, int64_t sequence, time_t timestamp, std::string desc) = 0; //发送单聊消息超时通知 virtual void handleSendMsgTimeout(MIMCMessage message) = 0; //发送群聊消息超时通知 virtual void handleSendGroupMsgTimeout(MIMCGroupMessage groupMessage) = 0; }; #include #include #include class TestMessageHandler : public MessageHandler { public: void handleMessage(std::vector packets) { std::vector::iterator it = packets.begin(); for (; it != packets.end(); ++it) { messages.push(*it); } } void handleGroupMessage(std::vector packets) { std::vector::iterator it = packets.begin(); for (; it != packets.end(); ++it) { groupMessages.push(*it); } } void handleServerAck(std::string packetId, int64_t sequence, time_t timestamp, std::string desc) { packetIds.push(packetId); } void handleSendMsgTimeout(MIMCMessage message) { ··· } void handleSendGroupMsgTimeout(MIMCGroupMessage groupMessage) { ... } MIMCMessage* pollMessage() { MIMCMessage *messagePtr; messages.pop(&messagePtr); return messagePtr; } MIMCGroupMessage* pollGroupMessage() { MIMCGroupMessage *groupMessagePtr; groupMessages.pop(&groupMessagePtr); return groupMessagePtr; } std::string* pollServerAck() { std::string *packetIdPtr; packetIds.pop(&packetIdPtr); return packetIdPtr; } private: ThreadSafeQueue messages; ThreadSafeQueue groupMessages; ThreadSafeQueue packetIds; }; TestMessageHandler* messageHandler = new TestMessageHandler(); user->registerMessageHandler(messageHandler); 登录 -- user->login(); //此处会检查相关回调函数是否均已注册,如果有回调函数尚未注册,则返回false 发送消息 ---- **发送单聊消息** /** * @param[toAppAccount]: 消息接收者在APP账号系统内的唯一账号ID * @param[payload]: 开发者自定义消息体,最大不超过15KB * @param[bizType]: 开发者自定义消息类型,默认为空 * @param[isStore]: 消息是否存储在mimc服务端,true 存储,false 不存储,默认存储 * @return: 客户端生成的消息ID * 返回空串:消息未进入发送队列 */ std::string sendMessage(const std::string& toAppAccount, const std::string& payload, const std::string& bizType = "", const bool isStore = true); string payload1 = "With MIMC, We can communicate with each other much easier!"; string packetId_sent1 = user->sendMessage(toAppAccount, payload1); **发送群聊消息** /** * @param[topicId]: 群ID * @param[payload]: 开发者自定义消息体,最大不超过15KB * @param[bizType]: 开发者自定义消息类型,默认为空 * @param[isStore]: 消息是否存储在mimc服务端,true 存储,false 不存储,默认存储 * @return: 客户端生成的消息ID * 返回空串:消息未进入发送队列 */ std::string sendGroupMessage(int64_t topicId, const std::string& payload, const std::string& bizType = "", const bool isStore = true); string payload1 = "With MIMC, We can communicate with each other much easier!"; string packetId_sent1 = user->sendGroupMessage(topicId, payload1); 接收消息 ---- **接收单聊消息** #include #include MIMCMessage *message; while (message = messageHandler->pollMessage()) { XMDLoggerWrapper::instance()->info("Message from %s to %s is %s", message->getFromAccount().c_str(), message->getToAccount().c_str(), message->getPayload().c_str()); } **接收群聊消息** #include #include MIMCGroupMessage *groupMessage; while (groupMessage = messageHandler->pollGroupMessage()) { XMDLoggerWrapper::instance()->info("Message from %s to topic %llu is %s", groupMessage->getFromAccount().c_str(), groupMessage->getTopicId(), groupMessage->getPayload().c_str()); } 注销 -- user->logout(); [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/0406-cpp.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # iOS · GitBook [iOS](https://admin.mimc.chat.xiaomi.net/docs/) ================================================ 目录 -- * [信令](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E4%BF%A1%E4%BB%A4) * [单聊](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%8D%95%E8%81%8A) * [发起会话](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%8F%91%E8%B5%B7%E4%BC%9A%E8%AF%9D) * [关闭会话](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%85%B3%E9%97%AD%E4%BC%9A%E8%AF%9D) * [多聊](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%A4%9A%E8%81%8A) * [创建频道](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%88%9B%E5%BB%BA%E9%A2%91%E9%81%93) * [加入频道](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%8A%A0%E5%85%A5%E9%A2%91%E9%81%93) * [离开频道](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E7%A6%BB%E5%BC%80%E9%A2%91%E9%81%93) * [数据](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E6%95%B0%E6%8D%AE) * [初始化音频流配置](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%88%9D%E5%A7%8B%E5%8C%96%E9%9F%B3%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [初始化视频流配置](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%88%9D%E5%A7%8B%E5%8C%96%E8%A7%86%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [发送数据](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE) * [获取音频流配置](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%8E%B7%E5%8F%96%E9%9F%B3%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [获取视频流配置](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%8E%B7%E5%8F%96%E8%A7%86%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [设置发送缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%AE%BE%E7%BD%AE%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [获取发送缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%8E%B7%E5%8F%96%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [设置接收缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%AE%BE%E7%BD%AE%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [获取接收缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%8E%B7%E5%8F%96%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [清空发送缓存](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E6%B8%85%E7%A9%BA%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98) * [清空接收缓存](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E6%B8%85%E7%A9%BA%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98) * [获取发送缓存使用率](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%8E%B7%E5%8F%96%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8%E7%8E%87) * [获取接收缓存使用率](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E8%8E%B7%E5%8F%96%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8%E7%8E%87) * [回调](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%9B%9E%E8%B0%83) * [单聊回调](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%8D%95%E8%81%8A%E5%9B%9E%E8%B0%83) * [多聊回调](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E5%A4%9A%E8%81%8A%E5%9B%9E%E8%B0%83) 信令 -- #### 单聊 ##### 发起会话 /** * @param[toAppAccount] NSString: 接收方账号 * @param[toResource] NSString: 用户设备的标识 * @param[appContent] NSData: 可以给接收方携带数据 * @return: 会话ID,唯一标识当前流会话 */ int64_t callId = [user dialCall:toAppAccount]; int64_t callId = [user dialCall:toAppAccount toResource:toResource]; int64_t callId = [user dialCall:toAppAccount appContent:appContent]; int64_t callId = [user dialCall:toAppAccount toResource:toResource appContent:appContent]; ###### 关闭会话 /** * @param[callId] int64_t: 会话ID * @param[byeReason] NSString: 描述信息 */ [user closeCall:callId]; [user closeCall:callId byeReason:byeReason]; #### 多聊 ###### 创建频道 /** * @param[extra] NSData: 可携带附加信息 * @return 用于区分创建不同频道 */ int64_t identity = [user createChannel:extra]; ###### 加入频道 /** * @param[callId] int64_t: 通话ID,唯一标识一个频道会话 * @param[callKey] NSString: 通话密钥,配合callId使用 */ [user joinChannel:callId callKey:callKey]; ###### 离开频道 /** * @param[callId] int64_t: 通话ID,唯一标识一个频道会话 * @param[callKey] NSString: 通话密钥,配合callId使用 */ [user leaveChannel:callId callKey:callKey]; 数据 -- #### 初始化音频流配置 /** * @param[audioStreamConfig] MIMCStreamConfig: 音频流配置,该接口如果不调用,内部采用默认配置! * audioStreamConfig.strategy: 发送流策略,支持STRATEGY_FEC和STRATEGY_ACK(默认) * audioStreamConfig.ackWaitTimeMs: 策略为STRATEGY_ACK时有效,表示发送数据后等待接收发送成功的的响应时间,单位毫秒,默认150ms * audioStreamConfig.isEncrypt: 是否加密,默认NO */ [user initAudioStreamConfig:audioStreamConfig]; #### 初始化视频流配置 /** * @param[videoStreamConfig] MIMCStreamConfig: 视频流配置,该接口如果不调用,内部采用默认配置! * videoStreamConfig.strategy: 发送流策略,支持STRATEGY_FEC(默认)和STRATEGY_ACK * videoStreamConfig.ackWaitTimeMs: 策略为STRATEGY_ACK时有效,表示发送数据后等待接收发送成功的的响应时间,单位毫秒,默认150ms * videoStreamConfig.isEncrypt: 是否加密,默认NO */ [user initVideoStreamConfig:videoStreamConfig]; #### 发送数据 /** * @param[callId] int64_t: 会话ID * @param[data] NSData: 流数据 * @param[dataType] RtsDataType: 数据类型,音频:AUDIO,视频:VIDEO * @param[dataPriority] MIMCDataPriority: 数据优先级,MIMC_P0优先级最高,MIMC_P1次之,MIMC_P2最低 * @param[canBeDropped] BOOL: 是否允许丢包 * @param[resendCount] int: 重发次数,针对MIMCStreamConfig.STRATEGY_ACK有效 * @param[channelType] RtsChannelType: 通道类型,RELAY、P2P_INTERNET、P2P_INTRANET,不指定默认RELAY * @param[context] id: 用户自定义对象 * @return 成功返回dataId,失败返回-1 */ int dataId = [user sendRtsData:callId data:data dataType:dataType dataPriority:dataPriority canBeDropped:canBeDropped context:context]; int dataId = [user sendRtsData:callId data:data dataType:dataType dataPriority:dataPriority canBeDropped:canBeDropped resendCount:resendCount context:context]; int dataId = [user sendRtsData:callId data:data dataType:dataType dataPriority:dataPriority canBeDropped:canBeDropped resendCount:resendCount channelType:channelType context:context]; #### 获取音频流配置 /** * @return 返回音频流配置 */ MIMCStreamConfig *config = [user getAudioStreamConfig]; #### 获取视频流配置 /** * @return 返回视频流配置 */ MIMCStreamConfig *config = [user getVideoStreamConfig]; #### 设置发送缓存大小 /** * @param[size] int: 以消息个数为单位 */ [user setSendBufferSize:size]; #### 获取发送缓存大小 int size = [user getSendBufferSize]; #### 设置接收缓存大小 /** * @param[size] int: 以消息个数为单位 */ [user setRecvBufferSize:size]; #### 获取接收缓存大小 int size = [user getRecvBufferSize]; #### 清空发送缓存 [user clearSendBuffer]; #### 清空接收缓存 [user clearRecvBuffer]; #### 获取发送缓存使用率 float rate = [user getSendBufferUsageRate]; #### 获取接收缓存使用率 float rate = [user getRecvBufferUsageRate]; 回调 -- #### 单聊回调 @protocol handleRtsCallDelegate /** * @param[fromAccount] NSString: 发起方账号 * @param[fromResource] NSString: 用户设备的标识 * @param[callId] int64_t: 会话ID * @param[appContent] NSData: 发起方携带的数据 * @return: MIMCLaunchedResponse,成员accepted表示是否接受会话,成员errMsg携带描述信息 */ - (MIMCLaunchedResponse *)onLaunched:(NSString *)fromAccount fromResource:(NSString *)fromResource callId:(int64_t)callId appContent:(NSData *)appContent; /** * @param[callId] int64_t: 会话ID * @param[accepted] BOOL: 接收方同意ture,拒绝NO * @param[desc] NSString: 描述信息 */ - (void)onAnswered:(int64_t)callId accepted:(BOOL)accepted desc:(NSString *)desc; /** * @param[callId] int64_t: 会话ID * @param[desc] NSString: 描述信息 */ - (void)onClosed:(int64_t)callId desc:(NSString *)desc; /** * @param[callId] int64_t: 会话ID * @param[fromAccount] NSString: 发送方账号 * @param[resource] NSString: 用户设备的标识 * @param[data]: 流数据 * @param[dataType]: 数据类型,AUDIO,VIDEO * @param[channelType]: 通道类型,RELAY、P2P_INTERNET、P2P_INTRANET */ - (void)onData:(int64_t)callId fromAccount:(NSString *)fromAccount resource:(NSString *)resource data:(NSData *)data dataType:(RtsDataType)dataType channelType:(RtsChannelType)channelType; /** * 发送流数据成功的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId] int64_t: 会话ID * @param[dataId] int: 和sendRtsData()返回值对应 * @param[context] id: 用户自定义对象,和sendRtsData()中的context对应 */ - (void)onSendDataSuccess:(int64_t)callId dataId:(int)dataId context :(id)context; /** * 发送流数据失败的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId] int64_t: 会话ID * @param[dataId] int: 和sendRtsData()返回值对应 * @param[context] id: 用户自定义对象,和sendRtsData()中的context对应 */ - (void)onSendDataFailure:(int64_t)callId dataId:(int)dataId context :(id)context; 开发者实现上面定义的几个回调函数之后,需要设置委托者的代理是谁。比如:_user.handleRtsCallDelegate = self,self指的是实现上述几个回调函数的当前类对象。 @end #### 多聊回调 @protocol handleRtsChannelDelegate /** * 创建频道回调 * @param[identity] int64_t: 创建频道标识,和createChannel()返回值一一对应 * @param[callId] int64_t: 通话ID * @param[callKey] NSString: 通话密钥 * @param[success] BOOL: YES:成功,NO:失败 * @param[desc] NSString: 描述信息 * @param[extra] NSData: 附加信息 */ - (void)onCreateChannel:(int64_t)identity callId:(int64_t)callId callKey:(NSString *)callKey success:(BOOL)success desc:(NSString *)desc extra:(NSData *)extra; /** * 加入频道回调 * @param[callId] int64_t: 通话ID * @param[appAccount] NSString: 发起方账号 * @param[resource] NSString: 设备的标识 * @param[success] BOOL: YES:成功,NO:失败 * @param[desc] NSString: 描述信息 * @param[extra] NSData: 附加信息 * @param[members] NSArray: 频道内所有成员 * ChannelUser.appAccount: 用户账号 * ChannelUser.resource: 用户设备的标识 */ - (void)onJoinChannel:(int64_t)callId appAccount:(NSString *)appAccount resource:(NSString *)resource success:(BOOL)success desc:(NSString *)desc extra:(NSData *)extra members:(NSArray *)members; /** * 离开频道回调 * @param[callId] int64_t: 通话ID * @param[appAccount] NSString: 发起方账号 * @param[resource] NSString: 设备的标识 * @param[success] BOOL: YES:成功,NO:失败 * @param[desc] NSString: 描述信息 */ - (void)onLeaveChannel:(int64_t)callId appAccount:(NSString *)appAccount resource:(NSString *)resource success:(BOOL)success desc:(NSString *)desc; /** * 新加入用户回调 * @param[callId] int64_t:通话ID * @param[appAccount] NSString: 用户账号 * @param[resource] NSString: 设备的标识 */ - (void)onUserJoined:(int64_t)callId appAccount:(NSString *)appAccount resource:(NSString *)resource; /** * 用户离开回调 * @param[callId] int64_t: 通话ID * @param[appAccount] NSString: 用户账号 * @param[resource] NSString: 设备的标识 */ - (void)onUserLeft:(int64_t)callId appAccount:(NSString *)appAccount resource:(NSString *)resource; /** * 接收流数据 * @param[callId] int64_t: 通话ID * @param[fromAccount] NSString: 发送方账号 * @param[resource] NSString: 设备的标识 * @param[data] NSData: 流数据 * @param[dataType] RtsDataType: 数据类型,音频:AUDIO,视频:VIDEO */ - (void)onData:(int64_t)callId fromAccount:(NSString *)fromAccount resource:(NSString *)resource data:(NSData *)data dataType:(RtsDataType)dataType; /** * 发送流数据成功的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId] int64_t: 通话ID * @param[dataId] int: 和sendRtsData()返回值对应 * @param[context] id: 用户自定义对象,和sendRtsData()中的context对应 */ - (void)onSendDataSuccess:(int64_t)callId dataId:(int)dataId context:(id)context; /** * 发送流数据失败的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId] int64_t: 通话ID * @param[dataId] int: 和sendRtsData()返回值对应 * @param[context] id: 用户自定义对象,和sendRtsData()中的context对应 */ - (void)onSendDataFailure:(int64_t)callId dataId:(int)dataId context:(id)context; 开发者实现上面定义的几个回调函数之后,需要设置委托者的代理是谁。比如:_user.handleRtsChannelDelegate = self,self指的是实现上述几个回调函数的当前类对象。 @end [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/1602-ios-rts.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # Android Java · GitBook [Android Java](https://admin.mimc.chat.xiaomi.net/docs/) ========================================================= 目录 -- * [信令](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E4%BF%A1%E4%BB%A4) * [单聊](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%8D%95%E8%81%8A) * [发起会话](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%8F%91%E8%B5%B7%E4%BC%9A%E8%AF%9D) * [关闭会话](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%85%B3%E9%97%AD%E4%BC%9A%E8%AF%9D) * [多聊](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%A4%9A%E8%81%8A) * [创建频道](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%88%9B%E5%BB%BA%E9%A2%91%E9%81%93) * [加入频道](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%8A%A0%E5%85%A5%E9%A2%91%E9%81%93) * [离开频道](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E7%A6%BB%E5%BC%80%E9%A2%91%E9%81%93) * [数据](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E6%95%B0%E6%8D%AE) * [初始化音频流配置](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%88%9D%E5%A7%8B%E5%8C%96%E9%9F%B3%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [初始化视频流配置](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%88%9D%E5%A7%8B%E5%8C%96%E8%A7%86%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [发送数据](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE) * [获取音频流配置](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%8E%B7%E5%8F%96%E9%9F%B3%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [获取视频流配置](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%8E%B7%E5%8F%96%E8%A7%86%E9%A2%91%E6%B5%81%E9%85%8D%E7%BD%AE) * [设置发送缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%AE%BE%E7%BD%AE%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [获取发送缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%8E%B7%E5%8F%96%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [设置接收缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%AE%BE%E7%BD%AE%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [获取接收缓存大小](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%8E%B7%E5%8F%96%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98%E5%A4%A7%E5%B0%8F) * [清空发送缓存](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E6%B8%85%E7%A9%BA%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98) * [清空接收缓存](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E6%B8%85%E7%A9%BA%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98) * [获取发送缓存使用率](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%8E%B7%E5%8F%96%E5%8F%91%E9%80%81%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8%E7%8E%87) * [获取接收缓存使用率](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E8%8E%B7%E5%8F%96%E6%8E%A5%E6%94%B6%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8%E7%8E%87) * [回调](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%9B%9E%E8%B0%83) * [单聊回调](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%8D%95%E8%81%8A%E5%9B%9E%E8%B0%83) * [多聊回调](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E5%A4%9A%E8%81%8A%E5%9B%9E%E8%B0%83) 信令 -- #### 单聊 ###### 发起会话 /** * @param[toAppAccount]: 接收方账号 * @param[toResource]: 用户设备的标识 * @param[appContent]: 可以给接收方携带数据 * @return 通话ID,唯一标识当前流会话 */ long callId = user.dialCall(String toAppAccount); long callId = user.dialCall(String toAppAccount, byte[] appContent); long callId = user.dialCall(String toAppAccount, String toResource); long callId = user.dialCall(String toAppAccount, String toResource, byte[] appContent); ###### 关闭会话 /** * @param[callId]: 通话ID * @param[byeReason]: 描述信息 */ user.closeCall(long callId); user.closeCall(long callId, String byeReason); #### 多聊 ###### 创建频道 /** * @param[extra]: 可携带附加信息 * @return 用于区分创建不同频道 */ long identity = user.createChannel(byte[] extra); ###### 加入频道 /** * @param[callId]: 通话ID,唯一标识一个频道会话 * @param[callKey]: 通话密钥,配合callId使用 */ user.joinChannel(long callId, String callKey); ###### 离开频道 /** * @param[callId]: 通话ID,唯一标识一个频道会话 * @param[callKey]: 会话密钥,配合callId使用 */ user.leaveChannel(long callId, String callKey); 数据 -- #### 初始化音频流配置 /** * @param[audioStreamConfig]: 音频流配置,该接口如果不调用,内部采用默认配置! * audioStreamConfig.strategy:发送流策略,支持MIMCStreamConfig.STRATEGY_FEC和MIMCStreamConfig.STRATEGY_ACK(默认) * audioStreamConfig.ackWaitTimeMs:策略为STRATEGY_ACK时有效,表示发送数据后等待接收发送成功的的响应时间,单位毫秒,默认150ms * audioStreamConfig.isEncrypt:是否加密,默认false */ user.initAudioStreamConfig(MIMCStreamConfig audioStreamConfig); #### 初始化视频流配置 /** * @param[videoStreamConfig]: 视频流配置,该接口如果不调用,内部采用默认配置! * videoStreamConfig.strategy:发送流策略,支持MIMCStreamConfig.STRATEGY_FEC(默认)和MIMCStreamConfig.STRATEGY_ACK * videoStreamConfig.ackWaitTimeMs:策略为STRATEGY_ACK时有效,表示发送数据后等待接收发送成功的的响应时间,单位毫秒,默认150ms * videoStreamConfig.isEncrypt:是否加密,默认false */ user.initVideoStreamConfig(MIMCStreamConfig videoStreamConfig); #### 发送数据 /** * @param[callId]: 通话ID * @param[data]: 流数据,最大不超过512KB * @param[dataType]: 数据类型,音频:AUDIO,视频:VIDEO * @param[dataPriority]: 数据优先级,P0优先级最高,P1次之,P2最低 * @param[canBeDropped]: 是否允许丢包 * @param[resendCount]: 重发次数,针对MIMCStreamConfig.STRATEGY_ACK有效 * @param[channelType]: 通道类型,可指定RELAY,P2P_INTERNET,P2P_INTRANET,不指定优先选择P2P_INTRANET发送数据,次之P2P_INTERNET,最后RELAY,无缝切换 * @param[context]: 用户自定义对象 * @return 成功返回dataId,失败返回-1 */ int dataId = user.sendRtsData(long callId, byte[] data, RtsDataType dataType, DataPriority dataPriority, boolean canBeDropped, Object context); int dataId = user.sendRtsData(long callId, byte[] data, RtsDataType dataType, DataPriority dataPriority, boolean canBeDropped, int resendCount, Object context); int dataId = user.sendRtsData(long callId, byte[] data, RtsDataType dataType, DataPriority dataPriority, boolean canBeDropped, int resendCount, RtsChannelType channelType, Object context); #### 获取音频流配置 /** * @return 返回音频流配置 */ MIMCStreamConfig config = user.getAudioStreamConfig(); #### 获取视频流配置 /** * @return 返回视频流配置 */ MIMCStreamConfig config = user.getVideoStreamConfig(); #### 设置发送缓存大小 /** * @param[size]: 以消息个数为单位 */ user.setSendBufferSize(int size); #### 获取发送缓存大小 int size = user.getSendBufferSize(); #### 设置接收缓存大小 /** * @param[size]: 以消息个数为单位 */ user.setRecvBufferSize(int size); #### 获取接收缓存大小 int size = user.getRecvBufferSize(); #### 清空发送缓存 user.clearSendBuffer(); #### 清空接收缓存 user.clearRecvBuffer(); #### 获取发送缓存使用率 float rate = user.getSendBufferUsageRate(); #### 获取接收缓存使用率 float rate = user.getRecvBufferUsageRate(); 回调 -- #### 单聊回调 user.registerRtsCallHandler(MIMCRtsCallHandler rtsCallHandler); public interface MIMCRtsCallHandler { /** * @param[fromAccount]: 发起方账号 * @param[fromResource]: 用户设备的标识 * @param[callId]: 通话ID * @param[appContent]: 发起方携带的数据 * @return LaunchedResponse,成员accepted表示是否接受会话,成员desc携带描述信息 */ LaunchedResponse onLaunched(String fromAccount, String fromResource, long callId, byte[] appContent); /** * @param[callId]: 通话ID * @param[accepted]: 接收方同意ture,拒绝false * @param[desc]: 描述信息 */ void onAnswered(long callId, boolean accepted, String desc); /** * @param[callId]: 通话ID * @param[desc]: 描述信息 */ void onClosed(long callId, String desc); /** * 接收流数据 * @param[callId]: 通话ID * @param[fromAccount]: 发送方账号 * @param[resource]: 用户设备的标识 * @param[data]: 流数据 * @param[dataType]: 数据类型,AUDIO,VIDEO * @param[channelType);]: 通道类型,RELAY、P2P_INTERNET、P2P_INTRANET */ void onData(long callId, String fromAccount, String resource, byte[] data, RtsDataType dataType, RtsChannelType channelType); /** * 发送流数据成功的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId]: 通话ID * @param[dataId]: 和sendRtsData()返回值对应 * @param[context]: 用户自定义对象,和sendRtsData()中的context对应 */ void onSendDataSuccess(long callId, int dataId, Object context); /** * 发送流数据失败的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId]: 通话ID * @param[dataId]: 和sendRtsData()返回值对应 * @param[context]: 用户自定义对象,和sendRtsData()中的context对应 */ void onSendDataFailure(long callId, int dataId, Object context); } #### 多聊回调 user.registerChannelHandler(MIMCRtsChannelHandler rtsChannelHandler); public interface MIMCRtsChannelHandler { /** * 创建频道回调 * @param[identity]: 创建频道标识,和createChannel()返回值一一对应 * @param[callId]: 通话ID * @param[callKey]: 通话密钥 * @param[success]: true:成功,false:失败 * @param[desc]: 描述信息 * @param[extra]: 附加信息 */ void onCreateChannel(long identity, long callId, String callKey, boolean success, String desc, byte[] extra); /** * 加入频道回调 * @param[callId]: 通话ID * @param[appAccount]: 发起方账号 * @param[resource]: 设备的标识 * @param[success]: true:成功,false:失败 * @param[desc]: 描述信息 * @param[extra]: 附加信息 * @param[members]: 频道内所有成员 * ChannelUser.appAccount: 用户账号 * ChannelUser.resource: 用户设备的标识 */ void onJoinChannel(long callId, String appAccount, String resource, boolean success, String desc, byte[] extra, List members); /** * 离开频道回调 * @param[callId]: 通话ID * @param[appAccount]: 发起方账号 * @param[resource]: 设备的标识 * @param[success]: true:成功,false:失败 * @param[desc]: 描述信息 */ void onLeaveChannel(long callId, String appAccount, String resource, boolean success, String desc); /** * 新加入用户回调 * @param[callId]: 通话ID * @param[appAccount]: 用户账号 * @param[resource]: 设备的标识 */ void onUserJoined(long callId, String appAccount, String resource); /** * 用户离开回调 * @param[callId]: 通话ID * @param[appAccount]: 用户账号 * @param[resource]: 设备的标识 */ void onUserLeft(long callId, String appAccount, String resource); /** * 接收流数据 * @param[callId]: 通话ID * @param[fromAccount]: 发送方账号 * @param[resource]: 设备的标识 * @param[data]: 流数据 * @param[dataType]: 数据类型,AUDIO,VIDEO */ void onData(long callId, String fromAccount, String resource, byte[] data, RtsDataType dataType); /** * 发送流数据成功的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId]: 通话ID * @param[dataId]: 和sendRtsData()返回值对应 * @param[context]: 用户自定义对象,和sendRtsData()中的context对应 */ void onSendDataSuccess(long callId, int dataId, Object context); /** * 发送流数据失败的回调,仅当流策略配置为MIMCStreamConfig.STRATEGY_ACK时回调 * @param[callId]: 通话ID * @param[dataId]: 和sendRtsData()返回值对应 * @param[context]: 用户自定义对象,和sendRtsData()中的context对应 */ void onSendDataFailure(long callId, int dataId, Object context); } [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/1601-android-java-rts.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # C++ · GitBook [C++](https://admin.mimc.chat.xiaomi.net/docs/) ================================================ 目录 -- * [实时流](https://admin.mimc.chat.xiaomi.net/docs/1603-cpp-rts.html#%E5%AE%9E%E6%97%B6%E6%B5%81) * [设置实时流参数](https://admin.mimc.chat.xiaomi.net/docs/1603-cpp-rts.html#%E8%AE%BE%E7%BD%AE%E5%AE%9E%E6%97%B6%E6%B5%81%E5%8F%82%E6%95%B0) * [发起会话](https://admin.mimc.chat.xiaomi.net/docs/1603-cpp-rts.html#%E5%8F%91%E8%B5%B7%E4%BC%9A%E8%AF%9D) * [发送数据](https://admin.mimc.chat.xiaomi.net/docs/1603-cpp-rts.html#%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE) * [关闭会话](https://admin.mimc.chat.xiaomi.net/docs/1603-cpp-rts.html#%E5%85%B3%E9%97%AD%E4%BC%9A%E8%AF%9D) * [实时流回调](https://admin.mimc.chat.xiaomi.net/docs/1603-cpp-rts.html#%E5%AE%9E%E6%97%B6%E6%B5%81%E5%9B%9E%E8%B0%83) 实时流 --- #### 设置实时流参数 ##### 初始化音频流配置 注意:如不指定,按系统默认配置;如开发者指定,则务必在发起会话前设置! /** * @param[audioStreamConfig]: 音频流配置 * audioStreamConfig._type: 流类型,分为FEC_TYPE和ACK_TYPE(默认) * audioStreamConfig._ackStreamWaitTimeMs: 流类型为ACK_TYPE时有效,表示发送数据后直到收到对方接收成功确认的等待时间,单位毫秒 * audioStreamConfig._isEncrypt: 是否加密 */ void initAudioStreamConfig(const RtsStreamConfig& audioStreamConfig); user->initAudioStreamConfig(RtsStreamConfig(ACK_TYPE, 50, false)); ··· user->dialCall(appAccount2); ##### 初始化视频流配置 注意:如不指定,按系统默认配置;如开发者指定,则务必在发起会话前设置! /** * @param[videoStreamConfig]: 视频流配置 * videoStreamConfig._type: 流类型,分为FEC_TYPE(默认)和ACK_TYPE * videoStreamConfig._ackStreamWaitTimeMs: 流类型为ACK_TYPE时有效,表示发送数据后直到收到对方接收成功确认的等待时间,单位毫秒 * videoStreamConfig._isEncrypt: 是否加密 */ void initVideoStreamConfig(const RtsStreamConfig& videoStreamConfig); user->initVideoStreamConfig(RtsStreamConfig(FEC_TYPE, 50, false)); ··· user->dialCall(appAccount2); ##### 设置发送缓存大小 /** * @param[size]: 实时流数据发送缓存大小,以消息个数为单位 */ void setSendBufferSize(int size); user->setSendBufferSize(10000); ##### 获取发送缓存大小 /** * @return: 返回实时流数据发送缓存大小 */ int getSendBufferSize(); int size = user->getSendBufferSize(); ##### 设置接收缓存大小 /** * @param[size]: 实时流数据接收缓存大小,以消息个数为单位 */ void setRecvBufferSize(int size); user->setRecvBufferSize(10000); ##### 获取接收缓存大小 /** * @return: 返回实时流数据接收缓存大小 */ int getRecvBufferSize(); int size = user->getRecvBufferSize(); ##### 获取发送缓存使用率 /** * @return: 返回实时流数据发送缓存使用率 */ float getSendBufferUsageRate(); float usageRate = user->getSendBufferUsageRate(); ##### 获取接收缓存使用率 /** * @return: 返回实时流数据接收缓存使用率 */ float getRecvBufferUsageRate(); float usageRate = user->getRecvBufferUsageRate(); ##### 清空发送缓存 /** * 清空发送缓存中所有待发送数据 */ void clearSendBuffer(); user->clearSendBuffer(); ##### 清空接收缓存 /** * 清空接收缓存中所有已接收数据 */ void clearRecvBuffer(); user->clearRecvBuffer(); #### 发起会话 /** * @param[toAppAccount]: 接收方账号 * @param[appContent]: 给接收方携带的业务自定义数据,默认为空 * @param[toResource]: 用户设备的标识,默认不指定 * @return: 通话ID,唯一标识当前流会话 */ uint64_t dialCall(const std::string& toAppAccount, const std::string& appContent = "", const std::string& toResource = ""); #### 发送数据 /** * @param[callId]: 通话ID * @param[data]: 实时流数据,最大不超过512KB * @param[dataType]: 数据类型,音频:AUDIO,视频:VIDEO * @param[channelType]: 通道类型,RELAY、P2P_INTERNET、P2P_INTRANET,默认为RELAY * @param[ctx]:开发者自定义内容,默认为空 * @param[canBeDropped]: 实时流数据是否允许丢失,true 允许,false 不允许,默认为false * @param[priority]: 实时流数据发送优先级,P0>P1>P2,默认为P1 * @param[resendCount]: 实时流数据重发次数,默认为2 * @return: 实时流数据ID,失败为-1 */ int sendRtsData(uint64_t callId, const std::string& data, const RtsDataType dataType, const RtsChannelType channelType = RELAY, const std::string& ctx = "", const bool canBeDropped = false, const DataPriority priority = P1, const unsigned int resendCount = 2); #### 关闭会话 /** * @param[callId]: 通话ID * @param[byeReason]: 描述信息 */ void closeCall(uint64_t callId, std::string byeReason = ""); #### 实时流回调 class RTSCallEventHandler { public: /** * 新会话接入回调 * @param[callId]: 通话ID * @param[fromAccount]: 发起方账号 * @param[appContent]: 发起方携带的业务自定义数据 * @param[fromResource]: 用户设备的标识 * @return: LaunchedResponse,成员accepted表示是否接受会话,成员desc携带描述信息 */ virtual LaunchedResponse onLaunched(uint64_t callId, const std::string fromAccount, const std::string appContent, const std::string fromResource) = 0; /** * 会话被接通回调 * @param[callId]: 通话ID * @param[accepted]: 接收方同意ture,拒绝false * @param[desc]: 描述信息 */ virtual void onAnswered(uint64_t callId, bool accepted, const std::string desc) = 0; /** * 会话被关闭回调 * @param[callId]: 通话ID * @param[desc]: 描述信息 */ virtual void onClosed(uint64_t callId, const std::string desc) = 0; /** * 接收到数据的回调 * @param[callId]: 通话ID * @param[fromAccount]: 发送方账号 * @param[resource]: 用户设备的标识 * @param[data]: 实时流数据 * @param[dataType]: 数据类型,AUDIO,VIDEO * @param[channelType]: 通道类型,RELAY、P2P_INTERNET、P2P_INTRANET */ virtual void onData(uint64_t callId, const std::string fromAccount, const std::string resource, const std::string data, RtsDataType dataType, RtsChannelType channelType) = 0; /** * 发送数据成功的回调(仅当RtsStreamConfig._type为ACK_TYPE时回调) * @param[callId]: 通话ID * @param[dataId]: 实时流数据ID,和sendRtsData()返回值对应 * @param[ctx]: 开发者自定义内容,和sendRtsData()传入的ctx对应 */ virtual void onSendDataSuccess(uint64_t callId, int dataId, const std::string ctx) = 0; /** * 发送数据失败的回调(仅当RtsStreamConfig._type为ACK_TYPE时回调) * @param[callId]: 通话ID * @param[dataId]: 实时流数据ID,和sendRtsData()返回值对应 * @param[ctx]: 开发者自定义内容,和sendRtsData()传入的ctx对应 */ virtual void onSendDataFailure(uint64_t callId, int dataId, const std::string ctx) = 0; }; #include #include #include #include class TestRTSCallEventHandler : public RTSCallEventHandler { public: LaunchedResponse onLaunched(uint64_t callId, const std::string fromAccount, const std::string appContent, const std::string fromResource) { XMDLoggerWrapper::instance()->info("In onLaunched, callId is %llu, fromAccount is %s, appContent is %s, fromResource is %s", callId, fromAccount.c_str(), appContent.c_str(), fromResource.c_str()); inviteRequests.push(RtsMessageData(callId, fromAccount, appContent, fromResource)); if (this->appContent != "" && appContent != this->appContent) { return LaunchedResponse(false, LAUNCH_ERR_ILLEGALAPPCONTENT); } XMDLoggerWrapper::instance()->info("In onLaunched, appContent is equal to this->appContent"); return LaunchedResponse(true, LAUNCH_OK); } void onAnswered(uint64_t callId, bool accepted, const std::string desc) { XMDLoggerWrapper::instance()->info("In onAnswered, callId is %llu, accepted is %d, desc is %s", callId, accepted, desc.c_str()); createResponses.push(RtsMessageData(callId, desc, accepted)); } void onClosed(uint64_t callId, const std::string desc) { XMDLoggerWrapper::instance()->info("In onClosed, callId is %llu, desc is %s", callId, desc.c_str()); byes.push(RtsMessageData(callId, desc)); } void onData(uint64_t callId, const std::string fromAccount, const std::string resource, const std::string data, RtsDataType dataType, RtsChannelType channelType) { XMDLoggerWrapper::instance()->info("In handleData, callId is %llu, fromAccount is %s, resource is %s, dataLen is %d, data is %s, dataType is %d", callId, fromAccount.c_str(), resource.c_str(), data.length(), data.c_str(), dataType); recvDatas.push(RtsMessageData(callId, data, dataType, channelType)); } void onSendDataSuccess(uint64_t callId, int dataId, const std::string ctx) { XMDLoggerWrapper::instance()->info("In handleSendDataSucc, callId is %llu, dataId is %d, ctx is %s", callId, dataId, ctx.c_str()); } void onSendDataFailure(uint64_t callId, int dataId, const std::string ctx) { XMDLoggerWrapper::instance()->warn("In handleSendDataFail, callId is %llu, dataId is %d, ctx is %s", callId, dataId, ctx.c_str()); } const std::string& getAppContent() {return this->appContent;} RtsMessageData* pollInviteRequest(long timeout_s) { RtsMessageData* inviteRequestPtr; inviteRequests.pop(timeout_s, &inviteRequestPtr); return inviteRequestPtr; } RtsMessageData* pollCreateResponse(long timeout_s) { RtsMessageData* createResponsePtr; createResponses.pop(timeout_s, &createResponsePtr); return createResponsePtr; } RtsMessageData* pollBye(long timeout_s) { RtsMessageData* byePtr; byes.pop(timeout_s, &byePtr); return byePtr; } RtsMessageData* pollData(long timeout_s) { RtsMessageData* recvDataPtr; recvDatas.pop(timeout_s, &recvDataPtr); return recvDataPtr; } int getDataSize() { return recvDatas.size(); } void clear() { inviteRequests.clear(); createResponses.clear(); byes.clear(); recvDatas.clear(); } TestRTSCallEventHandler(std::string appContent) { this->appContent = appContent; } TestRTSCallEventHandler() {} public: const std::string LAUNCH_OK = "OK"; const std::string LAUNCH_ERR_ILLEGALAPPCONTENT = "ILLEGALAPPCONTENT"; private: std::string appContent; ThreadSafeQueue inviteRequests; ThreadSafeQueue createResponses; ThreadSafeQueue byes; ThreadSafeQueue recvDatas; }; TestRTSCallEventHandler* callEventHandler = new TestRTSCallEventHandler(); user->registerRTSCallEventHandler(callEventHandler); [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/1603-cpp-rts.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 无限大群 · GitBook [无限大群](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [普通群聊 VS 无限群聊](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E6%99%AE%E9%80%9A%E7%BE%A4%E8%81%8A%E5%AF%B9%E6%AF%94%E6%97%A0%E9%99%90%E7%BE%A4%E8%81%8A) * [群组管理](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E7%BE%A4%E7%BB%84%E7%AE%A1%E7%90%86) > * [参数列表](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8) > > * [创建群](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E5%88%9B%E5%BB%BA%E7%BE%A4) > > * [更新群](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E6%9B%B4%E6%96%B0%E7%BE%A4) > > * [删除群](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E5%88%A0%E9%99%A4%E7%BE%A4) > > * [查询群成员](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E6%88%90%E5%91%98) > > * [查询所属群](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E6%9F%A5%E8%AF%A2%E6%89%80%E5%B1%9E%E7%BE%A4) > > * [查询群基本信息](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF) > > * [查询群在线人数](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E6%9F%A5%E8%AF%A2%E7%BE%A4%E5%9C%A8%E7%BA%BF%E4%BA%BA%E6%95%B0) > > * [禁止群成员发消息](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E7%A6%81%E6%AD%A2%E7%BE%A4%E6%88%90%E5%91%98%E5%8F%91%E6%B6%88%E6%81%AF) > * [接口调整](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E6%95%B4) 普通群聊对比无限群聊 ---------- | 普通群聊 | 无限群聊 | | --- | --- | | 人数 <= 500 | 人数无限 | | 支持在线/离线消息 | 支持在线消息,不支持离线消息 | | 需成员邀请 | 可随意加入 | 群组管理 ---- ### 参数列表 | Variable | Meanings | | --- | --- | --- | | $appId | 小米开放平台申请的AppId | | $appKey | 小米开放平台申请的AppKey | | $appSecret | 小米开放平台申请的AppSecret | | $topicId | 表示群ID | | $topicName | 表示创建群的时候所指定的群名称 | | $topicId1 | 表示查询所属群信息时用户所加入群的群ID | | $topicId2 | 表示查询所属群信息时用户所加入群的群ID | | $topicName1 | 表示查询所属群信息时用户所加入群的群名称 | | $ownerUuid | 表示群主在MIMC账号系统内uuid(可使用user.getUuid()获取) | | $ownerAccount | 表示群主在APP账号系统内唯一ID | | | $ownerToken | 表示群主token(可使用user.getToken()获取) | | $userAccount1 | 表示群成员1号在APP账号系统内唯一ID | | $userUuid1 | 表示userAccount1在MIMC账号系统内uuid(可使用user.getUuid()获取) | | $userToken1 | 表示userAccount1的token(可使用user.getToken()获取) | | $memberNum | 表示查询群的成员数量 | | $userCnt | 表示在线人数 | | $isEnd | 表示拉取群组成员时,是否是最后一批,拉取群成员是批量查询 | | $startUuid | 表示起始的uuid,初始表示0,后续批量查询以此来作为起始uuid。 | | $extra | 群消息自定义字段,开发者自行定义,最大不超过10kb 非必填 | 身份认证有两种方式: 1. token验证,适用于客户端访问,token可通过User.getToken()获取 2. appId/appKey/appSecret验证,适用于服务端访问 注意: 以下所有的http接口中,如果传入的appAccount是-H参数且含有中文,那么就需要做下面两件事(不含中文则不需要): (1)将appAccount进行base64编码之后再传入; (2)需要加上下面的appAccountEncode参数,表示对appAccount进行了base64编码; -H "appAccountEncode:base64" ### 创建群 创建群后,$ownerAccount会加入到群组里,无须再加群 * HTTPS 请求 curl "https://mimc.chat.xiaomi.net/api/uctopic" -XPOST -d '{"topicName":$topicName,"extra":$extra}' -H "Content-Type: application/json" -H "token:$token" curl "https://mimc.chat.xiaomi.net/api/uctopic" -XPOST -d '{"topicName":$topicName,"extra":$extra}' -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$ownerAccount" * JSON结果 { "code":200, "message":"success", "data":{ "topicId":$topicId, "ownerUuid":$ownerUuid, "topicName":$topicName, "extra":$extra } } ### 更新群 更新群,topicId必填,其他参数必填一个; 必须群主才能转让群,更新群信息,转让群主需要被转让用户在群中; * HTTPS 请求 curl "https://mimc.chat.xiaomi.net/api/uctopic/update" -XPOST -d '{"topicId":$topicId,"topicName":$topicName,"ownerAccount":$ownerAccount,"extra":$extra}' -H "Content-Type: application/json" -H "token:$token" curl "https://mimc.chat.xiaomi.net/api/uctopic/update" -XPOST -d '{"topicId":$topicId,"topicName":$topicName,"ownerAccount":$ownerAccount,"extra":$extra}' -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" * JSON结果 { "code":200, "message":"success", "data":{ "topicId":$topicId, "ownerUuid":$ownerUuid, "ownerAccount":$ownerAccount, "topicName":$topicName, "extra":$extra } } ### 删除群 删除群,topicId必填 必须群主才能删除群; * HTTPS 请求 curl "https://mimc.chat.xiaomi.net/api/uctopic" -XDELETE -H "Content-Type: application/json" -H "topicId:$topicId" -H "token:$token" curl "https://mimc.chat.xiaomi.net/api/uctopic" -XDELETE -H "Content-Type: application/json" -H "topicId:$topicId" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" * JSON结果 {"code":200,"message":"success","data":null} ### 查询群成员 为了避免超大群成员过多,每次最多返回一百个,以uuid大小排序。 startUuid 可以不写,默认为0。isEnd表示本次查询,成员是否是最后一批。 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/uctopic/userlist" -XGET -H "Content-Type: application/json" -H "token:$userToken1" -H "topicId:$topicId" -H "startUuid:$startUuid" curl "https://mimc.chat.xiaomi.net/api/uctopic/userlist" -XGET -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "topicId:$topicId" -H "startUuid:$startUuid" * JSON结果 { "code":200, "message":"success", "data":{ "count": "$count", "members":[\ {\ "appAccout":"$userAccount1",\ "uuid":"$userUuid1",\ "appId":"$appId"\ },\ {\ "appAccout":"$userAccount2",\ "uuid":"$userUuid2",\ "appId":"$appId"\ }\ ], "isEnd":"$isEnd" } } ### 查询所属群 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/uctopic/topics" -XGET -H "Content-Type: application/json" -H "token:$userToken1" curl "https://mimc.chat.xiaomi.net/api/uctopic/topics" -XGET -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$userAccount1" * JSON结果 { "code":200, "message":"success", "data":[$topicId1, $topicId2] } ### 查询群基本信息 返回创建者的uuid和appAcount,群组名称,成员总数, 群组Id * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/uctopic/topic" -XGET -H "Content-Type: application/json" -H "token:$userToken1" -H "topicId:$topicId" curl "https://mimc.chat.xiaomi.net/api/uctopic/topic" -XGET -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "topicId:$topicId" * JSON结果 { "code":200, "message":"success", "data": { "topicId":"$topicId", "topicName":"$topicName", "ownerUuid":"$ownerUuid", "ownerAccount":"$ownerAccount", "memberNum":"$memberNum" } } ### 查询群在线人数 并不限定只能查询自己的群组,所有的群组都可查看 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/uctopic/onlineinfo" -XGET -H "Content-Type: application/json" -H "token:$userToken1" -H "topicId:$topicId" curl "https://mimc.chat.xiaomi.net/api/uctopic/onlineinfo" -XGET -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "topicId:$topicId" * JSON结果 { "code":200, "message":"success", "data": { "topicId":"$topicId", "userCnt":"$userCnt" } } ### 禁止群成员发消息 群主可以禁止群内成员发送消息 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/uctopic/forbidsendmsg" -XPOST -H "Content-Type: application/json" -H "token:$userToken1" -d '{"topicId":"$topicid","user":"$user", "forbidSeconds":$seconds}' curl "https://mimc.chat.xiaomi.net/api/uctopic/forbidsendmsg" -XPOST -H "Content-Type: application/json" -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -d '{"topicId":"$topicid","user":"$user", "forbidSeconds":$seconds}' * 参数说明 * `topicId` : 无限大群id * `user` : 被禁言用户 * `forbidSeconds` : 禁言时间(秒),如果传`0`则相当于取消禁言。最多可以禁言`315360000`秒(十年) * JSON结果 { "code":200, "message":"success", "data":"" } 接口调整 ---- 请[联系我们](https://admin.mimc.chat.xiaomi.net/docs/00-us.html) ,给我们提出需求,我们可快速提供对应调整 [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/15-uctopic.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 消息回调 · GitBook [消息回调](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [消息回调](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [应用场景](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF) * [回调发送与失败重试](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E5%9B%9E%E8%B0%83%E5%8F%91%E9%80%81%E4%B8%8E%E5%A4%B1%E8%B4%A5%E9%87%8D%E8%AF%95) * [如何接入](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E5%A6%82%E4%BD%95%E6%8E%A5%E5%85%A5) * [回调格式](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E5%9B%9E%E8%B0%83%E6%A0%BC%E5%BC%8F) * [单聊即时消息回调](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E5%8D%95%E8%81%8A%E5%8D%B3%E6%97%B6%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [单聊离线消息回调](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E5%8D%95%E8%81%8A%E7%A6%BB%E7%BA%BF%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [群聊即时消息回调](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E7%BE%A4%E8%81%8A%E5%8D%B3%E6%97%B6%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [群聊离线消息回调](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E7%BE%A4%E8%81%8A%E7%A6%BB%E7%BA%BF%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [超级大群消息回调](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E8%B6%85%E7%BA%A7%E5%A4%A7%E7%BE%A4%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) 消息回调 ---- #### 应用场景 消息回调功能可以帮助应用方完全掌控App使用情况,回调消息数据可用于数据挖掘、统计、监控、App保活等。 #### 回调发送与失败重试 回调服务将App用户的即时消息和离线消息POST发给应用方,回调服务收到返回200状态码则表示接收成功 用户发送的完整消息体base64编码后放置在payload字段中 当消息回调失败时,系统会重试最多3次(5s后,30s后,5min后) #### 如何接入 管理平台:https://admin.mimc.chat.xiaomi.net ![](https://admin.mimc.chat.xiaomi.net/docs/img-folder/msgcallback.png) 回调格式 ---- #### 单聊即时消息回调 * Post的body中JSON字符串结果 { "msgType":"NORMAL_MSG", // 表示单聊即时消息 "fromAppId":$fromAppId, "fromAccount":$fromAccount, "fromResource":$fromResource, "toAppId":$toAppId, "toAccount":$toAccount, "toResource":$toResource, "payload":$payload, // 消息体Base64编码后数据 "timestamp":$timestamp, "packetId":$packetId, //客户端生成的消息ID "sequence":$sequence, //服务器为消息分配的递增ID,可用于去重/排序 "bizType":$bizType, // 可用于表示消息类型扩展字段 "authentication":$value //value是用AES算法对timestamp_appId加密的,加密key基于appsecurity的md5值; } #### 单聊离线消息回调 * Post的body中JSON字符串结果 { "msgType":"OFFLINE_MSG", // 表示单聊离线消息 "fromAppId":$fromAppId, "fromAccount":$fromAccount, "fromResource":$fromResource, "toAppId":$toAppId, "toAccount":$toAccount, "toResource":$toResource, "payload":$payload, // 消息体Base64编码后数据 "timestamp":$timestamp, "packetId":$packetId, //客户端生成的消息ID "sequence":$sequence, //服务器为消息分配的递增ID,可用于去重/排序 "bizType":$bizType, // 可用于表示消息类型扩展字段 "authentication":$value, //value是用AES算法对timestamp_appId加密的,加密key基于appsecurity的md5值; "offlineResources":[$Resource1,$Resource2,...,$ResourceN]//所有离线设备 } #### 群聊即时消息回调 * Post的body中JSON字符串结果 { "msgType":"NORMAL_TOPIC_MSG", // 表示群聊即时消息 "appId":$appId, "topicId":$topicId, "fromAccount":$fromAccount, "fromResource":$fromResource, "toAccounts":[$toAccount1,$toAccount2,...,$toAccountN], //群组内所有用户 "payload":$payload, // 消息体Base64编码后数据 "timestamp":$timestamp, "packetId":$packetId, //客户端生成的消息ID "sequence":$sequence, //服务器为消息分配的递增ID,可用于去重/排序 "bizType":$bizType, // 可用于表示消息类型扩展字段 "authentication":$value //value是用AES算法对timestamp_appId加密的,加密key基于appsecurity的md5值; } #### 群聊离线消息回调 * Post的body中JSON字符串结果 { "msgType":"OFFLINE_TOPIC_MSG", // 表示群聊即时消息 "appId":$appId, "topicId":$topicId, "fromAccount":$fromAccount, "fromResource":$fromResource, "toAccounts":[$toAccount1,$toAccount3,...,$toAccountK], //群组内未收到消息的用户 "payload":$payload, // 消息体Base64编码后数据 "timestamp":$timestamp, "packetId":$packetId, //客户端生成的消息ID "sequence":$sequence, //服务器为消息分配的递增ID,可用于去重/排序 "bizType":$bizType, // 可用于表示消息类型扩展字段 "authentication":$value, //value是用AES算法对timestamp_appId加密的,加密key基于appsecurity的md5值; "offlineAccounts":[{\ "toAccount":$toAccount1,\ "offlineResources":[$Resource1,$Resource2,...,$ResourceN], //账户($toAccount1)的离线设备\ },\ {\ "toAccount":$toAccount2,\ "offlineResources":[$Resource1,$Resource2,...,$ResourceN], //账户($toAccount2)的离线设备\ },\ ...\ {\ "toAccount":$toAccountN,\ "offlineResources":[$Resource1,$Resource2,...,$ResourceN], //账户($toAccountN)的离线设备\ }\ ]//所有的离线设备 } #### 超级大群消息回调 * Post的body中JSON字符串结果 { "msgType":"UCTOPIC_MSG", // 表示超级大群即时消息 "appId":$appId, "topicId":$topicId, "fromAccount":$fromAccount, "fromResource":$fromResource, "payload":$payload, // 消息体Base64编码后数据 "timestamp":$timestamp, "packetId":$packetId, //客户端生成的消息ID "sequence":$sequence, //服务器为消息分配的递增ID,可用于去重/排序 "bizType":$bizType, // 可用于表示消息类型扩展字段 "authentication":$value //value是用AES算法对timestamp_appId加密的,加密key基于appsecurity的md5值; } #### 备注1 超级大群的消息场景只存在在线的情况,所以这里的消息回调统一指在线即时消息回调。 #### 备注2 "authentication":$value,加密流程图: ![](https://admin.mimc.chat.xiaomi.net/docs/img-folder/encrypt.png "加密流程图") "authentication":$value,解密流程图: ![](https://admin.mimc.chat.xiaomi.net/docs/img-folder/dencrypt.png "解密流程图") 加密和解密的key都是同一个appsecurity的md5值 [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/09-callback.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 普通群组 · GitBook [普通群组](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [参数列表](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8) * [人数上限](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E4%BA%BA%E6%95%B0%E4%B8%8A%E9%99%90) * [创建群](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E5%88%9B%E5%BB%BA%E7%BE%A4) * [查询指定群信息](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E6%9F%A5%E8%AF%A2%E6%8C%87%E5%AE%9A%E7%BE%A4%E4%BF%A1%E6%81%AF) * [查询所属群信息](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E6%9F%A5%E8%AF%A2%E6%89%80%E5%B1%9E%E7%BE%A4%E4%BF%A1%E6%81%AF) * [邀请用户加入群](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E9%82%80%E8%AF%B7%E7%94%A8%E6%88%B7%E5%8A%A0%E5%85%A5%E7%BE%A4) * [非群主用户退群](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E9%9D%9E%E7%BE%A4%E4%B8%BB%E7%94%A8%E6%88%B7%E9%80%80%E7%BE%A4) * [群主踢用户退群](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E7%BE%A4%E4%B8%BB%E8%B8%A2%E7%94%A8%E6%88%B7%E9%80%80%E7%BE%A4) * [群主更新群信息](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E7%BE%A4%E4%B8%BB%E6%9B%B4%E6%96%B0%E7%BE%A4%E4%BF%A1%E6%81%AF) * [群主销毁群](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E7%BE%A4%E4%B8%BB%E9%94%80%E6%AF%81%E7%BE%A4) 群组管理 ---- ### 参数列表 | Variable | Meanings | | --- | --- | | $appId | 小米开放平台申请的AppId | | $appKey | 小米开放平台申请的AppKey | | $appSecret | 小米开放平台申请的AppSecret | | $topicId | 表示群ID | | $topicName | 表示创建群的时候所指定的群名称 | | $topicId1 | 表示查询所属群信息时用户所加入群的群ID | | $topicId2 | 表示查询所属群信息时用户所加入群的群ID | | $topicName1 | 表示查询所属群信息时用户所加入群的群名称 | | $topicName2 | 表示查询所属群信息时用户所加入群的群名称 | | $topicBulletin1 | 表示查询所属群信息时用户所加入群的群公告 | | $topicBulletin2 | 表示查询所属群信息时用户所加入群的群公告 | | $newBulletin | 表示更新群时设置的新群公告 | | $newTopicName | 表示更新群时设置的新群名称 | | $ownerUuid | 表示群主在MIMC账号系统内uuid(使用user.getUuid()获取) | | $ownerAccount | 表示群主在APP账号系统内唯一ID | | $ownerToken | 表示群主token(使用user.getToken()获取) | | $userAccount1 | 表示群成员1号在APP账号系统内唯一ID | | $userAccount2 | 表示群成员2号在APP账号系统内唯一ID | | $userAccount3 | 表示群成员3号在APP账号系统内唯一ID | | $userAccount4 | 表示群成员4号在APP账号系统内唯一ID | | $userAccount5 | 表示群成员5号在APP账号系统内唯一ID | | $userUuid1 | 表示userAccount1在MIMC账号系统内uuid(使用user.getUuid()获取) | | $userToken1 | 表示userAccount1的token(使用user.getToken()获取) | | $extra | 表示针对该群开发者自定义信息 | #### 备注: token的获取使用User.getToken()方法。 uuid的获取使用User.getUuid()方法,uuid由MIMC根据($appId, $appAccount)生成,全局唯一。 身份认证有两种方式:1. token($ownerToken/$userToken1); 2. app信息,app账号($appKey,$appSecret,$ownerAccount/$userAccount1)。 当两种认证信息都存在时,优先验证前者。前者一般用于app客户端,后者一般用于app服务端。下面给出了这两种的使用方式。 ### 人数上限 当前群默认限制500人 注意: 以下所有的http接口中,如果传入的appAccount是-H参数且含有中文,那么就需要做下面两件事(不含中文则不需要): (1)将appAccount进行base64编码之后再传入; (2)需要加上下面的appAccountEncode参数,表示对appAccount进行了base64编码; -H "appAccountEncode:base64" ### 创建群 #### 如下为$ownerAccount创建群 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId" -XPOST -d '{"topicName":$topicName,"accounts":"$userAccount1,$userAccount2,$userAccount3","extra":$extra}' -H "Content-Type: application/json" -H "token:$ownerToken" curl "https://mimc.chat.xiaomi.net/api/topic/$appId" -XPOST -d '{"topicName":$topicName,"accounts":"$userAccount1,$userAccount2,$userAccount3","extra":$extra}' -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$ownerAccount" * JSON结果 { "code":200,"message":"success", "data":{ "topicInfo":{ "topicId":$topicId, "ownerUuid":$ownerUuid, "ownerAccount":$ownerAccount, "topicName":$topicName, "bulletin":"", "extra":$extra }, "members":[\ {"uuid":$ownerUuid,"account":$ownerAccount},\ {"uuid":$userUuid1,"account":$userAccount1},\ {"uuid":$userUuid2,"account":$userAccount2},\ {"uuid":$userUuid3,"account":$userAccount3}\ ] } } ### 查询指定群信息 #### 如下为$userAccount1查询群信息 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId" -XGET -H "Content-Type: application/json" -H "token:$userToken1" curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId" -XGET -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$userAccount1" * JSON结果 { "code":200,"message":"success", "data":{ "topicInfo":{ "topicId":$topicId, "ownerUuid":$ownerUuid, "ownerAccount":$ownerAccount, "topicName":$topicName, "bulletin":"", "extra":$extra }, "members":[\ {"uuid":$ownerUuid,"account":$ownerAccount},\ {"uuid":$userUuid1,"account":$userAccount1},\ {"uuid":$userUuid2,"account":$userAccount2},\ {"uuid":$userUuid3,"account":$userAccount3}\ ] } } ### 查询所属群信息 #### 如下为$userAccount1查询加入的所有群信息 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId/account" -XGET -H "Content-Type: application/json" -H "token:$userToken1" curl "https://mimc.chat.xiaomi.net/api/topic/$appId/account" -XGET -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$userAccount1" * JSON结果 { "code":200, "message":"success", "data":[\ {\ "topicId":$topicId1,\ "ownerUuid":$ownerUuid,\ "ownerAccount":$ownerAccount,\ "topicName":$topicName1,\ "bulletin":$topicBulletin1,\ "extra":$extra\ },\ {\ "topicId":$topicId2,\ "ownerUuid":$ownerUuid,\ "ownerAccount":$ownerAccount,\ "topicName":$topicName2,\ "bulletin":$topicBulletin2,\ "extra":$extra\ }\ ] } ### 邀请用户加入群 #### 如下为$userAccount1邀请$userAccount4,$userAccount5加入群 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId/accounts" -XPOST -d '{"accounts":"$userAccount4,$userAccount5"}' -H "Content-Type: application/json" -H "token:$userToken1" curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId/accounts" -XPOST -d '{"accounts":"$userAccount4,$userAccount5"}' -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$userAccount1" * JSON结果 { "code":200,"message":"success", "data":{ "topicInfo":{ "topicId":$topicId, "ownerUuid":$ownerUuid, "ownerAccount":$ownerAccount, "topicName":$topicName, "bulletin":"", "extra":$extra }, "members":[\ {"uuid":$ownerUuid,"account":$ownerAccount},\ {"uuid":$userUuid1,"account":$userAccount1},\ {"uuid":$userUuid2,"account":$userAccount2},\ {"uuid":$userUuid3,"account":$userAccount3},\ {"uuid":$userUuid4,"account":$userAccount4},\ {"uuid":$userUuid5,"account":$userAccount5}\ ] } } ### 非群主用户退群 #### 如下为$userAccount1退群 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId/account" -XDELETE -H "Content-Type: application/json" -H "token:$userToken1" curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId/account" -XDELETE -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$userAccount1" * JSON结果 {"code":200,"message":"success","data":null} * 若是群主退群,则JSON结果如下: {"code":500,"message":"quit topic fail","data":null} ### 群主踢用户退群 #### 如下为$ownerAccount踢$userAccount4,$userAccount5退出群 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId/accounts?accounts=$userAccount4,$userAccount5" -XDELETE -H "Content-Type: application/json" -H "token:$ownerToken" curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId/accounts?accounts=$userAccount4,$userAccount5" -XDELETE -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$ownerAccount" * JSON结果 { "code":200,"message":"success", "data":{ "topicInfo":{ "topicId":$topicId, "ownerUuid":$ownerUuid, "ownerAccount":$ownerAccount, "topicName":$topicName, "bulletin":"", "extra":$extra }, "members":[\ {"uuid":$ownerUuid,"account":$ownerAccount},\ {"uuid":$userUuid2,"account":$userAccount2},\ {"uuid":$userUuid3,"account":$userAccount3}\ ] } } ### 群主更新群信息 #### 如下为$ownerAccount更新群信息:群主为$userAccount2,群名称为$newTopicName,群公告为$newBulletin,群自定义信息为$newExtra,也可只对某一项修改,如群名称,其它项不传数据即可。 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId" -XPUT -d '{"ownerAccount":$userAccount2,"topicName":$newTopicName,"bulletin":$newBulletin,"extra":$newExtra}' -H "Content-Type: application/json" -H "token:$ownerToken" curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId" -XPUT -d '{"ownerAccount":$userAccount2,"topicName":$newTopicName,"bulletin":$newBulletin,"extra":$newExtra}' -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$ownerAccount" * JSON结果 { "code":200,"message":"success", "data":{ "topicInfo":{ "topicId":$topicId, "ownerUuid":$userUuid2, "ownerAccount":$userAccount2, "topicName":$newTopicName, "bulletin":$newBulletin, "extra":$newExtra }, "members":[\ {"uuid":$ownerUuid,"account":$ownerAccount},\ {"uuid":$userUuid2,"account":$userAccount2},\ {"uuid":$userUuid3,"account":$userAccount3}\ ] } } ### 群主销毁群 #### 如下为群主销毁群 * HTTPS请求 curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId" -XDELETE -H "Content-Type: application/json" -H "token:$ownerToken" curl "https://mimc.chat.xiaomi.net/api/topic/$appId/$topicId" -XDELETE -H "Content-Type: application/json" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$ownerAccount" * JSON结果 {"code":200,"message":"success!","data":null} [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/10-group.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 历史消息 · GitBook [历史消息](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [参数列表](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8) * [保存多久](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E4%BF%9D%E5%AD%98%E5%A4%9A%E4%B9%85) * [拉取指定时间单聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%97%B6%E9%97%B4%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [拉取指定数目单聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%95%B0%E7%9B%AE%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [拉取指定数目单聊消息记录v2](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%95%B0%E7%9B%AE%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95v2) * [拉取指定序列号单聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E5%BA%8F%E5%88%97%E5%8F%B7%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [拉取指定时间群聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%97%B6%E9%97%B4%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [拉取指定数目群聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%95%B0%E7%9B%AE%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [拉取指定数目群聊消息记录v2](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%95%B0%E7%9B%AE%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95v2) * [拉取指定序列号群聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E5%BA%8F%E5%88%97%E5%8F%B7%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [拉取指定时间超级大群聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%97%B6%E9%97%B4%E8%B6%85%E7%BA%A7%E5%A4%A7%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [拉取指定数目超级大群聊消息记录](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%8B%89%E5%8F%96%E6%8C%87%E5%AE%9A%E6%95%B0%E7%9B%AE%E8%B6%85%E7%BA%A7%E5%A4%A7%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E8%AE%B0%E5%BD%95) * [更新单聊消息扩展extra](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%9B%B4%E6%96%B0%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E6%89%A9%E5%B1%95extra) * [更新群聊消息扩展extra](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%9B%B4%E6%96%B0%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E6%89%A9%E5%B1%95extra) * [批量更新单聊消息扩展extra](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%89%B9%E9%87%8F%E6%9B%B4%E6%96%B0%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E6%89%A9%E5%B1%95extra) * [批量更新群聊消息扩展extra](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%89%B9%E9%87%8F%E6%9B%B4%E6%96%B0%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E6%89%A9%E5%B1%95extra) * [更新单聊消息扩展extraV2](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%9B%B4%E6%96%B0%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E6%89%A9%E5%B1%95extrav2) * [更新群聊消息扩展extraV2](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%9B%B4%E6%96%B0%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E6%89%A9%E5%B1%95extrav2) * [更新单聊消息多扩展extra](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%9B%B4%E6%96%B0%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E5%A4%9A%E6%89%A9%E5%B1%95extra) * [更新群聊消息多扩展extra](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E6%9B%B4%E6%96%B0%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E5%A4%9A%E6%89%A9%E5%B1%95extra) 历史消息 ---- ### 参数列表 | Variable | Meanings | | --- | --- | | $appId | 小米开放平台申请的AppId | | $token | 查询方的token(使用user.getToken()获取) | | $account | 查询方在APP系统内唯一ID | | $fromAccount | 消息发送方在APP账号系统内唯一ID | | $toAccount | 消息接收方在APP账号系统内唯一ID | | $topicId | 表示群ID | | $utcFromTime | 表示查询开始时间,UTC时间,单位毫秒 | | $utcToTime | 表示查询结束时间,UTC时间,单位毫秒 | | $startSeq | 表示查询开始序列号 | | $stopSeq | 表示查询结束序列号 | | $count | 表示查询的消息条数 | | $row | 表示返回的消息条数 | | $timestamp | 表示返回的消息中最早的时间戳 | | $messages | 表示返回的消息集合 | | $sequence | sequence主要用来做消息的排序和去重,全局唯一 | | $payload | 表示经过Base64编码的消息体,app端需要进行Base64解码 | | $ts | 表示消息时间戳 | | $bizType | 可用于表示消息类型扩展字段(可选) | | $extra | 可用于表示消息全局扩展字段值(可选) | | $extraKey | 可用于表示单条消息扩展字段Key(可选) | | $extraValue | 可用于表示单条消息扩展字段值(可选) | | $sequenceExtraMap | Map 格式 对应 | | $sextraKeyMap | Map 格式 对应 | ### 保存多久 | API名称 | 保存时间 | | --- | --- | | 拉取指定时间单聊消息记录 | 6个月 | | 拉取指定数目单聊消息记录 | 6个月 | | 拉取指定序列号单聊消息记录 | 7天 | | 拉取指定时间群聊消息记录 | 6个月 | | 拉取指定数目群聊消息记录 | 6个月 | | 拉取指定序列号群聊消息记录 | 7天 | ### 拉取指定时间单聊消息记录 指的是拉取[utcFromTime, utcToTime)的时间范围内的A与B之间的聊天记录,单聊是相对于群聊而言的一对一聊天。\ 当指定appId+appKey+appSecret方式验证时聊天记录与toAccount对应\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnTime -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"utcFromTime":$utcFromTime,"utcToTime":$utcToTime,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnTime -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"utcFromTime":$utcFromTime,"utcToTime":$utcToTime,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "messages": [\ {\ "sequence": $sequence,\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "toAccount": $toAccount,\ "bizType":$bizType,\ "extra":$extra\ }\ ],\ "row": $row\ }\ }\ \ \ #### 备注\ \ 1. utcFromTime和utcToTime的时间间隔不能超过24小时,查询状态为[utcFromTime,utcToTime);\ 2. timestamp字段在这个请求的响应中没有意义;\ 3. extra 为消息扩展字段,可以根据业务需求灵活定义格式和内容,这里也可以通过extra对查询结果进行过滤。\ \ \ ### 拉取指定数目单聊消息记录\ \ 指的是拉取从指定的时间戳utcToTime(不包含utcToTime)向前count条的A与B之间的聊天记录。\ 当指定appId+appKey+appSecret方式验证时聊天记录与toAccount对应\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnCount/ -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnCount/ -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "messages": [\ {\ "sequence": $sequence,\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "toAccount": $toAccount,\ "bizType":$bizType,\ "extra":$extra\ }\ ],\ "row": $row,\ "timestamp":$timestamp\ }\ }\ \ \ #### 备注\ \ timestamp字段在这个请求的响应中表示当前的聊天记录最早的时间戳(单位:毫秒)。\ \ \ ### 拉取指定数目单聊消息记录V2\ \ 指的是拉取从指定的时间戳utcToTime(不包含utcToTime)向前count条的A与B之间的聊天记录。\ extraFilterMap:v2信息匹配extraFilterMap键值对的sequence记录将会被过滤掉\ getAllExtra:是否拉取所有的v2信息(默认为false)\ bizType:指定类型来筛选\ 当指定appId+appKey+appSecret方式验证时聊天记录与toAccount对应\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnCount/v2 -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"utcToTime":$utcToTime,"extraFilterMap":$extraFilterMap,bizType":$bizType,"getAllExtra":$getAllExtra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnCount/v2 -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"utcToTime":$utcToTime,"extraFilterMap":$extraFilterMap,"bizType":$bizType,"getAllExtra":$getAllExtra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ PS:URL中的$account与$token需要相匹配(即$token应该是$account用户的token信息)。\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "messages": [\ {\ "sequence": $sequence,\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "toAccount": $toAccount,\ "bizType":$bizType,\ "extra":$extra\ "extraMap":$extraMap\ }\ ],\ "row": $row,\ "timestamp":$timestamp\ }\ }\ \ \ #### 备注\ \ 1.timestamp字段在这个请求的响应中表示当前的聊天记录最早的时间戳(单位:毫秒)。\ 2.extraMap为获取的V2信息\ \ \ \ ### 拉取指定序列号单聊消息记录\ \ 指的是拉取从[startSeq, stopSeq)之间的A与B之间的聊天记录。\ 当指定appId+appKey+appSecret方式验证时聊天记录与toAccount对应\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnSequence/ -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"startSeq":$startSeq,"stopSeq":$stopSeq}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/queryOnSequence/ -XPOST\ -d '{"toAccount":$toAccount,"fromAccount":$fromAccount,"startSeq":$startSeq,"stopSeq":$stopSeq}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "messages": [\ {\ "sequence": $sequence,\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "toAccount": $toAccount,\ "bizType":$bizType,\ "extra":$extra\ }\ ],\ "row": $row,\ "timestamp":$timestamp\ }\ }\ \ \ #### 备注\ \ timestamp字段表示当前的聊天记录最早的时间戳(单位:毫秒)。\ \ \ ### 拉取指定时间群聊消息记录\ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnTime/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcFromTime":$utcFromTime,"utcToTime":$utcToTime,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnTime/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcFromTime":$utcFromTime,"utcToTime":$utcToTime,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ PS:URL中的$account与$token需要相匹配(即$token应该是$account用户的token信息)。\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "topicId": $topicId,\ "row": $row,\ "timestamp":$timestamp,\ "messages": [\ {\ "sequence": $sequence,\ "fromAccount": $fromAccount,\ "payload": $payload,\ "ts": $ts,\ "bizType":$bizType,\ "extra":$extra\ },\ {\ "sequence": $sequence,\ "fromAccount": $fromAccount,\ "payload": $payload,\ "ts": $ts,\ "bizType":$bizType,\ "extra":$extra\ }\ ]\ }\ }\ \ \ #### 备注\ \ timestamp字段在这个请求的响应中表示当前的聊天记录最早的时间戳(单位:毫秒)。。\ \ \ ### 拉取指定数目群聊消息记录\ \ 指的是拉取从指定的时间戳utcToTime(不包含utcToTime)向前count条的指定的topicId的群聊天记录。\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnCount/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnCount/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ PS:URL中的$account与$token需要相匹配(即$token应该是$account用户的token信息)。\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "topicId": $topicId,\ "row": $row,\ "timestamp":$timestamp,\ "messages": [\ {\ "sequence": $sequence,\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "bizType":$bizType,\ "extra":$extra\ }\ ]\ }\ }\ \ \ #### 备注\ \ timestamp字段在这个请求的响应中表示当前的聊天记录最早的时间戳(单位:毫秒)。\ \ \ \ ### 拉取指定数目群聊消息记录V2\ \ 指的是拉取从指定的时间戳utcToTime(不包含utcToTime)向前count条的指定的topicId的群聊天记录。\ extraFilterMap:v2信息匹配extraFilterMap键值对的sequence记录将会被过滤掉\ getAllExtra:是否拉取所有的v2信息(默认为false)\ bizType:指定类型来筛选\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnCount/v2 -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,extraFilterMap":$extraFilterMap,"getAllExtra":$getAllExtra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnCount/v2 -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,extraFilterMap":$extraFilterMap,"getAllExtra":$getAllExtra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ PS:URL中的$account与$token需要相匹配(即$token应该是$account用户的token信息)。\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "topicId": $topicId,\ "row": $row,\ "timestamp":$timestamp,\ "messages": [\ {\ "sequence": $sequence,\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "toAccount": $toAccount,\ "bizType":$bizType,\ "extraMap":$extraMap\ }\ ]\ }\ }\ \ \ #### 备注\ \ 1.timestamp字段在这个请求的响应中表示当前的聊天记录最早的时间戳(单位:毫秒)。\ 2.extraMap为获取的V2信息\ \ \ \ ### 拉取指定序列号群聊消息记录\ \ 指的是拉取[startSeq, stopSeq)的指定的topicId的群聊天记录。\ \ \ #### 如下为拉取\[startSeq, stopSeq)的群聊消息记录\ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnSequence/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"startSeq":$startSeq,"stopSeq":$stopSeq}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/queryOnSequence/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"startSeq":$startSeq,"stopSeq":$stopSeq}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ PS:URL中的$account与$token需要相匹配(即$token应该是$account用户的token信息)。\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "topicId": $topicId,\ "row": $row,\ "timestamp":$timestamp,\ "messages": [\ {\ "sequence": $sequence,\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "bizType":$bizType,\ "extra":$extra\ }\ ]\ }\ }\ \ \ \ #### 备注\ \ timestamp字段表示当前的聊天记录最早的时间戳(单位:毫秒)。\ \ \ ### 拉取指定时间超级大群聊消息记录\ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/queryOnTime/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcFromTime":$utcFromTime,"utcToTime":$utcToTime,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/queryOnTime/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcFromTime":$utcFromTime,"utcToTime":$utcToTime,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ PS:URL中的$account与$token需要相匹配(即$token应该是$account用户的token信息)。\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "topicId": $topicId,\ "row": $row,\ "timestamp":$timestamp,\ "messages": [\ {\ "fromAccount": $fromAccount,\ "payload": $payload,\ "ts": $ts,\ "bizType":$bizType,\ "extra":$extra\ },\ {\ "fromAccount": $fromAccount,\ "payload": $payload,\ "ts": $ts,\ "bizType":$bizType,\ "extra":$extra\ }\ ]\ }\ }\ \ \ #### 备注\ \ timestamp字段在这个请求的响应中表示当前的聊天记录最早的时间戳(单位:毫秒)。\ \ \ ### 拉取指定数目超级大群聊消息记录\ \ 指的是拉取从指定的时间戳utcToTime(不包含utcToTime)向前count条的指定的topicId的群聊天记录。\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/queryOnCount/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "appId:$appId"\ -H "appKey:$appKey"\ -H "appSecret:$appSecret"\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/queryOnCount/ -XPOST\ -d '{"account":$account,"topicId":$topicId,"utcToTime":$utcToTime,"count":$count,"bizType":$bizType,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ PS:URL中的$account与$token需要相匹配(即$token应该是$account用户的token信息)。\ \ \ * JSON结果示例\ \ {\ "code": 200,\ "message": "success",\ "data": {\ "appId": $appId,\ "messages": [\ {\ "payload": $payload,\ "ts": $ts,\ "fromAccount":$fromAccount,\ "bizType":$bizType,\ "extra":$extra\ }\ ],\ "row": $row,\ "timestamp":$timestamp\ }\ }\ \ \ #### 备注\ \ timestamp字段在这个请求的响应中表示当前的聊天记录最早的时间戳(单位:毫秒)。\ \ \ \ ### 更新单聊消息扩展extra\ \ 更新指定sequence的某条单聊消息的消息扩展属性extra\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/extra/update -XPOST\ -d '{"fromAccount":$fromAccount,"toAccount":$toAccount,"sequence":$sequence,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": {\ "fromAccount": $fromAccount, \ "toAccount": $toAccount, \ "sequence": $sequence, \ "extra": $extra\ }\ }\ \ \ \ ### 更新群聊消息扩展extra\ \ 更新指定sequence的某条群聊消息的消息扩展属性extra\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/extra/update -XPOST\ -d '{"account":$account,"topicId":$topicId,"sequence":$sequence,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/extra/update -XPOST\ -d '{"account":$account,"topicId":$topicId,"sequence":$sequence,"extra":$extra}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": {\ "topicId": $topicId, \ "sequence": $sequence, \ "extra": $extra\ }\ }\ \ \ \ ### 批量更新单聊消息扩展extra\ \ 批量更新指定sequence的单聊消息的消息扩展属性extra\ sequenceExtraMap Map 格式 对应\ updateCode 成功返回:00,失败返回:01\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/extra/multiupdate -XPOST\ -d '{"fromAccount":$fromAccount,"toAccount":$toAccount,"sequenceExtraMap":$sequenceExtraMap}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": [\ {\ "updateCode": "01", \ "updateMsg": "Records do not exist and cannot be updated", \ "fromAccount": "$fromAccount", \ "toAccount": "$toAccount", \ "sequence": "$sequence", \ "extra": "$extra"\ }, \ {\ "updateCode": "00", \ "updateMsg": "success", \ "fromAccount": "$fromAccount", \ "toAccount": "$toAccount", \ "sequence": "$sequence", \ "extra": "$extra"\ }\ ]\ }\ \ \ \ ### 批量更新群聊消息扩展extra\ \ 同上\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/extra/multiupdate -XPOST\ -d '{"account":$account,"topicId":$topicId,"sequenceExtraMap":$sequenceExtraMap}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/extra/multiupdate -XPOST\ -d '{"account":$account,"topicId":$topicId,"sequenceExtraMap":$sequenceExtraMap}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": [\ {\ "updateCode": "00", \ "updateMsg": "success", \ "account": "$account", \ "topicId": "$topicId", \ "sequence": "$sequence", \ "extra": "$extra"\ }\ ]\ }\ \ \ \ * * *\ \ > v2 版本增加对每一条消息的多扩展设计,原来的消息扩展属性extra可作为消息全局扩展对待,开发者可自行传入extrakey设置多条特定扩展属性,以适应业务上的需要。\ \ ### 更新单聊消息扩展extraV2\ \ 更新指定sequence的某条单聊消息的消息扩展属性extra\ 如果不传extraKey,默认更新全局消息extra属性。\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/extra/update/v2 -XPOST\ -d '{"fromAccount":$fromAccount,"toAccount":$toAccount,"sequence":$sequence,"extraKey":$extraKey,"extraValue":$extraValue}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": {\ "fromAccount": $fromAccount, \ "toAccount": $toAccount, \ "sequence": $sequence, \ "extraKey": $extraKey,\ "extraValue": $extraValue\ }\ }\ \ \ \ ### 更新群聊消息扩展extraV2\ \ 更新指定sequence的某条群聊消息的消息扩展属性extra\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/extra/update/v2 -XPOST\ -d '{"account":$account,"topicId":$topicId,"sequence":$sequence,"extraKey":$extraKey,"extraValue":$extraValue}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/extra/update/v2 -XPOST\ -d '{"account":$account,"topicId":$topicId,"sequence":$sequence,"extraKey":$extraKey,"extraValue":$extraValue}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": {\ "topicId": $topicId, \ "sequence": $sequence, \ "extraKey": $extraKey,\ "extraValue":$extraValue\ }\ }\ \ \ \ ### 更新单聊消息多扩展extra\ \ 批量更新指定sequence的单聊消息的消息扩展属性extra\ extraKeyMap Map 格式 对应\ updateCode 成功返回00 失败返回01\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2p/extra/batchupdate -XPOST\ -d '{"fromAccount":$fromAccount,"toAccount":$toAccount,"sequence":$sequence,"extraKeyMap":$extraKeyMap}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": [\ {\ "updateCode": "01", \ "updateMsg": "Records do not exist and cannot be updated", \ "fromAccount": "$fromAccount", \ "toAccount": "$toAccount", \ "sequence": "$sequence", \ "extraKey": "$extraKey",\ "extraValue": "$extraValue",\ }, \ {\ "updateCode": "00", \ "updateMsg": "success", \ "fromAccount": "$fromAccount", \ "toAccount": "$toAccount", \ "sequence": "$sequence", \ "extraKey": "$extraKey",\ "extraValue": "$extraValue"\ }\ ]\ }\ \ \ \ ### 更新群聊消息多扩展extra\ \ 同上\ \ \ * HTTPS请求(POST)\ \ curl https://mimc.chat.xiaomi.net/api/msg/p2t/extra/batchupdate -XPOST\ -d '{"account":$account,"topicId":$topicId,"sequence":$sequence,"extraKeyMap":$extraKeyMap}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ curl https://mimc.chat.xiaomi.net/api/msg/p2u/extra/batchupdate -XPOST\ -d '{"account":$account,"topicId":$topicId,"extraKeyMap":extraKeyMap}'\ -H "Content-Type: application/json;charset=UTF-8"\ -H "Accept:application/json;charset=UTF-8"\ -H "token:$token"\ \ \ * JSON结果示例\ \ {\ "code": 200, \ "message": "success", \ "data": [\ {\ "updateCode": "00", \ "updateMsg": "success", \ "account": "$account", \ "topicId": "$topicId", \ "sequence": "$sequence", \ "extraKey": "$extraKey",\ "extraValue": "$extraValue"\ }\ ]\ }\ \ \ \ [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/11-history.html#%E7%9B%AE%E5%BD%95)\ \ results matching ""\ ===================\ \ No results matching ""\ ====================== --- # 会话列表 · GitBook [会话列表](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [参数列表](https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html#%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8) * [获取最近会话列表](https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html#%E8%8E%B7%E5%8F%96%E6%9C%80%E8%BF%91%E4%BC%9A%E8%AF%9D%E5%88%97%E8%A1%A8) * [获取最近会话列表V2](https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html#%E8%8E%B7%E5%8F%96%E6%9C%80%E8%BF%91%E4%BC%9A%E8%AF%9D%E5%88%97%E8%A1%A8%E7%89%88%E6%9C%AC%E4%BA%8C) * [更新指定单聊会话扩展字段](https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html#%E6%9B%B4%E6%96%B0%E6%8C%87%E5%AE%9A%E5%8D%95%E8%81%8A%E4%BC%9A%E8%AF%9D%E6%89%A9%E5%B1%95%E5%AD%97%E6%AE%B5) * [更新指定群聊会话扩展字段](https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html#%E6%9B%B4%E6%96%B0%E6%8C%87%E5%AE%9A%E7%BE%A4%E8%81%8A%E4%BC%9A%E8%AF%9D%E6%89%A9%E5%B1%95%E5%AD%97%E6%AE%B5) 最近会话列表 ------ 该功能应用于新设备登录后获取服务端存储的最近30天的全量通讯列表记录,返回结果中包括最近联系的用户和群组信息,按时间降序排列。身份验证方式即客户端使用的token验证。 ### 参数列表(请求or返回参数汇总) | Variable | Meanings | | --- | --- | | $appId | 小米开放平台申请的AppId | | $appKey | 小米开放平台申请的AppKey | | $appSecret | 小米开放平台申请的AppSecret | | $appAccount | 查询方在APP账号系统内唯一ID | | $token | 查询方的token(使用user.getToken()获取) | | $member | 与查询方进行会话的用户在APP账号系统内唯一ID | | $size | 会话条数 | | $timestamp | 创建时间 | | $topicId | 与查询方进行会话的群在APP账号系统内唯一ID | | $sequence | sequence主要用来做消息的排序和去重,全局唯一 | | $extra | 会话的扩展字段,用于实现一些自定义功能 | | $bizType | 消息的扩展字段,参考历史消息页面 | | $msgExtra | 消息的扩展字段,参考历史消息页面 | | $userType | 可选值USER 或者 TOPIC,代表单聊或者群聊消息 | | $uuid | 当前用户uuid 开发者无需关心 | | $msgExtraFlag | 消息extra扩展字段查询标记,非必填,默认不填为false | | $ts | 非必填,毫秒级时间戳,拉取大于等于该时间戳的会话列表 | ### 获取最近会话列表 * HTTP 请求 curl "https://mimc.chat.xiaomi.net/api/contact/?ts=$ts" -XGET -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code":200, "data":[\ { "userType":"TOPIC",\ "id":"$topicId1",\ "name":"$topicName1",\ "timestamp":"$ts1",\ "extra":"$extra",\ "lastMessage":{\ "fromUuid":"$fromUuid1",\ "fromAccount":"$fromAccount1",\ "payload":"$payload1", // 需base64解码\ "sequence":"$sequence1",\ "bizType":"$bizType"\ }\ },\ {\ "userType":"USER",\ "id":"$uuid1",\ "name":"$appAccount1",\ "timestamp":"$ts3",\ "extra":"$extra",\ "lastMessage":{\ "fromUuid":"$fromUuid3",\ "fromAccount":"$fromAccount3",\ "payload":"$payload3", // 需base64解码\ "sequence":"$sequence3",\ "bizType":"$bizType"\ }\ }\ ], "message":"success" } * 注意: 此处获取的单聊和普通群聊会话条数各不超过1000条,未支持包含超级大群会话; ### 获取最近会话列表版本二 * HTTP 请求 curl "https://mimc.chat.xiaomi.net/api/contact/v2?msgExtraFlag=$msgExtraFlag\&ts=$ts" -XGET -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code": 200, "message": "success", "data": { "appId": $appId, "appAccount": "$appAccount", "uuid": $uuid, "row": $size, "timestamp": $timestamp, "contacts": [\ {\ "userType": "USER",\ "id": "$id",\ "name": "$name",\ "timestamp": "$timestamp",\ "extra": "$extra",\ "lastMessage": {\ "fromUuid": "$fromUuid",\ "fromAccount": "$fromAccount",\ "payload": "$payload ",\ "sequence": "$sequence",\ "bizType": "$bizType",\ "msgExtra":$msgExtra // msgExtraFlag=true时会有该字段\ }\ },\ {\ "userType": "TOPIC",\ "id": "$id",\ "name": "$name",\ "timestamp": "$timestamp",\ "extra": "$extra",\ "lastMessage": {\ "fromUuid": "$fromUuid",\ "fromAccount": "$fromAccount",\ "payload": "$payload ",\ "sequence": "$sequence",\ "bizType": "$bizType",\ "msgExtra":$msgExtra\ }\ }\ ] } } * 注意: 此处获取的单聊和普通群聊会话条数各不超过1000条,未支持包含超级大群会话; ### 更新指定单聊会话扩展字段 curl "https://mimc.chat.xiaomi.net/api/contact/p2p/extra/update" -XPOST -d '{"account":"$account","extra":"$extra"}' -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code": 200, "message": "success", "data": { "userType":"USER", "id":"$uuid1", "name":"$appAccount1", "timestamp":"$ts3", "extra":"$extra", "lastMessage":{ "fromUuid":"$fromUuid3", "fromAccount":"$fromAccount3", "payload":"$payload3", // 需base64解码 "sequence":"$sequence3", "bizType":"$bizType" } } } ### 更新指定群聊会话扩展字段 curl "https://mimc.chat.xiaomi.net/api/contact/p2t/extra/update" -XPOST -d '{"topicId":"$topicId","extra":"$extra"}' -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code": 200, "message": "success", "data": { "userType":"TOPIC", "id":"$uuid1", "name":"$appAccount1", "timestamp":"$ts3", "extra":"$extra", "lastMessage":{ "fromUuid":"$fromUuid3", "fromAccount":"$fromAccount3", "payload":"$payload3", // 需base64解码 "sequence":"$sequence3", "bizType":"$bizType" } } } * 注意 更新会话extra是指,更新当前token解析出的用户和某个accout或者topicId之间的会话 [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 黑名单 · GitBook [黑名单](https://admin.mimc.chat.xiaomi.net/docs/) ================================================ 目录 -- * [参数列表](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8) * [单聊黑名单](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E5%8D%95%E8%81%8A%E9%BB%91%E5%90%8D%E5%8D%95) * [拉黑对方](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E6%8B%89%E9%BB%91%E5%AF%B9%E6%96%B9) * [取消拉黑](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E5%8F%96%E6%B6%88%E6%8B%89%E9%BB%91) * [是否拉黑](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E6%98%AF%E5%90%A6%E6%8B%89%E9%BB%91) * [群禁言](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E7%BE%A4%E7%A6%81%E8%A8%80) * [禁言群成员](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E7%A6%81%E8%A8%80%E7%BE%A4%E6%88%90%E5%91%98) * [取消禁言](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E5%8F%96%E6%B6%88%E7%A6%81%E8%A8%80) * [是否被禁言](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E6%98%AF%E5%90%A6%E8%A2%AB%E7%A6%81%E8%A8%80) 参数列表 ---- | Variable | Meanings | | --- | --- | | $appId | 小米开放平台申请的AppId | | $appKey | 小米开放平台申请的AppKey | | $appSecret | 小米开放平台申请的AppSecret | | $appAccount | 表示查询方在APP账号系统内唯一ID | | $token | 查询方的token(使用user.getToken()获取) | | $blackAccount | 表示被拉黑方在APP账号系统内唯一ID | | $blackTopicId | 表示要进行禁言的群ID | 单聊黑名单 ----- 该功能限于单聊的黑名单功能: A拉黑B,B不能给A发送消息,A可以继续给B发送消息。 注意: 以下所有的http接口中,如果传入的appAccount是-H参数且含有中文,那么就需要做下面两件事(不含中文则不需要): (1)将appAccount进行base64编码之后再传入; (2)需要加上下面的appAccountEncode参数,表示对appAccount进行了base64编码; -H "appAccountEncode:base64" ### 拉黑对方 * HTTP请求 curl https://mimc.chat.xiaomi.net/api/blacklist/ -XPOST -d '{"blackAccount":"$blackAccount"}' -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" -H "Content-Type: application/json" curl https://mimc.chat.xiaomi.net/api/blacklist/ -XPOST -d '{"blackAccount":"$blackAccount"}' -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code":200, "message":"success", "data":null, } ### 取消拉黑 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/blacklist/?blackAccount=$blackAccount -XDELETE -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" -H "Content-Type: application/json" curl https://mimc.chat.xiaomi.net/api/blacklist/?blackAccount=$blackAccount -XDELETE -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code":200, "message":"success", "data":null, } ### 是否拉黑 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/blacklist/?blackAccount=$blackAccount -XGET -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" -H "Content-Type: application/json" curl https://mimc.chat.xiaomi.net/api/blacklist/?blackAccount=$blackAccount -XGET -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code":200, "message":"success", "data":{ "isBlack":true/false }, } 群禁言 --- 该功能限于群聊的禁言功能: 群主A禁言群成员B,B不能在群里发消息,B能收到群消息。 只有群主有禁言权限,被禁言者必须是群成员,查询是否被禁言者必须是群成员。 注意: 以下所有的http接口中,如果传入的appAccount是-H参数且含有中文,那么就需要做下面两件事(不含中文则不需要): (1)将appAccount进行base64编码之后再传入; (2)需要加上下面的appAccountEncode参数,表示对appAccount进行了base64编码; -H "appAccountEncode:base64" ### 禁言群成员 * HTTP请求 curl https://mimc.chat.xiaomi.net/api/topicblacklist/ -XPOST -d '{"blackAccount":"$blackAccount","blackTopicId":"$blackTopicId"}' -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" -H "Content-Type: application/json" curl https://mimc.chat.xiaomi.net/api/topicblacklist/ -XPOST -d '{"blackAccount":"$blackAccount","blackTopicId":"$blackTopicId"}' -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code":200, "message":"success", "data":null, } ### 取消禁言 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/topicblacklist/$blackTopicId/blackAccount?blackAccount=$blackAccount -XDELETE -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" -H "Content-Type: application/json" curl https://mimc.chat.xiaomi.net/api/topicblacklist/$blackTopicId/blackAccount?blackAccount=$blackAccount -XDELETE -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code":200, "message":"success", "data":null, } ### 是否被禁言 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/topicblacklist/$blackTopicId/blackAccount?blackAccount=$blackAccount -XGET -H "appId:$appId" -H "appKey:$appKey" -H "appSecret:$appSecret" -H "appAccount:$appAccount" -H "Content-Type: application/json" curl https://mimc.chat.xiaomi.net/api/topicblacklist/$blackTopicId/blackAccount?blackAccount=$blackAccount -XGET -H "token:$token" -H "Content-Type: application/json" * JSON结果 { "code":200, "message":"success", "data":{ "isBlack":true/false }, } [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/14-blacklist.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 创建应用 · GitBook [创建应用](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 创建应用 ---- APP开发者访问小米开放平台(dev.mi.com)申请appId/appKey/appSecret。 步骤如下:登录小米开放平台网页 -> “管理控制台” -> “小米应用商店” -> “创建应用” -> 填入应用名和包名 -> “创建” -> 记下看到的AppId/AppKey/AppSecret 。 ![](https://admin.mimc.chat.xiaomi.net/docs/img-folder/application.jpg) #### 备注:安卓/iOS/Web/Java/C#/C++/go等多平台用同一个APP results matching "" =================== No results matching "" ====================== --- # 排查问题 · GitBook [排查问题](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [正确的接入流程](https://admin.mimc.chat.xiaomi.net/docs/0505-debug.html#%E6%AD%A3%E7%A1%AE%E7%9A%84%E6%8E%A5%E5%85%A5%E6%B5%81%E7%A8%8B) * [收不到消息如何排查](https://admin.mimc.chat.xiaomi.net/docs/0505-debug.html#%E6%94%B6%E4%B8%8D%E5%88%B0%E6%B6%88%E6%81%AF%E5%A6%82%E4%BD%95%E6%8E%92%E6%9F%A5) 正确的接入流程 ------- 1. 先确认DEMO是可用的 2. 删除本地缓存目录 3. 替换DEMO中appid/appkey/appsec为自用app信息 4. 仔细阅读文档(不要偷懒不要省) 5. 开始编写自己的业务代码 收不到消息如何排查 --------- 1. 删除本地缓存目录,尝试(appid修改后必须执行此操作) 2. 检查发送方和接收方的appid是否一致(防止粗心大意导致不一致) 3. 发送者和接收者确认都在线(onlineStatus回调打印日志) 4. 发送者serverAck回调是否被执行 5. 打印出接收者账号,确认接收者账号是不是正确(防止发给了错误的人) 6. 接收端handleMessage回调是否被执行(在第一行添加日志,排除消息回调中业务逻辑bug导致消息不能正确显示) results matching "" =================== No results matching "" ====================== --- # iOS · GitBook [iOS](https://admin.mimc.chat.xiaomi.net/docs/) ================================================ 目录 -- * [引入静态库](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%BC%95%E5%85%A5%E9%9D%99%E6%80%81%E5%BA%93) * [环境配置](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE) * [日志](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E6%97%A5%E5%BF%97) * [用户登录](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95) * [用户初始化](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E7%94%A8%E6%88%B7%E5%88%9D%E5%A7%8B%E5%8C%96) * [登录](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E7%99%BB%E5%BD%95) * [单点登录](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95) * [在线状态变化回调](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%9C%A8%E7%BA%BF%E7%8A%B6%E6%80%81%E5%8F%98%E5%8C%96%E5%9B%9E%E8%B0%83) * [注销](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E6%B3%A8%E9%94%80) * [发送消息](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF) * [发送单聊消息](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%8F%91%E9%80%81%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF) * [发送群聊消息](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%8F%91%E9%80%81%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF) * [发送无限大群消息](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%8F%91%E9%80%81%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E6%B6%88%E6%81%AF) * [发送在线消息](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%8F%91%E9%80%81%E5%9C%A8%E7%BA%BF%E6%B6%88%E6%81%AF) * [接收消息回调](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E6%8E%A5%E6%94%B6%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [无限大群](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [创建无限大群](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%88%9B%E5%BB%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [加入无限大群](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E5%8A%A0%E5%85%A5%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [退出无限大群](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E9%80%80%E5%87%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [解散无限大群](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E8%A7%A3%E6%95%A3%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [无限大群操作回调](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E6%93%8D%E4%BD%9C%E5%9B%9E%E8%B0%83) * [示例代码](https://github.com/Xiaomi-mimc/mimc-ios-sdk) 引入静态库 ----- 正常情况下需要引入MMCSDK和ProtocolBufferSDK两个静态库,但是若你的项目中也用到了ProtocolBuffer,为避免冲突,在项目中可以不引入MIMC提供的ProtocolBufferSDK静态库。 环境配置 ---- (1) Build Settings的Framework Search Paths和Header Search Paths都引入MMCSDK的正确路径。 (2) Build Phases的Link Binary With Libraries中加入CoreTelephony.framework,SystemConfiguration.framework和已经引入的两个静态库。 (3) 需在github的sdk目录下根据链接下载ffmpeg库并放到demo中,否则demo无法正常运行。 (具体配置可参考demo) 日志 -- //SDK日志总开关,默认开 [MCUser setMIMCLogSwitch:YES]; /** * 设置打印的日志级别,默认DEBUG级别 * @param[level]: * MIMC_DEBUG(默认) * MIMC_INFO * MIMC_WARN * MIMC_ERROR */ [MCUser setMIMCLogLevel:MIMC_DEBUG]; 用户登录 ---- #### 用户初始化 #### 参考 [安全认证](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html#%E5%BA%94%E7%94%A8%E7%AB%AF%E5%AE%9E%E7%8E%B0%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81%E6%8E%A5%E5%8F%A3) ,初始化NSMutableURLRequest和parseToken (1)创建URLRequest,用于访问AppProxyService服务 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSMutableDictionary *dicObj = [[NSMutableDictionary alloc] init]; ... NSData *dicData = [NSJSONSerialization dataWithJSONObject:dicObj options:NSJSONWritingPrettyPrinted error:nil]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:dicData]; (2)实现协议解析,解析返回结果,获取小米认证服务下发的Token /** * @return[NSString]:从代理认证服务返回结果中获取[小米认证服务下发的原始数据]并返回 **/ @protocol parseTokenDelegate - (void)parseProxyServiceToken:(void(^)(NSData *data))callback; @end parseProxyServiceToken回调函数实现之后,需要设置委托者的代理是谁。比如:_user.parseTokenDelegate = self,self指的是实现parseProxyServiceToken方法的当前类对> 象。 (3)创建user: MCUser *user = [[MCUser alloc] initWithAppId:appId andAppAccount:appAccount]; #### 登录 /** * 默认支持多设备登录 * 进程整个生命周期内login()调用一次即可 */ [user login]; #### 单点登录 /** * @param[enableSSO]: 默认NO,YES时打开启用标志,且实例化User对象时,传入相同resource时方可正式生效 * 注意: * 必须在调用login()之前调用 * 当用户登录时,先前登录用户会收到下线回调,回调参数type = reason = desc = "single-resource-kick" */ [user enableSSO:YES]; #### 在线状态变化回调 /** * @param[user]: 在线状态发生变化的用户 * @param[status]: 1:在线,0:不在线 * @param[type]: 状态变化类型 * @param[reason]: 状态变化原因 * @param[desc]: 状态变化描述信息 **/ @protocol onlineStatusDelegate - (void)statusChange:(MCUser *)user status:(int)status type:(NSString *)type reason:(NSString *)reason desc:(NSString *)desc; @end statusChange回调函数实现之后,需要设置委托者的代理是谁。比如:_user.onlineStatusDelegate = self,self指的是实现statusChange方法的当前类对象。 #### 注销 [user logout]; 发送消息 ---- #### 发送单聊消息 /** * @param[toAppAccount] NSString: 消息接收者在APP账号系统内的账号 * @param[payload] NSData: 开发者自定义消息体,最大不超过15KB * @param[isStore] BOOL: 消息是否存储在mimc服务端,YES:存储, NO:不存储, 默认存储 * @param[bizType] NSString: 消息类型,默认空字符串 * @return: 客户端生成的消息ID **/ NSString packetId = [user sendMessage:toAppAccount payload:payload]; NSString packetId = [user sendMessage:toAppAccount payload:payload isStore:isStore]; NSString packetId = [user sendMessage:toAppAccount payload:payload bizType:bizType]; NSString packetId = [user sendMessage:toAppAccount payload:payload bizType:bizType isStore:isStore]; #### 发送群聊消息 /** * @param[topicId] int64_t: 接收消息的群ID * @param[payload] NSData: 开发者自定义消息体,最大不超过15KB * @param[isStore] BOOL: 消息是否存储在mimc服务端,YES:存储, NO:不存储, 默认存储 * @param[bizType] NSString: 消息类型,默认空字符串 * @return: 客户端生成的消息ID **/ NSString packetId = [user sendGroupMessage:topicId payload:payload]; NSString packetId = [user sendGroupMessage:topicId payload:payload isStore:isStore]; NSString packetId = [user sendGroupMessage:topicId payload:payload bizType:bizType]; NSString packetId = [user sendGroupMessage:topicId payload:payload bizType:bizType isStore:isStore]; #### 发送无限大群消息 /** * @param[topicId] int64_t: 需要发送给哪个群的群ID * @param[payload] NSData: 需要发送的群消息内容,最大不超过15KB * @param[isStore] BOOL: 是否存储这条消息 * @param[bizType] NSString: 消息类型,默认空字符串 * @return: 客户端生成的消息ID **/ NSString packetId = [user sendUnlimitedGroupMessage:topicId payload:payload]; NSString packetId = [user sendUnlimitedGroupMessage:topicId payload:payload isStore:isStore]; NSString packetId = [user sendUnlimitedGroupMessage:topicId payload:payload bizType:bizType]; NSString packetId = [user sendUnlimitedGroupMessage:topicId payload:payload bizType:bizType isStore:isStore]; #### 发送在线消息 /** * @param[toAppAccount]: 消息接收方在APP账号系统内的唯一账号ID * @param[payload]: 开发者自定义消息体,最大不超过15KB * @param[bizType]: 消息类型,默认空字符串 * @return 客户端生成的消息ID */ String packetId = [user sendOnlineMessage:toAppAccount payload:payload]; String packetId = [user sendOnlineMessage:toAppAccount payload:payload bizType:bizType]; 接收消息回调 ------ @protocol handleMessageDelegate /** * 收到单聊消息的回调函数 * @param[packets]: 单聊消息集 * @note: MIMCMessage 单聊消息 * MIMCMessage.packetId: 消息ID * MIMCMessage.sequence: 序列号 * MIMCMessage.fromAccount: 发送方账号 * MIMCMessage.fromResource: 发送方设备标识 * MIMCMessage.toAccount: 接收方账号 * MIMCMessage.toResource: 接收方设备标识 * MIMCMessage.payload: 消息体 * MIMCMessage.timestamp: 时间戳 * MIMCMessage.bizType: 消息类型 * MIMCMessage.convIndex: 会话索引,默认0值,说明没有启用会话消息,该字段由服务器填充,在一个会话中连续自增,从1开始 * @return 返回YES说明消息被成功递交给应用层,若返回NO说明消息递交失败,会再次触发该回调,直到返回YES为止 **/ - (BOOL)handleMessage:(NSArray *)packets user:(MCUser *)user; /** * 收到群聊消息的回调函数 * @param[packets]: 群聊消息集 * @note: MIMCGroupMessage 群聊消息 * MIMCGroupMessage.packetId: 消息ID * MIMCGroupMessage.topicId: 群ID * MIMCGroupMessage.sequence: 序列号 * MIMCGroupMessage.fromAccount: 发送方账号 * MIMCGroupMessage.fromResource: 发送方设备标识 * MIMCGroupMessage.payload: 消息体 * MIMCGroupMessage.timestamp: 时间戳 * MIMCGroupMessage.bizType: 消息类型 * MIMCGroupMessage.convIndex: 会话索引,默认0值,说明没有启用会话消息,该字段由服务器填充,在一个会话中连续自增,从1开始 * @return 返回YES说明消息被成功递交给应用层,若返回NO说明消息递交失败,会再次触发该回调,直到返回YES为止 **/ - (BOOL)handleGroupMessage:(NSArray *)packets; /** * 收到serverAck消息的回调函数 * @param[serverAck]: 服务器返回的serverAck对象 * @note: MIMCServerAck serverAck对象 * MIMCServerAck.packetId: 客户端生成的消息ID * MIMCServerAck.timestamp: 消息发送到服务器的时间(单位:ms) * MIMCServerAck.sequence: 服务器为消息分配的递增ID,单用户空间内递增唯一,可用于去重/排序 * MIMCServerAck.desc: 服务器返回的描述信息 * (1)MSG_CHECK_ACCEPT字段:表示消息被服务端正常接收。 * (2)BLACKLIST_REFUSAL字段:表示发送者在黑名单中。 * (3)MSG_CHECK_SENDER_NOT_IN_TOPIC字段:表示发送者不在群列表中。 * (4)RUBBISH_MSG_REFUSAL:表示发送的消息中含有垃圾消息。(目前垃圾消息功能没有开启) * (5)P2P_MESSAGE_EXCEED_MAX_QPS字段:表示发送单聊的消息超过qps限制。 * (6)P2T_MESSAGE_EXCEED_MAX_QPS字段:表示发送群聊的消息超过qps限制。 * (7) TOPIC_BLACKLIST_REFUSAL字段:表示向群里发送消息的人被群禁言了。 * (8) TOPIC_ID_NOT_EXIST字段:表示群不存在。 * (9) NOT_IN_GROUP字段:表示用户不在群内。 * (10) MESSAGE_EXCEED_MAX_QPS:表示发送无限大群的消息超过qps限制。 * (11)FORBID_SNED_UC_MESSAGE:群用户被禁言 * MIMCServerAck.code: 服务器的返回码 * MSG_CHECK_ACCEPT返回100 * BLACKLIST_REFUSAL返回101 * MSG_CHECK_SENDER_NOT_IN_TOPIC返回102 * RUBBISH_MSG_REFUSAL返回103 * P2P_MESSAGE_EXCEED_MAX_QPS返回104 * TOPIC_BLACKLIST_REFUSAL返回105 * P2T_MESSAGE_EXCEED_MAX_QPS返回106 * TOPIC_ID_NOT_EXIST返回202 * NOT_IN_GROUP返回203 * MESSAGE_EXCEED_MAX_QPS返回204 * FORBID_SNED_UC_MESSAGE返回403 **/ - (void)handleServerAck:(MIMCServerAck *)serverAck; /** * 收到无限大群群消息的回调函数 * @param[packets]: 群聊消息集 **/ - (BOOL)handleUnlimitedGroupMessage:(NSArray *)packets; - (void)handleOnlineMessage:(MIMCMessage *)onlineMessage; /** * @param[onlineMessageAck]: 服务器返回的onlineMessageAck对象,即发送在线消息对应的反馈信息 * onlineMessageAck.packetId: 客户端生成的消息ID * onlineMessageAck.code: 服务器的返回码 * OFFLINE返回0 * RECEIVED返回1 * TIMEOUT返回2 * onlineMessageAck.desc: 服务器返回的描述信息: * OFFLINE字段:接收方离线 * RECEIVED字段:接收方成功接收 * TIMEOUT字段:发送超时,默认10s */ - (void)handleOnlineMessageAck:(MCOnlineMessageAck *)onlineMessageAck; /** * 通知主动拉取离线消息,拉取区间:(minSequence, maxSequence] * 默认情况,当用户处于离线状态时,最多保留近7天内的离线消息,直到用户上线,持续下发缓存的离线消息。 * 若积压的离线消息过多,会一直下发离线消息,从而导致长时间无法接收最新消息,直到离线消息接收完毕为止。 * 我们支持设置一个阈值来控制离线消息是否持续下发,比如阈值设置为offlineMsgMaxCount=500,表示当离线消息达到500条时,触发onPullNotification(...) * 回调,当回调接口返回true时,服务端会跳过离线消息,直接下发最新的实时消息,应用方可根据回调形参单独去拉取离线消息。 * 1)首先拉取会话列表; * 2)然后用会话列表中的"sequence"字段和回调接口的“minSequence”形参进行比对,当sequence > minSequence时,说明需要拉取该会话的历史消息; * 3)最后拉取历史消息,其中"fromAccount"字段从会话列表中提取即可。 * 会话列表:https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html * 历史消息:https://admin.mimc.chat.xiaomi.net/docs/11-history.html */ - (BOOL)onPullNotification:(int64_t)minSequence maxSequence:(int64_t)maxSequence; /** * 发送单聊消息超时的回调函数 * @param[message]: 发送超时的单聊消息 **/ - (void)handleSendMessageTimeout:(MIMCMessage *)message; /** * 发送群聊消息超时的回调函数 * @param[groupMessage]: 发送超时的群聊消息 **/ - (void)handleSendGroupMessageTimeout:(MIMCGroupMessage *)groupMessage; /** * 发送无限大群消息超时的回调函数 * @param[groupMessage]: 发送超时的群聊消息 **/ - (void)handleSendUnlimitedGroupMessageTimeout:(MIMCGroupMessage *)groupMessage; @end 开发者实现上面定义的几个回调函数之后,需要设置委托者的代理是谁。比如:_user.handleMessageDelegate = self,self指的是实现上述几个回调函数的当前类对象 无限大群 ---- #### 创建无限大群 /** * @param[topicName] NSString: 需要创建的群组名称 * @param[context] id: 用户自定义传入的对象,通过回调函数原样传出 * @return: 创建无限大群过程中是否有异常,无异常为YES,否则为NO **/ - (BOOL)createUnlimitedGroup:(NSString *)topicName context:(id)context; #### 加入无限大群 /** * @param[topicId] int64_t: 需要加入的群ID * @param[context] id: 用户自定义传入的对象,通过回调函数原样传出 * @return: 客户端生成的消息ID **/ - (NSString *)joinUnlimitedGroup:(int64_t)topicId context:(id)context; #### 退出无限大群 /** * @param[topicId] int64_t: 需要加入的群ID * @param[context] id: 用户自定义传入的对象,通过回调函数原样传出 * @return: 客户端生成的消息ID **/ - (NSString *)quitUnlimitedGroup:(int64_t)topicId context:(id)context; #### 解散无限大群 /** * @param[topicId] int64_t: 需要解散的群ID * @param[context] id: 用户自定义传入的对象,通过回调函数原样传出 * @return: 解散无限大群过程中是否有异常,无异常为YES,否则为NO **/ - (BOOL)dismissUnlimitedGroup:(int64_t)topicId context:(id)context; #### 无限大群操作回调 @protocol handleUnlimitedGroupDelegate /** * 创建无限大群是否成功的回调函数 * @param[topicId] int64_t: 群ID * @param[topicName] NSString: 群名称 * @param[code] int: 错误码,0成功,非0失败 * @param[desc] NSString: 描述信息 * @param[context] id: 用户自定义传入的对象 **/ - (void)handleCreateUnlimitedGroup:(int64_t)topicId topicName:(NSString *)topicName code:(int)code desc:(NSString *)desc context:(id)context; /** * 加入指定群ID是否成功的回调函数 * @param[topicId] int64_t: 群ID * @param[code] int: 错误码,0成功,非0失败 * @param[desc] NSString: 描述信息 * @param[context] id: 用户自定义传入的对象 **/ - (void)handleJoinUnlimitedGroup:(int64_t)topicId code:(int)code desc:(NSString *)desc context:(id)context; /** * 退出无限大群是否成功的回调函数 * @param[topicId] int64_t: 群ID * @param[code] int: 错误码,0成功,非0失败 * @param[desc] NSString: 描述信息 * @param[context] id: 用户自定义传入的对象 **/ - (void)handleQuitUnlimitedGroup:(int64_t)topicId code:(int)code desc:(NSString *)desc context:(id)context; /** * 解散无限大群是否成功的回调函数 * * @param[topicId] int64_t: 群ID * @param[code] int: 错误码,0成功,非0失败 * @param[desc] NSString: 描述信息 * @param[context] id: 用户自定义传入的对象 **/ - (void)handleQuitUnlimitedGroup:(int64_t)topicId code:(int)code desc:(NSString *)desc context:(id)context; /** * 收到无限大群被解散消息的回调函数 * @param[topicId] int64_t: 被解散的群ID **/ - (void)handleDismissUnlimitedGroup:(int64_t)topicId; 开发者实现上面定义的几个回调函数之后,需要设置委托者的代理是谁。比如:_user.handleUnlimitedGroupDelegate = self,self指的是实现上述几个回调函数的当前类对象。 @end [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/0402-ios.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # C# · GitBook [C#](https://admin.mimc.chat.xiaomi.net/docs/) =============================================== 目录 -- * [C#应用配置修改](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#C#%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE%E4%BF%AE%E6%94%B9) * [用户初始化](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E7%94%A8%E6%88%B7%E5%88%9D%E5%A7%8B%E5%8C%96) * [安全认证](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81) * [登录](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E7%99%BB%E5%BD%95) * [发送单聊消息](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E5%8F%91%E9%80%81%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF) * [发送群聊消息](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E5%8F%91%E9%80%81%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF) * [无限大群](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [创建无限大群](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E5%88%9B%E5%BB%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [解散无限大群](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E8%A7%A3%E6%95%A3%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [加入无限大群](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E5%8A%A0%E5%85%A5%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [退出无限大群](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E9%80%80%E5%87%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [发送无限大群消息](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E5%8F%91%E9%80%81%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E6%B6%88%E6%81%AF) * [接收消息回调](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E6%8E%A5%E6%94%B6%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) * [登出](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E7%99%BB%E5%87%BA) * [销毁](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E9%94%80%E6%AF%81) * [示例代码](https://github.com/Xiaomi-mimc/mimc-csharp-sdk/tree/master/demo) * [更新日志](https://github.com/Xiaomi-mimc/mimc-csharp-sdk/UPDATE.md) C#应用配置修改 -------- 1、可先下载demo,并更新demo项目依赖,建议采用最新版本,然后运行demo; 2、在项目中添加sdk目录中最新的dll包:mimc-csharp-sdk.dll,您可以直接添加本地dll,或者通过Nuget安装; 3、项目采用Visual Studio 2017开发,已开放源码; 4、日志采用log4net组件,项目中已经做了简单配置,可以按照需要自行修改; 5、目前因为语法问题,C#SDK 代码存在两个大版本NET Framework2.0/3.5 和NET Framework4.5/NET Core 2.0/NET Standard 2.0以上两个版本,demo亦是; 用户初始化 ----- /// 默认支持多设备登录 /// 用户在APP账号系统内的唯一账号ID /// 用户在APP账号系统内的唯一账号ID /// 自定义用户缓存目录,用于存放resource信息,如果不设置,默认放在项目运行目录 User user = new User(string appAccount); User user = new User(string appAccount,string path); 安全认证 ---- #### 参考 [安全认证](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html) user.RegisterTokenFetcher(IMIMCTokenFetcher fetcher); 实现接口: interface IMIMCTokenFetcher { /// /// FetchToken()访问APP应用方自行实现的AppProxyService服务, /// 该服务实现以下功能: ///1. 存储appId/appKey/appSecret(appKey/appSecret不可存储在APP客户端,以防泄漏) ///2. 用户在APP系统内的合法鉴权 ///3. 调用小米TokenService服务,将小米TokenService服务返回结果通过fetchToken()返回 /// /// 小米TokenService服务下发的原始数据 /// MIMCUser如果采用Login()方式登录 则必须实现该接口 string FetchToken(); /// MIMCUser如果采用LoginAsync()方式登录 则必须实现该接口 Task FetchTokenAsync(); } 登录 -- /** * @note: 用户登录接口,除在APP初始化时调用,APP从后台切换到前台时也建议调用一次 */ user.Login(); user.LoginAsync(); 发送单聊消息 ------ /// /// 发送单聊消息 /// /// 消息接收者在APP账号系统内的唯一账号ID /// 开发者自定义消息体,二级制数组格式 /// 是否保存历史记录,true:保存,false:不存 /// packetId客户端生成的消息ID String packetId = user.SendMessage(string toAppAccount, byte[] msg) String packetId = user.SendMessageAsync(string toAppAccount, byte[] msg) String packetId = user.SendMessage(string toAppAccount, byte[] msg, bool isStore) String packetId = user.SendMessageAsync(string toAppAccount, byte[] msg, bool isStore) 发送群聊消息 ------ /// /// 发送群聊消息 /// /// 群ID /// 开发者自定义消息体,二级制数组格式 /// 是否保存历史记录,true:保存,false:不存 /// packetId客户端生成的消息ID String packetId = user.SendGroupMessage(long topicId, byte[] msg) String packetId = user.SendGroupMessageAsync(long topicId, byte[] msg) String packetId = user.SendGroupMessage(long topicId, byte[] msg, bool isStore) String packetId = user.SendGroupMessageAsync(long topicId, byte[] msg, bool isStore) 无限大群 ---- #### 创建无限大群 /// /// 创建无限大群 /// /// public string CreateUnlimitedGroup(String topicName) #### 解散无限大群 /// /// 解散无限大群 /// /// /// public bool DismissUnlimitedGroup(long topicId) #### 加入无限大群 /// /// 加入无限大群 /// /// /// public string JoinUnlimitedGroup(long topicId) #### 退出无限大群 /// /// 离开无限大群 /// /// /// public string QuitUnlimitedGroup(long topicId) #### 发送无限大群消息 /// /// 发送无限大群消息 /// /// 群ID /// 开发者自定义消息体,二级制数组格式 /// public string SendUnlimitedGroupMessage(long topicId, byte[] msg) 接收消息回调 ------ ///添加事件,注册事件,实现回调方法 //发送单聊消息回调 user.MessageEvent += HandleMessage; //发送单聊消息超时回调 user.MessageTimeOutEvent += HandleMessageTimeout; //发送群聊消息回调 user.GroupMessageEvent += HandleGroupMessage; //发送群聊消息超时回调 user.GroupMessageTimeoutEvent += HandleGroupMessageTimeout; //ServerACK回调 user.ServerACKEvent += HandleServerACK; //发送无限大群消息回调 user.unlimitedGroupMessageEvent += HandleUnlimitedGroupMessage; //发送无限大群消息超时回调 user.unlimitedGroupMessageTimeoutEvent += HandleUnlimitedGroupMessageTimeout; //加入无限大群回调 user.joinUnlimitedGroupEvent += HandleJoinUnlimitedGroup; //退出无限大群回调 user.quitUnlimitedGroupEvent += HandleQuitUnlimitedGroup; //解散无限大群回调 user.dismissUnlimitedGroupEvent += HandleDismissUnlimitedGroup; void HandleMessageTimeout(object source, SendMessageTimeoutEventArgs e) void HandleGroupMessage(object source, GroupMessageEventArgs e) void HandleGroupMessageTimeout(object source, SendGroupMessageTimeoutEventArgs e) void HandleServerACK(object source, ServerACKEventArgs e) void HandleUnlimitedGroupMessage(UCPacket ucPacket) void HandleJoinUnlimitedGroup(UCPacket ucPacket) void HandleQuitUnlimitedGroup(UCPacket ucPacket) void HandleDismissUnlimitedGroup(UCPacket ucPacket) void HandleSendUnlimitedGroupMessageTimeout(UCPacket message) 登出 -- user.Logout(); user.LogoutAsync(); 销毁 -- user.Destroy(); [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/0405-csharp.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # Go · GitBook [Go](https://admin.mimc.chat.xiaomi.net/docs/) =============================================== 目录 -- * [如何引入](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%A6%82%E4%BD%95%E5%BC%95%E5%85%A5) > * [下载源码](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E4%B8%8B%E8%BD%BD%E6%BA%90%E7%A0%81) > > * [下载依赖库](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E4%B8%8B%E8%BD%BD%E4%BE%9D%E8%B5%96%E5%BA%93) > > * [引入包](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%BC%95%E5%85%A5%E5%8C%85) > * [用户创建及初始化](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E7%94%A8%E6%88%B7%E5%88%9B%E5%BB%BA%E5%8F%8A%E5%88%9D%E5%A7%8B%E5%8C%96) > * [创建用户](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7) > > * [安全认证](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81) > > * [用户在线状态回调](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E7%94%A8%E6%88%B7%E5%9C%A8%E7%BA%BF%E7%8A%B6%E6%80%81%E5%9B%9E%E8%B0%83) > > * [初始化](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%88%9D%E5%A7%8B%E5%8C%96) > * [登录](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E7%99%BB%E5%BD%95) * [发送单聊消息](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%8F%91%E9%80%81%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF) * [发送群聊消息](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%8F%91%E9%80%81%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF) * [接收消息](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E6%8E%A5%E6%94%B6%E6%B6%88%E6%81%AF) > * [单聊消息回调](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) > > * [群聊消息回调](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E5%9B%9E%E8%B0%83) > > * [单聊消息超时回调](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF%E8%B6%85%E6%97%B6%E5%9B%9E%E8%B0%83) > > * [群聊消息超时回调](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF%E8%B6%85%E6%97%B6%E5%9B%9E%E8%B0%83) > > * [消息送达服务器响应回调](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E6%B6%88%E6%81%AF%E9%80%81%E8%BE%BE%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%93%8D%E5%BA%94%E5%9B%9E%E8%B0%83) > * [退出](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E9%80%80%E5%87%BA) * [示例代码](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81) 如何引入 ---- MIMC-Go-SDK的源码已经上传到github中,开发者可以下载至本地GOPATH下安装。 ### 下载源码 go get github.com/Xiaomi-mimc/mimc-go-sdk cd $GOPATH/src/github.com/Xiaomi-mimc/mimc-go-sdk go build go install > 注:go get会从github上fetch所有的分支/tag,默认分支为master分支。 下载依赖库 ----- MIMC-Go-SDK依赖proto buffer进行序列化与反序列化数据,在使用时,确保已经install了proto buffer。如未安装,可参考如下进行安装操作。 go get github.com/golang/protobuf/proto // 进入下载目录 cd $GOPATH/src/github.com/golang/protobuf/proto // 编译安装 go build go install 引入包 --- 在使用MIMC-Go-SDK时,仅需引入一个包即可。 // 引入包路径, 该路径下引入了mimc包 import "github.com/Xiaomi-mimc/mimc-go-sdk" 用户创建及初始化 -------- 用户登录前需要:创建用户->安全认证->用户在线状态回调->接收消息回调->初始化。 ### 创建用户 默认支持多设备登录 import "github.com/XiaoMi-mimc/mimc-go-sdk" var appAccount string = "leijun" mcUser := mimc.NewUser(appAccount) ### 安全认证 参考[安全认证](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html) 文档实现: /** * 同步访问代理认证服务(appProxyService), * 从代理认证服务返回结果中解析[小米认证服务下发的原始数据]并返回 **/ type Token interface { FetchToken() *string } 实现该接口后,通过MCUser.registerTokenDelegate(tokenDeleget Token)方法实现**token回调**的注册, Token接口实现示例如下: type TokenHandler struct { httpUrl string AppId int64 `json:"appId"` AppKey string `json:"appKey"` AppSecret string `json:"appSecret"` AppAccount string `json:"appAccount"` } /** * 当前示例代码直接访问小米认证服务(TokenService) * 实际生产环境上,应该访问代理认证服务(appProxyService) **/ func (this *TokenHandler) FetchToken() *string { jsonBytes, err := json.Marshal(*this) if err != nil { return nil } requestJsonBody := bytes.NewBuffer(jsonBytes).String() request, err := http.Post(this.httpUrl, "application/json", strings.NewReader(requestJsonBody)) if err != nil { return nil } defer request.Body.Close() body, err := ioutil.ReadAll(request.Body) if err != nil { return nil } token := string(body) return &token } #### 用户在线状态回调 用户状态发生改变时,SDK通过**用户在线状态回调**来通知开发者进行处理,接口如下: type StatusDelegate interface { /** * @param[isOnline bool] true: 在线,false:离线 * @param[errType *string] 登录失败类型 * @param[errReason *string] 登录失败原因 * @param[errDescription *string] 登录失败原因描述 */ HandleChange(isOnline bool, errType, errReason, errDescription *string) } 开发者在该接口中实现用户状态变化的业务逻辑,通过MCUser.registerStatusDelegate(statusDelegate StatusDelegate)方法实现**用户在线状态回调**的注册。 **StatusDelegate**接口实现示例如下: type StatusHandler struct { } func (this StatusHandler) HandleChange(isOnline bool, errType, errReason, errDescription *string) { if isOnline { logger.Info("status changed: online.") // to do something for online. } else { logger.Info("status changed: offline.") // to do something for offline. } } ### 初始化 MCUser初始化以及启动读、写协程。 mcUser.InitAndSetup() 至此,用户就可以进行登录操作了。 登录 -- mcUser.Login() 发送单聊消息 ------ 发送单聊消息的接口如下: /** * @param[toAppAccount string] 接收者 * @param[msgByte []byte] 开发者自定义消息体 * @return 客户端生成的数据包Id **/ func (this *MCUser) SendMessage(toAppAccount string, msgByte []byte) string 发送单聊消息示例如下: packetId := mcUser.SendMessage("MiFen", []byte("Are you OK?")) 发送群聊消息 ------ 发送群聊消息的接口如下: /** * @param[topicId *int64] 群Id * @param[msgByte []byte] 开发者自定义消息体 * @return 客户端生成的数据包Id **/ func (this *MCUser) SendGroupMessage(topicId *int64, msgByte []byte) string 发送群聊消息示例如下: groupId := int64(123456789) packetId := mcUser.SendMessage(&groupid, []byte("Are you OK?")) 接收消息 ---- ### 接口概览 当MIMC-Go-SDK收到消息时,会通过**消息回调**来执行开发者的业务逻辑,主要包括5种回调: > 1) 单聊消息回调 2) 群聊消息回调 3) 单聊消息超时回调 4) 群聊消息超时回调 5) 消息送达服务器响应回调 消息回调的接口如下: type MessageHandlerDelegate interface { HandleMessage(packets *list.List) HandleGroupMessage(packets *list.List) HandleServerAck(packetId *string, sequence, timestamp *int64) HandleSendMessageTimeout(message *msg.P2PMessage) HandleSendGroupMessageTimeout(message *msg.P2TMessage) } 在处理“接收单聊/群聊消息”、“单聊/群聊消息超时”以及“消息送达服务器”的业务逻辑时,开发者通过实现MessageHandlerDelegate接口的方法,并通过MCUser.RegisterMessageDelegate(msgDelegate MessageHandlerDelegate)方法实现**接收消息回调**的注册。 ### 单聊消息回调 单聊消息回调的HandleMessage方法实现示例如下: type MsgHandler struct { } func (this MsgHandler) HandleMessage(packets *list.List) { for ele := packets.Front(); ele != nil; ele = ele.Next() { p2pmsg := ele.Value.(*msg.P2PMessage) logger.Info("[handle p2p msg]%v -> %v, pcktId: %v, timestamp: %v.", *(p2pmsg.FromAccount()), string(p2pmsg.Payload()), *(p2pmsg.PacketId()), *(p2pmsg.Timestamp())) } } > 注:HandleMessage方法中参数packets是P2PMessage的集合。 P2PMessage的结构如下: type P2PMessage struct { packetId *string 数据包Id sequence *int64 消息序列号 timestamp *int64 时间戳 fromAccount *string 发送者账号 toAccount *string 接收者账号 payload []byte 消息体 } ### 群聊消息回调 群聊消息回调的HandleGroupMessage方法实现示例如下: type MsgHandler struct { } func (this MsgHandler) HandleGroupMessage(packets *list.List) { for ele := packets.Front(); ele != nil; ele = ele.Next() { p2tmsg := ele.Value.(*msg.P2TMessage) logger.Info("[handle p2t msg]%v -> %v, pcktId: %v, timestamp: %v.", *(p2tmsg.FromAccount()), string(p2tmsg.Payload()), *(p2tmsg.PacketId()), *(p2tmsg.Timestamp())) } } > 注:HandleGroupMessage方法中参数packets是P2TMessage的集合。 P2TMessage的结构如下: type P2TMessage struct { packetId *string 数据包Id sequence *int64 消息序列号 timestamp *int64 时间戳 fromAccount *string 发送者账号 groupId *int64 群Id payload []byte 消息体 } ### 单聊消息超时回调 单聊消息超时回调的HandleSendMessageTimeout方法的实现示例如下: type MsgHandler struct { } func (this MsgHandler) HandleSendMessageTimeout(message *msg.P2PMessage) { logger.Info("[handle p2pmsg timeout] packetId:%v, msg:%v, time: %v.", *(message.PacketId()), string(message.Payload()), time.Now()) } ### 群聊消息超时回调 群聊消息超时回调的HandleSendGroupMessageTimeout方法的实现示例如下: type MsgHandler struct { } func (this MsgHandler) HandleSendGroupMessageTimeout(message *msg.P2TMessage) { logger.Info("[handle p2tmsg timeout] packetId:%v, msg:%v.", *(message.PacketId()), string(message.Payload())) } ### 消息送达服务器响应回调 消息送达服务器响应回调HandleServerAck方法实现示例如下: type MsgHandler struct { } func (this MsgHandler) HandleServerAck(packetId *string, sequence, timestamp *int64) { logger.Info("[handle server ack] packetId:%v, timestamp:%v.", *packetId, *timestamp) } > 注:超时回调,保证消息比丢失;消息送达服务器时,服务会响应Ack,SDK收到Ack响应才说明消息送达。 退出 -- mcUser.Logout() 示例代码 ---- 在MIMC-Go-SDK中提供了一个demo,实现两个用户收发消息,该Demo实现可分为以下几步: > 1) 实现Token接口 > > 2) 实现StatusDelegate接口 > > 3) 实现MessageHandlerDelegate接口 > > 4) 创建回调接口实现类以及用户 > > 5) 登录、收发消息、退出 demo在MIMC-Go-SDK中的目录如下: |-$GOPATH |-bin |-pkg |-src |-github.com |-Xiaomi-mimc |-mimc-go-sdk |-demo |-handler |-TokenHandler.go |-StatusHandler.go |-MsgHandler.go |-MCDemo.go ### 实现Token接口 TokenHandler.go中定义了实现Token接口的struct:**TokenHandler**。该文件在$GOPATH/src/github.com/Xiaomi-mimc/mimc-go-sdk/demo/handler目录。 ### 实现StatusDelegate接口 StatusHandler.go中定义了实现StatusDelegate接口的struct:**StatusHandler**。该文件在$GOPATH/src/github.com/Xiaomi-mimc/mimc-go-sdk/demo/handler ### 实现MessageHandlerDelegate接口 MsgHandler.go中定义了实现MessageDelegate接口的struct:**MsgHandler**。该文件在$GOPATH/src/github.com/Xiaomi-mimc/mimc-go-sdk/demo/handler目录 ### 创建回调接口实现类以及用户 // 创建三个回调接口的实现类 func createDelegates(appAccount *string) (*handler.StatusHandler, *handler.TokenHandler, *handler.MsgHandler) { return handler.NewStatusHandler(), handler.NewTokenHandler(&httpUrl, &apppKey, &appSecurt, appAccount, &appId), handler.NewMsgHandler() } // 创建用户 func createUser(appAccount *string) *mimc.MCUser { mcUser := mimc.NewUser(*appAccount) // 创建Token接口,StatusDelegate接口,MessageDelegate接口的实现类 statusDelegate, tokenDelegate, msgDelegate := createDelegates(appAccount) // 将三个实现类注册给用户,并启动用户内部读写协程 mcUser.StatusDelegate(statusDelegate).TokenDelegate(tokenDelegate).MsgDelegate(msgDelegate).InitAndSetup() return mcUser } ### MIMC-GO-SDK日志设置 import "github.com/Xiaomi-mimc/mimc-go-sdk/util/log" func init() { // SET LOG LEVEL log.SetLogLevel(log.InfoLevel) // SET GO-SDK LOG PATH log.SetLogPath("./mimc_demo.log") } ### 登录、收发消息、退出 // 创建用户 leijun := createUser(&appAccount1) mifen := createUser(&appAccount2) // 用户登录 leijun.Login() mifen.Login() mimc.Sleep(3000) // 互发消息 leijun.SendMessage(appAccount2, []byte("Are you OK?")) mifen.SendMessage(appAccount1, []byte("I am Fine. Thanks!")) mimc.Sleep(15000) // 用户退出 leijun.Logout() mifen.Logout() mimc.Sleep(3000) [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/0407-go.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 消息推送 · GitBook [消息推送](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= 目录 -- * [参数列表](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8) * [推送单聊信息](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E6%8E%A8%E9%80%81%E5%8D%95%E8%81%8A%E4%BF%A1%E6%81%AF) * [批量推送单聊信息](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E6%89%B9%E9%87%8F%E6%8E%A8%E9%80%81%E5%8D%95%E8%81%8A%E4%BF%A1%E6%81%AF) * [推送群聊信息](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E6%8E%A8%E9%80%81%E7%BE%A4%E8%81%8A%E4%BF%A1%E6%81%AF) * [批量推送群聊信息](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E6%89%B9%E9%87%8F%E6%8E%A8%E9%80%81%E7%BE%A4%E8%81%8A%E4%BF%A1%E6%81%AF) * [单条推送无限群聊消息](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E5%8D%95%E6%9D%A1%E6%8E%A8%E9%80%81%E6%97%A0%E9%99%90%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF) * [批量推送无限群聊消息](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E6%89%B9%E9%87%8F%E6%8E%A8%E9%80%81%E6%97%A0%E9%99%90%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF) * [多群推送单条消息](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E5%A4%9A%E7%BE%A4%E6%8E%A8%E9%80%81%E5%8D%95%E6%9D%A1%E6%B6%88%E6%81%AF) 推送消息 ---- #### 推送api接口限流 为保证服务公平性和可用性,对服务开放的接口进行限流。限流策略如下: | 消息类型 | 上限 | | --- | --- | | 单聊消息 | 50 人·消息/秒 | | 普通聊消息 | 20 群·消息/秒 | | 无限群聊消息 | 50 群·消息/秒 | #### 参数列表 | Variable | Meanings | | --- | --- | | $appId | 小米开放平台申请的AppId | | $appKey | 小米开放平台申请的AppKey | | $appSecret | 小米开放平台申请的AppSecret | | $fromAccount | 表示消息发送方在APP账号系统内唯一ID | | $fromResource | 表示消息发送方设备的标识 | | $toAccount | 表示消息接收方在APP账号系统内唯一ID | | $toAccounts | 表示消息接收方在APP账号系统内唯一ID集合($toAccounts是一个List类型的数据集合,例如\[$account1,$account2\]) | | $msgType | 表示发送消息的类型
msgType="base64": msg是base64编码后的数据,一般传输二进制数据时使用;
msgType="": msg是原始数据,一般传输String数据时使用 | | $isStore | 表示消息是否存储在mimc服务器,true存储,false不存储,默认不存储 | | $topicId | 表示群ID | | $topicIds | 表示群ID集合($topicIds是一个List类型的数据集合,例如\[$topicId1,$topicId2\]) | | $packetId | 表示发送消息包ID,由"随机串-数字"构成,在单个appAccount角度看可认为唯一 | | $bizType | 开发者定义消息类型,默认为空字符串 | #### 推送单聊信息 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/push/p2p/ -XPOST -d '{"appId":$appId, "appKey":$appKey,"appSecret":$appSecret, "fromAccount":$fromAccount, "fromResource":$fromResource, "toAccount":$toAccount, "msg":$msg, "msgType":$msgType, "isStore":$isStore, "bizType":$bizType}' -H "Content-Type: application/json" * JSON结果 { "code":200, "data":{"packetId":$packetId}, "message":"success" } #### 批量推送单聊信息 此功能目的是针对多个用户推送同一条消息。 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/push/p2p/more -XPOST -d '{"appId":$appId, "appKey":$appKey,"appSecret":$appSecret, "fromAccount":$fromAccount, "fromResource":$fromResource, "toAccounts":$toAccounts, "msg":$msg, "msgType":$msgType, "isStore":$isStore, "bizType":$bizType}' -H "Content-Type: application/json" ##### 其中的$toAccounts变量格式为\[$toAccount1,$toAccount2,...\],每一个用户名之间用逗号隔开。 * JSON结果 { "code":200, "data":{ "packetId":$packetId }, "message":"success" } > > 一次推送仅返回一个packetId,之前版本为一个接收者,返回一个packetId。 #### 推送群聊信息 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/push/p2t/ -XPOST -d '{"appId":$appId, "appKey":$appKey,"appSecret":$appSecret, "fromAccount":$fromAccount, "fromResource":$fromResource, "msg":$msg, "topicId":$topicId, "msgType":$msgType, "isStore":$isStore, "bizType":$bizType}' -H "Content-Type: application/json" * JSON结果 { "code":200, "data":{"packetId":$packetId}, "message":"success" } #### 批量推送群聊信息 此功能目的是针对多个群组推送同一条消息。 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/push/p2t/more -XPOST -d '{"appId":$appId, "appKey":$appKey,"appSecret":$appSecret, "fromAccount":$fromAccount, "fromResource":$fromResource, "topicIds":$topicIds, "msg":$msg, "msgType":$msgType, "isStore":$isStore, "bizType":$bizType}' -H "Content-Type: application/json" ##### 其中的$topicIds变量格式为\[$topicId1,$topicId2,...\],每一个群ID之间用逗号隔开。 * JSON结果 { "code":200, "data":{ "packetId":$packetId }, "message":"success" } > > 之前返回packetIds集合,经过优化后,一次推送仅返回一个packetId。 #### 单条推送无限群聊消息 向App的某个无限群聊推送一条消息。 * HTTP 请求 curl https://mimc.chat.xiaomi.net/api/push/ucs/singleMsgPush -XPOST -H "Content-Type: application/json" -d '{"appId":$appId, "appKey":$appKey, "appSecret":$appSecret, "fromAccount":$fromAccount, "topicId":$topicId, "fromResource":$fromResource, "message":$message, "isStore":$isStore, "msgType":$msgType, "bizType":$bizType}' * JSON结果 { "code": 200, "message": "success", "data": { "packetId": $packetId } } #### 批量推送无限群聊消息 向App的某个无限群推送多条消息。 * HTTP请求 curl https://mimc.chat.xiaomi.net/api/push/ucs/multiMsgPush -XPOST -H "Content-Type: application/json" -d '{"appId":$appId, "appKey":$appKey, "appSecret":$appSecret, "fromAccount":$fromAccount, "topicId":$topicId, "fromResource":$fromResource, "messages":$messages, "isStore":$isStore, "msgType":$msgType, "bizType":$bizType}' > > 其中的$messages变量格式为\[$message1,$message2,...\],每一条消息之间用逗号隔开。 * JSON结果 { "code": 200, "message": "success", "data": { "packetIds": [$packetId] } } > > 这里优化后,将多条消息合并为单条发送,因此只有一个packetId。packetIds为集合,是为了以后N条消息,分为M条发送,目前多条消息,以单条形式发送。 #### 多群推送单条消息 向App的一些无线群推送单条消息 * HTTP请求 curl https://mimc.chat.xiaomi.net/api/push/ucs/multiTopicPush -XPOST -H "Content-Type: application/json" -d '{"appId":$appId, "appKey":$appKey, "appSecret":$appSecret, "fromAccount":$fromAccount, "topicIds":$topicIds, "fromResource":$fromResource, "message":$message, "isStore":$isStore, "msgType":$msgType, "bizType":$bizType}' > > 其中的$topicIds变量格式为\[$topic1,$topic2,...\],每一条消息之间用逗号隔开。 * JSON结果 { "code": 200, "message": "success", "data": { "succPacketIds": [$packetId1, $packetId2, ...], "failTopicIds": [$topicId1, $topicId2] } } [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/08-push.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # Android Java · GitBook [Android Java](https://admin.mimc.chat.xiaomi.net/docs/) ========================================================= 目录 -- * [适用平台](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E9%80%82%E7%94%A8%E5%B9%B3%E5%8F%B0) * [添加依赖包](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E6%B7%BB%E5%8A%A0%E4%BE%9D%E8%B5%96%E5%8C%85) * [安卓配置](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%AE%89%E5%8D%93%E9%85%8D%E7%BD%AE) * [日志](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E6%97%A5%E5%BF%97) * [打印到控制台](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E6%89%93%E5%8D%B0%E5%88%B0%E6%8E%A7%E5%88%B6%E5%8F%B0) * [写到本地文件](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%86%99%E5%88%B0%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6) * [用户登录](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95) * [用户初始化](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E7%94%A8%E6%88%B7%E5%88%9D%E5%A7%8B%E5%8C%96) * [安全认证](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%AE%89%E5%85%A8%E8%AE%A4%E8%AF%81) * [登录](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E7%99%BB%E5%BD%95) * [单点登录](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95) * [在线状态变化回调](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%9C%A8%E7%BA%BF%E7%8A%B6%E6%80%81%E5%8F%98%E5%8C%96%E5%9B%9E%E8%B0%83) * [登出](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E7%99%BB%E5%87%BA) * [销毁](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E9%94%80%E6%AF%81) * [发送消息](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF) * [发送单聊消息](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%8F%91%E9%80%81%E5%8D%95%E8%81%8A%E6%B6%88%E6%81%AF) * [发送群聊消息](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%8F%91%E9%80%81%E7%BE%A4%E8%81%8A%E6%B6%88%E6%81%AF) * [发送无限大群消息](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%8F%91%E9%80%81%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E6%B6%88%E6%81%AF) * [发送在线消息](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%8F%91%E9%80%81%E5%9C%A8%E7%BA%BF%E6%B6%88%E6%81%AF) * [接收消息](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E6%8E%A5%E6%94%B6%E6%B6%88%E6%81%AF) * [无限大群](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [创建无限大群](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%88%9B%E5%BB%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [加入无限大群](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E5%8A%A0%E5%85%A5%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [退出无限大群](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E9%80%80%E5%87%BA%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [解散无限大群](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E8%A7%A3%E6%95%A3%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4) * [无限大群回调](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E6%97%A0%E9%99%90%E5%A4%A7%E7%BE%A4%E5%9B%9E%E8%B0%83) * [示例代码](https://github.com/Xiaomi-mimc/mimc-android-java-sdk) 适用平台 ---- 适用于任何Java平台,包括但不限于安卓/Java服务器/Java桌面等 添加依赖包 ----- 在项目中添加sdk目录中最新的jar包: 即时消息:mimc-java-sdk-0.0.19-SNAPSHOT.jar 含实实时流:mimc-java-sdk-0.0.19-SNAPSHOT.jar + librts.so + libxmdtransceiver.so 安卓配置 ---- // 权限 日志 -- #### 打印到控制台 // 默认控制台不打印日志,若需要打印到控制台,实现如下接口: MIMCLog.setLogger(new Logger() { @Override public void d(String tag, String msg) { } @Override public void d(String tag, String msg, Throwable th) { } @Override public void i(String tag, String msg) { } @Override public void i(String tag, String msg, Throwable th) { } @Override public void w(String tag, String msg) { } @Override public void w(String tag, String msg, Throwable th) { } @Override public void e(String tag, String msg) { } @Override public void e(String tag, String msg, Throwable th) { } }); /** * 设置控制台打印日志级别,默认INFO级别 * @param[level]: * MIMCLog.DEBUG * MIMCLog.INFO(默认) * MIMCLog.WARN * MIMCLog.ERROR * MIMCLog.NONE(不启用) */ MIMCLog.setLogPrintLevel(int level); /** * 获取堆栈异常信息 */ MIMCLog.getStackTraceString(Throwable th); #### 写到本地文件 /** * 是否启用本地写日志文件功能,默认启用,INFO级别,日志文件所在位置是在调用MIMCUser.newInstance()时,传入的cachePath处 * @param[level]: * MIMCLog.DEBUG * MIMCLog.INFO(默认) * MIMCLog.WARN * MIMCLog.ERROR * MIMCLog.NONE(不启用) */ MIMCLog.setLogSaveLevel(int level); 用户登录 ---- #### 用户初始化 /** * @param[appId]: 应用ID,小米开放平台申请分配 * @param[appAccount]: 用户在APP账号系统内的唯一账号ID * @param[resource]: 用户设备的标识 * 如不指定resource,SDK自动生成并支持多设备登录 * 如开发者指定resource,则需支持多设备登录: * 同一台设备,resource要保持不变 * 不同设备,resource要相互不同 * @param[logCachePath]: 必须传入合法的路径,用于缓存日志信息 * @param[tokenCachePath]: 必须传入合法的路径,用于缓存token信息 */ User user = MIMCUser.newInstance(long appId, String appAccount, String logCachePath, String tokenCachePath); User user = MIMCUser.newInstance(long appId, String appAccount, String resource, String logCachePath, String tokenCachePath); user.registerTokenFetcher(MIMCTokenFetcher tokenFetcher); user.registerOnlineStatusListener(MIMCOnlineStatusListener onlineStatusListener); user.registerMessageHandler(MIMCMessageHandler messageHandler); //user.registerUnlimitedGroupHandler(MIMCUnlimitedGroupHandler unlimitedGroupHandler); // 无限大群回调注册 #### 安全认证 参考 [安全认证](https://admin.mimc.chat.xiaomi.net/docs/03-auth.html) interface MIMCTokenFetcher{ /** * 同步访问代理认证服务(appProxyService) * 从代理认证服务返回结果中获取[小米认证服务下发的原始数据]并返回 */ public String fetchToken(); } #### 登录 /** * 进程整个生命周期内login()调用一次即可 */ user.login(); #### 单点登录 /** * @param[enableSSO]: 默认false,ture时打开启用标志,且实例化User对象时,传入相同resource时方可正式生效 * 注意: * 必须在调用login()之前调用 * 当用户登录时,先前登录用户会收到下线回调,回调参数type = reason = desc = "single-resource-kick" */ user.enableSSO(boolean enableSSO); #### 在线状态变化回调 interface MIMCOnlineStatusHandler { /** * @param[status]: 登录状态,ONLINE 在线,OFFLINE 离线 * @param[type]: 状态变化类型 * @param[reason]: 状态变化原因 * @param[desc]: 状态变化描述信息 */ public void statusChange(MIMCConstant.OnlineStatus status, String type, String reason, String desc); } #### 登出 user.logout(); #### 销毁 /** * 切换用户时,将老用户destroy掉,然后为新用户newInstance()创建实例 */ user.destroy(); 发送消息 ---- #### 发送单聊消息 /** * @param[toAppAccount]: 消息接收方在APP账号系统内的唯一账号ID * @param[payload]: 开发者自定义消息体,最大不超过15KB * @param[isStore]: 消息是否存储在mimc服务端,true 存储, false 不存储, 默认存储 * @param[bizType]: 消息类型,默认空字符串 * @param[isConversation]: 是否发送会话消息,默认false * @return 客户端生成的消息ID,返回null说明消息未进入发送队列 */ String packetId = user.sendMessage(String toAppAccount, byte[] payload); String packetId = user.sendMessage(String toAppAccount, byte[] payload, boolean isStore); String packetId = user.sendMessage(String toAppAccount, byte[] payload, boolean isStore, boolean isConversation); String packetId = user.sendMessage(String toAppAccount, byte[] payload, String bizType); String packetId = user.sendMessage(String toAppAccount, byte[] payload, String bizType, boolean isStore); String packetId = user.sendMessage(String toAppAccount, byte[] payload, String bizType, boolean isStore, boolean isConversation); #### 发送群聊消息 /** * @param[topicId]: 群ID * @param[payload]: 开发者自定义消息体,最大不超过15KB * @param[isStore]: 消息是否存储在mimc服务端,true 存储, false 不存储, 默认存储 * @param[bizType]: 消息类型,默认空字符串。 * @param[isConversation]: 是否发送会话消息,默认false * @return 客户端生成的消息ID,返回null说明消息未进入发送队列 */ String packetId = user.sendGroupMessage(long topicId, byte[] payload); String packetId = user.sendGroupMessage(long topicId, byte[] payload, boolean isStore); String packetId = user.sendGroupMessage(long topicId, byte[] payload, boolean isStore, boolean isConversation); String packetId = user.sendGroupMessage(long topicId, byte[] payload, String bizType); String packetId = user.sendGroupMessage(long topicId, byte[] payload, String bizType, boolean isStore); String packetId = user.sendGroupMessage(long topicId, byte[] payload, String bizType, boolean isStore, boolean isConversation); #### 发送无限大群消息 /** * @param[topicId]: 群ID * @param[payload]: 开发者自定义消息体,最大不超过15KB * @param[isStore]: 消息是否存储在mimc服务端,true 存储, false 不存储, 默认存储 * @param[bizType]: 消息类型,默认空字符串 * @return 客户端生成的消息ID */ String packetId = user.sendUnlimitedGroupMessage(long topicId, byte[] payload); String packetId = user.sendUnlimitedGroupMessage(long topicId, byte[] payload, boolean isStore); String packetId = user.sendUnlimitedGroupMessage(long topicId, byte[] payload, String bizType); String packetId = user.sendUnlimitedGroupMessage(long topicId, byte[] payload, String bizType, boolean isStore); #### 发送在线消息 /** * @param[toAppAccount]: 消息接收方在APP账号系统内的唯一账号ID * @param[payload]: 开发者自定义消息体,最大不超过15KB * @param[bizType]: 消息类型,默认空字符串 * @return 客户端生成的消息ID,返回null说明消息未进入发送队列 */ String packetId = user.sendOnlineMessage(String toAppAccount, byte[] payload); String packetId = user.sendOnlineMessage(String toAppAccount, byte[] payload, String bizType); 接收消息 ---- interface MIMCMessageHandler { /** * @param[MIMCMessage]: 单聊消息 * MIMCMessage.packetId: 消息ID * MIMCMessage.sequence: 服务器为消息分配的递增ID,可用于去重/排序 * MIMCMessage.timestamp: 发送时间戳 * MIMCMessage.fromAccount: 发送方账号 * MIMCMessage.fromResource: 发送方设备标识 * MIMCMessage.toAccount: 接收方账号 * MIMCMessage.toResource: 接收方设备标识 * MIMCMessage.payload: 消息体 * MIMCMessage.bizType: 消息类型 * MIMCMessage.convIndex: 会话索引,默认0值,说明没有启用会话消息,该字段由服务器填充,在一个会话中连续自增,从1开始 * @return 返回true说明消息被成功递交给应用层,若返回false说明消息递交失败,会再次触发该回调,直到返回true为止 */ public boolean handleMessage(List packets); /** * @param[MIMCGroupMessage]: 群聊消息 * MIMCGroupMessage.packetId: 消息ID * MIMCGroupMessage.sequence: 服务器为消息分配的递增ID,可用于去重/排序 * MIMCGroupMessage.timestamp: 发送时间戳 * MIMCGroupMessage.fromAccount: 发送方账号 * MIMCGroupMessage.fromResource: 发送方设备标识 * MIMCGroupMessage.topicId: 群ID * MIMCGroupMessage.payload: 消息体 * MIMCGroupMessage.bizType: 消息类型 * MIMCGroupMessage.convIndex: 会话索引,默认0值,说明没有启用会话消息,该字段由服务器填充,在一个会话中连续自增,从1开始 * @return 返回true说明消息被成功递交给应用层,若返回false说明消息递交失败,会再次触发该回调,直到返回true为止 */ public boolean handleGroupMessage(List packets); public boolean handleUnlimitedGroupMessage(List packets); /** * @param[serverAck]: 服务器返回的serverAck对象 * serverAck.packetId: 客户端生成的消息ID * serverAck.timestamp: 消息发送到服务器的时间(单位:ms) * serverAck.sequence: 服务器为消息分配的递增ID,可用于去重/排序 * serverAck.code: 服务器的返回码 * MSG_CHECK_ACCEPT返回100 * BLACKLIST_REFUSAL返回101 * MSG_CHECK_SENDER_NOT_IN_TOPIC返回102 * RUBBISH_MSG_REFUSAL返回103 * P2P_MESSAGE_EXCEED_MAX_QPS返回104 * TOPIC_BLACKLIST_REFUSAL返回105 * P2T_MESSAGE_EXCEED_MAX_QPS返回106 * TOPIC_ID_NOT_EXIST返回202 * NOT_IN_GROUP返回203 * MESSAGE_EXCEED_MAX_QPS返回204 * FORBID_SNED_UC_MESSAGE返回403 * serverAck.desc: 服务器返回的描述信息: * MSG_CHECK_ACCEPT:表示消息被服务端正常接收 * BLACKLIST_REFUSAL:表示发送者在黑名单中 * MSG_CHECK_SENDER_NOT_IN_TOPIC:表示发送者不在群列表中 * RUBBISH_MSG_REFUSAL:表示发送的消息中含有垃圾消息(目前垃圾消息功能没有开启) * P2P_MESSAGE_EXCEED_MAX_QPS:表示发送的消息超过qps限制 * TOPIC_BLACKLIST_REFUSAL:表示向群里发送消息的人被群禁言了 * P2T_MESSAGE_EXCEED_MAX_QPS字段:表示发送群聊的消息超过qps限制。 * TOPIC_ID_NOT_EXIST字段:表示群不存在。 * NOT_IN_GROUP字段:表示用户不在群内。 * MESSAGE_EXCEED_MAX_QPS:表示发送无限大群的消息超过qps限制。 * FORBID_SNED_UC_MESSAGE:群用户被禁言 * serverAck.convIndex: 会话索引,默认0值,说明没有启用会话消息,该字段由服务器填充,在一个会话中连续自增,从1开始 */ public void handleServerAck(MIMCServerAck serverAck); public void handleSendMessageTimeout(MIMCMessage message); public void handleSendGroupMessageTimeout(MIMCGroupMessage groupMessage); public void handleSendUnlimitedGroupMessageTimeout(MIMCGroupMessage groupMessage); /** * 通知主动拉取离线消息,拉取区间:(minSequence, maxSequence] * 默认情况,当用户处于离线状态时,最多保留近7天内的离线消息,直到用户上线,持续下发缓存的离线消息。 * 若积压的离线消息过多,会一直下发离线消息,从而导致长时间无法接收最新消息,直到离线消息接收完毕为止。 * 我们支持设置一个阈值来控制离线消息是否持续下发,比如阈值设置为offlineMsgMaxCount=500,表示当离线消息达到500条时,触发onPullNotification(...) * 回调,当回调接口返回true时,服务端会跳过离线消息,直接下发最新的实时消息,应用方可根据回调形参单独去拉取离线消息。 * 1)首先拉取会话列表; * 2)然后用会话列表中的"sequence"字段和回调接口的“minSequence”形参进行比对,当sequence > minSequence时,说明需要拉取该会话的历史消息; * 3)最后拉取历史消息,其中"fromAccount"字段从会话列表中提取即可。 * 会话列表:https://admin.mimc.chat.xiaomi.net/docs/13-chatlist.html * 历史消息:https://admin.mimc.chat.xiaomi.net/docs/11-history.html */ boolean onPullNotification(long minSequence, long maxSequence); void handleOnlineMessage(MIMCMessage onlineMessage); /** * @param[onlineMessageAck]: 服务器返回的onlineMessageAck对象,即发送在线消息对应的反馈信息 * onlineMessageAck.packetId: 客户端生成的消息ID * onlineMessageAck.code: 服务器的返回码 * OFFLINE返回0 * RECEIVED返回1 * TIMEOUT返回2 * onlineMessageAck.desc: 服务器返回的描述信息: * OFFLINE字段:接收方离线 * RECEIVED字段:接收方成功接收 * TIMEOUT字段:发送超时,默认10s */ void handleOnlineMessageAck(MIMCOnlineMessageAck onlineMessageAck); } 无限大群 ---- #### 创建无限大群 /** * @param[topicName]: 群名 * @param[context]: 用户自定义传入的对象,通过回调函数原样传出 */ user.createUnlimitedGroup(String topicName, Object context); #### 加入无限大群 /** * @param[topicId]: 群ID * @param[context]: 用户自定义传入的对象,通过回调函数原样传出 * @return 客户端生成的消息ID */ String packetId = user.joinUnlimitedGroup(long topicId, Object context); #### 退出无限大群 /** * @param[topicId]: 群ID * @param[context]: 用户自定义传入的对象,通过回调函数原样传出 * @return 客户端生成的消息ID */ String packetId = user.quitUnlimitedGroup(long topicId, Object context); #### 解散无限大群 /** * @param[topicId]: 群ID * @param[context]: 用户自定义传入的对象,通过回调函数原样传出 */ user.dismissUnlimitedGroup(long topicId, Object context); #### 无限大群回调 interface MIMCUnlimitedGroupHandler { /** * @param[topicId]: 群ID * @param[topicName]: 群名 * @param[code]: 0成功,非0失败 * @param[desc]: 描述信息 * @param[context]: 用户自定义传入的对象 */ void handleCreateUnlimitedGroup(long topicId, String topicName, int code, String desc, Object context); /** * @param[topicId]: 群ID * @param[code]: 0成功,非0失败 * @param[desc]: 描述信息 * @param[context]: 用户自定义传入的对象 */ void handleJoinUnlimitedGroup(long topicId, int code, String desc, Object context); /** * @param[topicId]: 群ID * @param[code]: 0成功,非0失败 * @param[desc]: 描述信息 * @param[context]: 用户自定义传入的对象 */ void handleQuitUnlimitedGroup(long topicId, int code, String desc, Object context); /** * 解散无限大群回调 * @param[topicId]: 群ID * @param[code]: 0成功,非0失败 * @param[desc]: 描述信息 * @param[context]: 用户自定义传入的对象 */ void handleDismissUnlimitedGroup(long topicId, int code, String desc, Object context); /** * 通知无限大群成员群解散回调 * @param[topicId]: 群ID */ void handleDismissUnlimitedGroup(long topicId); } [回到顶部](https://admin.mimc.chat.xiaomi.net/docs/0408-android-java.html#%E7%9B%AE%E5%BD%95) results matching "" =================== No results matching "" ====================== --- # 更新日志 · GitBook [更新日志](https://admin.mimc.chat.xiaomi.net/docs/) ================================================= > 感谢大家一直以来对MIMC的支持,文档还有很多不足之处,我们在逐步优化、完善,希望大家能理解,如有问题及时加群联系。 > > * 2019-03-13:历史消息接口增加对消息扩展属性的V2接口; > * 2018-12-04:会话列表最后一条消息增加bizType显示; > * 2018-10-26:更新无限大群接口文档; results matching "" =================== No results matching "" ====================== ---