BLE基础知识

1、传统蓝牙的传输距离几十米到几百米不等,BLE 则规定为 100 米(实际上没有那么远,50米以内比较稳定,和设备发射功率有关)

2、为了实现极低的功耗,BLE 协议设计为:在不必要射频的时候,彻底将空中射频关断(可以在需要的时候快速建立连接进行控制操作)。与传统蓝牙 BR\EDR 相比,BLE 有这三大特性,从而实现低功耗:缩短无线开启间、

快速建立连接、降低收发峰值功耗(具体由芯片决定)。

3、缩短无线开启时间的第一个技巧是只用 3 个“广告”信道(其余信道用于数据传输),第二个技巧是通过优化协议栈来降低工作周期。一个在广告的设备可以自动和一个在搜索的设备快速建立连接,所以可以在 3ms 内完成连接的建立和数据的传输。(实际上首次连接时并没有那么快,因为要进行一些初始化配置)

4、低功耗的设计会带来一些牺牲,例如:音频数据就无法通过 BLE 来进行传输。BLE 仍然是一种非常鲁棒的技术。它依然支持跳频(37 个数据信道),并且采用了一种改进的 GFSK调制方法来提高链路的稳定性。BLE 也仍是非常安全的技术,因为在芯片级提供了 128 bit AES加密(做应用层开发的安全性方面就省去了许多工作量)。

5、安卓的 BLE 标准在 2013 年 7 月 24 日发布,一般搭配Android 4.3 及以上系统的手机都是支持牙 4.0(BLE)的。智能机和平板会带双模蓝牙的基带和协议栈,协议栈中包括 GATT 及以下的所有部分,但是没有 GATT 之上的具体协议。所以,这些具体的协议需要在应用程序中实现,实现时需要基于各个 GATT API 集。这样有利于在智能机端简单地实现具体协议,也可以在智能机端简单地开发出一套基于
GATT 的私有协议。


6、BLE协议栈

PHY层:1Mbps自适应跳频GFSK(高斯频移键控),运行在免证的2.4GHz频段。

连接层 (LL) ) : 控制设备的状态。设备可能有 5 种状态:就绪(standby),广播(advertising),搜索(scanning),初始化(initiating)和连接(connected)。一个处于连接状态的设备会有一个角色:

master 和 slave。初始化这个连接的为 master,接受这个连接请求的为 slave(一般手机或平板作为 master)。

主机控制层 (HCI) ): 为 host 和 controller 之间通过一个标准接口进行通信提供了一些方法。这一层可以通过一个软件 API 或者是硬件接口如 UART,SPI 和 USB来实现设备控制。

逻辑链路控制与适配协议  L2CAP层:为上层提供数据封装服务,允许逻辑上的端到端数据通信。

安全管理层 SM:提供配对和密匙分发服务,实现安全连接和数据交换。

通用访问配置文 件GAP层:直接与应用程序或配置文件(profiles)通信的接口,处理设备发现和连接相关服务。另外还处理安全特性的初始化。

属性协议层(ATT) ):  ATT 协议允许一个设备去显示一些数据,对于其他设备称之为“Attribute属性”,在 ATT 中,那些显示这些属性的设备被称为 server,同等的另一个设备称为 client。LL 层的状态 master 和 slave 和 ATT 层的这两个状态无关。

通用属性配置文件 (GATT) ): 是一个服务框架,定义了 ATT 应用的子程序。GATT 指定了profile的结构。在BLE中,由profile或者是服务所使用的所有类型的数据都称为characteristic。发生于两个设备间通过 BLE 连接进行交换的数据都需经过 GATT 子程序处理。因此,app 和

profile 会直接使用 GATT。

7、通用属性配置文件(GATT)

GATT 定义了两个角色:服务器和客户端。GATT 的角色并不一定与特定的 GAP 角色有关联,但可能由更高层级的配置文件指定。GATT 和 ATT 不是传输专用,也可以用于 BR/EDR 和低耗能。但是,由于 GATT 和 ATT 用作发现服务,故必须在低耗能技术中实施。

