基于 BLE 5.1 协议 Core Spec。

BLE 数据收发,从 RF 发送/接收,到 Baseband 基带进行数据处理,数据并不是直接 raw data 出去到 空中的,分为几个部分:

对于 LE Uncoded PHYs

数据发送端(TX)经过可选的加密(取决连接状态启动加密与否),根据 PDU,启动加密引擎(硬件or软件,具体看实现)计算 CRC,数据白化后,通过 RF 发送到空口

接收的对端(RX),同样经过一些列的反流程,继续数据的处理,直到 Baseband 基带正常获取到数据。

白化的过程,是为了防止空口数据出现连续的 0 或者 1的情况,比如 0000000b or  1111111b,

对于 LE Coded PHYs

数据除了进过 Uncoded PHY 的处理以外,还要进行数据的 Coding,包含 FEC 的 encoding 和 对应的 decodeing,和 Pattern mapper 和 demapper。

硬件平台使用了phy6212 方案, 他的SDK 中带了一个Centrall例子,我刚开始调发现连接后 数据 发送 不出去,后来屏蔽了绑定部分,因为绑定部分注册验证,所以 BLE 从机也需要验证,当然这种验证比较麻烦,所以我就直接屏蔽了它。后面就正常了。 下面是代码主控代码路径 PHY62XX_SDK_2.1.0\example\ ble _central\simple Ble Central 屏蔽绑定部分,这部分在蓝牙启动开始事件处修改 if ( events & START_DEVICE_EVT ) 详解蓝牙BluetoothGattCallback用法之 BLE 数据 接收 这篇继续讲解 数据 接收 ,想要 接收 数据 必须先要使能通知@Override public void onServicesDiscovered(BluetoothGatt gatt, int status) {//发现服务,在蓝牙连接的时候会调用 List<BluetoothGattService> list = 1.启动蓝牙适配器与搜索蓝牙# 查看蓝牙适配器$ hciconfighci0: Type: Primary Bus: USBBD Address: 20:32:33:3C:2B:27 ACL MTU: 1021:6 SCO MTU: 255:12UP RUNNINGRX bytes:4404 acl:19 sco:0 events:310 errors:0TX bytes:29537 a... 里面包含了bt的各种应用场景,可以作为bt设备,以及 ble 主设备和从设备功能 ,而我们项目需要将linux系统作为一个 ble 从设备,所以需要使用peripheral这个文件夹。 attach.c attach.h efivar... HCI层为接口层,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制 Link Layer L层为RF控制器,控制设备处于准备(standby)、广播、监听/扫描(scan)、初始化、连接,这五种状态中一种。五种状态切换描述为:未连接时,设备广 1.每次收到一个字节 数据 后开始计数,计数器清零开始计数。 2.若计数器计时时间达到10ms(即10m未收到 数据 ,判断为一帧 数据 接收 结束)。 3.一帧 数据 接收 结束后,开始将一帧 数据 送到 BLE 协议栈,协议帧在再将 数据 送到Android端。   实验上述 流程 时,波特率115200,将串口 数据 发送 数据 帧的时间间隔定为20ms。发现20ms的串口 数据 帧间隔不会造成 BLE 串口 数据 接收 ,但会造成的Android端 数据 丢失,不断改变串口 数据 帧发 import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.Bluetoot... 如今的社会已经从IT时代过渡到了DT时代, 数据 的重要性不言而喻。将 数据 安全快速的传输给对方是一件非常重要的事情,如今诞生了很多不同的传输技术,每一种传输技术都是为了和对方进行 数据 交互。 BLE 技术也是这样,它的最终目的就是为了在两个设备间进行 数据 交互。我们从 BLE 的本质出发,搞清楚它是如何实现 数据 交互的,也就真正搞清楚了 BLE 的工作原理。 下面从3个方面,逐步讲解 BLE 数据 收发 过程 。 本文结合nordic的代码和蓝牙核心规范5.2来进行介绍。本文认为你对 BLE 协议栈的各个层已经有了一个大概认识,对 BLE 协议