Categoría: radio

a-radio: a web virtual reality radio power spectrum analyser

8/10/20

This is a humble experiment to inspire real engineers and graphical designers to do something professional and beautiful from this idea. This is a simple integration of another experiment («Radioprint», see Radio fingerprinting, and «rfside«) into a-frame webVR framework, made for a Windows server and to be used with any smartphone. Remember this is the gross result of a boring morning, so do not expect anything professional.

View of a-radio fast radio sweep between 88 and 130 MHz from a smartphone (cardboard)

Surrounded by radio spectrum

A-radio is the mix of rtl_power + heatmap.py + a-frame in an artistic way. To make it work, you will need:

  • Software Defined Radio device (using RTL-SDR v. 3) ready to be used with rtl_power
  • Python
  • Imagemagick
  • HTTP(s) server (I’m using Apache with XAMPP)
  • Rtl_power windows binaries and DLLs, a modified heatmap.py to avoid put legends on image, a-frame custom scene HTML file, a script .bat to make it all work together (download here)
  • Cardboard glasses + your smartphone (optional)
  • Dependencies related to heatmap.py script (see imports)
View from PC

How to use a-radio

  • Download and install Imagemagick for Windows. Download and install XAMPP. Start Apache service. Extract all .rar files to htdocs (i. ex. C:/XAMPP/htdocs/).
  • Start «script.bat» and wait about 20 seconds to get the first snapshot. Go to your web browser (in your PC, or in your smartphone if you are going to use the VR function) and navigate to your parent folder using HTTPS in the URL (i.ex. https://localhost). The script will continue getting new snapshots every 30 seconds, so if you refresh (F5) you will get new results on the VR.
  • Start exploring the radio snapshot in the VR scene, where you are surrounded by active frequencies.

Some comments

  • A-frame requires to be used over https to work properly with sensors. Is a lot of work for a test, so we just add https in the beginning of the URL and press «ok I understand the risks«. This bypass a-frame restrictions.
  • For a custom radio range, edit «script.bat» and give rtl_power the interval you want.
  • To-do: Having a lot of problems to make automatic refresh of spectrum image each X seconds. Tried a lot of javascript DOM, but having problems with cached images (tried the trick of adding random url parameters to make it appear different: not working).
  • To-do 2: Now I am working in openwebrx + aframe integration for real-time waterfalls.

La Ley de antenas colectivas «in a nutshell»

¿Puedo instalar una antena en la azotea? ¿Necesito permiso para instalarla? ¿Puedo utilizar la antena del vecino? ¿Pueden quitarme mi antena del tejado? ¿Es obligatorio instalar una antena colectiva? ¿Se puede modificar una instalación ya existente para recibir otro tipo de contenido? ¿Se la comunidad de propietarios negarse a la instalación de mi antena?

En menos de cinco minutos tendremos todas las respuestas.

Real Decreto-ley 1/1998, de 27 de febrero, sobre infraestructuras comunes en los edificios para el acceso a los servicios de telecomunicación

Objeto
(art. 1.1)
Las infraestructuras comunes de acceso a servicios de telecomunicaciones en edificios, así como los derechos de propiedad horizontal, propietarios y arrendatarios para conectarse o adaptar esas infraestructuras.
Definición
(art. 1.2)
Infraestructuras comunes son todo aquello instalado o que pueda instalarse en un edificio para:
a) Captar señales de radio y televisión terrenal hasta viviendas o locales
b) Teléfono y telecomunicaciones por cable hasta viviendas o locales
c) Aquellos servicios que no cumpliendo los fines anteriores, se puedan adaptar para ello.
Ámbito de aplicación
(art. 2)
Aplica a todos los edificios, nuevos o viejos, que estén acogidos o deban acogerse a la propiedad horizontal, así como edificios que parcial o totalmente hayan sido arrendados por > 1 año (salvo edificios de una sóla vivienda)
Obligación licencia de construcción
(art. 3)
No se darán licencias de construcción / rehabilitación si en el proyecto no se ha previsto la instalación de una infraestructura común que cumpla las funciones del art. 1.2, debiendo incluir su coste de implantación en el coste total de la construcción.
Solicitud de instalación
(art. 4)
En edificios ya construidos, si la comunidad o un propietario deciden hacer una instalación nueva, lo notificarán por escrito al menos 2 meses antes de las obras. La comunidad necesita +1/3 votos favorables de los propietarios que sumen +1/3 del total de cuota de participación.
Si se niegan algunos, no se les pedirá su parte, pero si luego solicitan conectarse pagarán lo que debían + intereses. Se repercutirá el coste pasado 1 mes tras las obras, pero si quien solicita las obras son arrendatarios, tendrán que pagar su parte aunque luego quede todo a disposición del propietario.
Consideración de elemento común
(art. 5)
La infraestructura común es elemento común (art. 10 LPH) a todos los efectos. En edificios arrendados, art. 21 LAU salvo la instalación se solicitase por arrendatarios, siendo entonces a cuenta de estos (art. 5).
Obligatoriedad
(art. 6)
Infraestructura obligatoria en edificios ya construidos si el número de antenas instaladas es +1/3 del numero de viviendas y locales. Quien coloque la suya para recibir servicios debe pagar su instalacion, mantenimiento y retirada, pero podrá repercutir la parte proporcional a quien luego quiera utilizarla también.
Si la Adminsitración competente considera “peligrosa o antiestética” la existencia de antenas individuales. Quienes quieran los servicios que regula esta ley pagarán la instalación de su bolsillo, luego pudiendo repercutir en los propietarios o arrendatarios que se enganchen el importe proporcional correspondiente.
Se podrá eximir de esta obligación si la Administración emite informe diciendo que no puede soportar una instalación así.
Calidad y otras obligaciones
(art. 7)
Las nuevas infraestructuras deben reunir las condiciones de calidad y seguridad de la normativa vigente, especialmente respecto a compatibilidad con instalaciones de agua, gas y electricidad.
Si se instala una nueva infraestructura colectiva, se irán retirando los sistemas individuales, pudiendo estar presente (si lo piden) los propietarios durante su retirada.
Protección de sistemas individuales
(art. 8)
Las comunidades de propietarios o propietarios de edificios deben asegurar que los que tengan sistemas individuales no se vean perturbados por las obras de construcción o adaptación.
Derechos
(art. 9)
Lso copropietarios y arrendatarios tienen derecho de acceso y uso compartido, pudiendo conectarse al sistema común (preferentemente) o a sistemas individuales. Además, tienen derecho a, si no existe infraestructura común, instalar una propia para los fines de esta Ley.
Recibir nuevos servicios
(art. 9)
Si alguien quiere beneficiarse de un nuevo servicio, debe comunicarlo a la comunidad o propietario antes de cualquier obra. Deben contestarle en 15 días, y sólo se podrán negar si ya existe esa infraestructura o se va a instalar en lo próximo. Si se acepta y monta su infraestructura privada y luego alguien quiere beneficiarse, deberá pagar la parte proporcional correspondiente a su coste.
Consideración de mejora
(art. 10).
La instalación o adaptación de infraestructuras de este tipo son consideradas obras de mejora (art. 22 LAU)
Sanciones
(art. 11)
Promotor/constructor que en nuevos edificios no establece infraestructura común de telecomunicaciones: Sanción muy grave (de 5 a 50 mill. Ptas)
Incumplimiento copropietarios/arrendatarios art. 6. Sación leve (hasta 5 mill. Ptas).

