环信ONE SDK架构介绍

摘要

环信即时通讯SDK自2014年6月正式公布2.0版本号至今已走过一个年头。从主要的单聊功能,到群聊功能,再到聊天室的实现。SDK无论是功能。稳定性,还是易集成性都在一步一步的走向完好与稳定,感谢开发人员们给与提供的反馈与帮助。使我们的SDK迅速的在诸多方面得到提高与改进。


随着如今物联网的兴起,环信如今的SDK的架构相应对未来物联网平台还是略有不足,使我们不得不在今年年初就考虑到怎样去改善我们的架构,使之可以较easy的适配到各个主流平台和物联网平台。


如今的Android, IOS, SDK都是各自维护了自己逻辑,给2.0开发带来了非常多不便。同样的功能须要维护两份代码,同一个bug要在不同的平台修复两次,因为不同平台的实现。导致Android。IOS架构设计不统一,API不一致。再加上在不同的平台开发的project师之间因为不同的实现导致沟通问题诸多,这样导致的问题就是,不同平台的开发进度大多数情况下都不同样。

所以针对以上的问题,我们今年年初就计划我们SDK3.0的开发。我们称之为ONE SDK,主要的理念就是我们实现共同IM 内核。使代码可被不同的平台最大化的重用,可是设计和实现却是面临着巨大的挑战,怎样适配到不同的平台。怎样最大化的重用代码都是要面临的问题。


ONE SDK 架构设计

整体设计



ONE SDK的设计整体分为3层,平台层-Platfrom layer,适配层-Porting layer。核心层-Common layer.

平台层会依据各平台的不同。实现不同的接口。开放符合平台层的API给第三方开发人员。

适配层主要要适配到ONE SDK 核心层所须要的一些接口,起到承上启下的作用。

核心层主要提供IM 功能和业务逻辑,保证最大化的代码重用。

考虑到跨平台共享代码,我们ONE SDK主要是用C++这样的跨平台的语言来实现。

平台层

我们计划要支持的平台为Android,IOS,MAC OS,Windows,Windows phone, Linux。Embedded Linux, 还有较为广泛应用的物联网平台-IOT OS。

我们会针对不同平台提供给开发人员,和平台一致API规范。使各平台的开发人员无难度的集成SDK。比如我们会提供JAVA给Android,Objective-C 给IOS和MAC, C++ 给Linux, IOT平台。

适配层


适配层主要就是各平台须要实现核心层所须要的一些接口类比如,上图给出的线程模型。定时器模型。数据库模型。还有HTTP模型。


这些模型都是和平台相关的,比如有的平台提供sqllite的訪问,有的没有,有的线程模型和定时器模型都有自己的实现方式比如物联网IOT OS,所以实现了上述的模型。就能够使核心层能够工作,只是也可能会遇到一些问题,这都会在详细的实现中会详细的应对。但结构是清晰的。


事实上比如Android,Linux, IOS, Mac OS。Windows都是支持C++11。也就是说都是支持C++11所提供的线程模型,所以这几个操作系统的线程模型的实现应该是相同的,所以代码是能够共享的, 可是数据库Anroid NDK是不支持sqlite訪问,所以这部分Android有两种策略一个是集成sqlite源码,二是回调给JAVA层,前一种策略是代码逻辑清晰,但坏处就是添加了代码量。


还有就是HTTP模型,默认的android,iOS。Mac OS,windows都有自己的API提供。所以ONE SDK策略就是假设有平台有原生的HTTP API 支持我们就会尽量用平台的,可是类似linux,就须要第三方库的支持比如libcurl.

所以综上所述适配层的意义重大,保证我们ONE SDK代码共享最大化的目的。

核心层

核心层是详细实现环信相关功能的模块。它里面也包括的几个部分。核心业务逻辑API实现。抽象协议层。和独立实时音视频模块。

Core Common

业务逻辑层,负责提供主要的IM功能。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


  • 会话管理
  • 消息收发
  • 登录鉴权
  • 连接管理
Audio/Video Call

实时音视频模块是一个独立的模块,能够单独存在,这样能够灵活处理,不须要时不用载入此模块。


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

  • 实时音视频
  • 多人语音
Abstract Protocol Layer

协议抽象层,主要用来处理详细的IM底层协议。这层是比較独立的主要实现环信定义的IM传输协议,也为为日后协议改造,扩展提供承上启下的作用。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

  • 定义抽象消息载体
  • 主要的消息发送
  • 主要的消息回调
  • 定义主要的通知
上述ONE SDK架构是我们计划要实现的,如今一些主要的设计已经在Linux SDK上得到了实现。以下让我们继续了解下Linux SDK。

Linux SDK

经过几个月的开发,我们已经推出了Linux SDK測试版,有兴趣的开发人员能够小试一下去我们的官网 http://www.easemob.com/downloads 下载。

通过EMChatClient Facade类开发人员能够訪问到不论什么IM停供的功能

  • 登录注冊
  • 消息收发,支持TXT, IMAGE, VIDEO, AUDIO, FILE, LOCATION, 类型的message
  • 会话管理
  • 联系人管理
在开发linux SDK的时候我们利用了C++11提供的非常多优良feature,比如lambda。shared ptr。thread等较新的功能,通过这些功能的使用,让我们可以迅速而且高效的开发出Linux SDK測试版。


Lambda是我们的代码逻辑阅读起来更清楚,shared ptr使我们对内存的管理更为简单。thread的使用使我们能迅速的建立好线程模型,加快开发的速度。

