跳到内容

OpenWebRX无线电监测站

方案介绍:

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

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

这是OpenWebRX的WiKi和一些老外们建设的站点,可以先去感受一下歪果仁的交流和分享精神。

https://github.com/jketterl/openwebrx/wiki

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

博主自己也搭建了一个OpenWebRX,覆盖:FM、航空、业余V段、业余U段。目前因为楼顶短波天线架设和服务器硬件升级问题,短波段和站点公开还没有实现,毕竟搭建站点需要一定的专业技术和环境条件,博主也会努力争取早日完工,供本地的HAM们日常测试使用。

PC页面:

手机端:

 

需要具备的条件:

  1. 技能:网络基础知识(IP地址)和Linux基本命令(别问我为什么,好玩的东西都是Linux……..需要学会:SSH连接、目录操作、nano编辑器)
  2. 服务器:64位ARM或X86的CPU,推荐使用树莓派(2B以上,Zero不行)、S905盒子(N1、天邑),X86 NUC,博主使用的是家中已有的群晖NAS。
  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部署

博主使用的是家里现成的群晖NAS;博主是个懒人,因此本文推荐使用Docker,优点就是部署简单,不用一个一个组件编译;配置方便,直接对映射到外部的配置文件进行编辑;升级方便,到处容器配置更换镜像即可。

 

开工:

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

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

 

拉取镜像(群晖Docker注册表搜索“jketterl/openwebrx”)

docker pull jketterl/openwebrx:latest

 

创建外部映射目录并建立容器(博主的群晖是5.2老版本,无法映射硬件设备,所以SSH连接命令行创建容器,使用新版本群晖的仁兄可以尝试一下图形化配置。)

“/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需要切分成两部分。

[
  {
    "name": "VHF 2m - 1",
    "lower_bound": 144000000,
    "upper_bound": 146000000,
    "frequencies": {
      "packet": 144640000
    }
  },
  {
    "name": "VHF 2m - 2",
    "lower_bound": 146000000,
    "upper_bound": 148000000
  }
]

 

config_webrx.py:主配置文件,Python语法+JSON语法,博主为主要功能做了注释,其余功能默认即可,如果需要可以根据官方注释结合官方文档研究:

 

SDR设备参数部分:

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

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

大致结构:

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

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

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

sdrs = {
    "rtlsdr": {
        "name": "RTL-SDR",
        "type": "rtl_sdr",
        # "ppm": 0,
        # "lfo_offset": 0,
        "scheduler": {
            "type": "static",
            "schedule": {
                "0000-0000": "VHF 2m - 1"
            }
        },
        "profiles": {
            "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
            }
        }
    }
}

 

max_clients = 3 # 站点最多同时访问人数(根据硬件配置和网络带宽权衡)

# ==== Web GUI configuration ====
# 站点标题选项
receiver_name = "Radio Receiver - VHF UHF" # 站点标题
receiver_location = "Xi'an, China" # 所在城市
receiver_asl = 93 # 天线高度
receiver_admin = "admin@gmail.com" # 站长邮箱
receiver_gps = {"lat": xx.xxxx, "lon": xxx.xxxx} # 纬度和经度
photo_title = "BG9EGA Radio Receiver" # 站点说明
photo_desc = """
Receiver is operated by: <a href="https://ham.com" target="_blank">BG9EGA</a><br/>
Device: RTL-SDR Blog V3<br />
Antenna: RenQiu 2.4m<br />
""" # 设备说明

# ==== Public receiver listings ====
# 频谱瀑布参数
fft_fps = 16 # 频谱瀑布刷新率(帧数越大越流畅,占用网络带宽越多)
fft_size = 4096 # 频谱瀑布幅度(1024的倍数)
fft_voverlap_factor = (
    0.3 # If fft_voverlap_factor is above 0, multiple FFTs will be used for creating a line on the diagram.
) # 频谱重叠指数(默认即可)

# ==== Color themes ====
# 频谱颜色参数
waterfall_scheme = "TeejeezWaterfall" # 频谱颜色主题,博主建议使用这个,黑色背景看频谱更舒服
waterfall_levels = {"min": -74, "max": -30} # 频谱能呈现出的信号强度范围(单位dB)
waterfall_auto_level_margin = {"min": 5, "max": 40, "min_range": 50}

