BLE低功耗蓝牙开发相关概念问题记录

蓝牙ble的传输速率是指主从机每秒所传输的字节数。既然是传输速率那就涉及到时间和每次所传递包大小的问题。

关于ble通信的demo可以参考蓝牙API介绍及基本功能实现

Ble概念相关

ble对于数据的传输有一个字节上的限制,默认情况下是20个字节,但并不是不可修改的。默认情况下mtu是23个字节(除去3个字节的标志位剩余为20个字节),主机完全可以通过调用BluetoothGatt#requestMtu(int mtu)来修改每个包所传输的字节数。 同样,ble在属于传输时对于每个包之间的时间间隔也有一定的限制,大多数从机的连接时间间隔为7.5ms–4s(以1.25ms为一个单位,也就是6-0x0C80个单位)。对于连接间隔主机同样可以修改:调用BluetoothGatt# requestConnectionPriority(int connectionPriority)方法。其中connectionPriority有三个取值:

  • BluetoothGatt#CONNECTION_PRIORITY_LOW_POWER:低功耗, 对应的连接时间间隔取值范围为:100ms–125ms(80–100个单位)。 对应的从机延时取值为:2.5ms(2个单位) 对应的监控超时取值为:20s(以10ms为一个单位);
  • BluetoothGatt#CONNECTION_PRIORITY_BALANCED:处于中等水平 对应的连接时间间隔取值范围为:30ms–50ms(24–40个单位)。 对应的从机延时取值为:0ms(0个单位) 对应的监控超时取值为:20s();
  • BluetoothGatt#CONNECTION_PRIORITY_HIGH:高功耗 对应的连接时间间隔取值范围为:11.25ms–15ms(9–12个单位)。 对应的从机延时取值为:0ms(0个单位) 对应的监控超时取值为:20s();

接下来看一下各个概念是什么意思??

  • 主机和从机:发起连接的设备是主机,接受连接请求的设备是从机
  • 客户端和服务器:展示“属性”的设备是服务器,与之配对的是客户端。换言之,获取信息的客户端提供信息的是服务器
  • 主机可以是客户端也可以是服务器端,同样从机可以做客户端也可以做服务器端
  • BLE协议和协议栈:协议指的是一种通信标准。比如规定第一个字节代表什么意思第二个字节又代表什么意思。而协议栈是具体的一些实现函数,开发人员调用协议栈函数进行通信(相当于各种API)
  • 连接事件:在两个ble设备的连接中使用调频机制,两个设备使用特定的信道收发数据,过段时间再使用新的信道(链路层处理信道切换),两个设备在信道切换后首发数据称为连接事件。即使没有数据收发两设备仍旧会交换链路层数据来维持连接。在一次连接事件中会不停的切换信道,所发送的数据包不止一个。
  • 连接间隔(Connection Interval):就是两个连接事件之间的间隔。主机开始发送数据到从机至下一次主机开始发送数据到从机之间的时间间隔。主从机之间的每次通信都是一个连接事件(但不同于第一次从机处于广播状态下主机连接从机)。以1.25ms为一个单位,一般取值是7.5ms–4s(6–3200)。
  • 从机延时(Slave latency):允许从机跳过一些连接事件。简单说就是我规定一个时间,在这次连接事件开始后到一定时间内,在这一段时间内从机不响应主机的任何消息。
  • 监控超时(Supervision Timeout):两个成功连接事件间的最大允许间隔。如果超过了这个时间而没有任何连接事件即没有任何数据交换则断开连接。以10ms为一个单位,一般取值范围是100ms–32s(10–3200)。

主机在发起连接之后会获取一个BluetoothGatt对象。

  • 主机主动读数据调用readCharacteristic方法,读之后会触发 onCharacteristicRead方法
  • 主机主动写数据调用writeCharacteristic方法,写之后会触发 onCharacteristicWrite方法(可以进行下一次的写数据)
  • 主机被动获取到数据(从机通过notify方法发送数据),当监听到有数据过来时会触发 onCharacteristicChanged方法(但是要想该方法回调,必须在主机端程序中为要监听的characteristic设置notify: setCharacteristicNotification)
  • 主机修改mtu(一个包的字节)会触发onMtuChanged方法。

