使用树莓派3B、RTL-SDR、OpenWebRX搭建无线电监测站

news2025/1/17 6:02:03

方案介绍:

OpenWebRX是一个国外开源项目,基于Python语言编写,配合SDR设备使用,能将SDR接收软件Web化,通过网络实现多用户远程访问,无需安装任何客户端软件,功能非常强大,支持:DMR、D-Star、NXDN、YSF、APRS、Pocsag、FT8等数字信号,后台自动解码,并存储解码内容上传APRS-IS、PSKreporter及WSPRNet,是一种理想的解决方案。

说通俗一些就是:1台电脑1个SDR,通过这个软件搭建一个频谱监测网站,只要能上网有浏览器的设备就能访问,随时随地查看频谱和守听,还支持多人同时使用,是不是很爽?你还在家用台子扫频吗?出门揣个便携SDR到处寻找制高点吗?来吧,利用手头的SDR,建立一个OpenWebRX基地监测站,享受业余无线电的乐趣。

这是一些老外们建设的OpenWebRX站点,可以先去体验一下。

https://www.receiverbook.de/?type=openwebrx

博主自己也搭建了一个OpenWebRX,覆盖:业余短波段、业余VU段。说到这里博主要提醒大家了:请勿触及敏感波段,特别是在互联网上!!

需要具备的条件:

  1. 技能:网络基础知识(IP地址)和Linux基本命令(别问我为什么,好玩的东西都是Linux……..需要学会:SSH连接、目录操作、vim编辑器)
  2. 服务器:64位ARM或X86的CPU,推荐使用树莓派(2B以上,Zero不行)、S905盒子(N1),X86 NUC,博主使用的是家中已有的树莓派。
  3. SDR:推荐使用RTL-SDR,要么就买老外的RTL-SDR Blog v3,要么就国产电视棒子,博主用的是前者,其优点在于频偏小,金属外壳屏蔽和散热好,25刀(160软妹币)的价格也相对60包邮的电视棒子高一些。淘宝上那些100+的RTL-SDR就别看了,都是智商税,国人连板子都懒得抄,直接换壳加忽悠;此外其它SDR(SDRPlay、AIRSPY。。。)效果会更好,价位也就更贵了,对服务器硬件要求更高。
  4. IP地址:远程访问需要的条件,但国内IPv4资源紧缺,多数家用宽带都没有公网IP地址。可以向运营商索要试试,或者做内网穿透,
  5. 天线:有条件的可以准备两根,短波和UV各一根,这样就可以全覆盖了,当然SDR也就相应是两个。

满足条件就可以开工了

选择适合的安装方式:

安装方式分为:手动编译、镜像刷入、Docker,可以根据你的服务器类型选择:

树莓派相对简单一些,此处下载镜像直接刷入,然后SSH连进去修改配置文件即可(跳过部署,直接看下文的配置文件说明),相对Docker省去了前面几步,很适合新手;

盒子较难,但其优点在于价格便宜性能强劲,咸鱼购买刷好Armbian系统的S905盒子,然后手动编译Docker部署

这里讲一下如何docker部署

主机开机并插入SDR,使用SSH客户端连入,安装好Docker工具。(群晖自带Docker套件)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

拉取镜像

docker pull jketterl/openwebrx:latest

