zoukankan      html  css  js  c++  java
  • BLE4.0教程二 蓝牙协议之服务与特征值分析

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

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

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

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

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

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

     

    2.ATTGATT

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

    蓝牙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:属性的访问权限,一般有ReadWrite notifications indications

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

  • 相关阅读:
    linux中mysql表名默认区分大小写导致表找不到的问题
    将hive的hql执行结果保存到变量中
    excel导出功能优化
    shell中执行hive命令错误:delimited by end-of-file (wanted `EOF')
    javascript中全局变量的定义
    datagrid中reoload提交时如何批量提交表单中的查询条件
    Linux下查看文件和文件夹大小
    Linux 时间修改--date -s命令
    Unicode字符集,各个语言的区间
    js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
  • 原文地址:https://www.cnblogs.com/asam/p/8676369.html
Copyright © 2011-2022 走看看