El competente para sancionar es el Secretario General de Comunicaciones del Ministerio de Fomento, de oficio o por denuncia, previa tramitación de expediente administrativo en base a “la legislación de telecomunicaciones” y normativa de Procedimiento Administrativo Común.

Radio signal identification «by ear»: Discrete Fast Fourier audio hashes comparison in Python

Most sound identification apps uses fast fourier transform to generate hashes from a sound. These hashes are stored in a huge catalog of audio fingerprints, and when a user tags a song for a few seconds, the app generates an audio fingerprint and seeks for a match on the database.

«I think that you’re listening to X«.

This clever guy created his own version of Shazam for experimental purposes. When I saw it, I thought about the posibility of use this application for SIGID.

SIGID (Signal Identification) is to search for unknown radio signals, trying to identify them through example sounds and waterfall images using software defined radio (RTLSDR, Airspy, SDRPlay, HackRF, etc.).

So first I have downloaded all audio samples from Signal Identification Wiki database and generated a SQLite database for the python script.

Listening for about 5-10 seconds, the script can now identify a lot of known signals (about 350)! In this article you can found a direct link to download my database and save potential time and problems.

Testing my database. 347 «songs» are fingerprinted. Very noisy songs, yeah.

How can I do the same?

  • Install python, pip and dependencies:
