Android BLE蓝牙开发-读写数据 获取UUID
<blockquote><p>原文地址 www.cnblogs.com</p>
</blockquote>
<p>首先:</p>
<p>1.BLE介绍</p>
<p>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和单模的设备通信,不能和传统蓝牙通信,由于功耗低,待机长,所以常用在手环的智能设备上。</p>
<p>2.连接流程</p>
<p><img src="https://img2023.cnblogs.com/blog/3140507/202303/3140507-20230323174810240-1208509381.webp" alt="" loading="lazy"> android的ble连接流程图</p>
<p>3.什么是GATT?</p>
<p>GATT全称Generic Attribute Profile,中文名叫通用属性协议,它定义了services和characteristic两种东西来完成低功耗蓝牙设备之间的数据传输。它是建立在通用数据协议Attribute Protocol (ATT),之上的,ATT把services和characteristic以及相关的数据保存在一张简单的查找表中,该表使用16-bit的id作为索引。</p>
<p>一旦两个设备建立了连接,GATT就开始发挥作用,同时意味着GAP协议管理的广播过程结束了。但是必须要知道的是,建立GATT连接必要经过GAP协议。</p>
<p>最重要的事情,GATT连接是独占的,也就意味着一个BLE周边设备同时只能与一个中心设备连接。一旦周边设备与中心设备连接成功,直至连接断开,它不再对外广播自己的存在,其他的设备就无法发现该周边设备的存在了。</p>
<p>周边设备和中心设备要完成双方的通信只能通过建立GATT连接的方式。</p>
<p><img src="https://img2023.cnblogs.com/blog/3140507/202303/3140507-20230323174810192-297490880.webp" alt="" loading="lazy"> GATT图解</p>
<p>一个ble蓝牙设备有多个包括多个Profile</p>
<p>一个Profile中有多个服务Service(通过服务的uuid找到对应的Service)</p>
<p>一个Service中有多个特征Characteristic(通过特征的uuid找到对应的Characteristic)</p>
<p>一个Characteristic中包括一个value和多个Descriptor(通过Descriptor的uuid找到对应的Descriptor)</p>
<p>其次 要知道一些名词:</p>
<p>1、profile</p>
<p>profile可以理解为一种规范,一个标准的通信协议,它存在于从机中。蓝牙组织规定了一些标准的profile,例如 HID OVER GATT ,防丢器 ,心率计等。每个profile中会包含多个service,每个service代表从机的一种能力。</p>
<p>2、service</p>
<p>service可以理解为一个服务,在ble从机中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据</p>
<p>3、characteristic</p>
<p>characteristic特征值,ble主从机的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。</p>
<p>4、UUID</p>
<p>UUID,统一识别码,我们刚才提到的service和characteristic,都需要一个唯一的uuid来标识</p>
<p>UUID的格式:00001101-0000-1000-8000-00805F9B34FB</p>
<p>整理一下,每个从机都会有一个叫做profile的东西存在,不管是上面的自定义的simpleprofile,还是标准的防丢器profile,他们都是由一些列service组成,然后每个service又包含了多个characteristic,主机和从机之间的通信,均是通过characteristic来实现。</p>
<h3 id="以上快速浏览一遍即可">以上快速浏览一遍即可</h3>
<p>在开发中我们需要获取设备的UUID字段,可以询问硬件工程师,也可以通过蓝牙测试工具查看service UUID 和characteristic UUID</p>
<h4 id="工具地址githubcomsouthavebletester">工具地址:github.com/SouthAve/bleTester</h4>
<p>(在Android studio编译运行即可 但需要将此项目编码格式从GBK转变为UTF-8以解决中文乱码问题)</p>
<p>在应用中搜索蓝牙找到:</p>
<p><img src="https://img2023.cnblogs.com/blog/3140507/202303/3140507-20230323174810133-1709955013.webp" alt="" loading="lazy"> service UUID</p>
<p><img src="https://img2023.cnblogs.com/blog/3140507/202303/3140507-20230323174809965-1981776052.webp" alt="" loading="lazy"> characteristic UUID</p>
<h4 id="在此强调-uuid是需要我们填写在程序里的-主要用的是service-uuid-和characteristic-uuid">在此强调 UUID是需要我们填写在程序里的 主要用的是service UUID 和characteristic UUID</h4>
<h4 id="一般读写和通知的uuid-就是-characteristic-uuid">一般读,写和通知的UUID 就是 characteristic UUID</h4>
<h4 id="一般我们写入数据后-设备会给我们立刻返回一个通知所以我们需要在通知中获取数据在这里不是用的读取数据">一般我们写入数据后 设备会给我们立刻返回一个通知,所以我们需要在通知中获取数据(在这里不是用的读取数据)!</h4>
<p><img src="https://img2023.cnblogs.com/blog/3140507/202303/3140507-20230323174810244-106770834.webp" alt="" loading="lazy"></p>
<p>工作原因不能贴项目的代码,下面这个项目实现了搜索 连接 读写数据的功能,导入到项目中作为lib 需要将正确的UUID填入即可</p>
<p>github.com/chaiming/BLEDemo</p>
<p>在这里 BLUETOOTH_NOTIFY_D 和 UUID_NOTIFY 、 UUID_WRITE 我统一填的是 搜索到的 characteristic UUID</p>
<p><img src="https://img2023.cnblogs.com/blog/3140507/202303/3140507-20230323174809966-1617979729.webp" alt="" loading="lazy"></p>
<h3 id="另外注意连接设备前请先关闭扫描蓝牙否则连接成功后再次扫描会发生阻塞扫描不到设备">另外注意,连接设备前,请先关闭扫描蓝牙,否则连接成功后,再次扫描会发生阻塞,扫描不到设备。</h3><br><br>
来源:https://www.cnblogs.com/cps666/p/17248346.html
頁:
[1]