8、GATT 配置文件层级

该层级的最高层是配置文件。配置文件由实现用例所需的一个或多个服务组成。服务由特征或有关其它服务的引用组成。各项特征包括一个值,还可能包括有关该值的可选信息。服务、特征以及特征的组件(即值和描述符)包含配置文件数据,并全部存储在服务器的属性中。

9、设备角色划分

在 BLE 协议中,有两个角色,周边/外围( Periphery )和中央( Central) ;周边是数据提供者,中央是数据使用/处理者;在 iOS SDK 里面,可以把一个 iOS 设备作为一个周边,也可以作为一个中央;但是在 Android SDK 里面,直到目前最新的 Android4.4.2,Android 手机只能作为中央来使用和处理数据。

一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央 (Central)BluetoothGattServer 作为周边来提供数据;BluetoothGattServerCallback 返回周边的状态。BluetoothGatt 作为中央来使用和处理数据;BluetoothGattCallback 返回中央的状态和周边提供的数据。一个 Ble 设备某一时刻只能扮演一种角色。

 每一个周边 BluetoothGattServer, 包含多个服务 Service, 每一个 Service 包含多个特征 Characteristic ,每一个 Characteristic 又包含多个Descriptor 。

10、为了获取中央 BluetoothGatt, 大致需要如下过程:

获取 BluetoothManager:mBluetoothManager =

(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

得到 BluetoothAdapter:mBluetoothAdapter =

mBluetoothManager.getAdapter();

扫描 Ble 设备: mBluetoothAdapter.startLeScan( BluetoothAdapter.

LeScanCallback);


从 LeScanCallback 中 得 到 BluetoothDevice : public void

onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)

{.....}

用 BluetoothDevice 得 到 BluetoothGatt : gatt  =

device.connectGatt(this, true, gattCallback);

获取到 BluetoothGatt, 通过调用 BluetoothGatt 的方法,就可以通过

BluetoothGattCallback 和周边 BluetoothGattServer 进行交互。





App 实现过程

Android 官网上有BLE Sample,故而不再粘贴其中代码。

1、 首先检测设备是否支持 BLE,若支持,开启蓝牙并获得初始化蓝牙适配器:

2、在确保 ble 可用及蓝牙已打开后,开始扫描外围设备。扫描过程由回调接口监控着。一旦发现外围 ble 设备,便将其加入 ble 设备列表中。

3、点击搜索出的某一设备后,将尝试与其进行连接。同时将设备的地址放入广播中,最终作为入参传递给 BluetoothAdapter.getRemoteDevice,以获取外围设备 device。

4、成功连接到外围设备后,会返回一个 BluetoothDevice device ,此返回值即代表与手机连接的外围设备。通过利用该外围设备的 connectGatt(Context context,boolean autoConnect, BluetoothGattCallback callback) 方法,可以获取到BluetoothGatt 实例, BluetoothGatt 类是与蓝牙 GATT 配置文件相关的公用 API,它提供了蓝牙 GATT 功能,确保与 BLE 设备的通讯,可以通过它来管理客户端的操作(重连/断开、发现/获取服务、读/写特征及描述等等)。
BluetoothGattCallback 作为连接过程中的回调接口,响应连接过程中的各种状态变化(连接状态的变化、发现服务、读写特征( Characteristic )、读写描述( Descriptor )、特征的 Value 发生变化),体现了观察者设计模式的应用。

5、 连接成功之后, BluetoothGattCallback 中的 onConnectionStateChange 即被触发,所以我们可以在该函数中使用获取到的 BluetoothGatt 实例来进行操作。连接建立之后的第一件事可能就是搜索外围设备所提供的可用服务,所以我们可以使用BluetoothGatt 实例的 discoverServices()方法,与此同时,一旦服务被发现,onServicesDiscovered 将被触发。

