WinCE蓝牙驱动

 之前没有摸过蓝牙,这回的项目里面有蓝牙模块.而我目前对蓝牙只知道的有:1.我们的设计里蓝牙模块是连接在串口上的.2.蓝牙不是蓝色的牙齿.呵呵, ,我不得不提前开始接触一下蓝牙协议栈.粗看起来还挺复杂庞大的.单蓝牙组织公布的规范1.1多达1084页.先看张图:

东西很多,先分类吧!从底向上看,蓝牙的协议和规范可以分这些大类:

一:最底层.就是上图蓝色部分.其中有射频规范,基带规范和链路管理层(Link Manager Protocol).一个好消息是,不要管这部分内容.因为这部分都在蓝牙模块里面实现了.可能需要稍微了解下的就是链路管理协议主要是负责认证,加密,链路管理和控制这些功能.还有一些有趣的信息,一个主设备最大和7个从设备建立链接,从设备之间不能互通.主设备到从设备的最大数据传输速率为723.2kbps,反向57.6kbps.也可以配置为双向433.9kbps.

二:接口层.协议栈和硬件之间的接口.在WinCE中,它也包括了3个部分:第一,HCI(Host Controller Interface),第二,Bluetooth Universal Transport Manager,第三,HCI Transport layer主机控制接口层.第一层向上提供一个接口,第三层是和硬件的接口,比如连接到Host的是串口,那第三层就是一个串口的抽象的传输层,那为什么还需要第二层呢?第二层叫统一传输管理,是因为WinCE是一个开放的平台,它也不知道蓝牙究竟是连接串口,usb口,sdio甚至一些pcmcia等其他的pnp设备,等等,而且作为HCI的上层也不想知道你用什么物理接口.于是它抽象出来这么一个东西来统一管理.简单说就是大一统所有的接口了,它先去扫描PCMCIA,USB和sdio等pnp设备,如果没有就根据注册表取默认的设备接口.最后被选定的接口会被安排到这里[HKEY_LOCAL_MACHINE/Software/Microsoft/Bluetooth/HCI]

第二和第三部分的代码在WINCE500/PUBLIC/COMMON/OAK/DRIVERS/BLUETOOTH/TRANSPORTS/目录下面,那个univ目录的就是Universal Transport Manager,其他是各个具体的Transport layer的实现.

刚才说到如果没有扫描到pnp的蓝牙设备就使用默认的,这个默认的接口在哪里?其实也是根据注册表来找接口,看看下面的内容吧:1代表优先级别.name=COM2,baud=1c200,这很明显,就是以115200的波特率打开COM2口了.

IF BSP_BLUETOOTH_BUILTIN_UART

[HKEY_LOCAL_MACHINE/Software/Microsoft/Bluetooth/Transports/BuiltIn/1]

    "driver"="bthuart.dll"

    "flags"=dword:4

    "name"="COM2:"

    "baud"=dword:1c200

    "resetdelay"=dword:1388

ENDIF


细说HCI

对于HCI接口,它向上提供了一个访问底层硬件的统一接口.比如提供给l2cap.其实不用关心HCI内部怎么实现的,只要懂得怎么使用就可以,更进一步,如果所有应用都是在l2cap上的,连HCI接口也没有必要知道.比如我们的应用只是基于winsock,rfcomm,或者obex,这些都是l2cap的上层,就不要关心HCI的上层接口.它是透明的,当它不存在好了.

如果好奇HCI的上层(比如l2cap)如何使用hci接口?其实是使用HCI_EstablishDeviceContext()这个函数来获得接口,并注册相关回调函数和事件响应函数.这些模块源代码都在WINCE500/PRIVATE/WINCEOS/COMM/BLUETOOTH/目录里面.

对于一些特殊的应用,比如你有一些蓝牙耳机这样的应用,就不是通过l2cap了,那么就要从hci层扩展.还是使用同样的接口方法,只是参数不同了.耳机这样的应用是要处理的是同步的连接SCO数据包,于是透过参数告知hci,将sco数据发给自己来处理.具体来说就是第2个参数BTH_CONTROL_ROUTE_BY_LINKTYPE,第5个参数BT_LINK_TYPE_SCO,以次来调用HCI_EstablishDeviceContext().


