wince 蓝牙 学习 1


如何编译WinCE Bluetooth Stack并打开的默认LOG

1 WinCE Bluetooth Stack在哪里

以WinCE6.0为例,在文件夹/PRIVATE/WINCEOS/COMM/BLUETOOTH下。

2 如何编译

编译源码

从VS2005中进入命令行窗口,切换到/PRIVATE/WINCEOS/COMM/BLUETOOTH下,并执行Build –c(地球人都知道,呵呵)。

编译Dll

切换到PUBLIC/COMMON/CESYSGEN路径下(makefile就在这里,有兴趣可以看一下),运行sysgen btd –p,等待编译结束即可。

3 如何打开协议栈的LOG

最好的调试方法,莫过于编译一个Debug Version的协议栈代码,然后通过如下注册表配置的方式打开相关的Debug Zone来进行分析。

[HKEY_LOCAL_MACHINE/Software/Microsoft/Bluetooth/Debug]

"Mask"=dword:3 // file&uart

"Console"=dword:7fffffff // open all debug zone

有关Mask和Console的配置可以参考public/common/oak/inc/bt_debug.h中的定义,这里简单的列举一部分Debug Zone的定义:

#define DEBUG_ERROR 0x00000001

#define DEBUG_WARN 0x00000002

#define DEBUG_OUTPUT 0x00000004

#define DEBUG_VERBOSE 0x00000008

#define DEBUG_SHELL_ALL 0x00000030

#define DEBUG_SHELL_INIT 0x00000010

#define DEBUG_SHELL_TRACE 0x00000020

#define DEBUG_HCI_TRANSPORT_ALL 0x000000c0

#define DEBUG_HCI_DUMP 0x00000040

#define DEBUG_HCI_TRANSPORT 0x00000080

#define DEBUG_HCI_ALL 0x00000f00

#define DEBUG_HCI_INIT 0x00000100

#define DEBUG_HCI_TRACE 0x00000200

#define DEBUG_HCI_PACKETS 0x00000400

#define DEBUG_HCI_CALLBACK 0x00000800

#define DEBUG_L2CAP_ALL 0x000f0000

#define DEBUG_L2CAP_INIT 0x00010000

#define DEBUG_L2CAP_TRACE 0x00020000

#define DEBUG_L2CAP_PACKETS 0x00040000

#define DEBUG_L2CAP_CALLBACK 0x00080000

#define DEBUG_RFCOMM_ALL 0x00f00000

#define DEBUG_RFCOMM_INIT 0x00100000

#define DEBUG_RFCOMM_TRACE 0x00200000

#define DEBUG_RFCOMM_PACKETS 0x00400000

#define DEBUG_RFCOMM_CALLBACK 0x00800000

#define DEBUG_SDP_ALL 0x0f000000

#define DEBUG_SDP_INIT 0x01000000

#define DEBUG_SDP_TRACE 0x02000000

#define DEBUG_SDP_PACKETS 0x04000000

#define DEBUG_SDP_CALLBACK 0x08000000

#define DEBUG_TDI_ALL 0x00f00000

#define DEBUG_TDI_INIT 0x00100000

#define DEBUG_TDI_TRACE 0x00200000

#define DEBUG_TDI_PACKETS 0x00400000

#define DEBUG_TDI_CALLBACK 0x00800000

#define DEBUG_PAN_ALL 0x0000f000

#define DEBUG_PAN_INIT 0x00001000

#define DEBUG_PAN_TRACE 0x00002000

#define DEBUG_PAN_PACKETS 0x00004000

#define DEBUG_PAN_CALLBACK 0x00008000

#define DEBUG_AVDTP_ALL 0xf0000000

#define DEBUG_AVDTP_INIT 0x10000000

#define DEBUG_AVDTP_TRACE 0x20000000

#define DEBUG_AVDTP_PACKETS 0x40000000

#define DEBUG_AVDTP_CALLBACK 0x80000000

#define OUTPUT_MODE_DEBUG 0

#define OUTPUT_MODE_CONSOLE 1

#define OUTPUT_MODE_FILE 2

OK,现在就可以来分析和调试协议栈的代码了,至于分析到什么程度,就看对协议的理解了,呵呵。

附带说一句,Debug Version的协议栈可以编译到Release Version的Image中调试起来更加方便。

 

wince 蓝牙 学习 1_第1张图片

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

:最底层.就是上图蓝色部分.其中有射频规范,基带规范和链路管理层(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,USBsdiopnp设备,如果没有就根据注册表取默认的设备接口.最后被选定的接口会被安排到这里[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),包括SDPL2CAPLMPBaseband 互通(Intercom),无绳电话(Cordless Telephony),包括TCSSDPL2CAPLMPBaseband;传真(FAX),拨号网络(Dial-up Networking),耳机(Headset),包括SDP/RFCOMML2CAPLMPBaseband 局域网访问(LAN Access),包括TCP/IPPPPSDP/RFCOMML2CAPLMPBaseband 文件传输(File Transfer),同步(Synchronization),Object Push,含OBEXSDP/RFCOMML2CAPLMPBaseband

你可能感兴趣的:(BlueTooth)