当前位置:首页 >> 信息与通信 >>

蓝牙资料整理


蓝牙(Bluetooth)
1 基础概念 1.1 BLE 是什么 BLE 是Bluetooth Low Energy的缩写, 区别于蓝牙3.0和之前的技术。 BLE前身是NOKIA开发的Wibree 技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并 且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。 蓝牙4.0是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。蓝牙4.0设备分单模 和双模两种, 双模简称BR, 商标为Bluetooth Smart Ready; 单模简称BLE或者LE,商标为Bluetooth Smart。 Android是在4.3后才支持BLE,这可以解释不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般 是双模的。 双模兼容传统蓝牙, 可以和传统蓝牙通信, 也可以和BLE通信, 常用在手机上, android4.3和IOS4.0 之后版本都支持BR,也就是双模设备。单模只能和BR和单模的设备通信,不能和传统蓝牙通信,由于功 耗低,待机长,所以常用在手环的智能设备上。这可以解释手机上的BLE与手环等设备上的BLE的区别。 不是所有手机都支持BLE,因为BLE不仅仅依靠软件实现,同时需要硬件支持,于是有很多手机不能 联接智能手环等设备。Android4.3手机上安装的是双模BR,因此兼容蓝牙3.0之前的技术,既能与BLE 设备通信,也能与传统蓝牙通信,比较耗电,能够像传统设备一样高速传输。大部分智能手环使用的单 工BLE,不支持传统蓝牙,不能与之联结和通信,低功耗低速率设备。 1.2 优势 首先是低功耗,以BLE 4.0为例,一节钮扣电池在静态工作状态可以支持数年; 其次是低成本,TI公司的CC2540蓝牙SOC方案芯片出售价仅1美元,可以让人们低廉使用蓝牙技术; 再次是开放性,2.4GHz的频段全球开放,没有政府监管; 最后是适合时代潮流,现在是手机的时代,蓝牙技术本来就为它而生。 2 通讯机制 2.1 蓝牙通信中两个节点如何交换数据 这是蓝牙通信中最让初学者迷惑的地方。大部分通信,尤其是TCP/IP,交换数据的婚介是数据包, 但蓝牙通信中,工程师找不到数据包访问方式,于是就产生疑问。其实蓝牙最底层也是基于无线数据包 交换,只是通过层层封装,交付给工程师的API接口就变成了Client访问Server的方式。 Server 首先将一个服务按“属性 / 句柄 / 数值 / 描述”这种格式予以组织,然后调用 API 函数 GATTServApp_RegisterService将服务数据进行注册。举个实例吧,设提供一个电池电量服务字节,它 允许Client读取,数据为一个8比特无符号数(0~100%),它的组织如下:02 25 00 19 2A, 这5个数据 (小端格式)分别是:0x02=只读属性,0x0025=句柄;0x2A19=服务UUID。 2.2 Server 提供服务中的 UUID UUID(Universal Unique Identifier)全球惟一标识符, 本来是SIC组织分配给特定蓝牙服务的标识, 如分配0x2A25为设备序列号的UUID,这样任意蓝牙设备都可以通过它得到另一个设备的序列号。

2.3 Server 提供服务中的句柄 句柄(Handle)就是服务数据在数据中心的地址, 当所有的服务数据组织起来后, 它总得有个先后顺 序,某个服务的位置就是它的句柄。还是上面的类比,如果想去图书馆借阅《现代操作系统》,需要查 明该书在哪一层楼,哪个房间,这就是该书的Hanle。 2.4 如何知道一个服务的 Handle 根据服务的UUID调用API函数GATT_ReadUsingCharUUID。协议栈会返回该服务的Handle。特别注意 的是,一个服务的Descriptor的Handle总是该服务的Handle+1,如电池电量服务的Handle是0x0025,那 么它的Descriptor的Handle是0x0026。 2.5 Client 如何访问 Server 的服务 大致分三类: 读取服务的值,需要知道服务的UUID或者Handle; 写服务的值,需要知道服务的Hanle; 写服务描述符,需要知道该Descriptor的Hanle。 2.6 Server 可以访问 Client 吗 蓝牙通信中,Server不能直接访问(读/写)Client,但是可以通知(Notification)Client,通 知的前提是Client通过写Descriptor使能通知功能。例如,某Server发现电池电量已经低于安全阀值, 它可以调用GATT_Notification通知已连接的Client,但是Client接收后如果处理是它自己的事情。
注:(个人理解,此处Client指的是启动站一方,例如手机端,Server指的是从动站,例如下位机。)

