最近在做一个蓝牙智能锁的项目,需要在Android APP 上使用 Ble低功耗蓝牙 和单片机蓝牙设备进行通信,网上关于搜索 连接 读写数据的资料太多了,我在最后放了一个Demo,完整实现搜索 连接 读写数据,在文章结尾重点说一下UUID
首先:
1.BLE介绍
BLE是Bluetooth Low Energy的缩写,又叫蓝牙4.0,区别于蓝牙3.0和之前的技术。BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久。BLE是在蓝牙技术的基础上发展起来的,既同于蓝牙,又区别于传统蓝牙。BLE设备分单模和双模两种,双模简称BR,商标为Bluetooth Smart Ready,单模简称BLE或者LE,商标为Bluetooth Smart。Android是在4.3后才支持BLE,这说明不是所有蓝牙手机都支持BLE,而且支持BLE的蓝牙手机一般是双模的。双模兼容传统蓝牙,可以和传统蓝牙通信,也可以和BLE通信,常用在手机上,android4.3和IOS4.0之后版本都支持BR,也就是双模设备。单模只能和BR和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。
2.连接流程
3.什么是GATT?
GATT全称Generic Attribute Profile,中文名叫通用属性协议,它定义了services和characteristic两种东西来完成低功耗蓝牙设备之间的数据传输。它是建立在通用数据协议Attribute Protocol (ATT),之上的,ATT把services和characteristic以及相关的数据保存在一张简单的查找表中,该表使用16-bit的id作为索引。
一旦两个设备建立了连接,GATT就开始发挥作用,同时意味着GAP协议管理的广播过程结束了。但是必须要知道的是,建立GATT连接必要经过GAP协议。
最重要的事情,GATT连接是独占的,也就意味着一个BLE周边设备同时只能与一个中心设备连接。一旦周边设备与中心设备连接成功,直至连接断开,它不再对外广播自己的存在,其他的设备就无法发现该周边设备的存在了。
周边设备和中心设备要完成双方的通信只能通过建立GATT连接的方式。
一个ble蓝牙设备有多个包括多个Profile
一个Profile中有多个服务Service(通过服务的uuid找到对应的Service)
一个Service中有多个特征Characteristic(通过特征的uuid找到对应的Characteristic)
一个Characteristic中包括一个value和多个Descriptor(通过Descriptor的uuid找到对应的Descriptor)
其次 要知道一些名词:
1、profile
profile可以理解为一种规范,一个标准的通信协议,它存在于从机中。蓝牙组织规定了一些标准的profile,例如 HID OVER GATT ,防丢器 ,心率计等。每个profile中会包含多个service,每个service代表从机的一种能力。
2、service
service可以理解为一个服务,在ble从机中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据
3、characteristic
characteristic特征值,ble主从机的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
4、UUID
UUID,统一识别码,我们刚才提到的service和characteristic,都需要一个唯一的uuid来标识
UUID的格式:00001101-0000-1000-8000-00805F9B34FB
整理一下,每个从机都会有一个叫做profile的东西存在,不管是上面的自定义的simpleprofile,还是标准的防丢器profile,他们都是由一些列service组成,然后每个service又包含了多个characteristic,主机和从机之间的通信,均是通过characteristic来实现。
以上快速浏览一遍即可
在开发中我们需要获取设备的UUID字段,可以询问硬件工程师,也可以通过蓝牙测试工具查看service UUID 和characteristic UUID
工具地址:github.com/SouthAve/bleTester
(在Android studio编译运行即可 但需要将此项目编码格式从GBK转变为UTF-8以解决中文乱码问题)
在应用中搜索蓝牙找到:
在此强调 UUID是需要我们填写在程序里的 主要用的是service UUID 和characteristic UUID
一般读,写和通知的UUID 就是 characteristic UUID
一般我们写入数据后 设备会给我们立刻返回一个通知,所以我们需要在通知中获取数据(在这里不是用的读取数据)!
工作原因不能贴项目的代码,下面这个项目实现了搜索 连接 读写数据的功能,导入到项目中作为lib 需要将正确的UUID填入即可
在这里 BLUETOOTH_NOTIFY_D 和 UUID_NOTIFY 、 UUID_WRITE 我统一填的是 搜索到的 characteristic UUID
另外注意,连接设备前,请先关闭扫描蓝牙,否则连接成功后,再次扫描会发生阻塞,扫描不到设备。
希望能够对你有所帮助。