• 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])
              }
          }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在蓝牙开发过程中, 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,都需要由硬件提供商告知使用者

    拓展阅读


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

  • 相关阅读:
    Java Web 7 JavaScript 7.7 事件监听 && 7.8 表单验证案例
    关于windows虚拟机的问题
    coco2017数据集COCO格式转YOLO格式
    Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell
    c++视觉处理---高斯滤波
    【浏览器内多个标签页之间的通讯、XSS和CSRF】
    了解高防服务器的工作原理
    【目标跟踪】|单目标跟踪指标
    mac火狐浏览器快速下载,aria2设置
    stamp mismatch with notes file
  • 原文地址:https://blog.csdn.net/win7583362/article/details/127443148