2.7 蓝牙通信的主从关系 蓝牙技术规定每一对设备之间进行蓝牙通讯时, 必须一个为主角色, 另一为从角色, 才能进行通信, 通信时,必须由主端进行查找,发起配对,建链成功后,双方即可收发数据。理论上,一个蓝牙主端设 备,可同时与7个蓝牙从端设备进行通讯。一个具备蓝牙通讯功能的设备,可以在两个角色间切换,平 时工作在从模式,等待其它主设备来连接,需要时,转换为主模式,向其它设备发起呼叫。一个蓝牙设 备以主模式发起呼叫时,需要知道对方的蓝牙地址,配对密码等信息,配对完成后,可直接发起呼叫。 这可以解释为什么有时无法连接蓝牙,有可能是连接的蓝牙设备过多。 2.8 蓝牙的呼叫过程 蓝牙主端设备发起呼叫,首先是查找,找出周围处于可被查找的蓝牙设备。主端设备找到从端蓝牙 设备后,与从端蓝牙设备进行配对,此时需要输入从端设备的PIN码,也有设备不需要输入PIN码。配对 完成后,从端蓝牙设备会记录主端设备的信任信息,此时主端即可向从端设备发起呼叫,已配对的设备 在下次呼叫时,不再需要重新配对。已配对的设备,做为从端的蓝牙耳机也可以发起建链请求,但做数 据通讯的蓝牙模块一般不发起呼叫。链路建立成功后,主从两端之间即可进行双向的数据或语音通讯。 在通信状态下,主端和从端设备都可以发起断链,断开蓝牙链路。

3 Android 与 BLE 3.1 关键概念

Core Specification(核心规范),用于规定蓝牙设备必须实现的通用功能和协议层次。它由软件 和硬件模块组成,两个模块之间的信息和数据通过主机控制接口(HCI)的解释才能进行传递。 Profiles(蓝牙应用规范),它从应用场景的角度为蓝牙技术的使用制定了不同的规范。这也是和 大众日常生活接触最多的一部分。 蓝牙支持很多Profiles, 下文将介绍几种使用最广泛的蓝牙应用规范。

由图可知,蓝牙核心规范4.0的模块增加了以下几个蓝牙低功耗组件。 GATT表示服务器属性和客户端属性,描述了属性服务器中使用的服务层次,特点和属性。BLE设备 使用它作为蓝牙低功耗应用规范的服务发现。 ATT实现了属性客户端和服务器之间的点对点协议。 ATT客户端给ATT服务器发送请命令。 ATT服务器 向ATT客户端发送回复和通知。 SMP用于生成对等协议的加密密钥和身份密钥。 SMP管理加密密钥和身份密钥的存储, 它通过生成和 解析设备的地址来识别蓝牙设备。 3.2 题外话 Android 4.2之前,Google一直使用的是Linux官方蓝牙协议栈,即知名老牌开源项目BlueZ。BlueZ 实际上是由高通公司在2001年5月基于GPL协议发布的一个开源项目,该项目仅发布一个月后就被Linux 之父Linux Torvalds纳入了Linux内核,并做为Linux 2.4.6内核的官方蓝牙协议栈。随着Android设备 的流行,BlueZ也得到了极大的完善和扩展。例如Android 4.1中BlueZ的版本升级为4.93,它支持蓝牙 核心规范4.0,并实现了绝大部分的Profiles。 BlueZ现在正处于其巅峰时期,但好景不长。从Android 4.2即Jelly Bean开始,Google便在Android 源码中推出了它和博通公司一起开发的BlueDroid以替代BlueZ。 虽然因为时间及成熟度的原因, 大部分 手机厂商在Android 4.2中仍继续使用BlueZ。但据笔者了解,BlueZ的创始者,高通公司也将在基于其 芯片的Android参考设计中去除BlueZ,并仅支持BlueDroid。 BlueZ的未来如何笔者姑且不论。 不过, 能让高通改弦易辙, BlueDroid自有其合理之处。 相比BlueZ, BlueDroid 最 值 得 称 道 的地 方 就 是 其 框 架 结 构 变得 更 为 简 洁 和 清 晰 。 另外 , 借 助 HAL ( Hardware Abstraction Layer,硬件抽象层),BlueDroid终于不再和dbus有任何瓜葛。 3.3 实际应用 应用程序通过android.bluetooth package下的API来调用系统的Bluetooth功能。 3.3.1 获取 BluetoothAdapter

