基于AllJoyn框架的跨平台局域无线组网技术的实现
扫描二维码
随时随地手机看文章
引言
随着智能设备的发展与移动终端的普及,物联网技术逐渐在生活生产中得到广泛的应用,近距离无线组网技术备受关注。但现有的解决方案缺乏统一的技术标准,开发者需要实现通信的框架、协议与承载的平台,存在着独立开发的技术不能相互适配和连通、开发成本高昂等缺点。高通的AllJoyn开源框架针对现有的问题提出了一套完整的解决方案,在操作系统、开发语言、物理网络和通信协议上具有独立性叫本文以开发者的角度从整体的高度分析了AllJoyn的软件框架与在C++语言下的应用,并利用AllJoyn框架,通过WiFi-Direct的连接方式实现了搭载Windows系统的终端间的组网通信实验,与VMware虚拟机下Windows与Linux间的跨平台通信实验。
AllJoyn与物联网技术
物联网技术的工作流程是使用各类集成化的传感器实时感知和采集所需的信息,经过信息处理基站对信息进行分析、处理,并通过自组织的无线通信网络以“多跳中继”的方式将信息传送到用户终端。AllJoyn是一个独立于操作系统、开发语言、通信协议的通用软件框架,提供了一种广播和发现服务的抽象,简化了定位和应用服务的流程,适合用来组建无线通信网络。
AllJoyn的优势
AllJoyn作为开源的中性平台系统,是一个“能够使连接设备间进行互操作的通用软件框架和系统服务核心集”,在操作系统、开发语言、物理网络和通信协议上具有独立性。并且在框架内部集成了对网络拓扑结构、通信协议的实现与管理,不需要上层应用程序的开发人员对每种网络技术的特性进行了解,近距离传输速度快,组网流程简单,并且为“握手”模式的安全通信模型提供框架(PasswordManager类)。
3AllJoyn基本概念
3.1总线与总线附件
AllJoyn总线是AllJoyn通信框架的基本抽象,是所有通信过程的承载。它的作用类似于工业上的数据总线,为消息在分布式系统上的传递提供了一个精简高效的消息序列。总线附件(BusAttachment)是应用程序进程与AllJoyn总线连接的媒介,可分别作为服务端、客户端或着作为通信的对等点。
3.2总线对象与总线接口
总线对象(BusObject)实现总线接口(Interface)与总线方法(Method),是通信的发起点与终点,使用时需要在总线附件中注册。总线接口定义了接口规范(ajn::InterfaceDescription类),并将总线方法、总线信号、总线属性及相关的类型签名封装到一个消息组(ajn::MsgArg类)中。
3.3总线守护进程
总线守护进程(Daemon)是运行在操作系统中用来实现分布式逻辑总线段的进程。分布式总线段的连接实质上就是守护进程间通信的建立,除了使用库文件中的绑定守护进程(BundledDaemon)完成底层网络连接的实现,还可以为瘦客户端(ThinClient)编程实现精简易用的守护进程。
AllJoyn会话
会话的建立由服务器的半连接(会话选项、总线名称、会话端口)与客户端的半连接(会话选项、唯一名称、会话ID)的组合实现,产生唯一的AllJoyn通信路径。在客户端捜寻到由服务器广播出来的服务名之后,需要通过加入AllJoyn会话才能进行通信。
AllJoyn通信原理
图1所示是总线消息模式示意图。处于分布式总线段上的两个应用程序,釆用广播与发现well-known服务名(如图1中的org.alljoyn.sample.service)的方式发现远程设备,并通过连接远程AllJoyn守护进程创建的总线建立通信,以加入AllJoyn会话的方式确定一条信息的传递路径。信息的发送由总线对象的成员函数ajn::BusObject::Signal完成,信息的接收由向总线附件注册的信息处理函数来完成(注册由库函数ajn::BusAttachment::RegisterSignalHandler完成)。
4AllJoyn软件框架
AllJoyn的软件框架由上层应用程序、基本服务框架、路
由结点(服务器)、客户端与底层网络构成。应用层可由开发者使用不同的开发语言,通过使用基本服务框架与调用AllJoyn库函数实现,图2所示是AllJoyn软件框架示意图。
5开发环境的构建
Windows7平台:安装VisualStudio2010;从官网下载VisualStudio2010版本的预编译SDK(或使用源码包编译[9]);打开samples目录下的VC2008Win7工程,并按提示自动转换(库与头文件的路径在工程中都已经添加);复制一个示例工程并删除其中的示例项目,得到一个完整的开发环境。
Fedora19平台可从官网下载源码包(或使用git工具克隆—镜像工程:gitclonehttps://git.allseenalliance.org/gerrit/p/All-Projects.git),并安装工具与依赖库:“yuminstallgccdoxygengraphvizopenssl-develbluez-libs-devel”(根据错误提示安装其他的依赖库),同时使用scons工具编译,编译选项参考“sconsOS=linuxCPU=x86DOCS=devBINDINGS=cpp,cWS=offVARIANT=release”,编译成功后,在源码目录下的build目录中能找到编译出的release版本的AllJoyn库文件;在samples中将Makefile的示例复制出来,并在“LIBS”项后添加“-lalljoyn../../lib/BundledRouter.o-lajrouter”,使程序运行时使用编译好的绑定守护进程(BundledDaemon);再使用make工具编译源码得到可执行程序。
6组网通信实验
WiFi-Direct传输文件实验
在两台搭载Windows系统的终端上进行该实验,利用Windows7自带的WiFi-Direct进行连接,其中一台在网络与共享中心里设置新的无线网络连接,另一台捜索相应的无线网络并连接,并分别使用ipconfig与ping来测试连接。
完成无线网络的连接后,在作服务器的终端上运行cpp/bin/samples/FileTransferService.exe<FileName>,该进程将文件以二进制的格式读入128KB的缓冲区,并通过与本地总线守护进程的连接将进程连接到本地AllJoyn总线段上(QStatusstatus=s_msgBus->Connect();),接着广播服务名并等待客户端的连接。在客户端运行FileTransferClientexe,该进程同样也将进程与本地总线相连(在早期版本中则使用显式的远程连接方法,如:QStatusstatus=s_msgBus->Connect“tcp:addr=169.254.227.124,port=9955");在TCP协议下的通信端口为9955,UDP协议的端口为9956),守护进程会根据总线附件的成员函数ajn::BusAttachment::FindAdvertisedName自动的寻找可及网络内的被广播出来的服务名并加入由服务器创建的AllJoyn会话,并通过信号在服务端的发射与客户端接收来实现文件的传递。AllJoyn信号中带有描述信息MsgArg类,可存储128KB的描述信息,在该实验中文件就是被存储在MsgArg类中通过库函数ajn::BusObject::Signal传递的。其文件传输流程如图3所示。
服务端 |
客户端 |
|定义相关变量 |
_| |定义相关变量| |
|获取并分割文件 |
| | 连接守护进程 | |
|连接守护进程 |
I丿搜寻服务名| |
| 广播服务名 |
FJ连接AllJoyn会话| |
创建AllJoyn会话 |
K|等待会话的连接| |
|发送带数据信号 |
I~h逐条接收信号| |
断开连接并退出 |
生成文件并退出 |
图3文件传输流程示意图
经过多次实验统计,可得到表1所列的统计结果。测试结果说明,在同等距离下,单次传输大文件的平均速度慢于传输小文件的速度;小文件的传输速度存在着一定的不稳定性;传输的平均速度随距离的增大而减小。
表1文件传输速度分布表 |
|||
距离(m) |
文件大小(M |
1B) 平均速度(KB/s) |
方差(KB/s) |
0 |
552.96 |
649.35 |
17.09 |
0 |
10.45 |
1136.68 |
41.82 |
0 |
114.48 |
876.59 |
24.15 |
5 |
114.48 |
567.81 |
14.42 |
10 |
114.48 |
418.86 |
20.49 |
实验说明:示例文件中的FileTransferService.exe在传输文件时可能会崩溃,原因在于在源代码移植过程中没有处理好Windows平台下的数据类型转换,在FileTransfer()函数中将变量bufferLength的从std::streamsize类型强制转换为unsignedint就能解决崩溃的问题,在目前最新的14.02.00版本中该问题仍然存在。
6.2跨平台通信实验
该实验使用示例文件chat.exe测试Windows与Linux平台间的通信。实验的流程与图3类似,所不同的是chat程序集成了服务器与客户端,并使用main函数参数对功能进行选择。经对比后发现,在Linux平台下编译所使用的chat.cc源码与Windows下的完全一致,体现出AllJoyn框架下源码的可移植性强。
由于Fedora19平台被搭建在VMware虚拟机中,所以使用NAT的网络连接方式就能实现Windows主机与Linux虚拟机的网络连接(通过VMware虚拟以太网配适器Vment8连接)[11]。在Windows终端中输入chat.exe-sROOM创建名为ROOM的服务名,Linux终端中输入./chat-jROOM&搜索名为ROOM服务名,并加入相应AllJoyn会话中,从而建立起Windows与Linux间的通信。
实验说明:运行时有可能会出现找不到动态库liballjoyn.so的错误提示,可将$PWD../../lib/中的liballjoyn.so拷贝至$PWD,并在Makefile的LIBS后添加-Wl,-rpath=”./”来修正错误。
7结语
AllJoyn的独立性通信场景可以经过移植并推广到通过Bluetooth、Zigbee等不同的通信协议进行通信,同时也可以推广到搭载Android、iOS、ARM-Linux等主流操作系统上,或以瘦客户協ThinClient)的方式推广到实时操作系统RTOS)移动终端的通信上,对构建局域无线通信网络具有较高的应用价值。
20211221_61c1bc4fe972f__基于AllJoyn框架的跨平台局域无线组网技术的实现