6、连接过程中,如果连接状态发生变化,也会自动触发onConnectionStateChange(BluetoothGatt gatt, int status,int newState),所以我们可以在该函数中判断新状态的类型,然后执行相应操作。如果连接断开了,我们只需要在该函数中,再次添加上connectBle(mBluetoothDeviceAddress)便会自动尝试连接了。

7、 在连接状态下,如果想读取一个Characteristic的值,必须先调用BluetoothGatt的readCharacteristic(characteristic)方法,而后触发onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic, intstatus)函数,在此函数中去调用characteristic. getValue()方法才可以获取到Characteristic的Value。

8、一般获取到的Value是byte数组,如何解析此Value格式要看你和开发外围Ble设备的硬件工程师之间的约定了。底层传递过来的数据类型,是八进制或十六进制抑或其他类型。根据数据类型,结合 Value 的构成,即可解析出自己需要的字段。





友情链接

以下站点或许对你开发 BLE 很有帮助:

http://developer.android.com/guide/topics/connectivity/bluetooth-

le.html

https://developer.bluetooth.org/gatt/Pages/default.aspx

http://blog.stylingandroid.com/bluetooth-le-part-1/

http://developer.bluetooth.cn/libs/Cn/Overview/CoreSpeci/

http://www.2cto.com/kf/201403/287145.html

http://www.blogjava.net/zh-weir/archive/2013/12/09/407373.html

(摘自基于 Android  平台的 的 BLE  开发 概要

——麦邦光电 戴海涛)

拓展知识

一般情况,使用某一特定的频段霈要得到无线电管理部门的许可,当然,各国的无线电管理部门也规定了一部分频段是对公众开放的,不需要许可即可使用,以满足不同的应用需求,这些频段包括 ISM(Industrial. Scientific and Medical-I 业、科学和医疗)频带。

除了 ISM 频带外,在我国,低于 135kHz,在北美、日本等地,低于 400kHz 的频带也是免费频段。各国对无线频谱的管理不仅规定了 ISM 频带的频率,同时也规定了在这些频带上所使用的发射功率,在项目开发过程中,需要查阅相关的手册,如我国信息产业部发布的《微功率(短距离)无线电设备管理规定》。BLE
工作在 ISM 频带,定义了两个频段,2.4GHz 频段和 896/915MHz 频带。在 IEEE802.15.4 中共规定了 27 个信道:

·在 2.4GHz 频段,共有 16 个信道,信道通信速率为 250kbps:

·在 915MHz 频段,共有 10 个信道,信道通信速率为 40kbps:

·在 868MHz 频段,有 1 个信道,信道通信速率为 20kbpS。



BLE 网络可以点对点或者点对多点,一个 ble 主机可以连接多个 ble 从机,组成星型

网络,另外还有一种有广播设备和多个扫描设备组成的广播组结构,不同的网络拓扑对

应不同的应用领域。



有分析认为,当 BLE 把每个人的安卓或者其他移动设备变为一个传感器标签时,它

所能做的将不仅仅是通过应用软件去找东西,而是将拥有巨大的可拓展性,如它可以通

过 App 和传感器来构建一个 P2P 的网络以模拟 GPS 的功能等。总之,当 BLE 传感器无

处不在时,定然蕴藏着巨大商机。