主机从机连接通信过程描述:

  • 主机开启蓝牙enable()
  • 主机扫描蓝牙startLeScan()( startLeScan(final UUID[] serviceUuids, final LeScanCallback callback) 可以扫描特定uuid的设备)
  • 主机connect连接蓝牙
  • 主机discoveryServices发现服务( 会回调onServicesDiscovered方法)
  • 进行通信

问题总结

问题一:在扫描蓝牙时如何进行过滤??

这个系统已经提供了接口了:

 @Deprecated
    @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
    public boolean startLeScan(final UUID[] serviceUuids, final LeScanCallback callback) {

把你想要扫描的设备的服务的uuid添加到serviceUuids中进行扫描即可。千万不要以name作为过滤。 如果在扫描到设备之后再通过BluetoothDevice.getUuids()方法进行过滤是不起作用的,看看对方法的定义就知道了:

 /**
     * Returns the supported features (UUIDs) of the remote device.
     *
     * <p>This method does not start a service discovery procedure to retrieve the UUIDs
     * from the remote device. Instead, the local cached copy of the service
     * UUIDs are returned.
     * <p>Use {@link #fetchUuidsWithSdp} if fresh UUIDs are desired.
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH}.
     *
     * @return the supported features (UUIDs) of the remote device,
     *         or null on error
     */
    @RequiresPermission(Manifest.permission.BLUETOOTH)
     public ParcelUuid[] getUuids() {

这里返回的uuid是缓存的uuid。如果你没有缓存的uuid获取到的肯定是null。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏韩伟的专栏

状态模式:一个Epoll边缘触发的代理服务器设计

设计模式是一门热门的知识,但是何时应该用哪个,却往往不容易掌握,本文以一个Socks5代理服务器的设计为例,介绍状态模式的实践用法。 软件的功能介绍 提供Soc...

4677
来自专栏xcywt

TCP头部分析与确认号的理解

1、TCP的特点: 基于字节流 面向连接 可靠传输 缓冲传输 全双工 流量控制 2、头部格式和说明 图源百度。如下图示,就是TCP包的头部结构。可以看到这个头部...

32310
来自专栏琯琯博客

优化 Laravel 网站打开速度

1.关闭debug 打开.env文件,把debug设置为false. APP_ENV=local APP_DEBUG=false APP_KEY=base64...

41711
来自专栏进击的程序猿

raft 系列解读(2) 之 测试用例raft 系列解读(2) 之 测试用例

基于mit的6.824课程,github代码地址:https://github.com/zhuanxuhit/distributed-system

1422
来自专栏大魏分享(微信公众号:david-share)

Oracle11g RAC双NFS仲裁容错方案

说明: 整理文档时发现自己在2010年写的一个RAC容灾方案,觉得有一些用,分享出来。当时为了验证此方案,做了很多PoC。方案相对比较复杂,但是也提供了一种思路...

5189
来自专栏乐百川的学习频道

scrapy 进阶使用

前段时间我写了一篇《scrapy快速入门》,简单介绍了一点scrapy的知识。最近我的搬瓦工让墙了,而且我又学了一点mongodb的知识,所以这次就来介绍一些s...

5937
来自专栏龙首琴剑庐

基于复杂方案OWSAP CsrfGuard的CSRF安全解决方案(适配nginx + DWR)

1、什么是CSRF? 已经有很多博文讲解其过程和攻击手段,在此就不重复了。 O(∩_∩)O 不清楚的同学,请自行搜索或按链接去了解: http://blog...

4687
来自专栏左瞅瞅,右瞅瞅

nmap详解

nmap,也就是Network Mapper,最早是Linux下的网络扫描和嗅探工具包,用来扫描网上电脑开放的网络连接端,确定哪些服务运行在哪些连接端。它是网...

2401
来自专栏运维杂家技术分享

MTR工具使用说明文档

Mtr是一个将“traceroute”和“ping”程序功能结合在一起的一个网络诊断工具。

5K9
来自专栏数据和云

来了!PostgreSQL 同步流复制原理和代码浅析,请签收

摘要: 数据库 ACID 中的持久化如何实现 数据库 ACID 里面的 D,持久化。 指的是对于用户来说提交的事务,数据是可靠的,即使数据库 crash了,在硬...

1313

扫码关注云+社区

领取腾讯云代金券