• 蓝牙协议服务与特征值


    本文摘自BLE4.0教程二 蓝牙协议之服务与特征值分析 - Asam - 博客园  https://www.cnblogs.com/asam/p/8676369.html,仅用于自己学习查看,如果各位博客想看更详细的内容,可以打开原博主的博客了解,这篇文章写得很好的。

    1.关于服务与特征值的简述

    之前说到蓝牙的连接过程,那蓝牙连接之后具体是如何传数据的呢。这里做一下简要说明。

    蓝牙4.0是以参数来进行数据传输的,即服务端定好一个参数,客户端可以对这个参数进行读,写,通知等操作,这个东西我们称之为特征值(characteristic

    但一个参数不够我们用,比如我们这个特征值是电量的值,另一个特征值是设备读取的温度值。

    那这时候会有多个特征值,并且我们还会对它们分类,分出来的类我们称之为服务(service)。

    一个设备可以有多个服务,每一个服务可以包含多个特征值。为了方便操作,每个特征值都有他的属性,例如长度(size),权限(permission),值(value),描述(descriptor),如下图。

     2.ATT与GATT

    我们刚才介绍服务与特征值,那具体我们是怎么去实现的呢.

    蓝牙4.0版本推出了低功耗规范,引入了两个核心协议:ATT(Attribute Protocol)GATT(Generic Attribute Protocol).这两个协议主要目标是BLE,但是也可以运行在传统蓝牙上(BR/EDR)。

    ATT主要是规定了"属性"的定义,GATT则是将这些"属性"包装成我们上面所讲的服务、特征值等。

    那我们是怎么搭建起来我们的服务的呢?
    大概可以概述为,由一个个属性搭建起来的东西。如下图,每一个属性就会告诉使用者说,我是什么,我带有什么,你能对我做什么,即描述,值,权限

    序号

    描述

    权限

    属性1

    我是 服务A的开头

    只读

    服务号0001

    属性2

    我是 特征值1的开头

    只读

    特征值1的值放在属性3里

    特征值1的值类型

    特征值1的值权限

    属性3

    我是 特征值1的值

    /

    0

    属性4

    我是 特征值1的特殊操作

    读写

    关闭

    属性5

    我是 特征值2的开头

    只读

    属性6

    我是 特征值2的值

    /

    属性7

    我是 特征值2的特殊操作

    读写

    属性8

    我是 服务B的开头

    只读

    服务号0002

    上图是一个简单的表述,真正的属性表如下图。

    Handle

    Type

    Permission

    Value

    39

    0x2800

    (GATT Primary Service UUID)

    Read

    E0:FF(2 bytes)

    (0xFFE0 = simple keys service custom UUID)

    40

    0x2803

    (GATT Characteristic Declaration UUID)

    Read

    10:29:00:E1:FF(5 byte)

    (0xFFE1 = Simple keys value custom UUID)

    (0x0029 = handle 41)

    (0x10 = characteristic properties :notify only)

    41

    0xFFE1

    (simple keys state)

    (none)

    00(1 byte)

    (value indicates states of keys)

    42

    0x2902

    (GATT Client Characteristic Configuration UUID)

    Read and Write

    00:00(2 byte)

    (value indicates whether notifications or indications are enabled)

    43

    0x2800

    (GATT Primary Service UUID)

    Read

    A1:DD(2 byte)

    (0xDDA1 = Other Service custom UUID)

    属性的定义是这样的

    Handle

    Type

    Permission

    Value

    Handle: 其实上面那张属性表,在程序里只是一个数组而已,所以Handle这个值其实我们是不需要专门去存的,他只是一个索引而已。

    Type:属性的类型,也即UUID ,蓝牙标准组织已经对UUID进行了分类。

        如上表中,服务的Type就是0X2800,所以每到一个服务,就会有一个Type类型为0x2800的属性出现。

        而特征值Declaration 的Type就是0x2803。至于特征值Value的Type可以是用户自定义的。

    Permission:属性的访问权限,一般有Read、Write、 notifications、 indications

    Value:属性的值 最长可达512字节

  • 相关阅读:
    BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
    BZOJ 2134: 单选错位( 期望 )
    BZOJ 1030: [JSOI2007]文本生成器( AC自动机 + dp )
    BZOJ 2599: [IOI2011]Race( 点分治 )
    BZOJ 3238: [Ahoi2013]差异( 后缀数组 + 单调栈 )
    ZOJ3732 Graph Reconstruction Havel-Hakimi定理
    HDU5653 Bomber Man wants to bomb an Array 简单DP
    HDU 5651 xiaoxin juju needs help 水题一发
    HDU 5652 India and China Origins 并查集
    HDU4725 The Shortest Path in Nya Graph dij
  • 原文地址:https://www.cnblogs.com/haibian/p/11734413.html
Copyright © 2020-2023  润新知