sudo apt-get install python-tk ffmpeg portaudio19-dev python-pyaudio python-pip
sudo pip install matplotlib termcolor scipy pydub PyAudio
  • Clone and set up SQLite database:
git clone https://github.com/baliksjosay/audio_recogition_system
cd audio_recognition_system
make clean reset
  • Download my generated hash database of Sigidwiki:
https://www.dropbox.com/s/9v7eslkwglzs3ys/fingerprints2.rar?dl=1
  • Unzip file in /db/ directory.
  • Test the script! Two ways:
  • Via microphone/virtual cable (5 seconds):
 python recognize-from-microphone.py -s 5
  • Vía saved audio file (Update: we are all having troubles with this option):
 python recognize-from-file.py sampleaudiofile.mp3

Enjoy it!

PS. – Doesn’t work? Think about demodulation. The same signal sounds pretty different from, i. ex. AM to FM. Some known signals (CW, FM broadcast…) may fail.

PS.2 – Update 4/2/2020. I’ve submitted my project and Rtl-sdr.com blog published a review 😀

PS.3 – Update. Some users reported problems using the «recognize-from-file.py», but no problems with «recognize-from-microphone.py». If you need to work only and exclusively with «from file» option, please contact with the author of the script (and please, share with us your conclusions!). Thank you!

PS.3 – Update 12/2/2020. Dan Maloney wrote a review on Hackaday 😀

Radio fingerprinting

Few days ago I heard about a guy that created a script for recognise spurious emissions from a list of known devices, and I wanted to do the same in a simpler way.

I do not own any downconverter for my RTL-SDR – most spurious emissions are located near to 0 MHz and my SDR device starts on 24 MHz – so I have created a very simple script using wide-range frequencies scan with rtl_power, then converted to image schema with heatmap.py, and compared with imagemagick in a probabilistic way to determine which profile is the most similar to database entries. I called it Radioprint.

Radioprint discovering nearby devices

Below you will find radioprint.sh sourcecode. Remember install all dependencies [imagemagick, rtl_power] and run the script in the same folder of heatmap.py. You must create an empty directory called «database» in the same folder in order to compare profiles before running the script.

The script reads from 24MHz to 921MHz. Maybe a narrower range would make the script more efficient, but also more innacurate. Feel free to modify it.

./RADIOPRINT.SH

rm log.html 1.png 2.png probe.csv r.txt; 
echo '<html><body bgcolor="#34495e"><font face="verdana" color="white"><h1>Radioprint</h1><br>' > log.html; 
while true; 
	do rtl_power -f 24M:921M:60k -g 50 -i 10 -e 10s probe.csv; 
	python heatmap.py probe.csv 1.png; convert 1.png -gravity Center -crop 100%x+0+26 2.png; 
	echo "<b>" >> log.html; 
	cd database; rm r.txt; 
		for line in `ls | xargs | tr " " "\n"`; 
		do convert -metric AE ../2.png $line -trim -compare -format "%[distortion]" info: >> r.txt; 
		echo -n ",$line" >> r.txt; echo " " >> r.txt; 
		done; 
	cat r.txt | sort | awk "NR==1" | cut -f2 -d"," | cut -f1 -d"." >> ../log.html; 
	cd ..; echo "</b> - " >> log.html; 
	content=$(base64 -w0 < "2.png"); 
	b64=$(echo "data:image/png;base64,$content"); 
	data=$(date +%d.%m.%y.%H.%M.%S); 
	hash=$(echo $content | base64 -d | md5sum | cut -f1 -d" "); 
	echo '<a>'$data' - '$hash':</a><br><img src="'$b64'" width=100% height=25 /><br>' >> log.html; 
