{"id":13583379,"url":"https://github.com/reynico/raspberry-websdr","last_synced_at":"2025-06-13T08:32:42.905Z","repository":{"id":47164354,"uuid":"115165758","full_name":"reynico/raspberry-websdr","owner":"reynico","description":"Raspberry PI based WebSDR server","archived":false,"fork":false,"pushed_at":"2025-05-26T01:13:47.000Z","size":8178,"stargazers_count":122,"open_issues_count":0,"forks_count":21,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-05-26T02:25:21.657Z","etag":null,"topics":["raspberry-pi","sdr","websdr"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reynico.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-23T02:49:34.000Z","updated_at":"2025-05-26T01:13:50.000Z","dependencies_parsed_at":"2024-07-12T23:55:14.454Z","dependency_job_id":null,"html_url":"https://github.com/reynico/raspberry-websdr","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/reynico/raspberry-websdr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reynico%2Fraspberry-websdr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reynico%2Fraspberry-websdr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reynico%2Fraspberry-websdr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reynico%2Fraspberry-websdr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reynico","download_url":"https://codeload.github.com/reynico/raspberry-websdr/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reynico%2Fraspberry-websdr/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259610142,"owners_count":22884200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["raspberry-pi","sdr","websdr"],"created_at":"2024-08-01T15:03:26.412Z","updated_at":"2025-06-13T08:32:42.897Z","avatar_url":"https://github.com/reynico.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# Nodo WebSDR utilizando un Raspberry PI\n\nLeer en [Inglés](README.md), [Español](README.es.md)\nRead in [English](README.md), [Español](README.es.md)\n\n![Receptor SDR funcionando en la banda de 40 metros](https://github.com/reynico/raspberry-websdr/raw/master/sdr-40m.jpg)\n\n- [Nodo WebSDR utilizando un Raspberry PI](#nodo-websdr-utilizando-un-raspberry-pi)\n  - [Requerimientos de hardware](#requerimientos-de-hardware)\n  - [Estás usando una Raspberry PI 4 o mas nueva?](#estás-usando-una-raspberry-pi-4-o-mas-nueva)\n  - [Configuración y software requerido](#configuración-y-software-requerido)\n  - [Clonar este repositorio](#clonar-este-repositorio)\n  - [Librerias faltantes](#librerias-faltantes)\n    - [libpng12](#libpng12)\n    - [libssl-1.0.0](#libssl-100)\n  - [Direct sampling en RTL SDR (500KHz - 28.8MHz sin upconverter!)](#direct-sampling-en-rtl-sdr-500khz---288mhz-sin-upconverter)\n  - [Instalar WebSDR](#instalar-websdr)\n  - [WebSDR de una sola banda](#websdr-de-una-sola-banda)\n  - [WebSDR multi banda controlado por tiempo](#websdr-multi-banda-controlado-por-tiempo)\n    - [Controlador de antena](#controlador-de-antena)\n    - [Habilitar WebSDR doble banda](#habilitar-websdr-doble-banda)\n    - [Cron](#cron)\n    - [Control manual](#control-manual)\n    - [Configuración de los pines GPIO](#configuración-de-los-pines-gpio)\n  - [Reinicio por software](#reinicio-por-software)\n  - [Blacklist de los modulos RTL](#blacklist-de-los-modulos-rtl)\n  - [Desgaste de la tarjeta SD](#desgaste-de-la-tarjeta-sd)\n\nEsta guía cubre la configuración de un receptor de doble banda (80/40 metros) basada en forma horaria. Usa un relay para intercambiar entre antenas, controlado por un puerto GPiO del Raspberry PI (utilizando un transistor como driver).\n\nMuchas gracias a Pieter PA3FWM, Mark GP4FPH y Jarek SQ9NFI por la gran mano configurando el parámetro progfreq.req setting.\n\n## Requerimientos de hardware\n\n- Raspberry PI 3 o superior\n- [Raspberry Pi OS (Legacy) instalado](https://downloads.raspberrypi.com/raspios_oldstable_lite_armhf/images/raspios_oldstable_lite_armhf-2024-03-12/2024-03-12-raspios-bullseye-armhf-lite.img.xz) y funcionando.\n- Acceso a internet configurado y funcionando\n- Receptor RTL-SDR USB\n\n## Estás usando una Raspberry PI 4 o mas nueva?\n\nA partir de la Raspberry PI 4, el hardware corre en una arquitectura diferente (pero similar) al hardware viejo. `websdr-rpi` no es completamente compatible con esta nueva arquitectura, mas que nada por dependencias desactualizadas y por lo tanto puede que te encuentres con algunos de estos errores:\n\n```\nwebsdr-rpi: cannot execute: required file not found\n```\n\nor\n\n```\nwebsdr-rpi: error while loading shared libraries: libfftw3f.so.3\n```\n\nAlgunos de los pasos listados aquí abajo tienen instrucciones específicas para configurar una Raspberry PI 4 con hardware moderno y solucionar estos problemas.\n\n## Configuración y software requerido\n\n```bash\nsudo apt update \u0026\u0026 sudo apt upgrade\nsudo apt install -y \\\n  g++ \\\n  make \\\n  libsigc++-2.0-dev \\\n  libgsm1-dev \\\n  libpopt-dev \\\n  tcl8.6-dev \\\n  libgcrypt-dev \\\n  libspeex-dev \\\n  libasound2-dev \\\n  alsa-utils \\\n  libsigc++-2.0-0v5 \\\n  cmake \\\n  groff \\\n  rtl-sdr \\\n  libusb-1.0-0-dev \\\n  unzip \\\n  git \\\n  rsync\n```\n\nSi estás usando una Rapberry PI 4 o mas nueva (con arquitectura arm64), instalá la arquitectura `armhf`:\n\n```bash\nsudo dpkg --add-architecture armhf\nsudo apt install -y \\\n  libsigc++-2.0-dev:armhf \\\n  libgsm1-dev:armhf \\\n  libpopt-dev:armhf \\\n  tcl8.6-dev:armhf \\\n  libgcrypt-dev:armhf \\\n  libspeex-dev:armhf \\\n  libasound2-dev:armhf \\\n  libsigc++-2.0-0v5:armhf \\\n  libusb-1.0-0-dev:armhf \\\n  libc6:armhf \\\n  zlib1g-dev:armhf\n```\n\n## Clonar este repositorio\n\n```\ncd /home/pi/\ngit clone https://github.com/reynico/raspberry-websdr.git\ncd raspberry-websdr/\n```\n\n## Librerias faltantes\n\nCon las últimas actualizaciones, algunas librerias requeridas por websdr fueron deprecadas haciéndolas incompatibles.\n\n### libpng12\n\nSi estás usando una Rapberry PI 4 o mas nueva (con arquitectura arm64), compilá `libpng` de esta manera:\n\n```bash\nsudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf\n\ntar xf libpng-1.2.59.tar.xz\ncd libpng-1.2.59/\nCC=arm-linux-gnueabihf-gcc \\\nCXX=arm-linux-gnueabihf-g++ \\\n./configure \\\n  --host=arm-linux-gnueabihf \\\n  --prefix=/usr/local \\\n  --libdir=/usr/local/lib/arm-linux-gnueabihf\n\nmake\nsudo make install\nsudo ldconfig\nsudo ln -s /usr/local/lib/arm-linux-gnueabihf/libpng12.so.0 /lib/arm-linux-gnueabihf/libpng12.so.0\ncd..\n\n```\n\nSi estás usando una Raspberry anterior a una PI 4, usá este comando:\n\n```bash\ntar xf libpng-1.2.59.tar.xz\ncd libpng-1.2.59/\n./configure\nmake\nsudo make install\ncd ..\n```\n\n### libssl-1.0.0\n\nSi estás usando una Rapberry PI 4 o mas nueva (con arquitectura arm64), compilá `libssl` de esta manera:\n\n```bash\ncd openssl-1.0.0k/\n\nCC=arm-linux-gnueabihf-gcc ./Configure linux-armv4 shared \\\n  --prefix=/usr/local/arm32 \\\n  --openssldir=/usr/local/arm32/ssl \\\n  -Wl,--version-script=openssl.ld \\\n  -Wl,-Bsymbolic-functions\n\nmake\nsudo make install_sw\n\nsudo ln -s /usr/local/arm32/lib/libcrypto.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0\nsudo ln -s /usr/local/arm32/lib/libssl.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libssl.so.1.0.0\n\nsudo ldconfig\n```\n\n\nSi estás usando una Raspberry anterior a una PI 4, usá este comando:\n\n```bash\ntar xf openssl-1.0.0k.tar.gz\ncd openssl-1.0.0k/\ncat \u003c\u003c EOF \u003e openssl.ld\nOPENSSL_1.0.0 {\n    global:\n    *;\n};\nEOF\n./config shared --prefix=$HOME/libssl/openssl --openssldir=$HOME/libssl/ssl -Wl,--version-script=openssl.ld -Wl,-Bsymbolic-functions\nmake\nsudo make install_sw\nsudo ldconfig\nldd $HOME/libssl/openssl/bin/openssl\nsudo cp $HOME/libssl/openssl/lib/libcrypto.so /usr/local/lib\nsudo chmod 0755 /usr/local/lib/libcrypto.so\nsudo ldconfig\ncd ..\n```\n\n## Direct sampling en RTL SDR (500KHz - 28.8MHz sin upconverter!)\n\nSi estás usando un receptor RTL-SDR.com V4, necesitás una versión especial del driver `rtl-sdr` para poder recibir 500KHz-28.8MHz\n\n```bash\ngit clone https://github.com/rtlsdrblog/rtl-sdr-blog\ncd rtl-sdr-blog/\nmkdir build\ncd build\ncmake ../ -DINSTALL_UDEV_RULES=ON\nmake\nsudo make install\nsudo cp ../rtl-sdr.rules /etc/udev/rules.d/\nsudo ldconfig\n```\n\nIf you are running a different SDR device, but if it supports direct sampling (such as RTL-SDR.com V3 receiver), there's a way to receive 500KHz-28.8MHz without an external upconverter hardware, easing the node build.\n\nSi estás usando un receptor SDR diferente, pero que soporta direct sampling (como el RTL-SDR.com v3), hay una manera de recibir las frecuencias entre 500KHz y 28.8MHz sin necesidad de un upconverter externo, facilitando la construcción del nodo.\n\n```bash\nunzip rtl-sdr-driver-patched.zip\ncd pkg-rtl-sdr/\nmkdir -p build/\ncd build/\ncmake ../ -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON\nmake\nsudo make install\nsudo ldconfig\ncd ../../\ncp -r pkg-rtl-sdr/ /home/pi/\ncd ..\n```\n\nNo olvides eliminar o comentar la linea `progfreq` de el(los) archivo(s) de configuración de websdr.\n\nUse the following systemd unit for direct sampling:\n\n```bash\nsudo cp etc/systemd/system/rtl_tcp_direct_sampling.service /etc/systemd/system/rtl_tcp@.service\n```\n\n## Instalar WebSDR\n\n- Este es un buen momento para reiniciar la Raspberry PI, ejecutar `sudo reboot`.\n- Enviale un email a [Pieter](http://websdr.org/) para obtener una copia de WebSDR.\n- Copia el binario websdr-rpi y los archivos de configuración a tu directorio personal (/home/pi/)\n- Edita websdr-80m.cfg y websdr-40m.cfg para ajustarlo a tu configuración\n- Crea dos Systemd units para controlar websdr y rtl_tcp\n\n```bash\nsudo cp etc/systemd/system/websdr@.service /etc/systemd/system/websdr@.service\n```\n\nCopia este archivo solo si NO estás usando el modo direct sampling de tu RTL SDR. Los receptores RTL-SDR.com V4 no necesitan la configuración especial de [Direct Sampling](#rtl-sdr-direct-sampling-500khz---288mhz-without-upconverter) para funcionar.\n\n```bash\nsudo cp etc/systemd/system/rtl_tcp@.service /etc/systemd/system/rtl_tcp@.service\n```\n\n## WebSDR de una sola banda\n\nEl setup descripto en esta sección es el mas común: un receptor SDR de una sola banda, por ejemplo de 40 metros.\n\n- Crea las systemd units para controlar `websdr` y `rtl_tcp`:\n\n```bash\nsudo cp etc/systemd/system/websdr.service /etc/systemd/system/websdr.service\nsudo cp etc/systemd/system/rtl_tcp@.service /etc/systemd/system/rtl_tcp@.service\n```\n\n- Habilita la systemd unit `rtl_tcp`:\n\n```bash\nsudo systemctl enable rtl_tcp@0.service\n```\n\n- Habilita la systemd unit `websdr`:\n\n```bash\nsudo systemctl enable websdr.service\n```\n\n## WebSDR multi banda controlado por tiempo\n\nEl Setup descripto en esta sección es mas poderoso: donde la Raspberry PI cambia la banda de recepción de WebSDR de acuerdo a los horarios definidos en `crontab`.\n\n### Controlador de antena\n\nEsta configuración de WebSDR utiliza un solo receptor RTL-SDR para dos bandas (40/80 metros), crontab toma el control de que banda está funcionando. Así como la longitud de onda no es la misma para las dos bandas, estoy utilizando un pin GPiO para intercambiar entre ellas usando un relé doble polo doble inversor. El pin GPiO3 es controlado por el script check_band.sh\n![Circuito esquemático del control de antena](https://github.com/reynico/raspberry-websdr/raw/master/gpio_antenna_control_npn.png)\n\n### Habilitar WebSDR doble banda\n\n- Hablita solo la systemd unit `rtl_tcp`. Websdr es controlado por `crontab`.\n\n```bash\nsudo systemctl enable rtl_tcp@0.service\n```\n\n### Cron\n\n- Fabriqué una configuración de crontabl para intercambiar entre las bandas de 40 y 80 metros basada en horarios. Sólo importa las lineas del archivo crontab en tu crontab.\n\n### Control manual\n\nSiempre podrás controlar el cambio de bandas de forma manual. Deshabilita las lineas de cron para evitar cambios automáticos. Luego puedes usar:\n\n```bash\nsudo systemctl stop websdr@40.service\nsudo systemctl start websdr@40.service\n```\n\nDonde 40 es la banda que quieres recibir. Puedes usar y configurar prácticamente cualquier banda que quieras, siempre y cuando hayas configurado tu archivo websdr-{{banda}}m.cfg\n\n### Configuración de los pines GPIO\n\n- Copia el archivo etc/rc.local a tu /etc/rc.local\n\n```bash\nsudo cp etc/rc.local /etc/rc.local\n```\n\n- Controla y revisa el número de puerto GPiO para el control de antenas y el botón de reinicio por software.\n\n## Reinicio por software\n\n- Hay un script en Python que controla el reinicio de la Raspberry PI a través de un switch de hardware, sin necesidad de quitarle la energía eléctrica.\n- Revisa el archivo /etc/rc.local y sincroniza el pin GPiO designado para esta aplicación.\n- Copia el archivo etc/systemd/system/reset.service a /etc/systemd/system/reset.service\n\n```bash\nsudo cp opt/reset.py /opt/reset.py\nsudo cp etc/systemd/system/reset.service /etc/systemd/system/reset.service\nsudo chmod 644 /etc/systemd/system/reset.service\nsudo systemctl enable reset.service\nsudo systemctl start reset.service\n```\n\nÉste es el circuito esquemático del reinicio por software. Tiene una señal de pull-up a 5v a través de una resistencia de 10k.\n![Soft reset](https://github.com/reynico/raspberry-websdr/raw/master/gpio_soft_reset.png)\n\n## Blacklist de los modulos RTL\n\nTendrás que hacer blacklist (bloquear) algunos modulos para conseguir que rtl_tcp funcione. Edita o crea el archivo `/etc/modprobe.d/blacklist.conf` con el siguiente contenido:\n\n```bash\nblacklist dvb_usb_rtl28xxu\n```\n\n\n## Desgaste de la tarjeta SD\n\nPara reducir el desgaste de la tarjeta SD por las escrituras a disco de los logs, recomiendo instalar [log2ram](https://github.com/azlux/log2ram), una herramienta que crea un punto de montaje en ram para `/var/log`.\n\n```bash\necho \"deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ bookworm main\" | sudo tee /etc/apt/sources.list.d/azlux.list\nsudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg  https://azlux.fr/repo.gpg\nsudo apt update\nsudo apt install log2ram\n\nsudo systemctl enable log2ram\n```\n\nProbablemente quieras aumentar el tamaño de la partición de logs a 200M, edita el archivo `/etc/log2ram.conf` y configura `SIZE=200M`.\n\nSi bien Websdr tiene una opción para prevenir que los logs se escriban a la tarjeta (`logfileinterval 0`), hay dos archivos de log que se escriben de todas formas: `log-cpuload.txt` y `userslog.txt`. Crea un directorio para logs dentro de `/var/log` y enlaza de forma simbólica para los dos archivos.\n\n```bash\nsudo rm /home/pi/dist11/userslog.txt\nsudo rm /home/pi/dist11/log-cpuload.txt\nsudo mkdir -p /var/log/websdr\nln -s /var/log/websdr/userslog.txt /home/pi/dist11/userslog.txt\nln -s /var/log/websdr/log-cpuload.txt /home/pi/dist11/log-cpuload.txt\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freynico%2Fraspberry-websdr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freynico%2Fraspberry-websdr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freynico%2Fraspberry-websdr/lists"}