台山市峰力助听器 發表於 2020-7-28 16:07:00

Android蓝牙开发(一)蓝牙模块及核心API

<blockquote>
<p>本文主要介绍Android蓝牙开发中基础知识:蓝牙模块及核心API。</p>
<p>关于蓝牙的连接及通讯功能实现,欢迎查阅下一篇文章:Android蓝牙开发(二)蓝牙消息传输实现。</p>
</blockquote>
<h2 id="蓝牙模块">蓝牙模块</h2>
<p>从蓝牙4.0开始包含两个蓝牙芯片模块:</p>
<p>传统/经典蓝牙模块(Classic Bluetooth,简称BT)和低功耗蓝牙(Bluetooth Low Energy,简称BLE)。</p>
<p>经典蓝牙是在之前的蓝牙1.0,1.2,2.0+EDR,2.1+EDR,3.0+EDR等基础上发展和完善起来的, 而低功耗蓝牙是Nokia的Wibree标准上发展起来的,是完全不同两个标准。</p>
<h3 id="1-经典蓝牙模块bt">1. 经典蓝牙模块(BT)</h3>
<p>泛指蓝牙4.0以下的模块,一般用于数据量比较大的传输,如:语音、音乐、较高数据量传输等。</p>
<p>经典蓝牙模块可再细分为:传统蓝牙模块和高速蓝牙模块。</p>
<p>传统蓝牙模块在2004年推出,主要代表是支持蓝牙2.1协议的模块,在智能手机爆发的时期得到广泛支持。</p>
<p>高速蓝牙模块在2009年推出,速率提高到约24Mbps,是传统蓝牙模块的八倍。</p>
<p>传统蓝牙有3个功率级别:Class1、Class2、Class3,分别支持100m,10m,1m的传输距离。</p>
<p>用途:</p>
<ul>
<li>
<p>传声音</p>
<p>如蓝牙耳机、蓝牙音箱。蓝牙设计的时候就是为了传声音的,所以是近距离的音频传输的不二选择。现在也有基于WIFI的音频传输方案,例如Airplay等,但是WIFI功耗比蓝牙大很多,设备无法做到便携。因此固定的音响有WIFI的,移动的如耳机、便携音箱清一色都是基于经典蓝牙协议的。</p>
</li>
<li>
<p>传大量数据</p>
<p>如某些工控场景,使用Android或Linux主控,外挂蓝牙遥控设备的,可以使用经典蓝牙里的SPP协议,当作一个无线串口使用。速度比BLE传输快多了。这里要注意的是,iPhone没有开放。</p>
</li>
</ul>
<h3 id="2-低功耗蓝牙模块ble">2. 低功耗蓝牙模块(BLE)</h3>
<p>泛指蓝牙4.0及更高的模块,蓝牙低功耗技术是低成本、短距离、可互操作的鲁棒性无线技术,工作在免许可的2.4GHz ISM射频频段。</p>
<p>因为BLE技术采用非常快速的连接方式,因此平时可以处于“非连接”状态(节省能源),此时链路两端相互间只是知晓对方,只有在必要时才开启链路,然后在尽可能短的时间内关闭链路(每次最多传输20字节)。</p>
<p>低功耗蓝牙无功率级别,一般发送功率在7dBm,一般在空旷距离,达到20m应该是没有问题。</p>
<p>随着蓝牙5.0的发布,其性能有了大幅提升,主要体现在以下几个方面:</p>
<ul>
<li>
<p>高速传输:其传输速率达到了 24Mbps 是蓝牙 4.2LE 的两倍</p>
</li>
<li>
<p>传输距离:其传输的有效距离是上一版本的 4 倍,理论上,蓝牙发射和接收设备之间的有效工作距离可达 300 米。</p>
</li>
<li>
<p>精准定位:结合 wifi 可以实现精度小于 1 米的室内定位</p>
</li>
<li>
<p>超低功耗:蓝牙 5.0 将大大降低了蓝牙的功耗,使人们在使用蓝牙的过程中再也不必担心待机时间短的问题。</p>
</li>
</ul>
<p>用途:</p>
<p>耗电低,数据量小,如遥控类(鼠标、键盘),传感设备(心跳带、血压计、温度传感器、共享单车锁、智能锁、防丢器、室内定位)是目前手机和智能硬件通信的性价比最高的手段,直线距离约50米,一节5号电池能用一年,传输模组成本10块钱,远比<code>WIFI</code>、<code>4G</code>等大数据量的通信协议更实用。虽然蓝牙距离近了点,但胜在直连手机,价格超便宜。以室内定位为例,商场每家门店挂个蓝牙beacon,就可以对手机做到精度10米级的室内定位,一个beacon的价格也就几十块钱而已。</p>
<h3 id="3-双模蓝牙">3. 双模蓝牙</h3>
<p>双模蓝牙指的是既有经典蓝牙也有低功耗蓝牙模块。</p>
<p>如智能电视遥控器、降噪耳机等。很多智能电视配的遥控器带有语音识别,需要用经典蓝牙才能传输声音。而如果做复杂的按键,例如原本键盘表上没有的功能,经典蓝牙的HID按键协议就不行了,得用BLE做私有协议。包括很多降噪耳机上通过APP来调节降噪效果,也是通过BLE来实现的私有通信协议。</p>
<p>Android手机蓝牙4.x都是双模蓝牙(既有经典蓝牙也有低功耗蓝牙),而某些蓝牙设备为了省电是单模(只支持低功耗蓝牙)。</p>
<h2 id="android蓝牙api简介">Android蓝牙API简介</h2>
<h3 id="1-经典蓝牙classic-bluetooth">1. 经典蓝牙(Classic Bluetooth)</h3>
<p>经典蓝牙适用于电池使用强度较大的操作,例如Android之间流式传输和通信等(音频/文件等大数据)。 从Android 4.3(API 18)才有API支持低功耗蓝牙(BLE)。</p>
<p>经典蓝牙API如下:</p>
<p>android.bluetooth</p>
<p>.BluetoothA2dp 音频分发配置文件,高质量音频通过蓝牙连接和流式传输</p>
<p>.BluetoothAdapter 本地蓝牙适配器,是所有蓝牙交互的入口,发现设备,查询配对设备,创建BluetoothServerSocket侦听其他设备</p>
<p>.BluetoothAssignedNumbers</p>
<p>.BluetoothClass 描述蓝牙设备的一般特征和功能,这是一组只读属性,设备类型提示</p>
<p>.BluetoothDevice 远程蓝牙设备,与某个远程设备建立连接,查询设备信息,名称,地址,类和配对状态</p>
<p>.BluetoothHeadset 提供蓝牙耳机支持,以便与手机配合使用,蓝牙耳机和免提配置文件</p>
<p>.BluetoothHealth 控制蓝牙服务的健康设备配置文件代理</p>
<p>.BluetoothHealthAppConfiguration 第三方蓝牙健康应用注册的应用配置,以便与远程蓝牙健康设备通信</p>
<p>.BluetoothHealthCallback 实现 BluetoothHealth 回调的抽象类</p>
<p>.BluetoothManager</p>
<p>.BluetoothProfile 蓝牙配置文件,蓝牙通信的无线接口规范</p>
<p>.BluetoothServerSocket 服务端监听,连接RFCOMM通道(类似TCP ServerSocket)</p>
<p>.BluetoothSocket 建立RFCOMM通道,蓝牙Socket接口(类似TCP Socket),通过InputStream和OutputStream与其他设备传输数据</p>
<p>Android经典蓝牙的开发步骤如下:</p>
<ol>
<li>
<p>扫描其他蓝牙设备</p>
</li>
<li>
<p>查询本地蓝牙适配器的配对蓝牙设备</p>
</li>
<li>
<p>建立 RFCOMM 通道 (SPP协议)</p>
</li>
<li>
<p>通过服务发现连接到其他设备</p>
</li>
<li>
<p>与其他设备进行双向数据传输</p>
</li>
<li>
<p>管理多个连接</p>
</li>
</ol>
<p>RFCOMM是蓝牙简单传输协议, 在两个蓝牙设备间的一条物理链上提供多个模拟串口进行传输数据, 可同时保持高达60路的通信连接。</p>
<p>SPP(Serial Port Profile)是通过蓝牙设备之间的串口进行数据传输协议,spp协议处于RFCOMM上层,如果能使用RFCOMM传输数据,就不需要使用SPP(省去一些流程,速度更快),但还是推荐用SPP,兼容性有保证</p>
<h3 id="2-低功耗蓝牙ble">2. 低功耗蓝牙(BLE)</h3>
<p>从Android 4.3(API 18)才支持低功耗蓝牙(Bluetooth Low Energy,BLE)的核心功能,BLE蓝牙协议是GATT协议, BLE相关类不多, 全都位于android.bluetooth包和android.bluetooth.le包的几个类:</p>
<p>android.bluetooth</p>
<p>.BluetoothGattService 包含多个Characteristic(属性特征值), 含有唯一的UUID作为标识</p>
<p>.BluetoothGattCharacteristic 包含单个值和多个Descriptor, 含有唯一的UUID作为标识</p>
<p>.BluetoothGattDescriptor 对Characteristic进行描述, 含有唯一的UUID作为标识</p>
<p>.BluetoothGatt 客户端相关</p>
<p>.BluetoothGattCallback 客户端连接回调</p>
<p>.BluetoothGattServer 服务端相关</p>
<p>.BluetoothGattServerCallback 服务端连接回调</p>
<p>android.bluetooth.le</p>
<p>.AdvertiseCallback 服务端的广播回调</p>
<p>.AdvertiseData 服务端的广播数据</p>
<p>.AdvertiseSettings 服务端的广播设置</p>
<p>.BluetoothLeAdvertiser 服务端的广播</p>
<p>.BluetoothLeScanner 客户端扫描相关(Android5.0新增)</p>
<p>.ScanCallback 客户端扫描回调</p>
<p>.ScanFilter 客户端扫描过滤</p>
<p>.ScanRecord 客户端扫描结果的广播数据</p>
<p>.ScanResult 客户端扫描结果</p>
<p>.ScanSettings 客户端扫描设置</p>
<p>BLE设备分为两种设备: 客户端(也叫主机/中心设备/Central), 服务端(也叫从机/外围设备/peripheral) 客户端的核心类是 BluetoothGatt</p>
<p>服务端的核心类是 BluetoothGattServer 和 BluetoothLeAdvertiser BLE数据的核心类是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor</p>
<p>本文的内容暂到此结束,下一篇中将详细介绍蓝牙的连接及通讯功能实现。</p>
<p>相关详细内容及使用请查看Github项目:https://github.com/MickJson/BluetoothCS</p>
<p>参考资料:</p>
<p>Android-经典蓝牙(BT)-建立长连接传输短消息和文件</p>
<p><strong>欢迎点赞/评论,你们的赞同和鼓励是我写作的最大动力!</strong></p>
<p>关注公众号:几圈年轮,查看更多有趣的技术资源。<br>
<img src="https://upload-images.jianshu.io/upload_images/14926374-5e5206c978f29c42.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="公众号.png" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/jqnl/p/13391663.html
頁: [1]
查看完整版本: Android蓝牙开发(一)蓝牙模块及核心API