我们在Linux SDK porting layer实现了线程模型,数据库模型。定时器模型和HTTP模型
  • 线程模型,利用C++11的thread进行封装
  • 数据库模型。使用Linux的sqlite
  • HTTP模型,我们使用了Libcurl进行了封装
  • 定时器模型,我们使用了C++11进行了封装
我们对Linux SDK还在紧锣密鼓,夜以继日的紧张开发中,群组和实时音视频功能还在开发中。可是在开发过程中我们也遇到了些的问题,比如不linux平台对库的支持也不尽同样,所以势必会对我们的架构有些改变,有些重构的工作也在进行中。我们希望8月底可以实现大部分的功能。


选择linux SDK为開始主要是由于大多数的嵌入式智能平台还是以linux为主,所以首先开发Linux 版SDK也是必先的一步,感谢我们的project师,我么的Linux SDK已经可以支持树莓派的开发环境,这对于非常多开发人员来说确实是个好消息。

假设想了解怎样集成Linux SDK请參考环信IM Linux SDK 集成说明

展望

Linux SDK 仅仅是实现我们ONE SDK 的第一步。我们下半年还要实现基于ONE SDK 的Android ,IOS,MAC OS, 还有主流物联网平台的SDK,通过借鉴Linux SDK的实现方式,我们觉得实现ONE SDK是能够做到的。

我们还会进一步和主要IOT平台供应商合作。实现某个详细IOT平台的环信SDK。使环信即时通讯平台生态圈更加壮大。

环信ONE SDK架构介绍的更多相关文章

  1. 李洪强iOS开发之-环信02_iOS SDK 介绍及导入

    李洪强iOS开发之-环信02_iOS SDK 介绍及导入 iOS SDK 介绍及导入 iOS SDK 介绍 环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架.包括以下几个部分: SD ...

  2. 李洪强iOS开发之-环信01_iOS SDK 前的准备工作

    李洪强iOS开发之-环信01_iOS SDK 前的准备工作 1.1_注册环信开发者账号并创建后台应用 详细步骤:  注册并创建应用 注册环信开发者账号 第 1 步:在环信官网上点击“即时通讯云”,并点 ...

  3. shit 环信 IM SDK & IM SDK & web

    shit 环信 IM SDK & IM SDK & web 环信 IM SDK, 采坑大全 自己写 UI appkey 是否正确 password 是字符串,不是 数字 HTTPS 是 ...

  4. 集成IOS 环信SDK

    集成IOS SDK 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念. 下载SDK 通过Cocoapods下载地址 不包含实时语音版本SDK(EaseMobC ...

  5. mui初级入门教程(五)— 聊聊即时通讯(IM),基于环信 web im SDK

    文章来源:小青年原创发布时间:2016-06-15关键词:mui,环信 web im,html5+,im,页面传值,缓存转载需标注本文原始地址: http://zhaomenghuan.github. ...

  6. 环信SDK与Apple Watch的结合(1)

    该系列是记录在apple watch上开发IM,用到了最近挺流行的环信IM SDK. 一.先来一段网上随处可查到的信息: 1.两种分辨率 1.65寸 312*390 1.5寸 272*340 2.开发 ...

  7. 李洪强iOS开发本人集成环信的经验总结_01环信SDK的导入

    李洪强iOS开发本人集成环信的经验总结_01环信SDK的导入 01 - 直接在项目中导入SDK和一些静态库 这个时候,没有错误的编译没有错误的话,就说明SDK已经配置成功 还有一种方法是用cocoap ...

  8. 环信SDK 头像、昵称、表情自定义和群聊设置的实现 一(附源码)

    前言: 环信的SDK在公司的项目中有用到,现在用到的是群聊的部分,这里我们分析总结一下自己对环信给的DEMO大概的拆解一下,说说我们怎么样充分的利用这个demo来写我们所需要的业务.这个也由于篇幅的原 ...

  9. android-使用环信SDK开发即时通信功能及源代码下载

    近期项目中集成即时聊天功能.挑来拣去,终于选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁.说明文档清楚易懂.文档有android.ios.和后台server端.还是非常全的. 环信官网: ...

随机推荐

  1. 小w的喜糖(candy)

    小w的喜糖(candy) 题目描述 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每 ...

  2. 满汉全席(banquet)

    满汉全席(banquet) 题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做 ...

  3. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] D 数学+(前缀 后缀 预处理)

    D. "Or" Game time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. 【08】node 之 fs文件

    var fs = require("fs");//fs 系统文件模块,对文件进行操作.Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有 ...

  5. pat 甲级 1022. Digital Library (30)

    1022. Digital Library (30) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A Di ...

  6. form快速转json serialize

    原文发布时间为:2011-03-28 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  7. 转 C++的常量引用

    C++的常量引用 如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对常量的引用可以用其它任何引用来初始化:但不能改变. 关 ...

  8. 解决mysql 远程链接问题

    grant all privileges on *.* to 'root'@'192.168.2.204' identified by '123456' with grant option;flush ...

  9. Chrome 75 将原生支持图片懒加载

    4 月 6 日,Google 的 Chrome & Web 平台工程经理 Addy Osmani 在个人博客发文,介绍到 <img> 和 <iframe> 的 load ...

  10. UITextView只能显示两行问题

    需求:UITextView只能显示两行 UITextView * textView = [[UITextView alloc]init]; textView.frame = CGRectMake(20 ...