http://blog.chinaunix.net/uid/28852942/cid-219646-list-1.html

这讲教程介绍如何使用51822的radio部分来模拟实现ble广播功能,并使手机能够搜索到该设备。这里先介绍相关理论,实战部分见 实战教程。

既然是模拟ble广播,那么首先就需要知道 ble的广播包在空中传输的 格式。

整体的 空中包数据 分如下几个字段

前导:1字节,为固定序列,8bit为01010101 或者10101010.到底使用哪个由其后的接入地址(access address)的第一个bit决定,如果是1则使用10101010,如果是0使用01010101,这样做的目的就是使 任意报文的前9个Bit都是交替的。 前导序列存在的目的是接收机可以用它来配置自动增益控制。

接入地址(access address):4字节分两种,广播接入地址和数据接入地址。 数据接入地址是在建立连接后两个设备之间使用的,由一定的规则产生。 我们这里因为是模拟广播,所以使用的是广播接入地址,为固定值是0x8E89BED6, 因为数据是LSB先发送,所以接入地址的第一个bit就是0 所以preamble的序列就是01010101.

PS:这里的接入地址 并不是 我们所说的ble的设备地址(6字节),这个接入地址是对 发射和接收端的物理radio而言的, 而ble的设备地址其实更像是应用层的地址。因为我们可以自行修改它。在广播数据包中,ble的设备地址是放在PDU中的,即负载数据中的,后面介绍具体的广播数据时会有说明。 这里这个接入地址可能不好理解,可能需要多看看规范才能渐渐明白。

PDU:即 协议数据单元。即包中的真正应用数据就是放在这里面的。

CRC: 3字节对PDU部分进行校验,不包括接入地址和前导。 Crc生成多项式为固定的x24 + x10 + x9 + x6 + x4 + x3 + x + 1

从以上了解到我们要广播的数据就是在PDU部分中。下面看一下PDU部分中包含了哪些内容。

PDU部分 在广播信道的数据包 和数据信道的数据包中格式是不一样的。这里我们只需要知道广播信道中的格式就可以了

即广播信道中的数据包,其中的PDU部分 中包含 了2字节的头 和不超过37字节的负载数据(因为PDU本身长度最大为39字节)

也就是说 负载数据Payload本身是可以变长的,那么如何知道负载数据有多少呢。这就是 PDU里前面两字节的header起作用了。

再看下header的格式

PDU TYPE:因为这里是广信道的数据包格式,所以这个type指示的是广播信道的包类型。

RFU:为目前没有使用

TxAdd:为发送者的 地址类型0表示公共地址,1表示随机地址

RxAdd:为接收者的地址类型。

Ps: 广播信道中并不是所有 类型的包 这两个指示地址类型的 bit都是有效的。比如对于普通广播包,只使用了TxAdd,因为就是一个广播向外广播数据,所以指示一下自己的地址类型就行了,RxAdd忽略就行了。 而定向广播包中TxAdd和RxAdd都使用了。因为需要指示自己的地址类型和接收方的地址类型。

Length:指示其后的负载(payload)的长度。

再介绍如何设置广播数据之前先小结一下:

ble空中包有自己的数据格式。整体分为4部分。前导,接入地址,PDU,CRC。

应用数据就是在PDU部分中。而PDU由2字节的头和变长负载组成。而应用数 据就是这个变长负载。

我们要模拟的广播,其中的广播数据也就是放在这个 变长负载payload中。

前面说过,这个包格式是广播信道中的数据包的格式。而广播信道中不是只会发广播包还包括,扫描包,连接请求包等。如下图所示。

我们这里需要模拟的就是  不可连接广播包。即上图中的 ADV_NONCONN_IND。

那么如何区分这些不同的数据包呢。  这就是前面说的 PDU中的2字节头中的PDU TYPE起作用了。由上图可知PDU TYPE的4bit为0010 时就代表这个 包的类型是普通广播包。

PS:之所以模拟这个广播包,而不是模拟 第一个普通广播包ADV_IND,是因为普通广播包,是可以被扫描和连接的,而对于可扫描的设备,手机可能会发一个扫描请求过来,如果设备没有回复扫描请求可能导致手机直接过滤掉设备导致搜不到这个设备。所以这里设置成 ADV_NONCONN_IND类型广播,改广播是不可连接也不可被扫描的。所以手机只要收到广播包就会将该设备显示在设备列表上了。

普通广播包就是向外广播数据,所以只有自己的ble地址,所以2字节头中的Txadd字段需要设置,我们使用静态随机地址,因为是随机地址,所以需要设置TxAdd为1,RxAdd忽略就行了(关于ble地址参考的教程 ble地址)。最后还剩一个Length,这个Length是只是2字节头后的payload的长度的。

这个payload也就是我们需要设置 广播什么数据的地方。

我们是模拟ADV_NONCONN_IND类型的广播,所以需要看一下该类型的广播包的payload的格式。

如下图所示:

即 负载payload部分中的数据由两部分组成 6字节广播设备地址和 广播数据。(这里的地址才是ble的设备地址,要和最前面说的那个4字节的接入地址区分开)

所以我们只要设置6字节的ble地址和一些广播数据 就完成了所有的格式要求了。

对于AdvData BLE同样也有自己的格式要求 如下图所示

广播数据中通常包含好几个类型数据,比如 设备名字,uuid,厂商自定义数据等。那么手机收到AdvData后如何将里面的数据解析成 设备名字,uuid,厂商自定义数据等呢。 就是根据上图中的 LTV结构来解析的。 也就是说广播数据的中的各个部分,像是设备名字,uuid,厂商字段什么的,都是按照LTV结构来组织的,即Length(1字节)表示后面的type(1字节)和data的长度和,type表示后面的data是什么,设备名字还是Uuid什么的。

