在 Android 中使用低功耗蓝牙-客户端 - 小专栏

发布时间:2025-05-01点击数:

  蓝牙,是一种无线通讯技术标准,一开始是由爱立信搞出来的,蓝牙技术目前由来负责维护其技术标准。可以在设备之间无线传输数据,以前诺基亚时代时蓝牙就是手机和手机之间传文件的重要手段。

  在蓝牙 4.0 之前,主要还是用来传输文件的,有些开发者还搞出了蓝牙聊天软件,后来 2010 年时,推出了蓝牙 4.0 规范,低功耗蓝牙就开始普及开,特别是在物联网智能家居领域,比如常见的体脂称,手表,血压计血糖计等,好多都是采用低功耗蓝牙来传输数据的。

  目前最新的蓝牙规范是 5.2,我们常说的蓝牙 4.0 就是指的低功耗蓝牙,而需要配对才能使用,以及用来传输文件的,是传统蓝牙,适用于较为耗电的操作,也是几乎每个手机都有的功能。接下来我们主要介绍低功耗蓝牙。

  后来在 Android 5.0 又整改了一波,后续在 6.0,8.0,10.0 都有些许改动,但是 5.0 的那次改动是最大的,8.0 后又支持了蓝牙 5,如果要做适配,得注意版本间的差异。

  既然是数据传输,肯定需要一个客户端一个服务端的,拿体脂称举例,当我们使用 Android 手机去连接体脂称时,此时手机是客户端,体脂称是服务端,体脂称负责对外广播和提供数据,手机负责扫描连接和接收数据。当然,客户端和服务端的角色不是绝对的,取决于数据的流向。

  因此我们需要两台设备,一台 Android 手机充当客户端,另一台设备充当服务端,可以是体脂称血压计等具备低功耗蓝牙功能的物联网设备。如果你没有,不用担心,可以用一台 5.0 以上的 Android 手机作为服务端,Android 有提供相应的 API,让你的手机变成服务端。

  我们将分步骤来实现客户端和服务端。代码会比较简单明了,以讲解为主,了解实现后应用到生产环境上,还得根据具体业务进行封装调整。

  下面我们先来解释下一些概念,看不懂没关系,晚点再回来看,或者再去网上搜索其他的相关资料。

  Maximum Transmission Unit,最大传输单元,就是说一次数据传输最大的数据长度,单位是字节。好多设备默认是 23 个,即你一次发 46 个字节,会被分成两次发过去。

  如果你请求的 MTU 太大,超出了设备的最大值,那么回调就不调用,一般最大的 MTU 是 512。

  建议采用默认的 MTU,或者你可以明确知道目标设备的 MTU 才好修改。

  Port Physical Layer,端口物理层,这是 BLE 堆栈的底层,负责通过无线电波在空中实际传输和接收信息。

  2 Mb/s 比特率,2 Msym/s 符号率。将符号率加倍以提高速度。

  1 Mb/s 比特率,500 或 125 ksym/s 符号率。提供更高的位错误容忍度,从而扩大范围。

  其中 1M PHY 是所有 BLE 都必须支持的,2M PHY 和 1M 的区别是提高了吞吐量,加快了速度的传输速率。2M PHY 和 Coded PHY 都是蓝牙 5.0 才引入的新配置,Coded PHY 目的是在不增加发射功率的情况下增加最大范围。

  但是这只是一个建议,是否会发生 PHY 更改还得看自身的配置以及服务端设备的配置。

  首先是权限,蓝牙 BLE 与位置有关系的,所以需要位置权限,要使用蓝牙,或者操纵蓝牙,需要蓝牙权限。如下:

  然后是查看设备是否支持蓝牙硬件,千万不要以为 Android 就一定支持蓝牙的,因此需要运行判断当前设备是否支持蓝牙。需要添加 uses-feature:

  如果你的应用必须有蓝牙才可以运行,那么 required 可以设置为 true,这样就不会安装在没有蓝牙的设备上了。否则如果你的应用只是部分功能用到了蓝牙,没有蓝牙也可以使用其他功能,那么建议设置为 false,并且在需要使用蓝牙时,再运行时检测。

  确定设备支持蓝牙后,需要判断蓝牙是否已打开,没有打开需要请求用户去打开:

  需要客户端发起扫描,才能发现附近处于可连接状态的蓝牙设备。服务端设备会发出广播,告知其他设备有关它的信息。

  // 设置是否仅在扫描结果中返回旧版广告,旧版广告包括蓝牙核心规范4.2及以下版本指定的广告

  蓝牙,是一种无线通讯技术标准,一开始是由爱立信搞出来的,蓝牙技术目前由蓝牙技术联盟(SIG)来负责维护其技术标准。可以在设备之间无线传输数据,以前诺基亚时代时蓝牙就是手机和手机之间传文件的重要手段。

  在蓝牙 4.0 之前,主要还是用来传输文件的,有些开发者还搞出了蓝牙聊天软件,后来 2010 年时,推出了蓝牙 4.0 规范,低功耗蓝牙就开始普及开,特别是在物联网智能家居领域,比如常见的体脂称,手表,血压计血糖计等,好多都是采用低功耗蓝牙来传输数据的。

  目前最新的蓝牙规范是 5.2,我们常说的蓝牙 4.0 就是指的低功耗蓝牙,而需要配对才能使用,以及用来传输文件的,是传统蓝牙,适用于较为耗电的操作,也是几乎每个手机都有的功能。接下来我们主要介绍低功耗蓝牙。

  后来在 Android 5.0 又整改了一波,后续在 6.0,8.0,10.0 都有些许改动,但是 5.0 的那次改动是最大的,8.0 后又支持了蓝牙 5,如果要做适配,得注意版本间的差异。

  既然是数据传输,pg电子官方网站肯定需要一个客户端一个服务端的,拿体脂称举例,当我们使用 Android 手机去连接体脂称时,此时手机是客户端,体脂称是服务端,体脂称负责对外广播和提供数据,手机负责扫描连接和接收数据。当然,客户端和服务端的角色不是绝对的,取决于数据的流向。

  因此我们需要两台设备,一台 Android 手机充当客户端,另一台设备充当服务端,可以是体脂称血压计等具备低功耗蓝牙功能的物联网设备。如果你没有,不用担心,可以用一台 5.0 以上的 Android 手机作为服务端,Android 有提供相应的 API,让你的手机变成服务端。

  我们将分步骤来实现客户端和服务端。代码会比较简单明了,以讲解为主,了解实现后应用到生产环境上,还得根据具体业务进行封装调整。

  下面我们先来解释下一些概念,看不懂没关系,晚点再回来看,或者再去网上搜索其他的相关资料。

  Maximum Transmission Unit,最大传输单元,就是说一次数据传输最大的数据长度,单位是字节。好多设备默认是 23 个,即你一次发 46 个字节,会被分成两次发过去。

  如果你请求的 MTU 太大,超出了设备的最大值,那么回调就不调用,一般最大的 MTU 是 512。

  建议采用默认的 MTU,或者你可以明确知道目标设备的 MTU 才好修改。

  Port Physical Layer,端口物理层,这是 BLE 堆栈的底层,负责通过无线电波在空中实际传输和接收信息。

  2 Mb/s 比特率,2 Msym/s 符号率。将符号率加倍以提高速度。

  1 Mb/s 比特率,500 或 125 ksym/s 符号率。提供更高的位错误容忍度,从而扩大范围。

  其中 1M PHY 是所有 BLE 都必须支持的,2M PHY 和 1M 的区别是提高了吞吐量,加快了速度的传输速率。2M PHY 和 Coded PHY 都是蓝牙 5.0 才引入的新配置,Coded PHY 目的是在不增加发射功率的情况下增加最大范围。

  但是这只是一个建议,是否会发生 PHY 更改还得看自身的配置以及服务端设备的配置。

  首先是权限,蓝牙 BLE 与位置有关系的,所以需要位置权限,要使用蓝牙,或者操纵蓝牙,需要蓝牙权限。如下:

  然后是查看设备是否支持蓝牙硬件,千万不要以为 Android 就一定支持蓝牙的,因此需要运行判断当前设备是否支持蓝牙。需要添加 uses-feature:

  如果你的应用必须有蓝牙才可以运行,那么 required 可以设置为 true,这样就不会安装在没有蓝牙的设备上了。否则如果你的应用只是部分功能用到了蓝牙,没有蓝牙也可以使用其他功能,那么建议设置为 false,并且在需要使用蓝牙时,再运行时检测。

  确定设备支持蓝牙后,需要判断蓝牙是否已打开,没有打开需要请求用户去打开:

  需要客户端发起扫描,才能发现附近处于可连接状态的蓝牙设备。服务端设备会发出广播,告知其他设备有关它的信息。

  // 设置是否仅在扫描结果中返回旧版广告,旧版广告包括蓝牙核心规范4.2及以下版本指定的广告

  蓝牙,是一种无线通讯技术标准,一开始是由爱立信搞出来的,蓝牙技术目前由蓝牙技术联盟(SIG)来负责维护其技术标准。可以在设备之间无线传输数据,以前诺基亚时代时蓝牙就是手机和手机之间传文件的重要手段。

  在蓝牙 4.0 之前,主要还是用来传输文件的,有些开发者还搞出了蓝牙聊天软件,后来 2010 年时,推出了蓝牙 4.0 规范,低功耗蓝牙就开始普及开,特别是在物联网智能家居领域,比如常见的体脂称,手表,血压计血糖计等,好多都是采用低功耗蓝牙来传输数据的。

  目前最新的蓝牙规范是 5.2,我们常说的蓝牙 4.0 就是指的低功耗蓝牙,而需要配对才能使用,以及用来传输文件的,是传统蓝牙,适用于较为耗电的操作,也是几乎每个手机都有的功能。接下来我们主要介绍低功耗蓝牙。

  后来在 Android 5.0 又整改了一波,后续在 6.0,8.0,10.0 都有些许改动,但是 5.0 的那次改动是最大的,8.0 后又支持了蓝牙 5,如果要做适配,得注意版本间的差异。

  既然是数据传输,肯定需要一个客户端一个服务端的,拿体脂称举例,当我们使用 Android 手机去连接体脂称时,此时手机是客户端,体脂称是服务端,体脂称负责对外广播和提供数据,手机负责扫描连接和接收数据。当然,客户端和服务端的角色不是绝对的,取决于数据的流向。

  因此我们需要两台设备,一台 Android 手机充当客户端,另一台设备充当服务端,可以是体脂称血压计等具备低功耗蓝牙功能的物联网设备。如果你没有,不用担心,可以用一台 5.0 以上的 Android 手机作为服务端,Android 有提供相应的 API,让你的手机变成服务端。

  我们将分步骤来实现客户端和服务端。代码会比较简单明了,以讲解为主,了解实现后应用到生产环境上,还得根据具体业务进行封装调整。

  下面我们先来解释下一些概念,看不懂没关系,晚点再回来看,或者再去网上搜索其他的相关资料。

  Maximum Transmission Unit,最大传输单元,就是说一次数据传输最大的数据长度,单位是字节。好多设备默认是 23 个,即你一次发 46 个字节,会被分成两次发过去。

  如果你请求的 MTU 太大,超出了设备的最大值,那么回调就不调用,一般最大的 MTU 是 512。

  建议采用默认的 MTU,或者你可以明确知道目标设备的 MTU 才好修改。

  Port Physical Layer,端口物理层,这是 BLE 堆栈的底层,负责通过无线电波在空中实际传输和接收信息。

  2 Mb/s 比特率,2 Msym/s 符号率。将符号率加倍以提高速度。

  1 Mb/s 比特率,500 或 125 ksym/s 符号率。提供更高的位错误容忍度,从而扩大范围。

  其中 1M PHY 是所有 BLE 都必须支持的,2M PHY 和 1M 的区别是提高了吞吐量,加快了速度的传输速率。2M PHY 和 Coded PHY 都是蓝牙 5.0 才引入的新配置,Coded PHY 目的是在不增加发射功率的情况下增加最大范围。

  但是这只是一个建议,是否会发生 PHY 更改还得看自身的配置以及服务端设备的配置。

  首先是权限,蓝牙 BLE 与位置有关系的,所以需要位置权限,要使用蓝牙,或者操纵蓝牙,需要蓝牙权限。如下:

  然后是查看设备是否支持蓝牙硬件,千万不要以为 Android 就一定支持蓝牙的,因此需要运行判断当前设备是否支持蓝牙。需要添加 uses-feature:

  如果你的应用必须有蓝牙才可以运行,那么 required 可以设置为 true,这样就不会安装在没有蓝牙的设备上了。否则如果你的应用只是部分功能用到了蓝牙,没有蓝牙也可以使用其他功能,那么建议设置为 false,并且在需要使用蓝牙时,再运行时检测。

  确定设备支持蓝牙后,需要判断蓝牙是否已打开,没有打开需要请求用户去打开:

  需要客户端发起扫描,才能发现附近处于可连接状态的蓝牙设备。服务端设备会发出广播,告知其他设备有关它的信息。

  // 设置是否仅在扫描结果中返回旧版广告,旧版广告包括蓝牙核心规范4.2及以下版本指定的广告

售前咨询:0760-2332 0168  
售后客服:400  830  7686



1998~2024,今科26年专注于企业信息化服务

立 即 注 册 / 咨 询
上 线 您 的 网 站