BluetoothAdapter是Android系统中所有蓝牙操作都需要的,它对应本地Android设备的蓝牙模块, 在整个系统中BluetoothAdapter是单例的。当你获取到它的示例之后,就能进行相关的蓝牙操作了。 获取BluetoothAdapter代码示例如下: // Initializes Bluetooth adapter. final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); 注 : 这 里 通 过 getSystemService 获 取 BluetoothManager , 再 通 过 BluetoothManager 获 取 BluetoothAdapter。BluetoothManager在Android4.3以上支持(API level 18)。 3.3.2 判断是否支持蓝牙,并打开蓝牙 获取到BluetoothAdapter之后,还需要判断是否支持蓝牙,以及蓝牙是否打开。 如果没打开,需要让用户打开蓝牙: private BluetoothAdapter mBluetoothAdapter; ... // Ensures Bluetooth is available on the device and it is enabled. If not, // displays a dialog requesting user permission to enable Bluetooth. if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } 3.3.3 搜索 BLE 设备 通 过 调 用 BluetoothAdapter 的 startLeScan() 搜 索 BLE 设 备 。 调 用 此 方 法 时 需 要 传 入 BluetoothAdapter.LeScanCallback 参数。 因 此 你 需 要 实 现 BluetoothAdapter.LeScanCallback 接 口 , BLE 设 备 的 搜 索 结 果 将 通 过 这 个 callback返回。 由于搜索需要尽量减少功耗,因此在实际使用时需要注意: 1、当找到对应的设备后,立即停止扫描; 2、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停 扫描,消耗电量。 搜索的示例代码如下: /** * Activity for scanning and displaying available BLE devices. */ public class DeviceScanActivity extends ListActivity {

private BluetoothAdapter mBluetoothAdapter; private boolean mScanning; private Handler mHandler;

// Stops scanning after 10 seconds. private static final long SCAN_PERIOD = 10000; ... private void scanLeDevice(final boolean enable) { if (enable) { // Stops scanning after a pre-defined scan period. mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } }, SCAN_PERIOD);

mScanning = true; mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } } } 如 果 你 只 需 要 搜 索 指 定 UUID 的 外 设 , 你 可 以 调 用 startLeScan(UUID[], BluetoothAdapter.LeScanCallback) 方法。 其中UUID数组指定你的应用程序所支持的GATT Services的UUID。 BluetoothAdapter.LeScanCallback 的实现示例如下: private LeDeviceListAdapter mLeDeviceListAdapter; ... // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {

@Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { mLeDeviceListAdapter.addDevice(device); mLeDeviceListAdapter.notifyDataSetChanged(); } }); } }; 注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。 3.3.4 连接 GATTServer: 两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接 GATT Server。 连接 GATT Server ,你需要调用 BluetoothDevice 的 connectGatt() 方法。此函数带三个参数: Context、autoConnect(boolean)和 BluetoothGattCallback 对象。调用示例: mBluetoothGatt = device.connectGatt(this, false,mGattCallback); 函数成功, 返回 BluetoothGatt 对象, 它是GATT profile的封装。 通过这个对象, 我们就能进行GATT Client端的相关操作。 BluetoothGattCallback 用于传递一些连接状态及结果。 BluetoothGatt常规用到的几个操作示例: connect() :连接远程设备。 discoverServices() : 搜索连接设备所支持的service。 disconnect():断开与远程设备的GATT连接。 close():关闭GATTClient端。 readCharacteristic(characteristic) :读取指定的characteristic。 setCharacteristicNotification(characteristic, enabled): 设置当指定characteristic值变化 时,发出通知。 getServices() :获取远程设备所支持的services。 等等。 注: 1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。 2、 一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调 函 数 中 返 回 。 例 如 discoverServices 与 onServicesDiscovered 回 调 , readCharacteristic 与 onCharacteristicRead回调,setCharacteristicNotification与onCharacteristicChanged回调等。

