我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 栈组合 >

WINCE蓝牙学习一---WINCE60蓝牙协议栈

归档日期:06-28       文本归类:栈组合      文章编辑:爱尚语录

  在蓝牙系统中,为了支持不同应用,需要使用多个协议,这些协议按层次组合在一起,构成了蓝牙协议栈.蓝牙协议栈是蓝牙技术的核心组成部分,它能使设备之间互相定位并建立连接,通过这个连接,设备间能通过各种各样的应用程序进行交互和数据交换

  蓝牙协议栈是蓝牙技术的核心部分,它能使设备之间相互定位并建立连接,通过这个连接,设备之间能够哦通过各种各样的应用程序进行交互和数据交换。

  上面的图展示了蓝牙协议栈中的支持层,下面从上到下依次概要学习这些组成部分的功能。

  OBEX(Object Exchange,对象交换)是一种高效和紧凑的二进制通信协议,它使广泛的设备以一种简单、有效的方式自发地交换数据,其中支持的设备很广泛广泛,例如PC,PDA,电话,摄像头,自动答录机,计算器,数据采集器,手表等等。

  OBEX协议构建在蓝牙和IrDA协议的上层,它最初作为a push or pull的应用。OBEX是由红外数据协会(IrDA)制定用于红外数据链路上数据对象交换的会话层协议.蓝牙SIG采纳了该协议,使得原来基于红外链路的OBEX应用有可能方便地移植到蓝牙上或在两者之间进行切换,广泛应用在蓝牙设备中,用来商业卡、数据甚至是应用程序,

  OBEX是一种高效的二进制协议,采用简单和自发的方式来交换对象.它提供的功能类似于HTTP(超文本传输)协议,但它不需要HTTP服务器所需要的资源,这样使OBEX非常适用于资源有限的低端设备。在假定传输层可靠的基础上,采用客户机.服务器模式.它只定义传输对象,而不指定特定的传输数据类型,可以是从文件到商业电子贺卡、从命令到数据库等任何类型,从而具有很好的平立性。

  Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。,WINCE的Windows Sockets(Winsock)基于大家熟悉的加州大学伯克利分校的套接字接口来规定了自己的可编程接口。它包含了一组扩展设计,以便充分利用WINCE的消息驱动机制进行编程,在WINCE4.1及之后版本的系统中支持Winsock2.2,它提供了更容易访问多个传输协议的办法。

  我们能够通过使用WINCE的COM端口模拟器(emulator facility)来在两个蓝牙设备之间创建一个连接,COM端口模拟器位于蓝牙协议栈最高层并提供了基于虚COM口来访问RFCOMM,它没有导出堆栈接口但提供一个API层来打开远程蓝牙设备的连接。当COM端口模拟器存出现在蓝牙协议栈中,可以创建一个虚拟服务器或是客户COM端来接收传入,或是创建传出的RFCOMM连接。

  WINCE蓝牙允许我们创建一个微微网,根据蓝牙协议你,一个微微网中有一个主设备和最多7个从设备,下面引申对微微网概念的学习:

  蓝牙系统采用一种灵活的无基站的组网方式,使得一个蓝牙设备可同时与7个其它的蓝牙设备相连接。基于蓝牙技术的无线接入简称为BLUEPAC(BluetoothPublic Access),蓝牙系统的网络结构的拓扑结构有两种形式:微微网(piconet)和分布式网络(Scatternet)。

  一个蓝牙网络由一个主设备和一个或多个从属设备组成,它们都与这设备的时间和跳频模式同步(以主设备的时钟和蓝牙设备的地址为准)。每个独立的同步蓝牙网络就被称为一个微微网(piconet)。

  在每个微微网中,一组伪随机调频序列被用来决定79个跳频信道,这个调频序列对于每个微微网来说是惟一的,由主设备地址和时钟决定。信道分成时隙,每个时隙相应有一个调频频率,通常调频速率为1600跳/s。

  微微网是通过蓝牙技术以特定方式连接起来的一种微型网络,一个微微网可以只是两台相连的设备,比如一台便携式电脑和一部移动电线台连在一起的设备。在一个微微网中,所有设备的级别是相同的,具有相同的权限。蓝牙采用自组式组网方式(Ad-hoc),微微网由主设备(Master)单元(发起链接的设备)和从设备(Slave)单元构成,有一个主设备单元和最多7个从设备单元。主设备单元负责提供时钟同步信号和跳频序列,从设备单元一般是受控同步的设备单元,接受主设备单元的控制。

  微软推荐我们使用Winsock API函数来创建连接,在两个蓝牙设备之前,我们必须要先有下面的信息:

  ⑴获取到要连接的蓝牙设备的地址,此地址保存在BT_ADDR类型的变量中。

  此指定要创建的虚拟COM端口的属性,并保存了蓝牙的特定信息,比如通道和蓝牙地址信息。

  对于一个服务器端口,需要设置此结构体的flocal和channel,比如:

  前面的例子通过设置flocal为TRUE来配置为一个服务器端口,这可使一个服务器COM端口在指定的通道能接收传入的连接。为避免冲突,当我们选择服务器通道时,推荐我们设置channel为RFCOMM_CHANNEL_MULTIPLE(0xfe),这可使RFCOMM使用下一个有效的通道。

  对于一个客户端端口,需要设置此结构体的device、channel和uiportflags,如下:

  前面的例子中,device赋值为一个保存了远程设备地址的BT_ADDR类型变量,用来发起一个RFCOMM层之上的远程连接。

  如果服务器通道未知,客户端能够在uuidService指定客户端的UUID,在这种情况下根据此UUID,会自动执行一个SDP查询来获得远程设备使用的目标信道号。

  此例子指定端口类型为COM、端口号和设备驱动dll的名称这些参数来注册设备,并且传递PORTEMUPortParams结构体变量。此函数用虚拟COM来注册蓝牙协议栈。

  创建一个以null结尾的字符串来保存COM端口的名称,此字符串必须在端口名包含一个冒号,比如:

  对于客户端端口,只有在以可读或可写方式调用CreateFile来打开设备时,才能创建物理连接。当第一个可读或可写的handle关闭的时候,服务器和客户端的物理连接都会被终止。

  每个被创建的虚拟端口最多可有多大4个打开句柄(open handle),每个句柄维护它自己的通信时间mask,如果以一个0访问掩码(accessmask)打开文件,它只能被用于WaitCommEvent函数,但不能用于ReadFile 和WriteFile函数。

  一旦COM端口被创建,它的功能相当于一个串口,也就可以使用串口的API来串口此端口。

  WINCE为我们提供了便利的函数来建立蓝牙连接,其中就包括建立蓝牙的虚拟串口连接.利用虚拟串口连接,我们可以方便的把以前利用串口连接传输数据的程序改为蓝牙无线传输的程序.这个过程只需要一个步骤,就是在服务端和客户端注册虚拟串口.        RegisterDevice这个函数就完成了这个功能.通过这个函数建立了串口之后,就可以像操控以往的串口一样用CreateFile,read,write这些系统API来读写

  WINCE中的COM端口模拟器允许我们通过RFCOMM通道创建虚拟串口,它主管拨号和局域网连接,COM端口模拟功能包含在Btd.dll中。

  SDP(Service Discovery Protocol)是一个蓝牙服务发现协议啊,它用来发布和发现运行于蓝牙协议栈顶部的服务,SDP客户端模块功能体现在Btdrt.dll中,SDP服务器模块功能体现在Btd.dll中。Btd.dll是蓝牙设备驱动包含所有的协议层,它被device.exe加载,被AFD使用,提供给TDI。执行在它自己的COM虚拟端口。通过IOCTLs来进行控制。

  Btdrt.dll是一个实时的thunk DLL,提供标准应用程序接口(API)给用户编程。通过IOCTL访问驱动和提供回调函数。

  提供应用程序在蓝牙环境中特定的涵义来发现哪个服务可用和决定那些可用服务的特征。 SDP 定义了一个蓝牙客户机是怎样可用蓝牙服务器服务和它们的特征的。这些协议定义了客户怎样能够寻找基于特定属性而不让客户知道可用服务的任何内容的服务。

  Service Discovery Protocol服务发现协议,蓝牙中定义的一个协议,主要用来提供一个方式,能够让应用程序发现和使用有关服务,并且能够知晓这些服务的特点。

  SDP 客户,从服务记录中获取信息的客户,通过发出SDP请求,由SDP 服务器进行维护。

  SDP服务器,用于维护服务记录清单,这些服务记录描述了同服务器相关联的服务的特性。

  SDP对话,在SDP客户和SDP服务器之间的信息交换。信息的一次交换称为SDP transaction.

  安全模式2,在信道通信建立之前,不设定安全步骤,允许应用程序使用不同的和可改变的安全策略,尤其适用于同时运行不同的安全策略的应用程序的场合。属于服务级的安全模式。

  安全模式3,在LMP level层的链路建立完成之前,就已经规划好安全步骤。属于链路级的安全模式。

  RFCOMM(SerialCable Emulation Protocol)一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议,它作为COM端口模拟器基础提供服务。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号等,为上层业务(如传统的串行线缆应用)提供了传送能力。

  RFCOMM是一个简单传输协议,其目的为了解决如何在两个不同设备上的应用程序之间保证一条完整的通信路径,并在它们之间保持一通信段的问题。

  RFCOMM是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。RFCOMM协议提供对基于L2CAP协议的串口仿线。可支持在两个BT设备之间同时保持高达60路的通信连接。

  PAN(PersonalArea Network)个人局域网profile定义了使用规程,以支持基于IP的标准网络服务,此网络服务部署在蓝牙传输层,PAN在蓝牙的基础上实现了一个网络接口,下图是PB6.0下PAN部分包含的组件:

  L2CAP(LogicalLink Control and Adaptation Protocol)逻辑链路控制和适配协议是一种实现多路复用且基于连接的蓝牙通讯的低层协议,L2CAP没有实现流控,它依赖于蓝牙硬件提供的可靠的device-to-device基带连接。L2CAP建立在HCI之上,其功能是分发数据给更高层、数据包分段和重组等等,L2CAP层包含在Btd.dll中。

  HID(HumanInterface Device,人机接口设备)profile(应理解为属性)定义了使用HID(比如基于蓝牙连接的键盘)的协议、步骤和应用范围。包含了蓝牙堆栈的设备使用SDP来发现HIDs,且此设备的蓝牙协议栈必须包含:

  HID在被激活之前,它必须发送设备信息(描述符)给含有class驱动的宿主机(比如我们的WINCE蓝牙设备)。Class驱动使用这个设备描述符来确定设备特性,目的是为了使能HID对WINCE蓝牙设备的控制。在HID和WINCE蓝牙设备建立蓝牙连接之后,HID基于L2CAP连接,能够和calss驱动通信,实现了对WINCE蓝牙设备的控制。

  ①auth:决定了蓝牙连接是否进行身份验证,0表示disable身份认证,1表示enable身份验证(默认)。此项是可选择的,如果设置为0,可能导致潜在的安全风险。

  ② encryption:决定蓝牙连接是否加密,0表示不加密,1表示加密(默认)。此项是可选择的,如果设置为0,可能导致潜在的安全风险。

  ③active:决定HID当前是否激活和能能够接收HID传入的连接请求,0表示不激活HID,表示HID当前被激活(默认)。

  HCI(HostController Interface,主控制器接口)提供了统一的接口用于访问蓝牙硬件,负责控制器管理、链路建立和维护,HCI层包含在Btd.dll中。在初始化序列中,HCI创建读和写线程,建立和蓝牙传输的连接,执行复位和读取蓝牙模块buffer的大小(read of device buffer size),然后进入初始化状态,并准备好接收客户端。

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

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

  为什么需要蓝牙统一传输管理器呢?是因为WinCE是一个开放的平台,它也不知道蓝牙究竟是连接串口、usb口、sdio甚至一些pcmcia等其他的pnp设备等等,而且作为HCI的上层也不想知道你用什么物理接口。于是它抽象出来这么一个东西来统一管理,简单说就是大一统所有的接口了,它先去扫描PCMCIA,USB和sdio等pnp设备,如果没有就根据注册表取默认的设备接口。最后被选定的接口会被安排到这里[HKEY_LOCAL_MACHINE\Software\Microsoft\Bluetooth\HCI],比如:

  HCI传输层传递HCI命令给蓝牙硬件(也就是蓝牙模块),HCI传输被设计用来抽象和简化蓝牙堆栈与控制器(这里指蓝牙模块)的物理通讯,WINCE的传输驱动支持使用UART、USB、SDIO和BCSP等接口的蓝牙模块。此层只需要实现少数几个函数,概括为open、read、write、close和两个用于bookkeeping(统计)的函数,其中read和write是阻塞的,蓝牙堆栈使用这些函数来发送蓝牙命令与数据包,和接收数据包与事件,这些函数在bt_hcip.h中定义,比如:

  除了HCI传输层之外的其它层,都是以一个单独的整体实现的,它们通过表的回调的方式向上和下层导出它的接口,并且这些接口已经定义好。除了这些接口,蓝牙协议栈中的各个部分没有其他的联系,每一层是可替换的。

  由此可见我们需要实现的就是HCI Transport Layer,也就是开发此层的那些函数

  最近在研究 WinCE 设备与 Android 手机之间的连接问题,通过 WIFI 等无线/有线网络,是比较简单的方法。但需要车机支持 WIFI、且有 WIFI 热点才行! 通过 USB 是现在比较常论坛

  插入东芝wifi sd卡,实现跟手机联网,有没有技术达人搞个wifi投屏程序? 本人不是搞技术的,简单想法:android手机有无线投屏功能,搞个程序放wifisd卡上,接收手机投过来的影音数据、读取论坛

  在控制面板, 找不到bluetooth的设备属性, 据说是导航仪厂家出厂的时候把蓝牙功能限制了, 有没有办法打开呢?论坛

  原文地址::相关文章1、WinCE蓝牙驱动----博文来自:xqhrs232的专栏

  这几天在做wince下的蓝牙开发,经过一番资料搜索之后发现了很多有用的帖子和经验,但是经过实际验证发现问题多多,首先就是一个wince和mobile不分的误区,很多API和库wince上有而mobil...博文来自:宋金时的专栏

  Wince中添加蓝牙设备,蓝牙接口可能有多种,MS已经提供了CSR,UART,USB,SDIO的。以下将会简单说说蓝牙设备的配置。  CSR的配置和UART的配置相似。UART就是利用串口来连接蓝牙...博文来自:bulreed的专栏

  随着WinCE6.0R2的发布,关于WinCE的博文与技术资料也越来越多,这不免让人感到欣喜,尤其是在经历了WinCE5.0或WinCE6.0模拟器连接的各种失败之后。感谢爱好者与志愿者们发布了他们编...博文来自:易道

  过去为了方便的把手机屏幕投射到电脑上,使用过Teamviewer,ApowerMirror等软件,但是速度和质量均不理想,也不是我想要的官方形式。这里我要推荐的是Andoird系统自带的无线显示功能,...博文来自:进击的奥利弗 IO/Fox

  不知道大家对无线同屏技术有多少了解,当这种技术普及的时候,我想我们的工作与生活又会方便很多吧!下面是目前三种主流同屏技术的介绍:目前这种将终端信号经由WiFi传输到电视、电视盒的技术有三种:DLNA、...博文来自:MingChao_Sun

  【转】wince蓝牙驱动(1)下面是WinCE中蓝牙协议栈的架构图:可以看到,HCI传输层以上的协议层全部由WinCE实现了,所以蓝牙模块只需要实现了基带层和链路管理层,并提供HCI传输接口给WinC...博文来自:carrie0728的专栏

  WinCE下打开与关闭蓝牙在WinCE下打开与关闭蓝牙非常的简单(只是一个API的调用);WinCE下打开与关闭蓝牙及判断蓝牙状态所用API如下:1.状态定义枚举enumBTH_RADIO_MODE{...博文来自:wince--linux的专栏

  不要那些第三方封装好的dll实现的代码,就用最原始的方法实现搜索蓝牙连接蓝牙设备,因为设备有可能是打印机之类的东西,所以还有个虚拟Com串口的需求。求大神给资料!!!!论坛

  [转]wince蓝牙  上面是WinCE中蓝牙协议栈的架构图:     可以看到,HCI传输层以上的协议层全部由WinCE实现了,所以蓝牙模块只需要实现了基带层和链路管理层,并提供HCI传输接口给Wi...博文来自:csu_yang的专栏

  1.OBEX客户端:连接是由OBEX客户端向OBEX服务端发起的,下面的命令可以用来建立和释放这个连接。Connect方法:在OBEX层上由客户端发起向服务器端请求建立一个连接。在这之前可以先调用IO...博文来自:AgentAI的专栏

  为一个新的硬件设备定制WinCE6.0操作系统,一般需要完成以下几个主要步骤:1.针对特定的硬件设备创建板级支持包(BoardSupportPackage缩写为BSP),BSP必须包括BOOTLOAD...博文来自:梦幻冰舞

  在学习的过程中一直有疑问,为什么蓝牙技术突然就产生了呢?蓝牙技术的目的是什么呢?蓝牙技术相对于它所替代的技术存在什么样的优势和劣势呢?蓝牙技术都做了些什么呢?随着我们周围电子产品的增多电子产品之间的信...博文来自:fanfan

  【前言】回老家了,进入新公司第一个任务就是学习如何做WinCE嵌入式开发。由于给我新配的PC机自带的是win764位系统,原开发人员都是用的32位XP,所以搭建环境时也没有人能助我一臂之力。经过一步步...博文来自:幸福官的博客

  最近,工作中需要在手持pda设备上开发一款库存软件,手持设备上安装的wince的系统,所以要进行wince开发。开发环境硬件平台用的是杭州xxxx公司开发的pda终端设备,该设备系统版本为wince6...博文来自:csucoderlee的专栏

  现在要做蓝牙,但什么都不懂,请问各位前辈谁有资料或经验分享下,谢谢。在下无以为报。仅贡献一点小分待笑纳!论坛

  WinCE自学一周心得体会(WinCE蓝牙连接打印机)                 各位大神们,看见小弟写的博客可不要笑话,小弟也是第一次写博客,初来乍到多多指教,本人也是还没毕业的学生,在一家公...博文来自:的博客

  相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...博文来自:杨威的博客

  本帖只谈技术实现,首先我们自己来编译一个比特币客户端吧, 技术讨论,欢迎大家入伙(注明:csdn)。...博文来自:开心乐源的专栏

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer...博文来自:kongwei521的专栏

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  mybatis简单小巧易于上手,方便浏览修改sql语句博文来自:努力+坚持,而且还很年轻

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。   在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 (...博文来自:朱小厮的博客

  我们在做项目的时候有时候需要给图片添加水印,水寒今天就遇到了这样的问题,所以搞了一个工具类,贴出来大家直接调用就行。/** * 图片工具类 * @author 水寒 * 欢迎访问水寒的个人博客:...博文来自:水寒

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  1. 规则引擎面临的问题:业务规则的实现大部分是由开发人员来实现的 业务规则需要业务分析人员能够阅读和理解 业务规则的可读性和用户的友好性都不太好2. DSL领域特殊语言DSL == Domain...博文来自:哎幽的成长

  nginx 是个轻量级的Web服务器,比Apache不差博文来自:老徐2014

  若是研究区在中国,则在地理空间数据云有中国区合成好的数据,直接下载用即可。数据格式为TIF。坐标为WGS84,不用再转换投影。下载网址为:博文来自:hengcall的博客

本文链接:http://mezzomagazine.com/zhanzuhe/118.html