转帖:http://rick-lei-zhao.blog.hexun.com/2002308_d.html
在Windows平台上PAN实现的要点和难点
蓝牙PAN Profile在Spec里面的描述是非常简单的, 只是定义了几个角色和基本功能, 大量的工作主要是在各个平台上的实现. 下面我就列举一下BlueSoleil在Windows平台上的实现的要点和难点, 以供别人参考.
首先我先描述一下PAN的工作原理: PAN Profile定义了3种角色:PANU, GN和NAP. 当PANU连到GN时,组成的是一个蓝牙设备之间的ad-hoc Network, 蓝牙设备之间可以互相通信; 当PANU连到NAP时, PANU做为外部网络的一部分, 和NAP一样是网络中的一个节点. 此外BlueSoleil又实现了NAT, 它实际上等于GN和NAP的结合, 当PANU连接到NAT时, PANU和NAT组成的是ad-hoc Network, 同时, PANU也可以访问外部网络, 和NAT使用同一个IP地址. 从数据流上来看, GN不需要考虑外部网络的问题, 它只是简单的把PANU发来的数据包转发给其他PANU. 而NAP需要把所有PANU发来的数据包全部转发到外部网络中,并且从外部网络中抓取到达全部PANU的数据包再转发给PANU. 因此, PAN的实现的关键是在于如何把数据包在蓝牙网络和外部网络中互相转发. 让我们先搞清楚数据流, 发数据时的数据流如下:App--->PAN Driver--->PAN Profile--->BT Stack--->USB Driver--->Remote Device. 收数据时的数据流:Remote Device--->USB Driver--->BT Stack--->PAN Profile--->PAN Driver--->App. 当做为NAP时, PAN Profile会转发从PAN Driver来的数据, 如果这些网络包不是给NAP的那么就全部转发给用于访问外部网络的网卡, 同样, PAN Profile也会从访问外部网络的网卡上侦听数据, 如果是到达PANU的数据包就转发给相应的PANU.
这样看来, PAN的实现还是比较简单, 而难点就是在Windows平台上的异常情况的处理. 我就以BlueSoleil的异常处理为例, 这些异常情况有: 1.换Dongle. 2. BlueSoleil运行时拔插Dongle. 3. 有PAN连接时手动Reset(禁用并启用)蓝牙网卡. 4. 做为NAP并有连接时手动Reset物理网卡. 5. IP地址的实时通知.
下面是各个异常情况的解决办法:
以上是我在BlueSoleil项目中对PAN应用的一些心得, 此外, 再顺便说一下对目前BlueSoleil的PAN的不足. 从用户的使用习惯上来讲, 建立一个PAN的连接就相当于在一块实际的物理网卡上插入一根网线, 这个时候网络连接的状态才改变成为Connected, 而现在BlueSoleil的做法是只要启动一个PAN服务, 就把网络连接的状态设为Connected, 这会给用户造成一定的混淆, 而且可能会引起将来上层应用的设计.
转帖:http://rick-lei-zhao.blog.hexun.com/2002308_d.html