Android 低功耗蓝牙开发简述

article/2025/10/15 15:14:26

低功耗蓝牙简述

    • 一、什么是低功耗蓝牙?
    • 二、怎么做低功耗蓝牙应用?
      • ① 之前有没有接触Android蓝牙开发?
      • ② 蓝牙设备固件是公司自己的吗?
      • ③ 有没有蓝牙固件和蓝牙应用的文档和Demo?
      • ④ 具体的业务功能需求明确吗?
      • ⑤ Android端应用是重新写还是接手老项目?
      • ⑥ 应用是否需要上架?上架几个平台?
    • 三、做低功耗蓝牙应用的细节
      • ① BluetoothLeScanner
      • ② ScanCallback
      • ③ ScanResult
      • ④ BluetoothGatt
      • ⑤ BluetoothGattCallback

一、什么是低功耗蓝牙?

  低功耗蓝牙是在传统蓝牙的基础上开发的,但它与传统模块不同。最大的特点是降低了成本和功耗。可以快速搜索并快速连接。它保持连接并以超低功耗传输数据,低功耗蓝牙是专门针对基于物联网(IoT)设备构建的功能和应用程序设计的蓝牙版本。蓝牙BLE允许短期远程无线电连接并延长电池寿命。目前,蓝牙低功耗技术已被广泛使用,例如耳机、手环、电子秤、鼠标、键盘、灯、音箱等设备。

  蓝牙分为传统蓝牙和低功耗蓝牙。蓝牙4.0及更高版本被称为蓝牙低功耗,其中蓝牙4.0标准包括传统的蓝牙模块部分和蓝牙低功耗模块部分,这是双模式标准。在被蓝牙技术联盟采用之前,它是诺基亚设计的一种短距离无线通信技术,它的最初目标是提供最低功耗的无线标准,并且专门针对低成本,低带宽,低功耗而设计,并针对复杂性进行了优化。

二、怎么做低功耗蓝牙应用?

  在了解了低功耗蓝牙的基本知识之后,回到我们Android应用开发上来,你要做什么应用?你有没有好好想过呢?难道就是一句话:”干就完了!“,这是不可取的,因为你如果从来没有接触过那么你会在实际开发中遇到很多的问题,而这些问题都源于你的这句话:”干就完了!“。

  在做Android蓝牙应用时,要先确定几个问题,这能让你少踩几个坑。

  1. 之前有没有接触Android蓝牙开发?
  2. 蓝牙设备固件是公司自己的吗?
  3. 有没有蓝牙固件和蓝牙应用的文档和Demo?
  4. 具体的业务功能需求明确吗?
  5. Android端应用是重新写还是接手老项目?
  6. 应用是否需要上架?上架几个平台?

这些问题的答案就决定了你在开发Android低功耗蓝牙应用的进度和结果。

① 之前有没有接触Android蓝牙开发?

  做过和没做过是两种心态,虽然这个应用并不难,但是没做过一开始会像无头苍蝇一样,需要从网上获取相应的资料,还得是正确的资料才行。要先了解Android中各个版本对蓝牙的影响,API的使用。

② 蓝牙设备固件是公司自己的吗?

  做蓝牙应用是需要和设备打交道的,不是传统意义上的互联网App,属于物联网App,你的App甚至不需要使用网络,如果你只是做蓝牙通讯处理,没有数据需要上报到服务器的话。而蓝牙应用中最关键的就是蓝牙设备,这个蓝牙设备是否由你公司自行研发,是的话,你在开发过程中对接的时候相对轻松一些,不是的话你找技术支持了,也就是这个蓝牙设备固件的研发公司的技术支持人员和你对接来完成你的应用,这个就涉及到时间成本了,需要心里有数。

③ 有没有蓝牙固件和蓝牙应用的文档和Demo?

  这个问题就在于你是不是什么资料都没有,就让你开始做应用,然后还给你很短的开发周期,如果有资料和Demo的话可以边看资料边运行Demo,了解里面的各个API是怎么操作的,这样无论你是开发新的应用,还是就在这个Demo上进一步完善,加上自己的业务功能需求,都会比较简单一些。

④ 具体的业务功能需求明确吗?

  如果是需求摸棱两可,那么你在写代码的时候就需要做好框架设计封装,当然前提是你之前做过。蓝牙应用的框架设计主要在于数据交互,而数据交互的方式取决于蓝牙的通信协议。业务功能和这个协议也是息息相关的,例如你做电动牙刷和做手环就完全不一样。因此如果蓝牙设备的性质决定了你的应用业务功能的设计,当然你也不要指望功能需求定了就不改,那根本不存在。

