概述
1 总述
根据之前用ios设备和ble usb dongle得到的ibeacon数据包结构,我们能用matlab生成ibeacon信号,并通过gnuradio+hackrf one发射出去,由一般的蓝牙4.0设备接收。
2 生成ibeacon信号
蓝牙4.0协议volume 6 part B 3定义了ble数据的处理过程,如下图所示:
advertising数据包没有加密过程,因此为了生成ibeacon信号,我们只需要实现几个简单的功能模块:生成pdu(内含ibeacon数据)、生成crc、data whitening、添加access address和preamble以及gfsk调制。最后,我们只需要将生成的基带复信号调制到载波上发射出去即可,这可以由gnuradio+hackrf one实现,将在第3节中介绍。其中生成crc的功能已经在
第二周工作总结中介绍了,这里不再赘述,剩余部分将在下文中介绍
2.1 生成PDU
首先回顾一下ibeacon pdu的结构
| header | payload |
| type | rfu | txadd | rxadd | length | rfu | adva | 1st ad structure | 2nd ad structure |
其中第二个ad structure的结构如下:
| type | length | manufacture id | type | length | uuid | major | minor | rssi |
ibeacon使用的pdu很简单,其header,payload中的第一个ad structure和第二个ad structure的开头都是固定的,因此这部分可以直接生成:
Header: 40 24
First AD Structure: 02 01 1A
Prefix of Second AD Structure: 1A FF 4C 00 02 15
而剩下的adva,uuid,major,minor以及rssi可以由我们随意指定。
生成pdu唯一需要注意的是每个byte的bit ordering,上文中的每个byte都是按照从高位到低位显示的,而传输过程中每个byte是从最低位开始传输的。
2.2 Data Whitening
data whitening 是在生成crc之后进行的,其作用对象是pdu和crc。data whitening的过程与生成crc的过程相似,也是使用特定的反馈移位寄存器,而区别则是两者的目的不同,data whitening使用最高位输出的伪随机码与数据比特进行模2和,对原始数据进行扰码。data whitening的示意图如下:
由于没有数据输入影响寄存器状态,我们可以通过简单的循环直接计算出与数据比特位数相同的伪随机码,并计算其与数据比特的模2和,得到输出码。这里唯一需要注意的是寄存器的初始状态与发射数据包使用的信道有关,具体可参考蓝牙4.0协议 volume 6 part b 3.2。
2.3 添加access address和preamble
advertising数据包的access address和preamble是固定的,即0x8E89BED6和0xAA,直接将相应的lsb格式的比特序列添加到data whitening的输出比特序列之前即可。
2.4 gfsk调制
matlab中没有自带的gfsk调制模块,但是有gmsk调制模块,在ble模式下可以替代。不过gfsk调制本身并不复杂,参考gnuradio中gfsk模块的实现,我在matlab中实现了gfsk调制。gfsk调制分两步,一是gaussian滤波,二是fsk调制。下面分别介绍两步的实现。
2.4.1 gaussian滤波
gfsk调制的第一步是对输入的比特序列(每个比特对应一个码元,0对应-1,1对应1)进行滤波。对于数字电路而言,码元序列和滤波器都是离散的,因此我们要确定每个码元的采样数和滤波器tap的长度。这里我们确定为每个码元采样4次,并且假设每个码元经过gaussian滤波后对相邻两个码元有影响,而每个码元的有四个采样,因此tap的长度为3*4=12。参数BT包含了滤波带宽B和符号间隔T,前者与滤波器冲激响应(gaussian函数)的方差有关,后者与采样间隔(这里是T/4)有关,因此在每个码元采样数确定的情况下,BT唯一确定了Gaussian数字滤波器。
生成滤波器后,我们需要对采样信号(每个码元复制四份得到采样信号)滤波,即将采样信号与滤波器的tap卷积即可。
2.4.2 fsk调制
fsk调制可以通过调相来实现,即每个码元引入的相移为h*pi*a,其中h是调制因子(modulation index),决定了频偏程度,ble中规定h的取值范围是0.45~0.55。a是码元幅度,对于二元非归零码,a的取值为1和-1。每个码元采样4次时,调相的精度是h*pi/4,因此我们可以根据gaussian滤波输出的码元采样序列调制相位,进而实现fsk调制。
至此,我们已经生成了完整的ibeacon基带信号,剩下的工作就是将其发射出去了。
3.1 实验准备
3. 用sdr发射信号
3.1 实验准备
首先,我们需要将生成的ibeacon信号保存到文件中,然后才能通过gnuradio+hackrf one将其发射出去。在文件中,每个复采样的实部和虚部用32位浮点数表示,按照先实部后虚部的方式保存。
直接发射ibeacon信号的流图如下:
直接发射ibeacon信号的流图如下:
其中file source模块从ibeacon信号文件中读取数据,并将其传入osmocom sink模块,osmocom sink模块通过驱动与hackrf one通信,将接收到的数据传输给hackrf one,并由后者调制到载波并发射。右下的scope sink用于显示gsfk调制信号的波形。
这次我们用iphone接收信号,app store中的Locate应用可以接收附近ibeacon广播的信号。不过只有在该应用中声明了uuid的ibeacon才能被该应用探测到,因此我们需要在应用中新建一个ibeacon的profile,如下图所示:
这次我们用iphone接收信号,app store中的Locate应用可以接收附近ibeacon广播的信号。不过只有在该应用中声明了uuid的ibeacon才能被该应用探测到,因此我们需要在应用中新建一个ibeacon的profile,如下图所示:
3.2 运行效果
我们在pc上运行gnuradio,并打开Locate软件接收。ibeacon信号的波形截图如下:
Locate软件的探测效果如下:
由于我们并未校准hackrf one发送的ibeacon信号的rssi值,因此Locate中的测距结果并不准确,但是数据包已经被正确接收了。
最后
以上就是无辜哈密瓜为你收集整理的第四周工作总结——Matlab生成iBeacon信号的全部内容,希望文章能够帮你解决第四周工作总结——Matlab生成iBeacon信号所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复