三:协议层.这一层包括L2CAP,SDP,RFCOMM.首先要说L2CAP,之前已经提及这个协议,它建立在HCI上面.全名是逻辑链路控制和适应协议(Logical Link Controller and Adaption Protocol)看看它的功能:分发数据给更高层,数据包分段和重组...看过tcpip协议栈,感觉这一层像ip层.如果想基于L2CAP上做第3方扩展应用,就要知道如何使用L2CAP接口.其实就是使用L2CAP_EstablishDeviceContext()来获得L2CAP层的接口,这是不是和HCI的接口太像了?接下来是SDP,这是一个服务发现协议(service discovery protocol)蓝牙设备是要组网的,就是用这个协议来寻找和定位其他蓝牙设备.另外一个RFCOMM是模拟串口协议,是ETSI TS07.10标准的子集.没有听过这个标准.反正,这个模块的作用是使得上层就像操作串口一样使用蓝牙.


    蓝牙协议栈的实体究竟在哪里?WinCE实现了2个动态链接库来实现,一个是btd.dll另外一个是btdrt.dll.由device.exe加载.btd.dll包含了协议栈各个层.而btdrt.dll提供了一组api来访问各个层.btdrt.dll其实是一个runtime库


四:应用层.摘抄一段:

蓝芽协议栈的最上部是各种应用模型(Profile)。其中较典型的有服务发现 (Service Discovery Application),互通(Intercom),无绳电话(Cordless Telephony),传真(FAX),拨号网络(Dial-up Networking),耳机(Headset),局域网访问(LAN Access),文件传输(File Transfer),同步(Synchronization),Object Push等。各种Profile从协议栈中选取不同的协议组合来完成特定的功能。 下面列出各种Profile需要的协议组合,协议排列顺序按照从上到下的顺序: 服务发现(Service Discovery Application),包括SDP、L2CAP、LMP、Baseband; 互通(Intercom),无绳电话(Cordless Telephony),包括TCS、SDP、L2CAP、LMP、Baseband;传真(FAX),拨号网络(Dial-up Networking),耳机(Headset),包括SDP/RFCOMM、L2CAP、LMP、Baseband; 局域网访问(LAN Access),包括TCP/IP,PPP,SDP/RFCOMM,L2CAP,LMP,Baseband; 文件传输(File Transfer),同步(Synchronization),Object Push,含OBEX,SDP/RFCOMM,L2CAP,LMP,Baseband。

 

From: http://hi.baidu.com/9562512/blog/item/9dbde700449e758ee950cd9f.html

 

==============================================================================

WinCE上的蓝牙开发

CE上的蓝牙开发,分为驱动和应用。CE下的蓝牙整体比较复杂,有提供一些组件可以直接使用,相对于在mobile5.0 上面还是麻烦多了,一些蓝牙的应用,对于我们这些不是专业做蓝牙方面的人员来说,难于入手。跌跌碰碰总算也是实现了蓝牙的一些基本功能,满足蓝牙的基本应 用(CE5.0下通过PDA上的蓝牙和GPS蓝牙通信,蓝牙设备间文件传输等)。在完成蓝牙模块,做的记录不多,把以前一些记录整理上来,作为CE上蓝牙开发参考。

RFCOMM (Serial Cable Emulation Protocol) 是蓝牙的TS07.10协议的适配器。这服务是基于com端口模拟工具和源于点对点协议。多路技术和流控基于设备和应用程序也在这里执行。
L2CAP (Logical Link Control and Adaptation Protocol) 是底层基于蓝牙通信多路技术协议的连接。L2CPA不执行流控。它依赖蓝牙硬件提供的一个可靠的设备对设备基带链路。
  CE下的蓝牙
蓝牙设备驱动作为一个流设备驱动被执行,它被Device.exe加载。蓝牙协议栈包含在微软的PB底下。最后的应用程序和包依赖于OEM和设计模板。这协议栈是有标准组件的,所以它可以使用作为一个多用途的软件栈,被默认连接,或它可以被分开使用。(可以自己定制?)
  默认连接在下面的两个DLL
  Btd.dll是蓝牙设备驱动包含所有的协议层。它被device.exe加载,被AFD使用,提供给TDI。执行在它自己的COM虚拟端口。通过IOCTLs来进行控制。
  Btdrt.dll是一个实时的thunk DLL,提供标准应用程序接口给用户编程。通过IOCTL访问驱动和提供回调函数。
  每一层都被直接连接入设备驱动,包括HCI传输,dll连接后,是不能被代替和扩展的,因为协议栈层APIs是不能被标准输出的。
  然而,每一步连接都是用户控制的,每一层都作为一个库提供出来,任何一层都可以被代替,因此方便以后的更新。大部分可以使用来创建一个设备,有一个可更换的HCI传输,所以传输支持可以被安装为特殊的蓝牙卡。
  在HCI,每一层都可以被公开。扩充可以被写实现SCO,ACL协议是类似L2CAP,和控制器管理命令。
  每层都允许多接口去设置它,每个上层的接口可以限制一个子集的连接权力,RFCOMM和SDP必须只连接在它们 自己的PSM(protocol/service multiplexer);SCO栈也只是操作CSO连接;自定义的软件栈也只能影响一个定义好的蓝牙设备连接。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值