当前位置:首页 > 物联网 > 《物联网技术》杂志
[导读]摘要:为了简化邻近异构分布式通信网络系统的组建并统一物联网通信框架,采用高通公司最新推出的AllJoyn开源框架,进行了Windows平台间通过WiFi-Direct方式传输文件的组网实验及VMware下Windows与Linux间的跨平台通信实验。结果证明:AllJoyn框架在通信协议与平台方面的独立性良好,而WiFi-Direct方式则具有组网过程简单、传输速度较快的特点。

引言

随着智能设备的发展与移动终端的普及,物联网技术逐渐在生活生产中得到广泛的应用,近距离无线组网技术备受关注。但现有的解决方案缺乏统一的技术标准,开发者需要实现通信的框架、协议与承载的平台,存在着独立开发的技术不能相互适配和连通、开发成本高昂等缺点。高通的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完成)。

基于AllJoyn框架的跨平台局域无线组网技术的实现

4AllJoyn软件框架

AllJoyn的软件框架由上层应用程序、基本服务框架、路

由结点(服务器)、客户端与底层网络构成。应用层可由开发者使用不同的开发语言,通过使用基本服务框架与调用AllJoyn库函数实现,图2所示是AllJoyn软件框架示意图。


基于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框架的跨平台局域无线组网技术的实现

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