# === Experimental settings ===
# 后台解码参数
nmux_memory = 50
map_position_retention_time = 2 * 60 * 60
decoding_queue_workers = 2
decoding_queue_length = 10
wsjt_decoding_depth = 3
wsjt_decoding_depths = {"jt65": 1}
fst4_enabled_intervals = [15, 30]
fst4w_enabled_intervals = [120, 300]
q65_enabled_combinations = ["A30", "E120", "C60"]
js8_enabled_profiles = ["normal", "slow"]
js8_decoding_depth = 3
services_enabled = True # 是否开启后台解码,在sdr配置段的"scheduler"中指定计划任务
services_decoders = ["packet"] # 后台解码的类型,博主只解码APRS信标

# === aprs igate settings ===
# APRS网关服务参数,将后台解码到的APRS信标上传至APRS-IS,前往http://aprs.cn/查看
aprs_callsign = "BG9EGA-10" # 网关呼号+SSID
aprs_igate_enabled = True # 开启网关功能
aprs_igate_server = "china.aprs2.net" # APRS-IS服务器
aprs_igate_password = "xxxxx" # 呼号在APRS-IS上的Pass_Code,去http://22meters.com/生成
aprs_igate_beacon = True # 上传网关自身信标(上面"receiver_gps"处配置的坐标)
aprs_igate_symbol = "/r" # APRS图标,由两个字符组成,参见http://202.141.176.3/img/symbol.php
aprs_igate_comment = "Xi'an 2 Meter APRS iGate" # 信标附带说明文字,可填写网关频率及状态信息。
aprs_igate_height = "5" # 天线高度
aprs_igate_gain = "0" # 天线增益(网关是单接收,所以用#屏蔽掉此项)
aprs_igate_dir = "NE" # 天线朝向(我们大多使用全向天线,所以用#屏蔽掉此项)

# === PSK Reporter setting ===
# 将解码到的数字通联(如FT8)上传至监测网站https://pskreporter.info/pskmap.html
pskreporter_enabled = True # 开启汇报功能
pskreporter_callsign = "BG9EGA" # 汇报者呼号
pskreporter_antenna_information = "Dipole" # 天线类型

# === WSPRNet reporting settings
# 将解码到的若数字信号上传至监测网站https://wsprnet.ort
wsprnet_enabled = True
wsprnet_callsign = "BG9EGA"

 

bookmarks.json:书签配置,JSON格式,将一些常用的频点存入其中,在站点中就可以书签的方式快速切换,参见:书签设置

[
  {
    "name": "C4 CQ",
    "frequency": 434775000,
    "modulation": "ysf"
  },
  {
    "name": "DMR CQ",
    "frequency": 434875000,
    "modulation": "dmr"
  },
  {
    "name": "FM CQ",
    "frequency": 434975000,
    "modulation": "nfm"
  }
]

 

背景和图标自定义:

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

 

博主将网关自身信标做了一番修饰,方便来访的外地火腿了解当地APRS网关的频率及分布情况

 

结语:

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

发表于无线电

7 Comments

  1. 博主写得非常详细,学习了。

    • 国内有关的教程实在太少,我也是受你博文的启发。

  2. bg4vrg bg4vrg

    这个配置文件在最新版里好像没有用了

  3. bg4vrg bg4vrg

    我试了用玩客云跑docker,解码wfm时cpu70%。但是我的看不到dmr模式。另外新版配置文件也变化了。大佬有空升级看看,分享下教程啊哈哈

  4. 正巧前两天看朋友访问websdr,搜索无意中看到openwebrx,查找相关内容又来到前辈站点了。感谢~

    • 我还有一篇介绍新版本的博文,OpenWebRX是个好东西,值得推广。

      • 嗯,我用ubuntu搭建了最新的那个v1.1.0,操作挺简单的,就是刚开始不知道还以为得手动安装驱动,结果是自己想多了,添加设备就可以了,驱动都自带了!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注