环信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功能。
- 会话管理
- 消息收发
- 登录鉴权
- 连接管理
Audio/Video Call
实时音视频模块是一个独立的模块,能够单独存在,这样能够灵活处理,不须要时不用载入此模块。
- 实时音视频
- 多人语音
Abstract Protocol Layer
协议抽象层,主要用来处理详细的IM底层协议。这层是比較独立的主要实现环信定义的IM传输协议,也为为日后协议改造,扩展提供承上启下的作用。
- 定义抽象消息载体
- 主要的消息发送
- 主要的消息回调
- 定义主要的通知
上述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。使环信即时通讯平台生态圈更加壮大。