Alljoyn之管中窥豹

一、历史:

Alljoyn是高通2011年推出的近距离P2P通讯技术,它为分布式应用程序在不同设备中提供了运行环境,特别是移动性、安全性和动态配置,支持Microsoft Windows、Linux、ios和Android等主流的操作系统平台,可以说AllJoyn是专门处理异构分布式系统中的难题而产生的,同时Alljoyn还是一项开源项目(项目地址http://www.alljoyn.org),按道理说应该很火才对,

(怎么就没火起来呢???)

年12月份将该项目贡献了处理,并拉了一帮的大佬小弟(Linux 基金会、HTC、思科、LG、夏普、海尔、松下、Silicon Image、TP-Link等)成立了AllSeen联盟,旨在建立、维护统一的设备间通讯标准也就是物联网互联架构,可以让家中的电视、机上盒、路由器、智能照明系统和其他设备无缝地连接起来,并跨越iOS、Android、Windows 或 Mac 等不同的作业系统。

(我们一起来玩吧)

现在这个项目是由Linux 基金会来管理和运作,并添加一些功能模块(之前只有通讯框架)如音频推送,设备控制等,所以个人觉得比较靠谱,正好项目需要用到这方面的技术,也就来潜心研究学习下。——allseen的项目地址是 http://www.allseen.org

二、优点:

、开源

这个是我们最喜爱它的原因,没有之一。

2、操作系统的独立性

AllJoyn提供了一个抽象层,允许AllJoyn及其应用程序运行在多个操作系统平台上。支持的系统包括Windows XP , Windows 7, Windows RT , and Windows 8,Android 2.2和更高版本,Linux发行版本如Ubuntu以及苹果操作系统iOS 和OS X

3、开发语言的独立性

目前,支持的语言有C++,Java, C#, JavaScript,和Objective-C.

4、物理网络和协议的独立性

现在,网络设备支持许多的通信技术。AllJoyn提供了一个抽象层,它为底层网络协议栈定义了统一的接口,使得软件工程师可以相对容易地添加和安装新的网络。

Wi-Fi联盟已经发布了一个Wi-Fi Direct规范,这将允许点对点的Wi-Fi连接。并且Wi-Fi Direct的网络硬件模块也正在积极开发中,它将为AllJoyn开发者增加Wi-Fi Direct功能和可用网络选项的预关联发现机制。

5、最重要的就是上面这几点,当然还有其他很多。。。。。。

三、概念

、AllJoyn总线

显示了单一设备上AllJoyn总线实例在理论上的结构。总线用加粗的水平黑线表示。垂直线可以被认为是消息通过总线在源点和目的点之间传递的"出口"。

所示的总线连接被描述为了六边形(这是任意选择的形状)。正如高速公路的出口通常都具有编号,图中每个连接都分配了唯一的连接名称。为了清晰起见,这里使用连接名称的简化形式。

的例子中,独特的连接名称:1.1可能被分配给应用程序实例进程的一个连接,而独特的连接名称:1.4可能被分配给其它应用程序实例进程的连接。AllJoyn总线的目标就是让两个应用程序进行通信,而无需处理底层机制的细节。其中一个连接可以认为是客户端存根,另一方就可以认为是服务器存根。

图2. 典型的AllJoyn总线

显示了AllJoyn总线的一个实例,说明了软件总线如何给连接到总线上的组件提供进程间通信。AllJoyn总线的典型设备扩展如图3所示。组件可根据需要,在Smartphone和Linux主机上的组件之间创建逻辑总线段之间的通信链路。

图 3. AllJoyn处理设备到设备的通信

通信链路的管理由AllJoyn系统负责,并且由许多底层技术组成,例如Wi-Fi和蓝牙技术。可能有不同的设备参与管理AllJoyn总线,但是这对分布式总线上的用户都是透明的。对于总线上的某个组成部分,分布式AllJoyn系统看起来就像是本地设备中的总线。

显示了分布式总线对于总线上的用户是如何呈现的。一个组件(例如,智能手机连接的名称为1.1)可以创建一个进程来调用Linux主机上的名称为1.7的组件,而无需担心该组件的物理位置。

图4. 分布式AllJoyn总线类似一条本地总线

2、总线守护进程

说明了逻辑分布式总线实际上被分成了若干个段,每个段都运行在不同的设备上。AllJoyn从功能上实现这些逻辑总线段的进程被称为AllJoyn守护进程。

Unix派生系统中的长驻守护进程,通常用来描述运行在计算机系统中并提供一些必要功能的程序。在Windows系统中,长驻服务更加常见,但是我仍然是指AllJoyn在Windows系统中的守护进程。

图5. 总线的相关气泡图形

所示。总线连接被标记为了客户端(C)和服务器(S)基于RMI模型。执行分布式总线核心的守护进程被标记为(D)。图5中的组件通常被解释为如图6所示的插图。

图6. AllJoyn气泡图形

所示,逻辑总线是单一的实体连接。类似Smartphone中的配置,Linux主机上有两个服务组件和一个客户端组件。

在此配置中,客户端组件C1可以采用远程方法来调用服务组件S1,就像它是一个本地对象。参数在源头进行封装,并由Smartphone上的守护进程送至本地总线段的路由。封装参数通过网络链接(从客户端来看是透明的)发送至Linux主机上的守护进程。而Linux主机上运行的守护进程确定目的地是S1,并且对封装参数进行拆封,然后通知服务去调用远程方法。如果有返回值,那么将反向进行这个通信过程,把返回值传回给客户端。

由于守护进程在后台运行,并且客户端和服务都运行在单独的进程中,所以在每个单独进程中必须有一个守护进程的"代理"。 AllJoyn将调用这些代理总线附件。

3、总线附件

每个AllJoyn总线连接都需要一个特定的AllJoyn组件作为介质,它称为总线附件。每个需要连接AllJoyn总线的进程都有一个总线附件。

当在硬件和软件之间讨论软件组件时,往往会引出一个比喻。我们可以将分布式AllJoyn总线的本地网段想象为台式电脑的底板硬件总线。硬件总线本身就能传递电子信息,并且有一个可以插卡的点称为连接器。AllJoyn中类似功能的连接器就是总线附件。

AllJoyn总线附件是本地指定语言的对象,它代表了分布式AllJoyn总线中的客户端、服务或对等点。例如,这里有为用户提供总线附件功能的C++语言实现,还有为用户提供相同总线附件功能的Java语言实现。由于AllJoyn增加了语言支持,将会有更多这样的具体语言实现。

4、总线方法、总线属性和总线信号

AllJoyn基本上是一个面向对象的系统。在面向对象的系统中,人们将谈论对象中的调用方法(因此对于分布式系统,人们将谈论长驻远程方法调用)。面向对象编程中的对象需要有成员。通常,还需要对象方法或属性,在AllJoyn中就是BusMethods和BusProperties。AllJoyn同样也有总线信号(BusSignal),它是对象中某些事件或状态变化的异步通知。

为了使客户端、服务和对等点之间的通信更加透明,那么总线方法和总线信号中的参数顺序必须有一些规范,并且总线属性中也必须有一些形式的类型信息。对于计算机科学,方法(或信号)输入和输出类型的申明或定义被称为类型签名。

类型签名使用字符串来定义,包括所有的基本数字类型(对于大多数编程语言),以及从这些基本类型创建出的复合类型,例如数组和结构体。类型签名的具体分配和使用超出了本文介绍的范围,但是总线方法、信号或属性的类型签名将传递给AllJoyn底层系统,来实现总线上传递参数和封装返回值的转换。

5、总线接口

在大多数面向对象的编程系统中,方法或属性集合将合并到具备固有内在联系的群组中。该集合函数的统一申明被称为接口。接口为执行接口规范的实体与外界之间的连接提供服务。正因为如此,接口需要适当的标准结构来实现标准化。各种网站上可以找到众多的接口服务规范,从电话到媒体播放器控制。D-Bus规范在XML中进行描述来指定接口。

接口规范会将总线方法、总线信号、总线属性以及与它们相关的类型签名组合到一个命名组中。而实际上,接口会由客户端、服务或对等点进程来实现。如果实现了给定的命名接口,那么在这个实现和外界之间会有一个隐性契约,接口将会支持它所有的总线方法、总线信号和总线属性。

接口名称通常采用域名反转形式。例如,这里有许多AllJoyn实现的标准接口。其中有一个标准接口是theorg.alljoyn.Businterface,将守护实现并为总线附件提供一些基本功能。

值得注意的是,接口名称仅仅是相对自由形式的命名空间中的一个字符串,并且其它命名空间可能也有类似的外观。接口名称字符串提供的特定函数不应该和其它类似的字符串混淆,特别是总线名称。例如,org.alljoyn.sample.chat可能是总线名称常量,就是客户端搜索的名字。但是也有可能org.alljoyn.sample.chat是接口名称,它定义了总线对象采用特定的总线名称连接到总线附件上时提供的方法、信号和属性。如果存在给定接口名称的接口就暗示了总线名称的存在;但是,它们确实是两个完全不同的东西,有时可能长得一模一样。

6、总线对象和对象路径

总线接口提供了一种标准的方式来声明分布式系统中的接口。总线对象提供桥接到可能实现给定接口规范的地方。总线对象存在于总线附件中,并作为通信的终点。

因为,在特殊的总线附件中特定的接口可能会有多种实现,所以必须增加额外的结构体来区分这些接口实现。这将由对象路径来提供。

就像接口名称是命名空间中的一个字符串,对象路径同样也存在于命名空间中。命名空间的结构就像一棵树,路径的思维模式就是文件系统的目录树。事实上,对象路径的路径分隔符使用的是斜杠字符,和Unix文件系统类似。由于总线对象是总线接口的实现,所以对象路径可以遵循相应接口的命名约定。如果定义了一个磁盘控制器接口(exampleorg.freedesktop.DeviceKit.Disks),那么你就可以想象,对于同一系统中的两个分开的物理磁盘,这个接口的不同实现应该遵循下面的对象路径:

/org/freedesktop/DeviceKit/Disks/sda1

/org/freedesktop/DeviceKit/Disks/sda2

概念多了一下子也记不住,我的理解是:AllJoyn总线是对底层通信的抽象,我们在实际的应用中并不需要关注它;总线附件是与总线连接的接口,每一个ALLJoyn应用都需要创建一个总线附件来与总线通信;总线接口与面向对象编程中的接口类似,是应用服务的抽象,它包含有总线方法、总线属性和总线信号;总线对象才是总线方法,总线信号处理函数的实现体,总线接口与总线对象都需要与总线附件绑定才能生效。下一篇分析代码,来帮助我们更好地理解!

Alljoyn之管中窥豹的更多相关文章

  1. 物联网实验4 alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

  2. (原创) alljoyn物联网实验之手机局域网控制设备

    AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...

  3. Alljoyn瘦客户端库介绍(官方文档翻译 下)

    由于其他事情耽误,这个翻译现在才完成.接上篇—— 4 瘦客户端核心库架构 由于AllJoyn瘦客户端核心库(AJTCL)必须运行在那些功耗受限.计算能力有限.资源紧缺的设备上,因此它无法像运行在通用型 ...

  4. Alljoyn瘦客户端库介绍(官方文档翻译)

    Alljoyn瘦客户端库介绍(上) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设 ...

  5. 深入浅出Alljoyn——实例分析之远程调用(Method)篇

    深入浅出就是很深入的学习了很久,还是只学了毛皮,呵呵! 服务端完整代码: #include <qcc/platform.h> #include <assert.h> #incl ...

  6. 嵌入式设备上运行AllJoyn注意事项

    1. 交叉编译AllJoyn库.编译成功后的文件位于:alljoyn-3.3.0-src\build\linux\arm\debug\dist\目录下: 2. 程序要使用AllJoyn,必须要启动al ...

  7. alljoyn连接时-fno-rtti选项测试结果

    以AllJoyn自带的chat示例在pc上测试结果如下: libAllJoyn.a编译选项 Chat编译选项 测试结果 -Wall -Werror=non-virtual-dtor -pipe -st ...

  8. AllJoyn Bundled Daemon 使用方式研究

    关于AllJoyn不多做介绍,请看官网:www.alljoyn.org/ 0. 问题来源: 应用程序要使用AllJoyn库,就必须启动deamon. 目前有两种方式: 使用standalone形式,单 ...

  9. 【开源推荐】AllJoyn:打造全球物联网的通用开源框架

    摘要:随着智能设备的发展,物联网逐渐进入了人们的生活.据预测,未来几乎一切东西(超过500亿台设备)都可以互联.高通公司发布了开源项目AllJoyn,这是一个能够使连接设备间进行互操作的通用软件框架和 ...

随机推荐

  1. 再探JS数组原生方法—没想到你是这样的数组

    最近作死又去做了一遍javascript-puzzlers上的44道变态题,这些题号称"JS语言专业八级"的水准,建议可以去试试,这里我不去解析这44道题了, ...

  2. Pycharm创建py文件时自定义头部模板

    File->settings->Editor->File and Code Templates->Python Script #!/usr/bin/env python # - ...

  3. 学习微信小程序之css12设置盒子内容的宽高

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. sping注解

    1.@Autowired(已不推荐使用) 按类型装配,如果匹配不到或者匹配到多个则抛BeanCreationException异常.如果是多个时可以用@Qualifier指定来解决 eg. @Auto ...

  5. URAL 2089 Experienced coach Twosat

    Description Misha trains several ACM teams at the university. He is an experienced coach, and he doe ...

  6. iOS Swift 数组 交换元素的两种方法

    swap(&arr[fromIndexPath.row], &arr[to.row]) (arr[fromIndexPath.row],arr[to.row]) = (arr[to.r ...

  7. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

  8. STDIN(0), STDOUT(1), STDERR(2), 2 > &1

    当我们在 shell 中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符(文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的文件是0,第二个是1 ...

  9. [资料分享]2016 黑马 Java 19期视频+Hadoop大数据实战视频

    下载链接: 链接:http://pan.baidu.com/s/1bToXK6 密码:7k43 解压密码: www.lthack.com 或者 2cifang.com 或者 2cifang.com_2 ...

  10. 关于WM_GETTEXT的应用

    HWND hw = ::FindWindow(NULL,"Form1"); HWND hw2 = ::FindWindowEx(hw,NULL,NULL,NULL); int le ...