蓝牙无法进行通信通信有没有使用HTTP

大家都知道相比传统蓝牙无法進行通信,蓝牙无法进行通信低功耗(BLE)最大的突破就是加大了对广播通信(Advertising)的支持和利用本文将从技术的角度,分析和理解BLE协议中囿关广播通信的定义和实现

注1:之前的蓝牙无法进行通信协议分析文章(如“”),偏向于从横向、从大而全的角度介绍蓝牙无法进荇通信协议,以便让大家有一个整体的认识而从本文开始,我们会收敛到一个个的功能点上以功能为出发点,从纵向的角度游走于藍牙无法进行通信协议的各个层次中,以加深对蓝牙无法进行通信协议的理解进而达到融会贯通的目的。

在BLE协议中广播通信主要有两類使用场景:

1)单一方向的、无连接的数据通信,数据发送者在广播信道上广播数据数据接收者扫描、接收数据。

后续的分析将围绕這两个使用场景展开。

在BLE协议中和广播通信相关的协议层次比较简单,主要包括:

LL(Link Layer)位于最底层负责广播通信有关功能的定义和实现,包括物理通道的选择、相关的链路状态的定义、PDU的定义、设备过滤(Device Filtering)机制的实现等

HCI负责将LL提供的所有功能,以Command/Event的形式抽象出来供Host使鼡。

GAP负责从应用程序的角度抽象并封装LL提供的功能,以便让应用以比较傻瓜的方式进行广播通信当然,这不是必须的也就是说,我們可以在没有GAP参与的情况下进行广播通信。

在某一个时刻参与广播通信的BLE设备,从LL的角度看可以处于如下三种状态的一种:

Advertising,数据發送方周期性的发送广播数据;

Scanning,数据接收方扫描、接收广播数据;

Initiating,连接发起方扫描带有“可连接”标志的广播数据,一旦发现则发起连接请求(都是由Link Layer自动完成,不需要Host软件参与)

根据应用场景的不同,处于不同状态的BLE设备可以发送不同类型的PDU(Packet Data Unit),具体洳下

广播通信中,传输的PDU有如下的格式:

PDU Type指示PDU的类型,具体可参考后面的介绍

和ADV_IND类似,但不可以被连接不可以被扫描
和ADV_IND类似泹不可以被连接可以被扫描

有关广播通信的PDU类型,总结如下:

1)如果只需要定时传输一些简单的数据(如某一个温度节点的温度信息)后续不需要建立连接,则可以使用ADV_NONCONN_IND广播者只需要周期性的广播该类型的PDU即可,接收者按照自己的策略扫描、接收二者不需要任何額外的数据交互。

2)如果除了广播数据之外还有一些额外的数据需要传输,由于种种原因如广播数据的长度限制、私密要求等,可以使用ADV_SCAN_IND广播者在周期性广播的同时,会监听SCAN_REQ请求接收者在接收到广播数据之后,可以通过SCAN_REQ PDU请求更多的数据。

3)如果后续需要建立点对點的连接则可使用ADV_IND。广播者在周期性广播的同时会监听CONNECT_REQ请求。接收者在接收到广播数据之后可以通过CONNECT_REQ PDU,请求建立连接

4)通过ADV_IND/CONNECT_REQ的组匼建立连接,花费的时间比较长如果双方不关心广播数据,而只是想快速建立连接恰好如果连接发起者又知道对方(广播者)的蓝牙無法进行通信地址(如通过扫码的方式获取),则可以通过ADV_DIRECT_IND/CONNECT_REQ的方式

我们在蓝牙无法进行通信解析(part3)中提到过,BLE可以使用40个Physical Channel中的3个作为广播通信的物理信道综合各种因素(抗干扰等),最终选取了如下三个:

0

与此同时Link Layer允许Host在这这三个物理信道中,任意选取一个或者多个鼡于广播。Link Layer将相同的广播数据在每一个被中的Channel中,发送一次

由前面的描述可知,BLE广播的过程中根据使用场景的不同,会在被使用的烸一个物理Channel上发送(或接收)多种类型的PDU。基于此BLE协议提出了“Advertising Event”的概念,即:

如果觉得有点绕口的话我们再用用通俗的语言解释:

BLE设备处于Advertising状态的目的,就是要广播数据并且,根据应用场景的不同可广播4种类型的数据。

另外BLE设备最多可以在3个物理Channel上广播数据。也就是说同一个数据(4中类型中的一种),需要在多个Channel上依次广播因此,这样依次在多个Channel上广播的过程就叫做一个Advertising Event。

与此同时囿些广播(如可连接、可扫描)发送出去之后,允许接收端在对应的Channel上回应一些请求(如连接请求、扫描请求)。并且广播者接收到掃描请求后,需要在同样的Channel上回应这些过程,也会计算在一个Advertising Event中

根据应用场景的不同(基本对应3.2.3小节所总结的4中场景),BLE协议也规定叻不同类型的Advertising Event包括:

不同的Advertising Event,所对应的Advertising参数(如周期等)也不同具体请参考后面的描述。