done;

How it works

Run the script -without arguments- and let it work in the background. Minimize the console and open log.html with your favourite web browser in order to see real-time results – pressing F5 each 30 seconds. The script adds the scan results on this page each ~20-30 seconds.

Connect to your SDR device a small wire as antenna, about 7-8 centimeters, and let it work in a place far away from electronic devices [>1 meter]. Refresh webpage and wait until you see an appropiate spectrum representation of «normality» in «log.html», then right-click, save image as…, go to /database folder and save it [without spaces] as «normal.png». You’ve just created your first profile for nothing found.

Now put your mobile phone touching directly the small antenna. Wait for the correct profile image in «log.html», and save it in the same way we did for «normal» profile. Now save the file in /database as «smartphone.png«. Now we have two profiles: normal and smartphone.

Radioprint will start to compare distortion between saved images and the new real-time generated images. Start checking if the script detects if your smartphone is near, for example.

Update 1/10/19. RTL-SDR.com has just released a review of my script! It is a great privilege and I appreciate it very much.

rfside

rfside is a very simple bash script based on rtl_power and heatmap.py that gets info related to emission power in wide-band scan and shows it all in a gaze. The scripts perform a huge scan in just 5 minutes, from 24 MHz to 1.7 GHz [customizable] allowing us to identify active bands for a more detailed study on any SDR application. It aims to be the first step in radio signals identification.

Source code here.

EMIs en el iPhone X

Las interferencias de Van Eck son emisiones de canal lateral de dispositivos electrónicos. Desde los años ’60 se estudia este fenómeno descubierto por el científico homónimo, que fue realmente sonado porque descubrió que aparatos eléctricos tales como televisores o monitores de ordenador emiten ondas residuales que pueden ser reinterpretadas por un actor malicioso con objetivos de espionaje, incluso desde otro edificio cercano.

También desde los años ’60 se ha puesto un especial celo en realizar productos que cumplan con la especificación técnica Tempest, que pretende mediante diversas técnicas – la más habitual, un armazón de metal y mallas metálicas a modo de jaula de Faraday – impedir que los aparatos eléctricos emitan estas EMIs al espectro radioeléctrico.

No obstante, salvo honrosas excepciones, esta especificación se dedica a atenuar más que a evitar, por lo que sigue siendo posible leer estas interferencias pese a los esfuerzos de la NSA y la OTAN. Simplemente ahora hay que utilizar antenas especialmente resonantes a las interferencias y con mayor proximidad física.

Ejemplo de estas radiaciones las pude encontrar fortuitamente con un sintonizador RTLSDR, cuando me dí cuenta que si la pantalla del iPhone X se encendía se producía una emisión constante allá por los 216 MHz. Esta emisión desaparecía si volvía a bloquear el móvil.

En la imagen se puede observar el acto de pulsar dos veces el botón reposo, esto es: pantalla apagada – pantalla encendida – pantalla apagada.

La frecuencia en cuestión es 216.002.640 Hz. He investigado los posibles armónicos y esta es la frecuencia que se recibe con mayor ganancia: unos -20 dB a una distancia de 10 cms del RTLSDR sin antena.

Utilizando una antena especial para la captación de interferencias los resultados son mucho más interesantes, y más aún si utilizamos preamplificadores y filtros de GNURadio, por ejemplo.

Como adelanto, un script bash «oneline» que detecta cuándo se ha activado la pantalla un iPhone X cercano. No olvides tocar los parámetros hasta que sirva para tus condiciones.

rtl_power -f 216.001M:216.003M:1K -g 30 -i 1 -c 20% | while read line; do data=$(date +%d/%m/%y-%H:%M:%S); valor=$(echo $line | cut -f11 -d"," | cut -f2 -d"-" | cut -f1 -d"."); if [ "$valor" -lt "15" ]; then echo "[$data][216.002 MHz][-$valor dB] iPhone en uso detectado"; fi; done;