Bluethooth

阅读时长10分钟

蓝牙技术是一种近距离无线连接技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。

历史:蓝牙技术是世界著名的 5 家大公司一爱立信(Ericsson)、诺基亚(Nokia)、东芝(Toshiba)、国际商用机器公司(IBM)和英特尔(Intel),于 1998 年 5 月联合宣布的一种无线通信新技术。蓝牙设备是蓝牙技术应用的主要载体,,常见蓝牙设备比如电脑、手机,平板等。

原理: 蓝牙是通过发送频率为 2.4GHZ 的 ISM 波段的电磁波来在主设备与从通信之间通信。

系统组成:蓝牙技术系统中的底层硬件模块由基带、跳频和链路管理。其中,基带是完成蓝牙数据和跳频的传输。无线调频层是不需要授权的通过 2.4GHz ISM 频段的微波,数据流传输和过滤就是在无线调频层实现的,主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。链路管理实现了链路建立、连接和拆除的安全控制。

通信方式:支持蓝牙技术的主设备与从设备,他们之间是通过协议来互相交换数据。协议类似于两个美国人交流使用英语,两个日本人交流使用日语, 两条狗交流使用狗叫。

蓝牙模式:在蓝牙 1.0,蓝牙 2.0,蓝牙 3.0 技术的不停迭代过程中,蓝牙 4.0 将蓝牙分为了两种模式:单模蓝牙(又叫做低功耗蓝牙)双模蓝牙 .直到发展到今天的蓝牙 5.0(默认支持 2 种模式)

双模蓝牙: 大数据,速率快。常见的蓝牙音箱,是典型的双模蓝牙,它需要传输大量的音频数据。
单模蓝牙: 小数据,低功耗。常见的小米手环,蓝牙温度计则属于单模蓝牙,使用纽扣电池就可以运行数月至数年。行业里一般不讲单模蓝牙,而是统一称为低功耗蓝牙。

通信过程

蓝牙设备之间要互传数据,首先设备之间需要相互认识,也就是建立连接。而设备的连接是按照 GATT协议 的要求建立,只要符合 GATT协议 就可以建立连接。

主设备向周围发送电磁波开始寻找,允许被查找的从设备,如果处于主设备的信号范围内,那么就会被发现。接下来主设备发起连接 connect 请求,从设备允许此连接请求,通信的通道建立完毕。

通信通道建立完毕后,主设备与从设备就可以开始互传数据。

此时GATT协议主设备 取名为 客户端, 从设备 取名为 服务端(这里有点绕). 此时只有主设备可以发起通信事件:读取从设备提供了哪些的服务,希望向从设备发送数据,希望接收从设备发出的数据。

flutter 代码演示:

void scan(){
  // 扫描设备
  flutterBlue.startScan(timeout: Duration(seconds: 4));

  // 监听扫描结果
  var subscription = flutterBlue.scanResults.listen((results) {

      for (ScanResult scanResult in results) {
          print('发现设备:${scanResult.device.name} ! 设备信号强度rssi: ${scanResult.rssi}');


          if (scanResult.device.name == "我的小米手环") {

              // 准备连接设备
              readyToConnect(scanResult.device);

              // 停止扫描
              flutterBlue.stopScan();
          }

      }
  });
}

void readyToConnect(BluetoothDevice device) async {
    // 开始连接设备
    await device.connect();

    // 连接成功后,发现服务(有多种服务)
    List<BluetoothService> services = await device.discoverServices();

    for (var service in services) {

      // 使用  0000fff0-0000-1000-8000-00805f9b34fb 这个服务
      if(service.uuid=="0000fff0-0000-1000-8000-00805f9b34fb"){

          // 获取服务上的Characteristic.
          // 一个服务上有多种 characteristic 特征值
          var characteristics = service.characteristics;

          for(BluetoothCharacteristic c in characteristics) {
            // 读
            List<int> value = await c.read();
            print(value);
            // 写
            await c.write([0x12, 0x34])
          }
      }
    }
}

在蓝牙开发过程中, Service uuid 以及 Characteristic uuid是我们需要重点关注的对象.与硬件 读写数据都是通过这个。

在蓝牙官方文档中,已经定义了一系列 Service,在 服务发现 Service Discovery 文档中可以看到:

  • 0x110A 标识此服务为 Advanced Audio Distribution Profile (A2DP) A2DP音频传输协议
  • x0311 标识此服务为 Audio/Video Remote Control Profile (AVRCP) 音视频远端管理协议

  • 在这里插入图片描述

GATT 协议

GATT 全称为 Generic Attribute Profile 属性配置文件。这个配置列表文件上记录了 ServiceCharacteristic 数据。

为什么要记录这两种数据? 因为在设备的发现与连接过程中使用的是 GAP(Generic Access Profile) 协议, 这个协议规定了两个设备之间发现与连接,必须带有配置表 Profile ,而配置表上记录着 Service 和 Characteristic 数据信息。

  • 配置 Profile: 一个服务清单。

    例如,一家酒店提供 吃饭/住宿/娱乐 等等一系列服务。

  • 服务 service: 协议中要求,每一个服务都必须提供一个 uuid 用来区分。标准UUID为128位,蓝牙协议栈中一般采用 16 位,也就是两个字节的 UUID 格式。

    例如,0x1A00 描述酒店的酒店名称

    例如,0x1A01 描述酒店的星级

    例如,0x1A02 描述酒店的成立日期

  • 特征值 Characteristic:协议中要求,每一个服务下的多种特征值也必须提供一个 uuid 用来区分.通常特征值用来指定具体的读或者写功能

    例如,0x1B00 描述吃饭服务中的川菜

    例如,0x1B01 描述吃饭服务中的粤菜

    例如,0x1B02 描述吃饭服务中的闽南菜

需要注意的是,每一个蓝牙设备中都有很多服务,而具体服务含义以及要使用哪种服务 uuid,都需要由硬件提供商告知使用者

拓展阅读


------ 如果文章对你有用,感谢右上角 >>>点赞 | 收藏 <<<

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值