引言
人们所携带的电子信息设备越来越多,像笔记本电脑、移动电话、PDA 等已不再只是商务人员的必备工具,正逐步进入百姓的日常生活。这些信息设备的功能越来越强大,同时尺寸却越来越小,但是人们已不能仅仅满足于它们各自独立工作,而是迫切需要各种设备之间能方便地进行信息的交互。因此,在小范围内能够将个人设备互联而组成的网络———个人局域网(PAN) 便应运而生。蓝牙(Bluetooth) 作为一种小范围无线连接技术,能够在设备间实现方便快捷、灵活安全、低成本、低功耗的数据和语音通信,是目前实现无线个域网的主流技术之一。本文提出了怎样实现现有上层协议(如TCP/ IP)与蓝牙协议的无缝连接;怎样实现蓝牙个人区域网的数据转发(主要集中在PAN 的网桥算法上) 的解决方法;最后提供了一个蓝牙个人区域网模块的完整设计方案供参考,希望对各个同行有借鉴意义。本文所提出的解决方案现已用软件实现,并投入国外市场,用户反映运行良好。
1 蓝牙PAN 实现原理
蓝牙技术是一种近距离无线通信的开放性标准,其目的是单芯片、低功耗,用来代替有线电缆连接,实现短距离无线语音和数据通信。由多个蓝牙设备就可以组成一个蓝牙网络。蓝牙个人区域网PAN 有两种应用模型: 一种被称为组网络( Group Ad - hoc Networking ,GN) ;另一种被称为网络访问点(Networking Access Point ,NAP) 。这两种实现模式分别有不同的网络结构和协议模型。下面对它们分别进行叙述。
1.1 组网( GN) 与网络访问点(NAP)
一个简单的组网由一个主设备和1~7 个活动的从设备组成。在这一个主从网中,主设备与从设备之间的点对点或点对多点通讯在主设备的控制下进行,这个网络不需与外部网络相连。另外一种就是由一个NAP和其它蓝牙设备组成的网络。这种无线设备充当网络设备(10baseT,GSM 等) 之间的网桥、代理或者路由。网络访问点与Internet 相连,它是其它计算机或设备与外部网络相连的中介。计算机通过网络访问点共享所有的网络资源。
1.2 PAN 协议栈模型
由上可见,NAP 和GN 是两种不同的服务。组网被设计用来允许一个或多个蓝牙设备组成一个局域网络,而网络访问点提供蓝牙设备进入Internet 网络的能力。无论是NAP 还是GN 都必须提供与TCP/ IP 和其它网络协议的无缝实现。下面是关于NAP 和GN 在协议栈部分图示(图1 和图2) 。从协议栈示意图可以看出,与GN 网络比较而言,NAP 除了要实现数据转发之外,还必须实现网桥,能够实现网络的路由,从而能通过网络访问外部网络。
2 PAN 实现要解决的问题
蓝牙个人区域网就是要用无线代替有线,用蓝牙硬件在不同设备之间建立一条虚拟的蓝牙链路,从而使现有的各种应用软件不经修改,就可以在不同蓝牙设备之间进行数据传输和数据交换。它必须解决以下问题:
(1)怎样支持IPv4 和IPv6 协议和其它可选协议。
(2)怎样实现GN 和NAP。
(3)怎样实现蓝牙协议栈与现有网络协议如TCP/ IP和PPP 等网络协议无缝连接,从而通过蓝牙硬件在下层建立一条虚拟的蓝牙链路,使现有网络应用程序就像在有线网络中使用一样。
3 PAN 的具体实现
3.1 实现高层协议与蓝牙协议的无缝连接
要充分运用现有的各种协议,如TCP/ IP 协议和其它上层协议的接口,PAN 网络需要在上层协议与蓝牙协议栈之间建立一条蓝牙无线链路。怎样实现现有协议与蓝牙协议的无缝连接? 笔者以Windows 平台为例提出了一个解决方案,如图3 所示。
在Windows 驱动程序设计构架中,现在的通讯协议(如TCP ,IPX/ SPX等) 都是建立在Miniport Driver 之上的。因此,只需实现一个Windows 关于NDIS 的Miniport 驱动程序(图4) 即可。从TCP/ IP 等高层协议过来的数据通过Miniport 进入Dispatch Driver ,然后进入个人区域网应用程序,通过应用程序进入蓝牙协议栈。当然,PAN Interface 也可以在Kernel Mode 层实现。通过PAN Interface ,数据就可以进入蓝牙协议栈了 。
3.2 网桥转发算法(实现GN 和NAP)
为了实现GN 和NAP ,就必须在GN 和NAP 端实现一个虚拟网桥,实现数据的转发。网桥转发算法是蓝牙个人区域网PAN 实现的关键技术。根据蓝牙个人区域网的特点,笔者提出了网桥三个端口的模型,并提出了一个网桥转发算法。
3.2.1 网桥转发算法基本思想
网桥在一定程度上就相当于一个集线器。在它上边可以有三种类型的端口:BNEP 端口(数据转发是直接建立在BNEP[3]之上的) ,本地端口(服务端本身) 和外部网络端口(如接入Internet) 。由于一个蓝牙主设备只能连接七台蓝牙从设备,所以网桥的BNEP 端口最多能有七个;本地端口表示的就是提供服务设备自己,它只有一个;如果本设备支持NAP ,那么将会注册一个外部网络端口。可见,一个网桥最多有九个端口,它的主要功能就是根据相应的网桥转发算法,把数据从一个蓝牙设备转发到其它的蓝牙设备或者外部网络,从而实现在不同设备间(GN) 或者和外部网络(NAP) 通信的目的。在每一个BNEP 端口设置一个自学习标志位来标志来自这个端口的数据包的源地址和目的地址是否已经被记忆下来,这样就没必要每次都去查找来自这个端口的每一个数据包的源地址或目的地址。如果要转发的数据包不是来自内部网络,并且在端口列表中没有找到目标端口,则默认为被转发到外部网络, 如果没有外部网络端口,则丢弃该包。另外,在每一个端口还有一个包过滤器,它可以过滤掉某些类型的网络包和来自或发往某地址范围段的网络包。
3.2.2 算法具体步骤
(1) 有数据包到达网桥,该数据包可能来自本地设备、其它蓝牙设备或外部网络(如果实现了NAP) 。
(2) 从包头中取得该数据包得源地址,检查该数据包的是否来自外部网络。若是,则检查数据包的源端口是否自学习的;若不是,则记下该数据包的源地址并设置自学习标志位为TRUE。
(3) 从包头中取得该数据包的类型。如果它是EARP/ ERARP 类型数据包,则把它作为广播包,并对除源端口外的每一个端口进行广播,然后转到(8) 。
(4) 如果它是IPv4 , IPv6 或者其它类型的数据包,则检查所记忆的目标端口是否是一个有效端口。如果所记忆的目标端口有效,则把所记忆的目标端口作为该数据包要转发的目标端口。
(5) 如果该数据包的目标地址是一个广播地址或多播地址,则把该数据包进行广播或多播,然后转到(8) ;否则,在除源端口外的所有端口中查找目标端口。
(6) 如果找到目标端口, 则记忆该目标端口;否则,若该网桥有默认端口(即外部网络端口) ,并且源端口不是外部网络端口,则把外部网络端口作为目标口,若没有外部网络端口, 则丢弃该包, 然后转到(8) 。
(7) 进行包过滤, 如果该包没有被过滤掉, 则转发该数据包到目标端口。
(8) 接收下一个到来的数据包,重复上述步骤。
4 模块介绍
4.1 PAN UI
PAN UI 模块是位于最上层的图形用户界面,它是与用户交互的接口。它使用户能够方便快捷地完成相应操作,如建立网络,进行数据交互等。
4.2 PAN Profile
PAN Profile 模块是蓝牙个人区域网PAN 实现的关键模块。一方面,它与用户界面打交道,另一方面,它又要负责与协议栈和网络驱动程序的数据交互。它有以下功能:
①一方面它能提供PAN 服务,并等待接收来自客户端的连接。
②另一方面它又能作为客户端,发出建立连接请求,并接收来自服务端的响应。
③如果提供NAP服务,则还需实现一个网桥,详见网桥算法。
4.3 Pan Interface
PAN Interface 模块是与系统相关的模块, 它直接和位于核心态的Virtual NIC 模块进行交互,接收来自Virtual NIC 模块的数据(即TCP/ IP 等上层协议发来的数据)或发送数据到Virtual NIC(即TCP/ IP 等上层协议接收的数据) 。
4.4 Virtual NIC
Virtual NIC 模块即网卡驱动部分,它位于Windows 系统的核心态,实现了一个虚拟的蓝牙网卡,直接与Windows 系统通信。
5 结束语
本文首先对PAN 蓝牙协议进行了一个概括性的描述,然后对PAN 设计中会遇到的问题进行了阐述,并在最后提出了作者对问题的解决方法。本文描述了PAN 的设计和实现过程,提出了算法及解决方案,具有很强的实用性。