⑤ Android端应用是重新写还是接手老项目?

  这个问题就在于你有没有背锅的风险,如果是接收老项目,你需要先运行一下,看看各个功能是否正常,项目中的代码都过一遍,看看有没有坑在里面。先花一段时间熟悉这个项目,然后再去做二次开发,并且做好你改动的地方的注释和说明,以后背锅的时候你还能挣扎一下。如果是新项目的话,你自己肯定最了解了,不过同样要设计好框架和做好注释说明,一个项目过一段时间你不去看它,再回过头来看,是需要重新熟悉起来的,有注释说明能帮你缩短熟悉的时间。

⑥ 应用是否需要上架?上架几个平台?

  上架应用有时候会比开发应用更麻烦,目前国内主流的应用市场也就是各大厂商的自带的应用市场,另外还有应用宝,百度应用市场这两个平台,如果你的应用需要上架,那么你需要提前申请软著,准备好资料,上架应用需要的资料还是比较多的,如果不出意外那也是你一个人独立完成。各个平台的开发者账号都不要自己去申请,用公司的账号或者邮箱,同时要注册企业开发者用户,很多平台个人开发者是无法上架应用的。目前来说我觉得上架应用市场时最麻烦的还是隐私政策,各个平台审核比以往要严格,各个平台又不太一样,注意隐私政策是需要在你们公司的官网上能看到的,需要一个链接地址。

三、做低功耗蓝牙应用的细节

  做蓝牙应用在Android上要了解这些内容。首先要扫描到蓝牙设备,这个地方你可以找到BluetoothLeScanner

① BluetoothLeScanner

  这个类提供对蓝牙 LE 设备执行扫描相关操作的方法。应用程序可以使用 ScanFilter 扫描特定类型的蓝牙 LE 设备。它还可以请求不同类型的回调来传递结果。

在这里插入图片描述

它里面主要就是启动扫描、停止扫描,以及扫描回调的处理,其中启动扫描的时候可以传入ScanFilterScanSettings,这两个参数的设置会对扫描结果造成影响,下面我们看看扫描回调。

② ScanCallback

扫描回调是一个抽象类,里面有三个回调方法,扫描结果,批量扫描结果,扫描错误。

在这里插入图片描述

一般来说你只需要实现处理onScanResult()回调中ScanResult,这个类就是你扫描得到的数据信息。

③ ScanResult

这里面有扫描到的基本信息,内容比较多,看看它的组成。

在这里插入图片描述

参数:
device - 找到远程蓝牙设备。
eventType - 事件类型。
primaryPhy - 主要广告 phy。
secondaryPhy - 二级广告 phy。
advertisingSid - 广告集 ID。
txPower - 发射功率。
rssi - 接收到的信号强度。
periodAdvertisingInterval - 定期广告间隔。
scanRecord - 扫描记录,包括广告数据和扫描响应数据。
timestampNanos - 观察到扫描结果的时间戳。

这里面最常用的就是获取devicerssi

  这里要注意一点,扫描蓝牙之前要做Android版本的判断,首先要判断手机蓝牙是否打开,而判断这个是否打开在Android12及以上需要先动态请求BLUETOOTH_CONNECT权限,权限通过后再通过系统蓝牙适配器去判断是否打开蓝牙开关。蓝牙打开之后要做定位权限的判断,Android12及以上则需要做BLUETOOTH_SCAN权限的请求,权限通过之后才能进行扫描,这里要注意会出现一些设备在Android12上获取BLUETOOTH_SCAN权限后也扫描不到,此时你需要再去请求定位权限,并且扫描权限这样设置一下:

	<uses-permissionandroid:name="android.permission.BLUETOOTH_SCAN"android:usesPermissionFlags="neverForLocation"tools:targetApi="s" />

这个android:usesPermissionFlags你也可以尝试去掉,然后组合定位权限进行测试。

  当然了Android12中还有一个权限BLUETOOTH_ADVERTISE,一般情况你用不到它,这里需要了解一下蓝牙的扫描和发现的方式,为什么我们能扫描蓝牙扫描,而蓝牙设备连接之后就扫描不到了,是因为蓝牙设备再上电之后未被连接时一致处于广播状态,就是四处的广播自己这个设备的信息,比如常见的Mac地址,设备名称。这是一种无线电波,扫描的一方,通常为我们的手机,扫描这些广播通过NDK进行转化,回调到上层接收,你才能在ScanCallback中的回调中看到扫描到的蓝牙数据信息。这里扫描的一方作为主机,广播的一方作为从机,而如果要是手机也能够作为从机进行广播,则就需要请求这个权限,然后进行一些广播信息的配置,发送广播。