BLE低功耗蓝牙关键技术解析与应用的更多相关文章

  1. Android使用BLE(低功耗蓝牙,Bluetooth Low Energy)

    背景 在学习BLE的过程中,积累了一些心得的DEMO,放到Github,形成本文.感兴趣的同学可以下载到源代码. github: https://github.com/vir56k/bluetooth ...

  2. 互联网DSP广告系统架构及关键技术解析

    互联网DSP广告系统架构及关键技术解析 宿逆 关注 1.9 2017.10.09 17:05* 字数 8206 阅读 10271评论 2喜欢 60 广告和网络游戏是互联网企业主要的盈利模式 广告是广告 ...

  3. BLE——低功耗蓝牙(Bluetooth Low Energy)

    1.简介 以下蓝牙协议特指低功耗蓝牙协议. 蓝牙协议是由SIG制定并维护的通信协议,蓝牙协议栈是蓝牙协议的具体实现. 各厂商都根据蓝牙协议实现了自己的一套函数库——蓝牙协议栈,所以不同厂商的蓝牙协议栈 ...

  4. 【原创】Android 5.0 BLE低功耗蓝牙从设备应用

    如果各位觉得有用,转载+个出处. 现如今安卓的低功耗蓝牙应用十分普遍了,智能手环.手表遍地都是,基本都是利用BLE通信来交互数据.BLE基本在安卓.IOS两大终端设备上都有很好支持,所以有很好发展前景 ...

  5. DSP广告系统架构及关键技术解析(转)

    广告和网络游戏是互联网企业主要的盈利模式 广告是广告主通过媒体以尽可能低成本的方式与用户达成接触的商业行为.也就是说按照某种市场意图接触相应人群,影响其中潜在用户,使其选择广告主产品的几率增加,或对广 ...

  6. 八大 IoT 安全关键技术解析

    IoT 设备的增长也伴随着网络攻击的风险的增长,因此在设计产品时就必须考虑到系统的安全. 高德纳咨询公司最近的报告预测,到 2020 年,全世界将有 200.4 亿的物联网设备相互连接,且平均每天约还 ...

  7. 深入浅出讲解低功耗蓝牙(BLE)协议栈

    详解BLE连接建立过程https://www.cnblogs.com/iini/p/8972635.html 详解BLE 空中包格式—兼BLE Link layer协议解析https://www.cn ...

  8. TI低功耗蓝牙(BLE)介绍

    TI低功耗蓝牙(BLE)介绍 本文档翻译和修改自参考资料:CC2540Bluetooth Low Energy Software Developer’s Guide (Rev. B),部分图片直接引用 ...

  9. TI低功耗蓝牙(BLE)介绍【转】

    转自:http://blog.csdn.net/ooakk/article/details/7302425 TI低功耗蓝牙(BLE)介绍 本文档翻译和修改自参考资料:CC2540Bluetooth L ...

随机推荐

  1. linux下安装与运行docker

    写者环境: 1.lsb_release -a hello@hello:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubu ...

  2. JavaScript:new function(){}和function(){}()

    继:http://www.cnblogs.com/hongdada/p/3328089.html new function(){} function(){}(): 大概的总结: function(){ ...

  3. JavaScript new return 类的实例化

    new初始化方法 简单没有return的就不写了 function Person() { this.name="hongda"; ; return "fffffff&qu ...

  4. Death to Binary? (模拟)题解

    思路: 除去前导0,注意两个1不能相邻(11->100),注意 0 *** 或者*** 0或者0 0情况 用string的reverse()很舒服 代码: #include<cstdio& ...

  5. ubuntu 安装 ftp服务

    1. 更新源列表 ---> sudo apt-get update 2. 安装vsftpd ---> sudo apt-get install vsftpd (安装) ----> s ...

  6. 51nod 1412 AVL树的种类(经典dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...

  7. OpenVPN Windows 平台安装部署教程

    一.环境准备: 操作系统Windows 服务器IP:192.168.88.123  VPN:192.168.89.1 客户端IP:192.168.78.3 客户端服务端单网卡,路由器做好端口映射 安装 ...

  8. SQLServer中对时间和长度的处理

    ---关于时间处理的函数 GETDATE() DATEADD(DAY,-20,GETDATE()) CONVERT(VARCHAR(100), GETDATE(), 112) DATENAME(PAR ...

  9. Enumerable扩展方法

    主要记录一些平时在工作中用到操作Enumerable的常用方法 /// <summary> /// The i enumerable extension. /// </summary ...

  10. [转]mysql日常工作手记

    1. 给navy加show权限: 1 2 update mysql.user set Show_db_priv='Y'  where user='navy'; flush privileges; 2. ...