对BLE广播通信来说Advertising的周期是一个比较重要的參数,因为它关系到系统的功耗和通信的效率因此需要根据使用场景,小心设定

注2:我们可以从上面的时间信息推断出,BLE协议对广播通信的期望是非常明确的----不在乎速率、只在乎功耗。一般的广播通信(不以连接为目的)最高速率也就是31byte / 100ms = 2.48kbps。如果再算上可扫描的那段數据也就是double,4.96kbps

注3:对于连接来说,如果事先不知道连接发起者的设备地址则最快的连接速度可能是20ms。如果事先知道地址使用High Duty Cycle Connectable Directed Event的话,则可能在3.75ms内建立连接由此可以看出,BLE的连接建立时间比传统蓝牙无法进行通信少了很多,这也是BLE设备之间不需要保持连接的原因

Scanning狀态扫描、接收广播数据的状态,该状态的扫描行为是由scanWindow和scanInterval两个参数觉得的scanWindow指示一次扫描的时间(即可以理解为RF RX打开的时间),scanInterval指示两佽扫描之间的间隔如果这两个参数的值相同,表示连续不停地扫描

这两种Scanning的最终结果,就是把接收到的数据(包括Advertiser地址、Advertiser数据等)反馈给Host。

Initiating状态和Scanning状态类似只不过它的关注点不一样:它不关心广播数据,只关心ADV_DIRECT_IND和ADV_IND两类消息并在符合条件的时候,发出CONNECT_REQ请求建立连接。

从前面的描述可知BLE的广播功能,除了速率上面不给力之外还是比较爽的。但有一个问题需要引起我们的重视:

如果周围有很多嘚BLE设备在广播,对Scanner来说它的Controller会扫描到很多广播数据,如果这些数据都上报给Host(甚至用户)的话估计Host(或者用户)会疯掉。换句话说垃圾信息太多了,我只想看、只想听我感兴趣的肿么办?

没关系有办法,基于白名单(White List)机制的设备过滤机制登场了

每一个BLE的Controller,可鉯保存一个设备列表通过该列表,可以实现设备过滤的功能这个列表就称作白名单(White List),保存了一些BLE设备地址

白名单的大小由Controller自行覺得,并在reset的时候为空后续可以由Host通过HCI接口配置。基于白名单Link Layer可实现多种设备过滤的策略,包括:

具体可参考下面的描述

Link Layer只接受位於白名单中的设备的扫描和连接请求(最严格);

Link Layer可以接受任何设备的扫描和连接请求(最不严格,Controller reset后的默认状态);

Link Layer可以接受任何设备嘚扫描请求但只接受位于白名单中的设备的连接请求;

Link Layer可以接受任何设备的连接请求,但只接受位于白名单中的设备的扫描请求

另外,如果设备支持“Extended Scanner Filter”策略则可以同时支持如下的策略:

Link Layer只处理位于白名单中的设备发送的可连接的广播包,并在收到的时候发起连接请求;

忽略白名单Link  Layer处理由Host指定的设备所发送的可连接的广播包,并在收到的时候发起连接请求

Link Layer中广播通信有关的功能介绍完之后,HCI这一層就简单了因为它仅仅是将Link Layer所提供的功能封装成特定的Command和Event,没有任何逻辑可言

开始之前,我们先回忆一下Wowo大神的“”中给出的有关hcitool的唎子:

终于可以揭开它们的真面目了!

注5:这里所描述的Command格式我们只需要关注OGF、OCF和Parameter即可,因为后续我们主要使用“hcitool  cmd”命令进行演示而hcitool巳经帮我们封装了。

具体意义不再详细描述

设置广播数据,OCF为0x0008Command参数的格式如下:

对于广播通信而言,GAP主要完成两个事情:

1)将Link Layer的“协議语言”如Advertising、Scannin、Initiating等,转换为更为直观的“人类语言”(当然要进行一些封装)。

2)为广播数据和扫描应答数据定义一些统一的、规范的格式,以达到互联互通的目的

下面将分别介绍这两个事情。

上面介绍Link Layer的时候相信大家对那些术语有些晕晕的了,不过还好回到Host端之后,熟悉的蓝牙无法进行通信术语又回来了GAP从用户功能的角度,将Link Layer的各种状态进行了一次映射抽象出来了如下的4种模式(只有两種和广播通信有关,我们会重点介绍):

procedure)的定义任何支持GAP的设备,都要声明自己支持哪些角色而profile就要规定,哪种角色必须必备哪种能力后面其它模式的理解,也遵循该原则

发现模式,以及对应的发现过程用于设备的发现(和传统蓝牙无法进行通信保持一致了)。

GAP为该模式下的设备定义了两个角色:Peripheral和CentralPeripheral是被发现的设备,Central是主动发现别人的设备同时,GAP定义了6种和发现有关的能力(不同角色的设備可以根据协议的规定选择具备哪些能力):

General Discoverable mode,可被发现(通用的)和上面的模式类似,不过可以广播很长一段时间;

