GNU Radio vers client Web

Dans le cadre du projet « Remote SDR« , il est nécessaire d’extraire les données de la voie audio créée par GNU Radio du « Récepteur BLU distant » et de les envoyer vers un client Web.

Parmis les blocs de traitement présent dans GNURADIO-companion, il existe le bloc UDP sink pour sortir les données. Pour entrer un flux de données audio dans une page web, on peut utiliser les websockets. Le programme proposé ci-après en python 3, récupère le flux audio reçu de GNU radio suivant le protocole UDP (port 9001) et passe ces données au client web suivant le protocole websocket (port 8001). On échange des paquets de 1024 octets. Il ne faut pas les faire trop important pour ne pas retarder le signal audio. Ici l’audio est codé sur 2 octets. On envoi ainsi 512 échantillons, sachant que nous sommes échantillonnées à 10kHz, cela fait environ 50ms de signal.

#!/usr/bin/python3           # This is client.py file

#Collect of Audio data from GNU Radio and send to web client
#Recuperation des données audio  de GNU_Radio et envoi vers le client web
import socket
import asyncio
import websockets

# create a socket object
s_audio = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

# get local machine name
host = 'localhost'                           
port_audio_Web = 8001
port_audio_GR = 9001

# connection to hostname on the port.
s_audio.bind((host, port_audio_GR))                           
print ("Passerelle audio Web")

# Receive no more than 1024 bytes audio
async def audio(websocket_a, path):
    while True:
# on recupere les data de GNU-RADIO
        msg_audio = s_audio.recv(1024)
#       print ("audio",len(msg_audio))
# on envoi le message vers le client web distant
        await websocket_a.send(msg_audio)
	


start_server_audio = websockets.serve(audio, "", port_audio_Web)

asyncio.get_event_loop().run_until_complete(start_server_audio)

asyncio.get_event_loop().run_forever()

Pour l’envoi du spectre permettant de créer un waterfall sur la page web, on utilise un autre programme très similaire à celui de l’audio. Sachant qu’un spectre est décrit en sortie de FFT par 1024 points représentés chacun par 2 octets, on enverra des paquets de 2048 octets.

#!/usr/bin/python3           # This is client.py file

#Collect spectral data to be passed to a web client
#Recuperation des données  spectre de GNU_Radio et envoi vers le client web
import socket
import asyncio
import websockets

# create a socket object
s_spectre = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# get local machine name
host = 'localhost'                           

port_spectre_Web = 8002
port_spectre_GR = 9002

# connection to hostname on the port.
s_spectre.bind((host, port_spectre_GR))                               
print("Passerelle Spectre vers client WEB")

# Reception 2048 bytes du spectre 
async def spectre(websocket_s, path):
    while True:
# on recupere les data de GNU-RADIO
        msg_spectre = s_spectre.recv(2048)
#       print ("spectre",len(msg_spectre))
        
# on envoi le message vers le client web distant
        await websocket_s.send(msg_spectre)
	

start_server_spectre = websockets.serve(spectre, "", port_spectre_Web)

asyncio.get_event_loop().run_until_complete(start_server_spectre)

asyncio.get_event_loop().run_forever()

Articles décrivant Remote-SDR

F1ATB André

Radio Amateur - Domotique - Photovoltaïque

Vous aimerez aussi...