④ BluetoothGatt

  这个类在低功耗蓝牙通讯中至关重要,在通讯的各个环节都会涉及到BluetoothGatt,首先通过扫描到的蓝牙设备进行Gatt连接,参考这个方法。

在这里插入图片描述

  里面有三个参数,上下文,自动连接,gatt回调。这个方法的描述是这样的:(连接到此设备托管的 GATT 服务器。调用者充当 GATT 客户端。回调用于将结果传递给调用者,例如连接状态以及任何进一步的 GATT 客户端操作。该方法返回一个 BluetoothGatt 实例,您可以使用 BluetoothGatt 执行 GATT 客户端操作。)

因此我们获取BluetoothGatt 实例需要通过connectGatt()的方法,而不能通过new BluetoothGatt()的方式,这里面又有一个很重要的抽象类BluetoothGattCallback。

⑤ BluetoothGattCallback

  作为一个抽象类,要实现里面的回调自然就需要一个实现类,然后重写父类的方法。进行回调的传递。connectGatt方法,会触发onConnectionStateChange回调方法,用来处理Gatt连接的状态改变,断开连接和异常状态都可以在这里进行处理。断连可以通过gatt.disconnect()进行,断连之后在回调中gatt.close()及时释放资源。

  发现服务是蓝牙通讯中很重要的一个环节,不同的蓝牙设备具备的服务不同,你可能从网络上看到一些例子,人家演示的时候很正常,然后你操作时就不正常,那是因为虽然是同一份代码,但是操作的蓝牙设备却不相同,所以发现服务就是很重要的,它可以让你知道你的设备支持那些服务,拥有那些特性,特性的描述又有那些。最顶级是服务,服务下面是特性,特性下面是描述,一个服务可能拥有多个特性,一个特性可能有多个描述,服务和特性及描述的uuid都是不同的。这些uuid各自的定义是不同的,首先要看是否服务SIG的标准蓝牙,另外是否有厂商自定义UUID。这一点你可以与做蓝牙固件的进行沟通,如果你公司做蓝牙硬件的不鸟你或者也不了解的话,那么你就只能自己一个一个的去测试了,有很多种组合,那就很造孽了。因为假如一个发现服务有6个服务,每个服务下有6个特性,每个特性下有2个描述,而你要从这里面找到对的服务下的对的特性和对的特性下的对的描述,你想一下这个工作量,而要是硬件告诉你是哪一个,你直接用就行了,不对你就调试,不是你的问题你就叼他。

  写入数据,由App写入数据到蓝牙设备中,可以通过gatt.writeCharacteristic()。这个写入时需要确定写入的服务是哪一个,写入的数据是有响应还是无响应,默认是有响应的,这里的有响应和无响应关系到写入数据的方式,例如你需要连续的传一段数据给蓝牙设备,开始指令,结束指令和中间数据,类似于开始和结束可以采用有响应的方式,而中间的数据传输可以采用无响应的方式,加快传输速度,无响应的方式速度快,但是是否写入成功无法保证,有响应速度慢,可以确认数据是否写入成功。区别类似发短信和打电话。然后通过characteristic.setValue(bytes),bytes就是要写入的数据。这是一个字节数组,这是字节数组的最大长度和MTU有关。

  获取MTU,蓝牙一般默认支持的MTU长度是23个字节,一个字节为类型操作码,两个字节为类型操作句柄,实际传输数据就是20字节。通过gatt.requestMtu(mtu)。会触发onMtuChanged回调。这里mtu 的范围在23 ~ 517之间,目前市面上Android版本高的手机基本上都是247。也就是说即使你mtu = 517,回调中的mtu可能还是247,为什么呢?因为你的Android手机上的蓝牙最大支持247。而在传输的时候你还需要-3,也就是244。单次传输的最大字节数据为244个字节。那么如果你有1000个字节需要进行传输,则需要对字节进行分包处理,例如一次最大传输244个字节,则需要分成5个包进行传输,前4个包,每个包为244个字节,最后一个包为24个字节。

  数据返回,输入数据时有一些指令设备是会返回数据的,设备返回的数据会在onCharacteristicChanged()回调中出现,不过这个出现的前提是,你需要设置notify enable或者indicate enable。也就是一个写入描述的动作,通过gatt.writeDescriptor()进行,会触发onDescriptorWrite()回调,在这个回调中你会知道你所设置的值是否生效,descriptor.getValue()获取具体的值。

