• 【全志T113-S3_100ask】12-1 Linux蓝牙通信实战(BLE简介)


    背景

    xr829器件描述:
    802.11b/g/n,带宽HT20和HT40,蓝牙BR/EDR BLE4.2,SDIO 2.0,
    电源3.0~5.5V,封装QFN40 5mm x 5mm
    在这里插入图片描述
    @更多规格参考:https://bbs.16rd.com/thread-537948-1-1.html

    在100ask的buildroot集成了xr829的wifi和蓝牙驱动,经测试正常。
    本章将从0入门学习BLE蓝牙实战。在开始之前先认识一下BLE。

    (一)经典蓝牙与BLE蓝牙

    1、区别

    • 蓝牙无线通讯技术是一种短距离的通讯技术,可以让固定设备和移动设备之间进行数据交换。
    • 我们一般将蓝牙3.0之前的BR/EDR蓝牙称之为传统蓝牙,而将蓝牙4.0规下的BLE蓝牙称之为低功耗蓝牙
      在这里插入图片描述

    低功耗蓝牙也是建立在传统蓝牙的基础上发展起来的,其区别于传统蓝牙的最大区别就是成本和功耗的降低,应用于实时性要求比较高。

    (二)BLE简介

    1、介绍

    BLE(Bluetooh Low Energy)蓝牙BLE技术是一种短距离、低成本、可互操作性的无线技术,它利用许多的智能手段最大限度地降低其功耗。

    BLE技术的工作模式非常适用于微型无线传感器(每半秒交换一次数据)或使用完全异步通信的遥控器等其它外设传送数据。这些设备发送的数据量非常小(通常也就几个字节),而且发送的次数也很少(例如每秒几次到每分钟一次,甚至更少)。

    2、BLE协议栈的结构和配置

    1)协议有两个部分组成:Controller和Host

    2)Profiles和应用总是基于GAP和GATT之上

    3)在单芯片方案中,Controller和Host,profiles,和应用层都在同一片芯片中

    4)在网络控制器模式中,Host和Controller是在一起运行的,但是应用和profiles在另外一个器件上,比如PC或者其他微控制器,可以通过UART,USB进行操作

    5)在双芯片模式中,Controller运行在一个控制器,而应用层,profiles和Host是运行在另外一个控制器上

    @本小节转自 蓝牙和BLE蓝牙分别是什么

    (三)BLE蓝牙优势

    1、BLE蓝牙模块功耗更低、供电时间长

    因为低功耗蓝牙技术已经发展到日常平均功耗可以做到10mA以下了,如此低功耗蓝牙应用在智能产品中,用体积很小的电池供电就能坚持工作一两年甚至更久,相对其它无线技术和经典蓝牙的功耗,这正是智能产品愿意且中意的通信技术。
    在这里插入图片描述
    上图为示例,不同蓝牙参数不一样

    2、低功耗蓝牙模块连接速度快

    低功耗蓝牙技术采用非常快速的连接方式,连接时间间隔可变,这个间隔根据具体应用可以设置为几毫秒到几秒不等,几乎瞬间就能与智能手机相连,极大缩短等待的时间。

    3、低功耗蓝牙模块使用免执照频段

    因为低功耗蓝牙技术是一种免费的电磁频段,低功耗蓝牙运行的2.4GHz的频段,正是完全免费的一个电磁频段,其它例如WiFi、电磁炉等都是使用的2.4GHz的频段,就是因为这个频段不用向无线电管理部门交专门的授权费用。

    4、低功耗蓝牙模块操作简单,更适合智能产品

    一款内嵌低功耗蓝牙模块的智能产品能直接连到手机上,相对于市面上其它通讯手段,例如433MHz、ZigBee来说,虽然这些通讯技术也很成熟、传输距离也不错,但是它们并没有在智能手机上有所体现,而蓝牙功能基本是智能手机的标配之一了,匹配操作起来根本无需其它终端设备,由此来说智能产品选择蓝牙技术的原因就是终端市场的认可。

    @本节转自 低功耗蓝牙(BLE)的三大优势以及它和经典蓝牙的区别

    以下为重点内容!

    (四)BLEGATT规范中关于UUID与属性的详细解析

    1、⾓⾊

    除了GAP定义了⾓⾊之外,BLE还定义了另外2种⾓⾊:GATT服务器和GATT客户端
    
    • 1

    它们完全独⽴于GAP的⾓⾊。提供数据的设备称为提供数据的设备称为GATT服务器,访问GATT服务器⽽获得数据的设备称为GATT客户端
    以LED Button应⽤为例,外围设备(带有LED和按键)作为服务器,集中器作为客户端。
    注意:⼀个设备可以同时作为服务器和客户端。

    2、GATT层

    GATT层是传输真正数据所在的层。
    ⼀个GATT服务器通过⼀个称为属性表属性表的表格组织数据,这些数据就是⽤于真正发送的数
    据。

    2.1 属性

    • ⼀个属性包含句柄、句柄、UUID(类型)、值,句柄是属性在GATT表中的索引,在⼀个设备中每⼀个属性的句柄都是唯⼀的。
    • UUID包含属性表中数据类型的信息,它是理解属性表中的值的每⼀个字节的意义的关键信息。
    • 在⼀个GATT表中可能有许多属性,这些属性能可能有相同的UUID。

    2.2 特性

    ⼀个特性⾄少包含2个属性:⼀个属性⽤于声明,⼀个属性⽤于存放特性的值。
    
    • 1

    所有通过GATT服务传输的数据必须映射成⼀系列的特性,可以把特性中的这些数据看成是服务传输的数据必须映射成⼀系列的特性
    ⼀个个捆绑起来的数据,每个特性就是⼀个⾃我包容⽽独⽴的数据点。例如,如果⼏块数据总是⼀起变化,那么我们可以把它们集中在⼀个特性⾥。
    以LED Button应⽤为例,外围设备(带有LED和按键)作为服务器,集中器作为客户端。
    在LED Button服务中,LED和按键之间没有任何联系,⽽且它们可以各⾃独⽴地改变,因此,可以让它们成为独⽴的特性,所以我们⽤⼀个特性表⽰当前按键的状态,⽤另⼀个特性⽤来所以我们⽤⼀个特性表⽰当前按键的状态,⽤另⼀个特性⽤来表⽰当前LED的状态。

    2.3描述符

    • 任何在特性中的属性不是定义为属性值就是为描述符。描述符是⼀个额外的属性以提供更描述符是⼀个额外的属性以提供更多特性的信息,它提供⼀个⼈类可识别的特性描述的实例。
    • 然⽽,有⼀个特别的描述符值得特别地提起:客户端特性配置描述符(Client Characteristic Configuration Descriptor,CCCD),这个描述符是给任何⽀持通知或指⽰功能的特性额外增加
      的。
    • 在CCCD中写⼊“1”使能通知功能,写⼊“2”使能指⽰功能,写⼊“0”同时禁⽌通知和指
      ⽰功能。

    2.4服务

    ⼀个服务包含⼀个或多个特性,这些特性是逻辑上相关的集合体。
    GATT服务⼀般包含⼏块具有相关的功能,⽐如特定传感器的读取和设置,⼈机接⼝的输⼊输出。组织具有相关的特性到服务中组织具有相关的特性到服务中既实⽤⼜有效,因为它使得逻辑上和⽤户数据上的边界变得
    更加清晰,同时它也有助于不同应⽤程序间代码的重⽤。GATT基于蓝⽛技术联盟(SIG)官⽅⽽
    设计,SIG建议根据它们的规范设计⾃⼰的profile。
    对于LED Button应⽤例程,因为不关⼼它们的重⽤,所以把LED特性和按键特性放到了⼀个
    服务中。

    2.5 profile(数据配置⽂件)

    ⼀个profile⽂件可以包含⼀个或者多个服务,⼀个⽂件可以包含⼀个或者多个服务profile⽂件包含需要的服务的信息或者为对等设备如何交互的配置⽂件的选项信息。设备的GAP和GATT的⾓⾊都可能在数据的交换过程中改变,因此,这个⽂件应该包含⼴播的种类、所使⽤的连接间隔、所需的安全等级等信息。
    需要注意的是:⼀个profile中的属性表不能包含另⼀个属性表。

    2.6 标准的定制服务和特性

    蓝⽛技术联盟(SIG)已经定义⼀些profile、服务、特性和根据协议栈的GATT层定义的属性。
    但是,协议栈中只实现了⼀部分应⽤的BLE服务,那就意味着,只要协议栈⽀持那就意味着,只要协议栈⽀持GATT,就可能为⼀个应⽤建⽴⼀个它需要的profile和服务。
    既然在⼀个应⽤中可以⽀持profile和服务,那么就可以在这个应⽤中建⽴⼀个定制的服务。

    2.7 UUID

    “GATT层”中定义的所有属性都有⼀个UUID值,UUID是全球唯⼀的128位的号码,它⽤来识别
    不同的特性。

    2.7.1 蓝⽛技术联盟 UUID

    蓝⽛核⼼规范制定了两种不同的UUID,⼀种是基本的UUID,⼀种是代替基本UUID的16位
    UUID。
    所有的蓝⽛技术联盟定义UUID共⽤了⼀个基本的UUID:
    0x0000xxxx-0000-1000-8000-00805F9B34FB

    为了进⼀步简化基本UUID,每⼀个蓝⽛技术联盟定义的属性有⼀个唯⼀的,每⼀个蓝⽛技术联盟定义的属性有16位UUID,以代替上⾯的基本UUID的‘x’部分。例如,⼼率测量特性使⽤⼼率测量特性使⽤0X2A37作为它的16位UUID,因此它完整的128位UUID为:
    0x00002A37-0000-1000-8000-00805F9B34FB

    虽然蓝⽛技术联盟使⽤相同的基本UUID,但是16位的UUID⾜够唯⼀地识别蓝⽛技术联盟所定
    义的各种属性。
    蓝⽛技术联盟所⽤的基本UUID不能⽤于任何定制的属性、服务和特性。对于定制的属性,必对于定制的属性,必须使⽤另外完整的128位UUID。

    2.7.2 供应商特定的UUID

    SoftDevice 根据蓝⽛技术联盟定义UUID类似的⽅式定义UUID:先增加⼀个特定的基本UUID,再定义⼀个16位的UUID(类似于⼀个别名),再加载在基本UUID之上。这种采⽤为所有的定制属性定义⼀个共⽤的基本UUID的⽅式使得应⽤变为更加简单,⾄少在同⼀服务中更是如此。

    使⽤软件nRFgo Studio⾮常容易产⽣⼀个新的基本UUID:
    例如,在LED BUTTON⽰例中,采⽤0x0000xxxx-1212-EFDE-1523-785FEABCD123作为基
    本UUID。

    蓝⽛核⼼规范没有任何规则或是建议如何对加⼊基本UUID的16位UUID进⾏分配,因此你可以
    按照你的意图来任意分配。
    例如,在LED BUTTON⽰例中,0x1523作为服务的UUID,0x1524作为LED特性的
    UUID,0x1525作为按键状态特性的UUID。

    2.8 空中操作和性质

    ⼤部分的空中操作事件都是采⽤句柄句柄来进⾏的,因为句柄能够唯⼀识别各个属性句柄能够唯⼀识别各个属性。如何使⽤特性依据它的性质,特性的性质包括:
    1)写
    2)没有回应的写
    3)读
    4)通知
    5)指⽰

    2.8.1 写和没有回应的写

    写和没有回应的写允许GATT客户端写⼊⼀个值到GATT服务器的⼀个特性中。它们之间不同的地⽅在于没有回应的写事件没有任何应⽤层上的确认或回应。

    2.8.2 读

    读性质表明⼀个GATT客户端可以读取在GATT服务器中特性的值。

    2.8.3 通知和指⽰

    通知和指⽰性质允许GATT服务器在其某个特性改变的时候对GATT客户端进⾏提醒,通知和指通知和指
    ⽰之间不同之处在于指⽰有应⽤层上的确认,⽽通知没有。

    @以上内容摘自 百度文库

  • 相关阅读:
    【zookeeper】zk集群安装与启动踩坑点
    【JVM】类加载相关面试题——类加载过程、双亲委派模型
    Arduino 基础语法
    linux线程互斥
    【密码加密原则二】
    CMake Cookbook
    Java 泛型
    网络安全观察国外政策法规大事件
    Java实习生常规技术面试题每日十题Java基础(五)
    动态内存管理
  • 原文地址:https://blog.csdn.net/qq_46079439/article/details/126201781