Type的值有如下这些

我们需要用到的有 0x01 BLE_GAP_AD_TYPE_FLAGS,用来指示发现模式,和是否支持经典蓝牙。 我们设置flag为不支持经典蓝牙。

即 0x02 0x01 0x04           l为2  t为0x01   v为0x04 表示不知道经典蓝牙

然后使用到0x09 BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 来设置名字。

即 0x07 0x09 0x64 0x65 0x76 0x69 0x63 0x65

关于具体的广播数据方面 参考教程  BLE广播数据解析。

具体51822代码实现 在教程  广播模拟实践中。

最后由一个图来总结下具体的包组成和格式:

51822模拟ble广播-理论相关推荐

  1. 51822模拟ble广播-实践

    http://blog.chinaunix.net/uid-28852942-id-5745469.html 理论部分主要介绍了BLE广播包的 数据包格式,知道了数据包格式只需要按照格式要求设置数据包 ...

  2. android BLE Peripheral 手机模拟设备发出BLE广播 BluetoothLeAdvertiser

    android 从4.3系统开始可以连接BLE设备,这个大家都知道了.iOS是从7.0版本开始支持BLE.android 进入5.0时代时,开放了一个新功能,手机可以模拟设备发出BLE广播, 这个新功 ...

  3. android BLE Peripheral 模拟 ibeacon 发出ble 广播

    原文地址: https://www.cnblogs.com/CharlesGrant/p/7155211.html Android对外模模式(peripheral)的支持: 从Android 5.0+ ...

  4. ble理论(13) BT4.2 ble 广播详解

    文章目录 1.BLE 广播基本知识 1.1 BLE广播信道 1.2 BLE广播数据结构 1.3 广播间隔 1.4 广播类型 1.41 非定向可连接 广播 事件(ADV_IND) 1.4.2 定向可连接 ...

  5. ESP32 VHCI实现BLE广播,就是这么神奇

    零. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对 ...

  6. 使用C#进行蓝牙开发-接收BLE广播

    使用BluetoothLEAdvertisementWatcher类来接收附近的蓝牙广播,这个是UWP的类,关于如何在WPF或者命令行程序中使用这个类,随便一搜就有了,很简单,.NET6之后简单设置一 ...

  7. 蓝牙4.0 BLE 广播包解析

    本文转自:蓝牙4.0BLE抓包(二) – 广播包解析 - 强光手电 - 博客园 感谢原创作者! SleepingBug评论:这篇文档写的相当好,受教了,多谢了! 所有图片水印均是CSDN自动标上的,并 ...

  8. Android的BLE广播数据包介绍和解析---BLE--Android系列, 蓝牙技术BLE

    目录 一.引言 二.广播的类型 三.广播数据格式 四.广播数据解析 五.总结 一.引言 理解和分析这个数据包结构(这里面也涉及广播间隔时间的设置,设备广播数据间隔设置长了,会影响设备被发现的效率:设置 ...

  9. 【蓝牙开发 - BLE】BLE广播包

    前言 对于BLE相关的知识学习,在实际开发中,大部分的开发人员不需要接触到底层的蓝牙协议,更多的是原厂提供的BLE收发或者广播包相关设置等接口,是不涉及到原理部分的内容. 而对于希望进一步的学习蓝牙知 ...

最新文章

  1. 马斯克学什么计算机语言,马斯克头脑风暴——对计算机如醉如痴
  2. mysql handlers,2 Handlers
  3. Python update 函数 - Python零基础入门教程
  4. 第三届“信息论与编码”中大论坛诚邀您的参加
  5. 如何用Pygame写游戏(五)
  6. java程序设计_十分钟说课—Java程序设计(耿祥义)
  7. idea 导入到码云
  8. SAP License:SAP顾问薪酬
  9. 2021年营销数智化趋势洞察报告:深链经营孕育品牌发展新商机.pdf(附下载链接)...
  10. Inside ASP.NET 2.0-即时编译系统
  11. python 给文本加下划线_untiy3dUGUI实现text文本下划线
  12. UNet多类别分割的keras实现
  13. 极域电子书包课堂管理系统怎么控屏_极域电子教室使用说明
  14. hbuilderX连接雷电模拟器
  15. Stroke:利用人类遗传学理解缺血性卒中预后的机制
  16. mysql语句解决查询乱码_mysql5.0用命令行查询正常,但用sql就乱码,已经加了useUnicode=truecharacterEncoding=GBK,该如何处理 _ 搞代码...
  17. win7激活成功 但每次开机后又显示此windows副本不是正版的解决办法
  18. 今日恐慌与贪婪指数为10 恐慌程度有所上升
  19. Operator '==' cannot be applied to错误
  20. Delphi中record的使用

热门文章

  1. SQL注入——基于报错的注入(五)
  2. python条件语句函数_python sum 函数中可以使用条件语句吗
  3. java 接口 提供 路径,Java之Resource接口
  4. MYSQL数据库VALUES_MYSQL入门大全来啦!
  5. ramebufferobject工程说明
  6. localhost、127.0.0.1对网络编程造成不通的说明
  7. php与go服务之间调用,PHP调用Go服务的正确方式 - Unix Domain Sockets
  8. angular2页面抓取_angular2怎么获取目前高度?
  9. html 自动滚动标签,HTML滚动标签(marquee标签)
  10. html5图片怎么顶格,iQOO 5系列几乎达到了“顶格”的性能状态。