BLE学习(1)

本文是作者初次接触BLE芯片CH579的学习笔记,详细介绍了BLE的协议栈结构,包括链路层的五种状态、广播包和数据包的格式,以及通用访问规范(GAP)的角色、模式和安全问题。此外,还概述了逻辑链路控制协议、安全管理协议、属性传输协议和通用属性规范。
摘要由CSDN通过智能技术生成

介绍

最近实验室安排了一个动物智能耳标的开发项目,沟通需求之后选择用低功耗蓝牙芯片CH579来做,因为是第一次接触BLE,所以记录一下完整的学习过程,当作笔记,这也是我第一次写博客,希望多多指点。

CH579协议栈

协议栈由 Host(主机协议层)和 Controller(控制协议层)组成,结构如下:
CH579协议栈

链路层(Link Layer)

RF 控制器。它控制设备处于准备(standby)、广播(advertising)、监听/扫描(scanning)、初始化(initiating)、连接(connected)这五种状态中一种。围绕这几种状态,BLE 设备可以执行广播和连接等操作,链路层定义了在各种状态下的数据包格式、时序规范和接口协议。

物理通道

BLE设备有3个广播通道,37个数据通道
广播信道分别分布于前中后三个不同的段,避免广播扫描过程中相邻信道干扰。

链路层操作的5个状态描述:

准备就绪状态(Standby State):不接收和发送任何数据
广播状态(Advertising State):发出广播通道包
扫描状态(Scanning State):监听其它设备发出的广播包
初始化状态(Initiating State):监听连接过的设备的广播包,同时做出回应从而开始连接
连接状态(Connection State):从Initiating State进入此状态为主,从Advertising State进入此状态为从

链路层只能处于上述状态中的一种。

BLE Packet格式
preamble(前导帧)为1个字节,为交替的0 1格式,根据Access Address第一个Bit,有两种取值情况:0x55或者0xAA(纯PHY层行为)

Access Address用来标示接收者ID或者空中包身份,如前所示,BLE只有一种packet格式,根据Access Address的不同,又区分两种Packet类型:广播包和数据包:

广播包Access Address: 固定为0x8E89BED6,广播包只能在广播信道(channel)上传输,即只能在37/38/39信道上传输(注:从蓝牙5.0开始广播包可以在其它信道上传输)。广播包发送给附近所有的observer(扫描者

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在前面的学习中,我们已经了解了Dialog BLE SDK的基本概念和使用方法,以及如何使用SDK中提供的API进行BLE设备的连接和通信。在本次学习中,我们将进一步探讨如何使用Dialog BLE SDK进行BLE设备的数据传输和处理。 一、BLE设备数据传输 在BLE设备连接成功后,我们需要通过BLE通道进行数据传输。Dialog BLE SDK提供了两种方式进行数据传输:Characteristic和Datastream。 1. Characteristic Characteristic是BLE设备中最基本的数据容器,每个Characteristic都有一个唯一的UUID来区分不同的Characteristic。在Dialog BLE SDK中,我们可以通过如下代码获取设备的Characteristic: ```c ble_service_t *service = find_service(ble, UUID_SERVICE); ble_characteristic_t *charac = find_charac(service, UUID_CHARAC); ``` 其中,UUID_SERVICE和UUID_CHARAC分别为需要获取的服务和Characteristic的UUID。获取到Characteristic后,我们可以通过如下代码进行数据传输: ```c const unsigned char data[] = {0x01, 0x02, 0x03}; uint16_t length = sizeof(data); ble_error_t err = ble_charac_notify(charac, data, length); ``` 其中,data为要传输的数据,length为数据长度,ble_charac_notify函数用于发送数据。需要注意的是,如果要使用notify功能进行数据传输,需要先开启notify模式,具体操作如下: ```c ble_charac_set_cccd(charac, true); ``` 2. Datastream Datastream是一种基于Characteristic的数据传输方式,相对于Characteristic而言,Datastream提供了更高效的数据传输,因为它可以将数据分成多个包进行传输,从而避免了数据包过大导致的传输失败和数据丢失等问题。在Dialog BLE SDK中,我们可以通过如下代码获取设备的Datastream: ```c ble_service_t *service = find_service(ble, UUID_SERVICE); ble_datastream_t *stream = find_datastream(service, UUID_DATASTREAM); ``` 其中,UUID_SERVICE和UUID_DATASTREAM分别为需要获取的服务和Datastream的UUID。获取到Datastream后,我们可以通过如下代码进行数据传输: ```c const unsigned char data[] = {0x01, 0x02, 0x03}; uint16_t length = sizeof(data); ble_error_t err = ble_datastream_send(stream, data, length); ``` 其中,data为要传输的数据,length为数据长度,ble_datastream_send函数用于发送数据。 二、BLE设备数据处理 在BLE设备数据传输完成后,我们需要对数据进行处理。在Dialog BLE SDK中,数据处理主要包括两个方面:数据解析和数据处理。 1. 数据解析 BLE设备传输的数据通常是经过编码的,因此我们需要进行解码才能得到原始数据。在Dialog BLE SDK中,我们可以通过如下代码进行数据解析: ```c ble_service_t *service = find_service(ble, UUID_SERVICE); ble_characteristic_t *charac = find_charac(service, UUID_CHARAC); unsigned char *data = ble_charac_get_value(charac); uint16_t length = ble_charac_get_length(charac); ``` 其中,UUID_SERVICE和UUID_CHARAC分别为需要获取的服务和Characteristic的UUID。获取到Characteristic后,我们可以通过ble_charac_get_value函数获取到数据的指针,通过ble_charac_get_length函数获取到数据的长度。 2. 数据处理 得到原始数据后,我们需要进行数据处理,以满足业务需求。在Dialog BLE SDK中,数据处理通常是由应用程序完成的,因为不同的应用程序有不同的数据处理需求。我们可以根据具体业务需求进行数据处理,例如数据解析、数据转换、数据存储等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值