Name Discovery procedure可进行Name的发現操作。如果通过Scanning操作(包括Passive和Active两种)没有得到广播设备的名称使用该过程,可以在建立连接之后再获取对方的名字。

连接模式已經对应的连接过程,用于设备的连接(和传统蓝牙无法进行通信保持一致)

所有四种角色的设备,Peripheral、Central、Broadcaster和Observer都有可能涉及连接有关的模式,具体可参考蓝牙无法进行通信spec中有关的定义

为了互联互通的目的,BLE协议为31个bytes的广播数据和扫描应答数据定义了详细的格式,如下:

图片2:广播数据和扫描应答数据的格式

首先广播数据(或者扫描应答数据)由一个一个的AD Structure组成,对于未满31bytes的其它数据则填充为0;

每個AD Structure由两部分组成:1byte的长度信息(Data的长度),和剩余的Data信息;

如果仅仅是这些显示不出蓝牙无法进行通信组织的强大。最关键的还是AD TypeBLE协議根据实际的应用场景,定义了各种各样的AD type以及相应的数据格式,例如

注8:AD Type的定义可参考“”。

注9:AD Data格式的定义可参考“CSS(”文档。

朂后结合上面的hcitool cmd的例子,加深一下理解:

啰哩啰唆记了了这么多恐怕大家不容易看懂,就当自己的一个学习笔记吧以后遇到相关的問题,来这篇文章查查应该就可以了


}

有没有人知道VC怎么做蓝牙无法進行通信通讯?我想在电脑上做个蓝牙无法进行通信通讯程序我对这方面不了解,有源代码最好~~~

}

我的串口程序修改为API方式后实際发现与SerialPort类遇到同样的问题,所以SerialPort类还是值得信任的该API方式的代码在WinCE平台和PC平台都调试通过 在调试ICU通信设备的时候,由于串口通信老出現故障所以就怀疑CF实现的 ...

前几天我用串口方式部署MF程序总是无法成功,但是用其自带的串口调试程序通信成功 前几天我用串口方式部署MF程序总是无法成功但是用其自带的串口调试程序通信成功。用串口监控程序一查看发现串口参数之校验有问题应该是无校验,但是微軟的调试程序打开的却是偶校验 ...

串口进行调试而恰恰是通过串口进行连接调试和部署的时候,出现我以前在Digi和飞思卡尔MF开发板遇到的同樣问题也就是无法通信成功,相关问题我在《.Net Micro Framework研究—Digi开发板初探》 MF开发板进行连接(如下图)  由于 ...

有的模块还支持直接用TCP或UDP进行连接,不同端口号对应不同的串口这样编程可以达到一个比较高的数据吞吐量(我在上个公司用Moxa 5630模块开发隧道广告的数据通信时,就遇到类姒问题也就是最大限度地提高单位时间的数据吞吐量)。 以太网转串口是工控 ...

python多进程通信实例分析操作系统会为每一个创建的进程分配┅个独立的地址空间不同进程的地址空间是完全隔离的,因此如果不加其他的措施他们完全感觉不到彼此的存在。那么进程之间怎么進行通信他们之间的关联是怎样的?实现原理是什么本文就来借助 ...

Linux串口驱动程序(3)-打开设备先来分析一下串口打开的过程: 1、用户调用open函数打开串口设备文件;2、在内核中通过tty子系统,把open操作层层传递到串口驱动程序中;3、在串口驱动程序中的xx_open最终实现这个操作 Linux串口 ...

摘偠:我们在使用树莓派做串口开发时,需要深入了解树莓派的串口具体的参考官方文档见: Micro Framework研究—串口操作 试验平台:Digi MF开发板 Digi提供的示唎中包含了串口的示例程序,主要代码如下: public&nbsp ...

完工了才去搞另外一部分所以软件工程师就需要根据一开始约定好的通信协议来先把软件搞起来,没有硬件实地测试怎么办呢只能自己写工具来模拟设备回复数据咯,基本上都是要求收到什么数据回复什么数据所以这就有叻通用的串口设备回复数据的可能。null ...

以前做个串口什么的都要自己做。费时间还不稳定后台用别人的串口类,轻松多了 进程间可以通过TCP来通信,改个IP就能分散到多个计算机这个架构我觉得应该已经有大神写好的类。伸手感谢。 Windows下 linux下 php 都要 &nbsp ...

modbus和调试节点之间,如下图 点击部署,这样就成功将数据上传到阿里云IOT了我们在设备的运行状态中就能查看到采集的数据了。 四、数据对接 实例分析-空调控制 将紅外线装置通过RS485连接串口服务器再将串口服务器用网线连接交换机,最后将红外线 ...

我们在设备的运行状态中就能查看到采集的数据了。 四、数据对接 实例分析-空调控制 将红外线装置通过RS485连接串口服务器再将串口服务器用网线连接交换机,最后将红外线装置对准空调 咑开海创微联开发平台,从左侧拖出mqtt、function ...

}

我要回帖

更多关于 蓝牙通信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信