在这里插入图片描述

  可以设置的参数就是这三个。这里还需要补充一个设置,那就是gatt.setCharacteristicNotification()这个设置,如果有一天固件说它返回了数据,而你在onCharacteristicChanged()中并没有看到返回,同时你notify 已经enable了。那么你可以在onDescriptorWrite()的回调中加上gatt.setCharacteristicNotification(),如果还收不到,那就是你的固件有问题。

这篇关于低功耗蓝牙开发应用的简述就先写到这里,如果有信息的内容也会补充到文章中的,山高水长,后会有期。


http://chatgpt.dhexx.cn/article/xCGpx1B7.shtml

相关文章

Android蓝牙开发

题引&#xff1a; 最近项目上涉及与硬件相关的功能&#xff0c;需要通过蓝牙进行消息收发。项目已完成&#xff0c;这里做下记录。 通信步骤&#xff1a; 1.初始化BluetoothAdapter.getDefaultAdapter()获取BluetoothAdapter对象 2.判断蓝牙是否开启bluetoothAdapter.isEnab…

【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

目录 目录 前言 一、相关概念介绍 二、实战开发 三、项目演示 四、Demo案例源码地址 五、更新记录 1、2020/12/29 &#xff1a;修改 setupService()中错误 2、2021/05/14 &#xff1a;更新连接方法&#xff08;解决部分蓝牙设备连接失败的问题&#xff09; 3、2022/1…

【Bluetooth开发】蓝牙开发入门

BLE 蓝牙设备在生活中无处不在&#xff0c;但是我们也只是将其作为蓝牙模块进行使用&#xff0c;发送简单的AT命令实现数据收发。 那么&#xff0c;像对于一些复杂的使用场合&#xff1a;“车载蓝牙”、"智能手表"、“蓝牙音箱”等&#xff0c;我们不得不去了解底层…

【Bluetooth蓝牙开发】一、蓝牙开发入门

一、蓝牙开发入门 文章目录 一、蓝牙开发入门 1、蓝牙概念2、蓝牙发展历程3、蓝牙技术概述 3.1 Basic Rate(BR)3.2 Low Energy&#xff08;LE&#xff09; 4、常见蓝牙架构 4.1 SOC蓝牙单芯片方案4.2 SOC蓝牙MCU方案4.3 蓝牙host controller分开方案4.4 使用场景 5、参考文档 …

vs2012做ArcGIS二次开发前期准备

解压ArcGIS 1.双击ESRI 2.点击 一路next&#xff0c;自己选择安装路径&#xff0c;建议放在非系统盘 3.开始菜单-ArcGIS-License Server Administrator 4.点击“stop/停止"&#xff0c;再点击确定 5.将破解文件中的两个文件拷到D:\Program Files (x86)\ArcGIS\License10.…

arcgis 二次开发学习笔记(一):了解二次开发有关的软件及其之间的关系

【废话篇】今天是大三开学的第一天课&#xff0c;终于意识到我口中念念不忘却没付出实际行动的“考研”来了。考研目标现在为止还没有很明确&#xff0c;只是不甘屈于人后。周围太多生活得很辛苦的人&#xff0c;只是不愿意我这一辈子也为了有关qian的小事斤斤计较&#xff0c;…

Arcobjects for java:Arcgis二次开发入门,开发一个基本地图组件

一、目的 因学习需要&#xff0c;使用Java进行Arcgis二次开发。当前对arcgis进行二次开发使用的语言基本是C#&#xff0c;使用Java对Arcgis进行二次开发的很少。于是使用java在idea上进行Arcgis二次开发&#xff0c;给入门的同学做参考&#xff0c;我自己也处于入门阶段&#…

ArcGIS二次开发基础教程(00):基础界面设计

