http://www.eefocus.com/majianhui/blog/09-12/182434_16fbb.html
一个牛叉人的blog
最近做一个蓝牙通信的项目,搞软件的最怕的就是和硬件沾边哪怕一点点都觉得很迷茫!
做这个项目时遇到了一个问题
就是当手机和蓝牙模块建立连接后,用的是长连接模式,就是持续保持连接.手机这边作为客户端发起请求,蓝牙模块作为server相应并返回数据.
问题是如果client这边发送数据给server但是serve出于某种原因没有返回数据,而client并不知道server没有返回数据,仍执行read,就会阻塞.死到server写进数据,这样是不行的,怎么能解决这个呢,找了好长时间都没找到,不知道android里蓝牙这部分能不能用nio呢?这方面也没有找到,希望做过的高手们能指导下!!!!!!
目前用csr的bc04,bc04是从eeprom里读取pskey的,现在疑惑的是
1.通过bcsp用bcccmd修改pskey后存储到eeprom里吗?
2.如果pskey设置错误会不会影响bcsp的初始化呢?及三次握手
现在出现的现象是有时候pskey设置成功貌似存储到eeprom里,但是有时候就不行。
如果pskey里时钟设置错误貌似bcsp初始化就不正确,发送第一次握手的数据包后,有时根本候收不到蓝牙芯片返回的数据包,有时候收到的就是不争气的包甚至头尾都不是c0很奇怪!!!!!!!!!!!!!!!!!!!!!!!!!!!!
----转的
——对于蓝牙的无线接入过程控制器主要分为Standby与Connection两大状态。在这两大状态下又分为传呼(Page)、传呼扫描(Page Scan)、询呼(Inquiry)、与询呼扫描(Inquiry Scan)四大子状态;另外,传呼下有主机响应(Master Response)子状志,传呼扫描下有服务机响应(Slave Response)子状态,询呼扫描下有询呼响应(Inquiry Response)子状态。如图1所示,蓝牙组件可离开Standby状态而进入Page、Page Scan、Inquiry或Inquiry_Scan状态,然后在进入Connection状态。在一蓝牙Piconet中,Master运用Page或Inquiry与Slave建立连接的链路。若Master不知欲连接的Slave组件地址,便开始Inquiry程序来寻找Piconet中的Slave组件地址与其时钟;但若Master己知欲连接的Slave组件地址,则开启Page程序来寻找其它的Slave。
——在以下各节中将说明无线接入的程序,连接模式与接入控制。
二、接入(Access)程序
——在开始建立一连接的无线链路时,Master需要知道Slave的蓝牙组件地址。因此当Master蓝牙组件在Inquiry状态时,它运用Inquiry信息指示哪些蓝牙组件需要响应Inquiry,并收集所有响应Slave的蓝牙组件地址与时钟,在Inquiry状态的Master蓝牙组件继续在不同的FH频率传送Inquiry信息以寻找其它的Slave蓝牙组件。
——而一旦被发现的Slave蓝牙组件则规则性的进入Inquiry Scan状态以响应Inquiry信息。而其接收机则运用一匹配相关器(Matching Correlator)来搜寻Inquiry接入码(Access Code)。此搜寻时间将持续至16个FH频率的范围。若某一激活的(Wake-Up)Slave蓝牙组件可辨识Inquiry信息,它则进入Inquiry Response状态。在Standby状态时的蓝牙组件可利用其所有的资源来搜寻其它Inquiry Access Code;而在Connection状态时的蓝牙组件则可将其现有的资料链路连接处于省能模式以便来搜寻其它Inquiry Access Code。以上的Inquiry Scan程序可能会被预留的SCO时段所中断。
——在已知欲连接Slave的Device Access Code(DAC)时,Master则开启Page程序来寻找此Slave。在Page程序中,Master重复的用不同的FH频率来传送Slave的DAC以尝试连接(请参见图2)。Page程序的步骤如下。
——先以Slave的DAC来决定Page信号的FH频率序列。
——Master以预估的Slave时钟来预测Slave的Wake-Up时间与FH频率。
——在每一传送时段,Master顺序地发射两个不同的频率。
——在每一接续的接收时段,Slave的接收机,依据Page Scan使用的跳频频率,顺序的侦测两个相对应的接收频率。
——Page程序可能会被预留的SCO时段所中断。当Slave组件成功的接收了Master的Page信息,Master与Slave便展开一例行的响应来互换信息。而Master与Slave间成功的连接,在于使用由蓝牙组件地址(BD_ADDR)导出的同一频率接入码与同一FH频率,且Master与Slave的时钟需同步。
——以下描述响应状态各程序中的步骤。
——1.Slave Response状态:
——(1)Slave在接到来自Master的DAC后,则以Page Response所用的FH频率响应此DAC作为确认。
——(2)在传送响应信息后,Slave的接收机即开启并等待来自Master的FH同步(FHS)封包。
——(3)若Slave正确的接到此FHS封包,Slave便以Page Response所用的FH频率传回其DAC以作为确认。
——(4)Slave可自此FHS封包的内容来得知Slave时钟与Master时钟的差异。
——(5)Slave在修正此时钟差异后,即可进入Connection状态。
——(6)若Slave在进入Connection状态前,上述建立连接的步骤失败的话,则Slave回到Page Scan状态。
——在进入Connection状态后,由Master先传送一个POLL封包。若Slave未成功的接到此POLL封包,Master与Slave便分别各自回到Page与Page Scan的状态。
——2.Master Response状态
——(1)Master在接到Slave传回的响应信息后,即固定其现有的时钟,并且将其输入至Page FH频率选取方案中。
——(2)Master运用此选取的Page FH频率来传送FHS封包。此FHS封包含有所有建构频道接入码所需的信息。
——(3)在Master传送FHS封包后,即等待Slave的确认。
——(4)若没有收到Slave的确认,Master将以更新的时钟再送FHS封包。
——(5)若收到Slave的确认,Master则进入Connection状态,并且运用BD_ADDR来与Slave交换使用的FH序列。
——(6)在进入Connection状态后,Master开始传送一个POLL封包。
三、Connection模式
——在Connection状态中,Slave组件可停留在Active、Sniff、Hold、与Park 4个模式。以下分别说明之。
——1.Active模式
——(1)Active Slave侦测Master传向Slave的时段上有无封包。
——(2)为了保持Master与Slave间的同步,即使无信息需要传输,Master亦需要周期性的传送封包至Slave。
——(3)若Active Slave未被Master寻址,它可睡眠至下一个新的Master传向Slave的时段。
——(4)Active Slave可导出Master预定传向Slave的时段数目。
——2.Sniff模式
——(1)在此省能模式中,为了节省能源,Slave可减少侦测(Master传向Slave时段)活动的任务时间(DutyCycle)。
——(2)Master可经由链路管理(LM)协议发出一Sniff指令。此Sniff指令包含Sniff的长度与开始时钟差异。
——(3)若Slave正使用ACL链路连接,则Slave组件必须侦测每一Master传向Slave的时段。
——3.Hoid模式
——(1)使用ACL链路的Slave可被置于Hold模式。
——(2)在此Hold模式下运作的Slave仍保有其Active Member组件地址(AM_ADDR)。
——(3)在此模式下,Slave不提供ACL链路服务,但仍提供SCO链路服务。
——(4)因此释放出的能量可让Slave进行Paging Inquiring或加入另一Piconet。
——4.Park模式
——(1)在Park模式运作的Slave仍与Master保持同步。
——(2)在此模式下,Slave已放弃其AM_ADDR,而接受一Park Member组件地址(PM_ADDR)与一Access Request组件地址(AR_ADDR)。
——(3)在一Piconet中Park的Save将在规则性的时段后醒来活动以便再与Master保持同步。
——(4)Park的Slave规则性的后醒来活动,将查询Master使用的引导(Beacon)频道中是否有广播信息。
——上述的Park模式下的Beacon频道是由一个周期性传输的Beacon时段或一列周期性传输且等距的Beacon时段所构成,如图3所示。而其周期与时段数等参数则由Master经LM协议指令传至Park模式下的Slave。Beacon频道有下列的目的:经Beacon频道,Master可传输Slave与其同步所需的封包;Beacon频道可载送改变Beacon时段参数所需的信息;Beacon频道可载送Master的广播信息;Master可利用Beacon频道来重新激活Park模式下的Slave。
四、媒介接入控制(MAC)
——目前的蓝牙标准使用Master控制的TDD Polling方案来完成MAC。在ACL链路连接中,当某一Slave组件被在前一Master-to-Slave时段上的封包头端中之AM_ADDR所寻址时,则此Slave可在接续的出Slave-to-Master时段上传输信息。而Slave组件的SCO链路连接中,若在前一Master-to-Slave时段上的封包头端中之AM_ADDR并非指定另一Slave,则此Slave可在预留的Slave-to-Master时段上传输信息。而上述预留的SCO链路时段之建立则是透过各LM层中之协议指令来协商完成。
——在Park模式下的Slave组件,若在前一Master-to-Slave时段上接到Master广播封包指示,此Slave则可在Beacon接入视窗(Access Window)上送出接入要求信息,以要求恢复活动,其中信息的传输则占Slave-to-Master的一半时段(请参见图4与图5)。若有需要,在Beacon接入视窗上的时段也可用作Piconet中其它讯息的传输,如图6中的SCO链路信息。上述的Slave接入要求讯息中包含Master的DAC。
——由以上的说明,可知Master可藉送出LM协议中的恢复活动指令来重新激活Park模式下的Slave组件。
五、结论与未来的研究方向
——蓝牙目前的系统规格标准中,只定义了Master控制的Polling无线接入(Wireless Access)协议,以作为基频芯片的接入控制方案。由上述的说明中可知,此Polling协议自频道资源的使用与管理效益上仍有待改进。如何研发更有效益的MAC方案与Scheduling方法,且在封包的递送路径方面可结合IP连网来发展随意的(ad-hoc)递送协议(Routing Protocol)。而针对多媒体通信需求,新的蓝牙技术亦可依据服务品质(QoS)不同的要求来提供Bandwidth-on-Demand。
分享到:
相关推荐
在本项目中,"Unity源码 蓝牙通信 支持IOS和Android"是一个专注于通过蓝牙进行设备间通信的示例应用。这个项目可以帮助开发者了解如何在Unity中实现蓝牙通信功能,以便于在iOS和Android设备之间共享数据或控制游戏...
在"QT 蓝牙通信.zip"这个压缩包中,我们有两个QT工程,分别扮演服务器和客户端的角色,目的是实现通过蓝牙进行通信和聊天。这是一项实用的技术,尤其是在物联网(IoT)和移动设备交互的场景中。 首先,我们要理解QT中...
在Windows平台上进行蓝牙通信开发是一项复杂但又充满挑战的任务,特别是在使用C++和Microsoft Foundation Class (MFC)库的情况下。本项目"基于Windows的蓝牙通信"利用Visual Studio 2008作为开发环境,实现了扫描...
总的来说,这个Android应用通过集成蓝牙通信功能,实现了手机间的文件无线传输,展示了如何利用Android API与蓝牙设备交互。同时,也涵盖了权限请求、设备搜索、连接管理和数据通信等关键知识点。这样的应用在日常...
在讨论VC++2008开发Windows蓝牙通信程序时,首先需要了解的是,VC++2008是微软发布的一个集成开发环境(IDE),主要用于开发Windows应用程序。它提供了包括Visual C++在内的各种开发工具。而蓝牙通信,作为一种无线...
嵌入式环境下的蓝牙通信系统软件设计与实现是一项复杂而精细的工作,涉及到多个技术领域,包括嵌入式系统、蓝牙协议栈、硬件接口以及软件工程方法。本文将深入探讨这一主题,详细介绍相关知识点。 首先,我们需要...
在IT领域,尤其是在移动设备和桌面系统的交互方面,蓝牙通信技术扮演着重要的角色。本教程主要探讨的是如何利用Java在PC端建立一个服务端,并与Android设备进行蓝牙通信,实现多设备同时连接和数据传输的功能。 ...
在Android平台上进行蓝牙通信是一项常见的任务,特别是在物联网(IoT)和移动设备交互的应用中。本文将深入探讨如何在Android中实现蓝牙通信,基于提供的"android蓝牙通信实例",我们将详细解析这一过程。 首先,我们...
在本文中,我们将深入探讨基于STM32F103微控制器的蓝牙通信模块。STM32F103是意法半导体(STMicroelectronics)生产的高性能、低成本的ARM Cortex-M3内核微控制器,广泛应用于各种嵌入式系统设计,尤其是物联网(IoT)...
"C#开发.NET CF 蓝牙蓝牙通信模块" 在 Windows Mobile 软件开发中,.NET 正扮演着日益重要的角色,我们已经可以看到很多用.NET CF 开发的软件,这些软件涉及到了日常应用的方方面面。在智能设备的软件开发中,无线...
1. **蓝牙APIs和库**:C#中实现蓝牙通信通常会依赖于.NET Framework或.NET Core提供的APIs,例如`System.IO.Ports.SerialPort`类,尽管它不是专门设计用于蓝牙通信,但可以通过配置COM端口来实现。另外,还有第三方...
【标题】: "基于STC52单片机的蓝牙通信app" 在现代电子设备的交互中,无线通信技术扮演了重要角色,其中蓝牙通信因其低功耗、简单易用的特点,广泛应用于移动设备和嵌入式系统之间。本项目专注于通过蓝牙连接,构建...
在Android平台上进行蓝牙通信是一项常见的任务,特别是在物联网(IoT)和设备间数据交换的应用中。这个"android蓝牙通信源码"提供了一种实现方式,它已经被验证可以在两个已配对的Android设备之间正常工作。这里我们将...
Unity用于蓝牙通信的插件,支持Android,ios等平台,Android平台支持BT蓝牙,BLE蓝牙
在本文中,我们将深入探讨如何在STM32上实现蓝牙通信,以及相关的关键知识点。 首先,理解STM32的基础是至关重要的。STM32家族包括多种型号,它们具有不同的内存大小、外设接口和性能等级。这些微控制器广泛应用于...
在Android平台上进行蓝牙通信是一项常见的任务,特别是在物联网(IoT)应用中,设备间的无线通信至关重要。本示例将详细讲解如何在Android上构建一个蓝牙通信系统,包括客户端和服务端的实现。 首先,理解蓝牙通信的...
### 蓝牙通信协议详解:深入理解RFCOMM #### 引言 在现代通讯技术中,蓝牙作为一项无线技术标准,广泛应用于各种设备之间的短距离数据交换。蓝牙通信的核心在于其通信协议,其中RFCOMM协议尤其关键,它为传统串口...
在IT领域,尤其是在移动设备与桌面系统的交互中,蓝牙通信是一种常见的无线数据传输方式。本教程将详述如何实现PC(使用Eclipse IDE)与Android设备(使用Android Studio,简称AS)之间的蓝牙通信,主要基于串口协议...
在Android平台上,蓝牙通信是一种常见的无线数据传输方式,尤其适用于设备间的小范围、低功耗通信。本项目“蓝牙通信android程序”旨在实现两台Android手机之间的双向对话通信。通过这个程序,用户可以发送文本信息...
在Android平台上,蓝牙通信是一种常见的数据传输方式,尤其在物联网(IoT)设备和移动设备之间。本项目“简易的安卓蓝牙通信demo”提供了一个基础的实现,旨在帮助初学者理解如何在Android应用中集成蓝牙功能。以下是...