创建外部映射目录并建立容器(

“/dev/bus/usb”是Linux下USB设备目录,SDR就包含在其中;“/date/openwebrx/conf:/etc/openwebrx”里前者是预先创建的外部目录,后者是容器内部目录,目的是将配置文件映射出来,方便以后修改配置;“8073:8073”同理是内外端口,默认即可。

mkdir -pv /date/openwebrx/conf
docker run -d --name="openwebrx" --privileged -v /dev/bus/usb:/dev/bus/usb -v /date/openwebrx/conf:/etc/openwebrx -p 8073:8073 jketterl/openwebrx:latest

此时容器就已经跑起来了,浏览器输入http://主机IP:8073就可以看到OpenWebRX的界面了。

如果界面出现“No SDR Devices available”错误,这是因为部分系统的内核自动加载SDR,而Docker容器会因宿主机占用SDR无法对其调用。解决的方法就是将SDR列入内核黑名单中。

创建黑名单文件

nano /etc/modprobe.d/rtlsdr.conf

写入如下内容(以下是RTL-SDR,其它SDR可自行百度),完成后Ctrl+x按y保存并重启系统。

blacklist dvb_usb_rtl28xxu

接下来就是编辑配置文件了,OpenWebRX的主要配置文件有:bands.json、config_webrx.py、bookmarks.json。

bands.json:频段范围配置,供后台解码服务使用,JSON语法。”lower_bound”和”upper_bound”为该频段的起始和截止频点,”frequencies”为可选参数,是频段内的特殊频点。

注意:bands.json和config_webrx.py中每个频段的划分大小根据设备的带宽决定,尽量用最少的条目创建频段,不同的SDR设备带宽不一样,可参照下表:

业余UHF段的频宽是10M(430M~440M),RTL-SDR的最佳工作带宽是2.4M,Airspy的最佳工作带宽是10M,因此Airspy仅需划分一个频段,而RTL-SDR则需要划分4个来回切换。

配置实例:业余VHF频段144M~148M,共4M,RTL-SDR需要切分成两部分。

config_webrx.py:主配置文件,Python语法+JSON语法,如果需要可以根据官方注释结合官方文档研究:

SDR设备参数部分:

此处定义SDR的相关参数,需要仔细研究,由于篇幅太多博主无法一一说明,需要注意的是站点页面可视的频宽范围和SDR带宽相关,和bands.json的配置类似,一段不够就切分成多段,切换显示。

"sdrs": {
        "rtlsdr": {
            "name": "RTL-SDR USB Stick",
            "type": "rtl_sdr",
            "profiles": {
                "70cm": {
                    "name": "70cm Repeaters",
                    "center_freq": 438800000,
                    "rf_gain": 29,
                    "samp_rate": 2400000,
                    "start_freq": 439275000,
                    "start_mod": "nfm"
                },
                "2m": {
                    "name": "2m",
                    "center_freq": 145000000,
                    "rf_gain": 29,
                    "samp_rate": 2048000,
                    "start_freq": 145725000,
                    "start_mod": "nfm"
                },
                "VHF FM Broadcast - 01": {
                    "name": "VHF FM Broadcast - 01",
                    "center_freq": 77200000,
                    "start_freq": 77000000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 02": {
                    "name": "VHF FM Broadcast - 02",
                    "center_freq": 79600000,
                    "start_freq": 79400000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 03": {
                    "name": "VHF FM Broadcast - 03",
                    "center_freq": 82000000,
                    "start_freq": 81800000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 04": {
                    "name": "VHF FM Broadcast - 04",
                    "center_freq": 84400000,
                    "start_freq": 83750000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 05": {
                    "name": "VHF FM Broadcast - 05",
                    "center_freq": 86800000,
                    "start_freq": 87800000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 06": {
                    "name": "VHF FM Broadcast - 06",
                    "center_freq": 89200000,
                    "start_freq": 89600000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 07": {
                    "name": "VHF FM Broadcast - 07",
                    "center_freq": 91600000,
                    "start_freq": 91600000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 08": {
                    "name": "VHF FM Broadcast - 08",
                    "center_freq": 94000000,
                    "start_freq": 93100000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 09": {
                    "name": "VHF FM Broadcast - 09",
                    "center_freq": 96400000,
                    "start_freq": 96400000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 10": {
                    "name": "VHF FM Broadcast - 10",
                    "center_freq": 98800000,
                    "start_freq": 98800000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 11": {
                    "name": "VHF FM Broadcast - 11",
                    "center_freq": 101200000,
                    "start_freq": 101100000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 12": {
                    "name": "VHF FM Broadcast - 12",
                    "center_freq": 103600000,
                    "start_freq": 104300000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF FM Broadcast - 13": {
                    "name": "VHF FM Broadcast - 13",
                    "center_freq": 106000000,
                    "start_freq": 105500000,
                    "start_mod": "wfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -55,
                    "rf_gain": 15
                },
                "VHF 2m Flight - 1": {
                    "name": "VHF 2m Flight - 1",
                    "center_freq": 119000000,
                    "start_freq": 119900000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 2": {
                    "name": "VHF 2m Flight - 2",
                    "center_freq": 122000000,
                    "start_freq": 122850000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 3": {
                    "name": "VHF 2m Flight - 3",
                    "center_freq": 124000000,
                    "start_freq": 125100000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 4": {
                    "name": "VHF 2m Flight - 4",
                    "center_freq": 126000000,
                    "start_freq": 125900000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 5": {
                    "name": "VHF 2m Flight - 5",
                    "center_freq": 128000000,
                    "start_freq": 127450000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 6": {
                    "name": "VHF 2m Flight - 6",
                    "center_freq": 130000000,
                    "start_freq": 130450000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 7": {
                    "name": "VHF 2m Flight - 7",
                    "center_freq": 132000000,
                    "start_freq": 132730000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 8": {
                    "name": "VHF 2m Flight - 8",
                    "center_freq": 134000000,
                    "start_freq": 133050000,
                    "start_mod": "am",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m Flight - 9": {
                    "name": "VHF 2m Flight - 9",
                    "center_freq": 135500000,
                    "start_freq": 135250000,
                    "start_mod": "am",
                    "samp_rate": 1024000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m - 1": {
                    "name": "VHF 2m - 1",
                    "center_freq": 145000000,
                    "start_freq": 144500000,
                    "start_mod": "nfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "VHF 2m - 2": {
                    "name": "VHF 2m - 2",
                    "center_freq": 147000000,
                    "start_freq": 147950000,
                    "start_mod": "nfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -61,
                    "rf_gain": 25
                },
                "UHF 70cm - 0": {
                    "name": "UHF 70cm - 0",
                    "center_freq": 409868700,
                    "start_freq": 409750000,
                    "start_mod": "nfm",
                    "samp_rate": 240000,
                    "initial_squelch_level": -62,
                    "rf_gain": 30
                },
                "UHF 70cm - 1": {
                    "name": "UHF 70cm - 1",
                    "center_freq": 431000000,
                    "start_freq": 431675000,
                    "start_mod": "nfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -66,
                    "rf_gain": 30
                },
                "UHF 70cm - 2": {
                    "name": "UHF 70cm - 2",
                    "center_freq": 433000000,
                    "start_freq": 432500000,
                    "start_mod": "nfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -66,
                    "rf_gain": 30
                },
                "UHF 70cm - 3": {
                    "name": "UHF 70cm - 3",
                    "center_freq": 435000000,
                    "start_freq": 434975000,
                    "start_mod": "nfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -66,
                    "rf_gain": 30
                },
                "UHF 70cm - 4": {
                    "name": "UHF 70cm - 4",
                    "center_freq": 437000000,
                    "start_freq": 436795000,
                    "start_mod": "nfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -66,
                    "rf_gain": 30
                },
                "UHF 70cm - 5": {
                    "name": "UHF 70cm - 5",
                    "center_freq": 439000000,
                    "start_freq": 438500000,
                    "start_mod": "nfm",
                    "samp_rate": 2400000,
                    "initial_squelch_level": -66,
                    "rf_gain": 30
                }
            },
            "always-on": true
        }
    }

OpenWebRX配置的精髓就在于此处,可实现多个SDR协同工作(博主有两个SDR:RTL-SDR Blog v3用于UV段、SDRPlay RSP1用于短波,打造全频段监测站)

大致结构:

【2~6行】单个SDR的设备ID、名称、设备类型、频偏等;

【7-10行】后台解码方式、时间段、扫描频段(bands.json中定义);

【其余】每个频段的的名称、中心频点、默认频点、默认制式、带宽、静噪、增益;

背景和图标自定义:

站点页面代码和图片在/opt/openwebrx/htdocs目录下,修改替换即可拥有自己的风格。

创建用户:

通过官方源安装的过程中会提示创建管理员并输入密码

而树莓派镜像有现成的“openwebrx”命令,SSH连入命令行执行命令创建管理员:

openwebrx admin adduser admin
openwebrx admin enableuser admin

Docker则需执行Python脚本创建管理员,如下命令是进入容器和执行创建一气呵成:

docker exec -it openwebrx python3 /opt/openwebrx/openwebrx.py admin adduser admin

目前还没有授权方法,所以创建出的用户都是管理员,期待后续版本加入权限分配功能。更多说明请参考官方文档的用户管理部分。

结语:

以上就是博主对OpenWebRX的安装和配置的简单说明,希望各位友台们发掘出更多功能。有条件的友台也不要吝惜你的资源,监测站的搭建可以为更多的台友提供信号监听、传播分析、信标上传等服务,这类技术研究或者说基础设施建设,在方便自己和他人的同时也促进了圈子的繁荣、推动了业余无线电的发展、体现了我们爱好者的团结互助精神。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python位置参数

位置参数,有时也称必备参数,指的是必须按照正确的顺序将实际参数传到函数中,换句话说,调用函数时传入实际参数的数量和位置都必须和定义函数时保持一致。实参和形参数量必须一致在调用函数,指定的实际参数的数量&#…

DaVinci:Camera Raw(CinemaDNG)

本文主要介绍 CinemaDNG Raw 格式素材相关的 Camera Raw 参数。解码质量Decode Quality解码质量决定了图像解拜耳之后所呈现的素质。默认为“使用项目设置” Use project setting,表示使用项目设置对话框中的“Camera RAW”解码质量设置。还可选择:全分辨…

离散系统的数字PID控制仿真-1

控制对象为:采样时间为1ms,采用z变换进行离散化,经过z变换后的离散化对象为:y(k)-den(2)y(k -1)- den(3)y(k -2)- den(4)y(k-3)num(2)u(k -1) num(3)u(k -2) num(4)u(k-3)设计离散PID控制器。其中,S为信号选择变量&…

【数据库概论】第四章 数据库安全性

第四章 数据库安全性 目录第四章 数据库安全性4.1 概述4.2 数据库安全性控制1.用户身份识别2.存取控制3.自主存取控制方法4.授权:授予与收回GRANT:授权语句REVOKE:收回权限3.创建数据库模式的权限4.数据库角色5.角色权限的回收6.强制存取控制…

贪心算法(greedy algorithm)

贪心算法什么是贪心算法[122. 买卖股票的最佳时机 II](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/)代码[455. 分发饼干](https://leetcode.cn/problems/assign-cookies/)思路代码[435. 无重叠区间](https://leetcode.cn/problems/non-overlapping-inte…

SaaS是什么,目前主流的国内SAAS平台提供商有哪些?

SaaS是什么,目前主流的国内SAAS平台提供商有哪些?SaaS这个概念近两年可谓说是十分火热,尤其是后疫情时代。 但还是有很多人对SaaS这个名词云里雾里,被碎片化的信息裹挟,并没有真正意义上理解SaaS的概念。 这篇就综合…

87.【SpringBoot-01】

SpringBoot(一)、前面回顾1.什么是Spring2.Spring 是如何简化Java开发的(二)、什么是SpringBoot1.基本含义:2.Spring Boot的主要优点(三)、微服务1.什么是微服务2.单体应用架构3.微服务架构 (活字印刷)4.如何构建微服务(四)、第一个SpringBoot程序1.点击新建文件2.勾选web框架3…

通用的产品功能设计方法

通用的产品功能设计方法1.如何设计注册/登录功能1.1 注册功能设计1.2 登录功能的设计2.如何设计APP启动页功能和引导页功能2.1 启动页功能设计2.2 引导页功能设计3.如何设计非法信息输入校验功能3.1 非法文本信息的输入校验规则3.2 非法图片信息的输入校验规则3.3 非法附件信息…

《C++程序设计原理与实践》笔记 第11章 定制输入/输出

在本章中,我们重点关注如何使第10章中介绍的通用iostream框架适配特定的需求和偏好。 11.1 规则性和不规则性 C标准库的输入/输出部分——iostream库为文本的输入和输出提供了一个统一的、可扩展的框架。 到目前为止,我们将所有输入源视为等价的&…

Python Flask 实现 HTML 文件压缩,9 级压缩

本博客详细为你解释 Python Flask 框架下的 HTML 文件压缩内容,其第三方模块也可用在其他框架中。 本案例是基于 Python Flask 进行搭建,所以需要提前搭建一个 Flask 项目环境,有 app.py 文件和 templates/index.html 文件即可。 实现 HTML 文…

微服务架构编码构建

目录 一、约定 > 配置 > 编码 二、IDEA新建project工作空间 (一)微服务cloud整体聚合父工程Project (二)父工程POM (三)Maven工程落地细节复习 三、Rest微服务工程构建 (一&#…

【蓝桥云课】进制

对于任意数制RRR的数nnn,都可以表达为n∑i0kaiRia0R0a1R1a2R2...akRkn\sum_{i0}^{k}a_{i}R^{i} a_{0}R^{0}a_{1}R^{1}a_{2}R^{2}...a_{k}R^{k}ni0∑k​ai​Ria0​R0a1​R1a2​R2...ak​Rk 一、十进制转RRR进制 方法:十进制数除RRR取余,余数…

kaggle竞赛 | 计算机视觉 | 数字图像基础操作

目录cv2基本操作图片哈希图像数据扩展无监督数据扩展方法监督式数据扩展方法cv2基本操作 import numpy as np import matplotlib.pyplot as plt import cv2img cv2.imread(cat.jpeg) plt.imshow(img)img cv2.imread(cat.jpeg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pl…

JUC并发编程(2.Java线程)

1.线程运行原理 栈与栈帧 Java Virtual Machine Stacks (Java 虚拟机栈) 我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?栈内存是给线程用,每个线程启动后,虚拟机就会为其分配一块栈内…

cmake 05 使用库

本文目标 使用自己写的动态库使用第三方库更新 cm 使用自己的动态库 写一个简单的库 目录结构 F:\2023\code\cmake\calc>tree /f 卷 dox 的文件夹 PATH 列表 卷序列号为 34D2-6BE8 F:. │ CMakeLists.txt │ ├─include │ └─calc │ calc.h │ └─srcc…

2022除夕卖水果

急促的呼吸,急促的爱,急促的吆喝声 来吧 朋友 伸出你的手 还有十分钟,拆拆盒子收摊中 管尝管饱,礼盒散装可打包 红橙黄绿青蓝紫 苹果樱桃小番茄 柠檬枳柑桔橙柚 香蕉龙眼与柠檬 蜜瓜西瓜猕猴桃 提子樱桃火龙果 葡萄甘蔗车厘子 柿子…

ES常用知识点整理第一部分

ES常用知识点整理第一部分引言APICrud APIBulk API批量读取批量查询ES服务器常见错误返回倒排索引分词器中文分词器Search APIURI SearchQuery DSL查询表达式短语搜索Query String 和 Simple Query Stringmapping映射动态映射手动映射多字段特性自定义分词Index TemplateDynami…

【Ubuntu】Nacos 2.1 单机安装

目录Nacos 2.1 单机安装1. 从GitHub下载2.1.0的压缩包2. 解压与配置3. 数据库配置4. 单机启动nacos遇到的一些错误ErrMsg:jmenv.tbsite.netlibstdc.so.6: cannot open shared object file: No such file or directoryCaused by: java.lang.IllegalStateException: No DataSourc…

3DCAD图纸转2D(DXF)图纸通用解决方案文稿

3DCAD图纸转2D(DXF)图纸通用解决方案文稿 本文地址:https://gitee.com/dvaloveu/lovedva/issues/I6B5YC 视频演示(1.25倍速&原速):Acfun Bilibili 脚本地址:https://gitee.com/dvaloveu/ug-automation/blob/master/ug2caxa/hellowolrd.p…

第二章物理层-第五节:信道的极限容量

文章目录一:相关概念(1)失真(2)信道带宽W(3)波特率(Baud)二:奈奎斯特定理(奈氏准则)三:香农定理本节对应视频 【计算机网络…