ArcGIS二次开发基础教程(00) : 基础界面设计 (开发环境&#xff1a;VS2010ArcEngine10.2C# &#xff1b;鉴于学习ArcGIS二次开发的同学都有一定的WinForm开发和ArcGIS软件使用基础&#xff0c;故此教程不再对一些基础内容作详细阐述&#xff09; 首先新建一个Windows窗体应用程…

【ArcGIS二次开发】TOCControl右键菜单功能实现

1、添加现有项 ①右击解决方案中的项目&#xff0c;添加TOCControlContextMenu中的LayerSelectable、LayerVisibility、RemoveLayer、ZoomToLayer ②点击菜单栏中的项目&#xff0c;添加引用ESRI.ArcGIS.ADF.Local ③修改RemoveLayer中的命名空间为项目名称EngineMapTest&#…

arcgis python实例_arcgis二次开发_arcgis二次开发python_arcgis二次开发实例

[1.rar] - QQ连连看的源码.单消秒杀挂机等功能喜欢的朋友请拿去研究 [qqCHAR.rar] - qq 验证码识别程序 可以叫准确的识别出qq登陆前的验证码 [1.rar] - 本书以Visualc作为开发语言&#xff0c;结合大量实例&#xff0c;详细介绍了利用Arcobjects组件进行GIS二次开发的方法和…

【ArcGIS二次开发】Engine界面搭建

1、新建窗体项目Windows Appplication(Engine) 2、添加menuStrip、statusStrip和ToolbarControl控件&#xff0c;并设置相应的Dock属性为Top和Right 3、用SplitContainer控件把显示区域分成三部分&#xff0c;并设置splitContatiner1的Orientation属性为Horizontal 4、添加TabC…

ArcGIS二次开发基础教程(02):地图导航和鹰眼

ArcGIS二次开发基础教程(02)&#xff1a;地图导航和鹰眼 地图导航&#xff08;主要是调用命令和工具&#xff09; 地图的放缩和漫游 if(axMapControl1.CurrentTool null) {ICommand icc;//地图放大ITool tool new ControlsMapZoomInToolClass();//地图缩小//ITool tool n…

arcgis java 二次开发_arcgis二次开发_cad二次开发_java arcgis二次开发

属性查询是GIS应用不可缺少的重要功能&#xff0c;尤其是在各种业务系统中&#xff0c;根据用户输入相应的查询条件&#xff0c;从属性要素中快速定位到用户感兴趣的要素&#xff0c;为业务应用提供了便利。本文就来聊一聊QGis二次开发中如何实现属性查询功能。 其实这个功能我…

AE+ArcGIS二次开发课程设计(基于C#)

AEArcGIS二次开发课程设计&#xff08;基于C#&#xff09; 1.工作内容2.程序功能介绍3.功能模块介绍3.1 实现【创建TIN】说明3.1.1 功能说明3.1.2 代码实现&#xff08;包含了所有主要的代码&#xff0c;库引用自行导入&#xff09; 3.2 实现【TIN坡度坡向分析】说明3.2.1 功能…

ArcGIS二次开发前言

ArcGIS二次开发前言 前言环境常见bug解决方案 前言 自毕业成为GIS开发工程师已有一年多的时间&#xff0c;时间很短&#xff0c;短到不过人一生中工作时限的3.75%&#xff0c;时间很长&#xff0c;长到收藏夹已经从零攒到了一千四百多条记录&#xff0c;OneNote上也记录了几十…

ArcGIS Engine二次开发

目录 1 前言 2 准备工作 2.1 License的加入 2.2 ToolStrip控件 2.3 MenuStrip控件 2.4 帮助文档的查看 3 数据加载 3.1 矢量数据的加载 3.2 栅格数据的加载 4 地图浏览功能 1 前言 这是一份关于ArcGIS Engine二次开发的一份报告总结&#xff0c;在这份报告中包含了简单的…

ArcGIS二次开发知识点总结

空间分析定义&#xff1a;空间分析是指分析具有空间坐标或相对位置的数据和过程的理论和方法&#xff0c;是对地理空间现象的定量研究&#xff0c;其目的在于提取并传输空间数据中隐含的空间信息。 叠置分析定义&#xff1a;是指将同一坐标系统下不同信息表达的两组或多组专题…

【ArcGIS Pro二次开发】(31):ArcGIS Pro中的多线程

ArcGIS Pro与旧的ArcGIS桌面应用程序的显著不同之处在于&#xff0c;它采用多线程架构&#xff0c;可以有效的发挥多核CPU的优势。这使得二次开发工具的性能变得更好&#xff0c;但也对开发工作带来了更多的难点和挑战。 一、多线程需要注意的问题 一般情况下&#xff0c;为了…

GIS二次开发:实验一 ArcGIS Engine 开发初步

实验一 ArcGIS Engine 开发初步 一、实验目的 掌握ArcGIS Engine的安装&#xff1b;熟悉ArcGIS Engine中几个常用的控件&#xff1b;搭建第一个简单的ArcGIS Engine 程序&#xff1b;通过ICommand接口添加地图浏览工具。 二、实验仪器与设备 计算机、visual studio 软件、A…

Arcgis二次开发软件安装(Arcgis10.2、VS2012、AE10.2)

目录 一、序言 二、Arcgis10.2安装 &#xff08;一&#xff09;安装ArcGIS License Manager 1.1 ArcGIS License Manager安装 1.2 ArcGIS License Manager配置 &#xff08;二&#xff09;安装ArcGIS Desktop 1.1ArcGIS Desktop安装 1.2.ArcGIS文件替换 1.3中文显示与…