GNUradio与USRP折腾指南

其实这篇文章我想用摩斯电码写,但是由于我不会,所以我只能敲汉字了。
我五月份的时候拿到了两台USRP,是由国内山黑制作的。没想到居然出差一个多月,耽误了很多事情,现在我已经返回到我的家中,在折腾了很长时间之后,在我一名同事的协助下,我终于摸索出来了一些门道,也就有了这篇文章。
有一说一,这两块设备着实花了我不少功夫去学习新的知识,无线电的原理,软件定义无线电,GNUradio,甚至还因此配置了半天Arch Linux,掉头发的同时心态也好了很多(果然任何知识学到一定程度,都会转向养生)。
先做下介绍,GNUradio是一个开源软件,完全免费,官网在https://www.gnuradio.org/,中文论坛在http://gnuradio.microembedded.com/,可以用于软件定义无线电的实验环境或者是纯软件的仿真。从形式上,它的使用方式很像Matlab中的Simulink,拖动模块连线,之后进行仿真,或者控制硬件的收发。GNUradio内部包含了诸多模块,可以对信号进行各种处理,不仅可以处理,还能生成各类信号,搭配USRP或者Hackrf或者是LimeSDR你可以做到各类无线信号的收发。
USRP是一个硬件,全称是Universal Software Radio Peripheral,我用一个比较简单的方式帮助你理解这个设备——你就把它当一个很不错的天线就可以了。它帮助你接收和发送各类信号,抽象出来就是一个又长又黑的天线。官网在https://www.ettus.com/,和GNUradio的官网一样,推荐英语好的上去看看,第一手的信息都在上面。
我目前手上的俩台USRP,一台是USRP B210,另外一台是USRP B205mini,板子的外形是很漂亮的,我推荐下不同的无线电平台,目前我认为热度比较高的有这几个,hackrf one,LimeSDR,以及USRP,bladeRF,其中的hackrf属于半双工,引申一下,半双工的对立面是全双工,一个无线电设备,要么收,要么发,比如收音机,就是接收信号的,而发射收音机信号的基站则是一个发送信号的设备。手机的基带是能收能发的,我并不知道最新的基带技术,我知道之前的手机基带,是半双工的,也就是不能同时收发,是在收发之间快速切换,我们将不能同时收发的双工设备叫半双工设备,不幸的是hackrf one就是这样的设备,你可以在某一时间段收,可以在某一时间段发,但是你不能同时收发无线电信号。这就是hackrf one最大的缺陷,我个人认为也是hackrf one最廉价的原因。LimeSDR和bladerf我个人了解不多,但是LimeSDR的热度似乎比bladerf要高一些。
GNUradio与USRP折腾指南_第1张图片
下面说说USRP,这是目前软件定义无线电设备中较为高端的产品,可以从上图中看出,usrp的带宽(bandwidth)为61.44Mhz,是图中三个设备里面最高的,同时双工(duplex)性能上B210版本还是多进多出的(MIMO),比如我手上的B210,是双收双发的,而属于B200系列的B205mini则是双收单发。随着高性能带来的是高售价,如果你去买原版预计会上万,但是如果你买国产仿制品价格会降下来很多,如果你不是大公司,或者王思聪(我估计这哥们永远用不着这玩意)我还是推荐你去买国产,比如山黑的usrp,想我手里这两台一样,性能相同,价格便宜很多,国内还可以售后,体验甚至比原装好一些。
其实想要驱动USRP,官方的UHD驱动就可以实现一些有趣的功能,如果你的Matlab使用的很熟练,Matlab中也有对应的硬件支持包可以安装(无论是否正版,都可以安装),不过要使用较新的Matlab,18a,18b,19a,19b肯定是支持的,之前的,我没有进行测试,不敢妄加评论。具体的测试我还没有动手,诸位大佬可以自行尝试。
GNUradio与USRP折腾指南_第2张图片
今天我要讲的是GNUradio以及USRP的安装到正常使用,我选择的平台是Linux,搭配apt安装的GNUradio和UHD驱动。稍微提醒下,如果你想使用最新的GNUradio以及UHD驱动,很简单,安装两个官网上的指示就可以完成GNUradio和UHD的编译和安装。我之所以选择apt安装GNUradio和UHD,主要是在编译安装好后遇到了不少问题,比如,无法识别设备,GNUradio无法找到USRP的固件,即使我放到了对应的文件夹,好吧,一步步来,先让整个系统跑起来。
经过多种系统的测试,我最后还是选择了Deepin,没啥特别理由,就因为在上面它正常工作了,我使用的版本是Deepin 15.11,最新版的Deepin 20 Beta版本经过测试,暂时不支持GNUradio,所以不能使用,必须使用旧版本Deepin 15.11。
在系统安装好后,在命令行中输入:sudo apt update,以及sudo apt install gnuradio,两个命令都正常执行之后,GNUradio以及UHD驱动会被安装好,但是你现在并不能正常使用这个软件,我将运行示例程序的报错贴到这里,首先是无法找到一个二进制文件usrp_b200_fw.hex,这个文件会加载到fpga上面,没有的话必然报错。下面给了你两条路,一条是设置正确的环境变量UHD_IMAGES_DIR,另外一个是运行下面的/usr/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py。
GNUradio与USRP折腾指南_第3张图片
透过现象看本质,usrp并不是开源设备,像其他的usrp设备,比如hackrf one,是完全开源的,从硬件到单片机程序到驱动, usrp只有驱动开源,其中的fpga程序并不开源,硬件更不开源,所以fpga中运行的程序并不能给你源码,而是以压缩包的形式通过python脚本从网上下载,但是鉴于国内的网速,其实很难下载。如果你第一次安装,那肯定是要运行这个python脚本进行下载的,因为你电脑中没有usrp里面的程序,但是当你运行这个python脚本时会出现如下情况:
$ python /usr/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py
python: can’t open file ‘/usr/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py’: [Errno 2] No such file or directory
这里也很坑,报错中提示你想运行的python脚本并没有在你指定的位置,也就是说,报错中提示的脚本位置也是错的,真有你的啊,GNUradio。
我经过一番检索,发现该文件在deepin的/usr/lib/uhd/utils文件夹下面,所以如果想运行这个脚本,指令应该为sudo python /usr/lib/uhd/utils/uhd_images_downloader.py。不过如果你没有代理,你的下载会一直中断,这时候我们就要动下脑子,看下运行这个脚本的输出:
$ sudo python /usr/lib/uhd/utils/uhd_images_downloader.py
[sudo] joe 的密码:
Images destination: /usr/share/uhd/images
Downloading images from: http://files.ettus.com/binaries/images/uhd-images_003.009.005-release.zip
Downloading images to: /tmp/tmpOoNB2O/uhd-images_003.009.005-release.zip
这是前几行输出,提示了几点信息,下载完成后,这些固件会放入/usr/share/uhd/images这个文件夹,下载这些固件的网站在http://files.ettus.com/binaries/images/uhd-images_003.009.005-release.zip,下载下来的固件为一个压缩包的形式,先缓存在/tmp/tmpOoNB2O/uhd-images_003.009.005-release.zip这个文件中。
GNUradio与USRP折腾指南_第4张图片
我尝试使用wget来下载这个文件,可以看到,速度其实比手写1和0快不了多少,下载完成的时候,你都能打两盘文明了,更别提中间的下载中断之类,更麻烦了。我推荐一个很简单的办法,用迅雷,打开windows上的迅雷,复制这个下载连接会自动下载,速度上本人亲测在40k左右,比wget和运行脚本下载都要快一些。在下载完成后,不要在windows上面解压该压缩包,使用SFTP传送到linux系统中。
当文件传好之后,进行解压和移动,我们就按照脚本的指示将解压后的文件放置在/usr/share/uhd/images这个文件夹下(我放到了/usr/local/share/uhd/images这个文件夹下,这不是很重要,重要的是下载)。
在下载终于完成之后,就应该设置环境变量了,这个环境变量每次开始GNUradio之前都要设置一次,这是比较头疼的地方。指令是export UHD_IMAGES_DIR=/usr/share/uhd/images(此处/usr/share/uhd/images应替换为你放置解压好的固件的位置)。
我目前发现两个bug,一个是,你设置变量之后双击GNUradio图标,或者在其他命令行中输入gnuradio-companion运行GNUradio,还是会发生报错,会出现和上面一样的提示,找不到固件。另外一个则是非root模式下也会出现类似的错误。解决问题的办法很简单,首先输入sudo passwd root,按照提示输入当前用户的密码,之后设置root用户的密码,设置完成之后,输入su root指令,切换root用户,运行两条指令:
export UHD_IMAGES_DIR= /usr/share/uhd/images(此处/usr/share/uhd/images还是应替换为你放置解压好的固件的位置)
gnuradio-companion
在运行完这两条指令之后,GNUradio的运行就是正常的了。
GNUradio与USRP折腾指南_第5张图片GNUradio与USRP折腾指南_第6张图片GNUradio与USRP折腾指南_第7张图片运行一个流程图,看看能否与usrp通信。
完全没问题,成功了。
再介绍一些其他的知识,想要看看Linux是否识别到了设备,可以用两个命令加以验证,一个是lsusb,查看usb口有什么设备,插上usrp看一次,拔下usrp看一次,两次会有不同,下图中第一次输入lsusb的时候usrp连接到了我的电脑上,第二次输入时电脑并没有连接usrp,所以说两次如果有不同就可以看出哪个设备是usrp。
GNUradio与USRP折腾指南_第8张图片
当然还有更直观的办法,UHD驱动本身就带有一些指令可以使用,在命令行中先进行环境变量的设置:export UHD_IMAGES_DIR=/usr/local/share/uhd/images(后面的文件夹位置需要替换成你放置固件的位置),之后输入uhd_find_devices这个指令,如过你的变量设置的没问题,你的usrp会被识别到,其型号也会被认出来,像下图一样。
GNUradio与USRP折腾指南_第9张图片
当然uhd驱动带的指令其实很多,本身就可以调用来做很多事情。
在这里插入图片描述
输入uhd_之后双击tab键,查看uhd的所有指令,你可以用输入其中的任意指令,加-h查看该指令的使用方式,比如uhd_rx_nogui -h,输出如下图所示。
GNUradio与USRP折腾指南_第10张图片
现阶段我们先告一段落,我之后会更新GNUradio中的模块的相关资料,如果你觉得本文对你有一定帮助,欢迎素质三联,如果你觉得有哪些纰漏,可以直说,我进行查证之后会进行修改。

你可能感兴趣的:(GNUradio与USRP折腾指南)