Gnuradio结合hackrf 通过FSK调制实现文本文件的发送与接收
一、实现目标
1、将我们要发送的文件封装成帧;
2、通过FSK调制与解调实现文件的传输;
3、将接受到的文件进行非实时的采样处理还原我们发送的文本文件;
二、实现过程
1、将我们要发送的文本文件封装成帧
(1)首先我们要选择文本文件,例如send.txt我们在文件中输入我们要发送的字符串,在本次实验中我输入的是“Hello World!Xiaoming”,输入完后保存文件并退出。
(2) 利用自己编写的Python程序data_send.py将我们的要发送的文本文件send.txt封装成简单的数据帧
data_send.py的截图
①首先在帧头写入同步序列
代码部分:
serial =[1,0,1,1,0,1,0,0]
serial=serial*2
for i inserial:
f.write(chr(i))
通过代码可以看出,将[1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0]作为我们的同步序列(为了后面的帧同步),将同步序列以字节的形式写入code.txt文件中。
②接着写入数据的大小长度(以字节为单位)
代码部分:
str1 =intTo2Str(length,8)
for i in range(8):
temp = str1[i]
temp = int(temp)
f.write(chr(temp))
计算我们要发送文本文件的大小,此处我用一个字节表示文本的字节数,即在本次试验中我们最多能够发送256字节(稍稍改变代码,可实现更多字节的传输),本次实验的为20字节,并以追加的方式写入code.txt文件中。
③写入数据
源代码:
for i in range(length):
str1 = intTo2Str(ord(send[i]),8)
for i in range(8):
temp = str1[i]
temp = int(temp)
f.write(chr(temp))
通过循环,我们将要发送的字符串,依次转换为字节,并追加写入code.txt文件中。
④写入结束标志
源代码:
serial =[1,1,1,1,1,1,1,1]
for i inserial:
f.write(chr(i))
f.close()
我们通过数据长度就可以确定数据的长度,所以结束标志并不是为了判断数据段的结束。我们知道我们的帧会被循环的发送出去,而我们的结束标志则是为了避免产生相同的同步序列。
⑤运行data_read.py,我们打开code.txt,因为我们发现会出现乱码,就说明我们基本正确。我们写入code.txt是0或1的字节,用数字的方式写入文件。
2、将我们要发送的文本通过hackrf发送出去
(1)发送端的grc流程图
流程图介绍:
①通过File source模块读取我们的code.txt中以保存的数据,因为我们的0,1是以字节的方式存入,所以File source模块数据类型参数选择Byte,还有记住选择code.txt的文件路径。我们可以从Vector wave看出读取出来的是0,1序列。
②Char to Float模块将字节数据类型转变为Float,方便后面的数据操作,例如乘除。
③接着我们把0,1变为-0.5和0.5,接着在乘以2,即-1,1,接着在每个数字后年插入0,达到的效果是从[0,1,,,]序列变为[-1,0,1,0,,,,,]等。然后通过Repeat进行插值,即从[-1,0,,,]变为[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,,,,,],通过这一系列的变化,达到的效果就是把读取出来的[0,1]序列用双极性方波,即从v