环信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. jquery 实践操作:iframe 相关操作

    此篇记录关于HTML 的 iframe 元素 的相关记录 定义:iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 常用的基本 iframe 设置(详细设置属性参考API:http:/ ...

  2. 有关UITableView--cell复用问题

      近来用Tableview做了一个九宫格.过程中碰到了两个cell复用问题. 问题一: 在cell中为button添加addTarget点击事件时,出现后面的cell会重叠它前面cell的事件.代码 ...

  3. pat 团体天梯赛 L2-002. 链表去重

    L2-002. 链表去重 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个带整数键值的单链表L,本题要求你编写程序,删除 ...

  4. 洛谷 P 2756 飞行员配对方案问题

    题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...

  5. 兼容FF和IE的tooltip 鼠标提示框

    原文发布时间为:2009-09-07 -- 来源于本人的百度文章 [由搬家工具导入] http://www.walterzorn.de/tooltip/tooltip.htm 【请见该页面】 Down ...

  6. Swing要点

    1. 布局管理器会控制潜逃在其他组件中组件的大小和位置. 2. 当某个组件加到背景组件上面时,被加入的组件是由背景组件的布局管理器管理的. 3. 布局管理器在做决定之前会询问组件的理想大小(setSi ...

  7. Selenium2+python自动化1(环境安装)

    前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium2为基础,目前selenium3坑比较多,暂 ...

  8. spingboot 邮件模板发送;

    <!-- 邮件start --><dependency> <groupId>javax.mail</groupId> <artifactId> ...

  9. LeetCode OJ--Binary Tree Zigzag Level Order Traversal *

    https://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/ 树的层序遍历 使用两个 stack 或者 vect ...

  10. nodejs express 路由并显示html以及访问静态资源设置

    var express = require('express'); var http = require('http'); var fs = require('fs'); var app = expr ...