第五周工作总结——基于Gnuradio实现ibeacon发射机

1 总述

我们已经在Matlab中实现了生成ibeacon信号的功能。为了体现SDR的概念,我们将ibeacon发射机移植到Gnuradio中,用C++实现ibeacon发射链路中的各个模块。

2 预备知识

2.1 基本概念

Gnuradio是一款提供了实现软件无线电所需的信号处理模块的开源软件,与Simulink类似。在我们的实现中用到了Gnuradio的一些重要概念,简介如下(官方教程):

  • flow graph:flow graph是Gnuradio中最基本的概念,类似于流程图,不同的是flow graph中是数据流。flow graph的节点称作block,数据则沿着连接节点的有向边流动。
  • block:block是进行信号处理的基本单位,所有的信号处理都是在block中进行的,理想状态下,每个block完成一个原子信号处理操作(如滤波等),block通过port互相连接,其中input port用于接收从前一个block传来的数据,而output port则用于发送数据给后一个block。一个流中的第一个block没有input port,其仅产生数据,被称作source;最后一个block没有output port,仅接收数据,被称作sink。
  • item:数据是以item为单位进行传输的,item可以是实采样,复采样,整数或者上述多个某一类型的标量构成的向量。
  • tagged stream blocks:这是我们在实现ibeacon发射机时涉及到的最重要的概念。在Gnuradio中,数据有两种传输模式,一种是流传输(例如滤波),另一种是包传输(例如CRC校验)。针对后者,Gnuradio提供了两种实现方式,分别是tagged stream blocks和message passing,这里我们仅介绍前者(关于message passing的概念及其与tagged stream blocks的区别可参见Gnuradio的使用手册)。tagged stream blocks使用了stream tags,后者是关于数据流的描述信息,称作metadata。通俗点说,就是在数据流的特定位置上打标签,声明数据的一些属性或相关信息(比方说ofdm解调中用到cfr等)。tagged stream blocks定义了一个特殊的stream tag来描述数据包的长度,即一个数据包中包含的item的个数。这样,tagged stream block在接收数据流时就可以根据这个描述包长度的stream tag确定数据包边界,进而对整个数据包进行操作。

2.2 Modules

为了便于管理模块,Gnuradio将具有相似功能的block封装到一个module中。除了官方发布的modules外,Gnuradio允许用户根据自己的需要编写module(out-of-tree modules)。自定义module的框架可以通过gr_modtool指令生成。

3 实现

第五周工作总结——基于Gnuradio实现ibeacon发射机_第1张图片

上图展示了我们实现的ibeacon发射机的全貌,其中包括ibeacon_source、ble_crc、ble_data_whitening、ble_access_address_and_preamble等自定义block以及官方提供的GFSK Mod和osmocom sink。

3.1 ibeacon_source

该模块的功能为生成ibeacon使用的ble pdu,其中pdu的各个field的值可以通过设定模块的参数修改。pdu的格式和生成过程与Matlab实现相同,唯一需要注意的问题也是bit ordering。

3.2 ble_crc

该模块的功能是生成CRC,这里我们用到了boost库中的crc类,crc对象的定义如下:

boost::crc_optimal<24, 0x00065B, 0x555555, 0x0, false, false> d_crc_impl;
声明中的参数的意义分别是:多项式的阶、多项式系数,LFSR的初始状态,最终异或值,是否反转输入值,是否反转输出值。


生成CRC的代码如下:

d_crc_impl.process_bytes(in, packet_length);
unsigned int cal_crc = d_crc_impl.checksum();
其中packet_length的值为pdu的字节数。


注意CRC是从大端到小端传输的,并且跟在pdu之后:

out[packet_length] = (unsigned char)((cal_crc >> 16) & 0xFF);
out[packet_length+1] = (unsigned char)((cal_crc >> 8) & 0xFF);
out[packet_length+2] = (unsigned char)(cal_crc & 0xFF);

3.3 ble_data_whitening

该模块的功能是whitening,与Matlab中相同,我们首先算出扰码序列,然后将扰码与数据异或即可。

3.4 ble_access_address_and_preamble

该模块的功能是在经过whitening的包前添加access address和preamble。对于ibeacon而言,上述两个域的值都是固定的,因此直接实现即可(当然access address可以作为参数直接修改,或者通过stream tags从上层模块传递,但是这在ibeacon发射机中是不需要实现的)。

3.5 GFSK Mod

该模块的功能是对整个packet进行GFSK调制,其本身是一个复合模块(hier block),主要包括gaussian filter和frequency modulator两部分组成。

3.6 osmocom sink

该模块的功能是将信号传输到hackrf one外设,并由后者调制到载频发射。

4 运行效果

上述实现的运行效果与第四周工作一样,这里就不再重复了。

你可能感兴趣的:(开源夏令营)