4 值得参考的网站 http://wenku.baidu.com/link?url=YsAZNmt-AeqIDzOR1d5mpNwfHh8LmFl1nboEFjXzEFYR0Bb1xl0mU aU5uPw-_MkfyS-ZX-tQm6AALzEnID6HtIGBVXYgg5CMbH0zfRSbbDa http://blog.chinaunix.net/uid-21411227-id-2780269.html http://network.51cto.com/art/201009/224766.htm http://www.cnblogs.com/zdz8207/archive/2012/10/17/bluetooth_ble_android.html http://blog.csdn.net/ooakk/article/details/7302425 http://baike.baidu.com/link?url=BrKMECbBWkg6joiey6nbYrNwX0ydrmNVg8NWdR9-ujJDSrV_AFZlx s61qFhmPNMz-imT1y__1qClgIMSF-M9W_ http://blog.csdn.net/stevenliyong/article/details/3550781 http://wenku.baidu.com/link?url=fwnFf7rVeWqng57_aEiWiiIfMUM1R7d1ufs15wSd_q_g_TLlXDcqA 4BYUo8WV9vIy2yaPjLVtAEwgSwF678IuDqN7OvnIGPrQ7PMADCXmvW http://3y.uu456.com/bp-c8176d2qa4s177232f60a278-1.html http://www.tuicool.com/articles/quiuMv http://www.mcuzone.com/bbs/read.php?tid=10992 http://home.eeworld.com.cn/my/space-uid-480041-blogid-237370.html http://my.oschina.net/innost/blog/140871


相关文章:
蓝牙耳机设计规范材料粗整理_图文
蓝牙耳机设计规范材料整理_材料科学_工程科技_专业资料。(5)壳体常用材料特性(Material) ? ABS:高流动性,便宜,适用于对强度要求不太高的部件(不直接受到冲击,...
蓝牙技术与一些测试整理
蓝牙技术与一些测试整理_计算机软件及应用_IT/计算机_专业资料。里面包含一些关于蓝牙测试重点,手机测试重点等总结Profile Tuning Suite(PTS)是蓝牙技术联盟制定的众多有...
Bluetooth Specification V4.0 EDR and BLE资料整理
Bluetooth Specification V4.0 EDR and BLE资料整理_信息与通信_工程科技_专业资料。Bluetooth Specification V4.0 EDR and BLE 一、产品参数 ??蓝牙版本:Bluetooth ...
ble4.0开发整理资料
ble4.0开发整理资料_计算机软件及应用_IT/计算机_专业资料。蓝牙4.0ble资料整理,补全。可以作为AndroidAPI文档的参考 在BLE 协议中,有两个角色,周边(Periphery)和...
关于Android Bluetooth 蓝牙的知识整理
百度文库 专业资料 IT/计算机 计算机软件及应用1/2 相关文档推荐...Android蓝牙开发(整理) 24页 1下载券 Android Bluetooth详解 15页 1下载券 Android...
蓝牙连接+上网设置(内容全+整理+贴图教程)
蓝牙连接+上网设置(内容全+整理+贴图教程)_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 蓝牙连接+上网设置(内容全+整理+贴图教程)_IT/计算机_专业...
FACE6蓝牙资料 - 副本
FACE6蓝牙资料 - 副本_机械/仪表_工程科技_专业资料。中控智慧考勤系列,考勤机,FACE6 中控智慧 FACE6 蓝牙产品概述: FACE6 蓝牙是主打的一款混合识别智能云考勤...
蓝牙管理软件说明书
蓝牙管理软件说明书_计算机软件及应用_IT/计算机_专业资料蓝牙一体机管理系统软件说明书 2015-08-20 1、双击打开文件夹后。 2、在文件夹里双击红色小车打开软件...
蓝牙查询扫描过程
蓝牙查询扫描过程_计算机硬件及网络_IT/计算机_专业资料蓝牙查询扫描过程整理 物理信道 (physical channel) 是蓝牙系统的最底层结构, 它以一伪随机跳频序列、 特定...
蓝牙编程基础_图文
蓝牙编程基础_计算机软件及应用_IT/计算机_专业资料。在移动设备上,联网的方式...下面我们将本地蓝牙适配器的 api 整理成以下一个表格。 那么上面的表中所列出...
更多相关标签: