Client Web vers GNU Radio

Dans le cadre du projet « Remote SDR« , il est nécessaire d’envoyer, depuis une page web, un flux audio et des paramètres vers l’émetteur BLU distant codé dans GNU Radio .

Parmis les blocs de traitement présent dans GNURADIO-companion, il existe le bloc UDP source pour entrer un flux de données audio. Pour envoyer ce flux depuis un client Web, on peut utiliser les websockets. Le programme proposé ci-après en python 3, récupère le flux audio reçu du client web suivant le protocole websocket (port 8005) et passe ces données à GNU Radio suivant le protocole UDP (port 9005).

En plus ce programme à chaque réception d’une trame audio (paquet de 512 octets), fait changer d’état la pin 26 du GPIO de l’Orange PI One Plus. Cela permet de générer un signal alternatif qui une fois redressé, va exciter des relais pour alimenter l’émetteur. Voir le détail ici.

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


import socket
import asyncio
import websockets
import os                       # To execute system command

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


# get local machine name
host = '127.0.0.1'                           

port_audio_Web = 8005
port_audio_GR = 9005

numgpio=227								 # GPIO 227 corresponds to pin 26 in Orange PI One PLUS H6
numgpio=str(numgpio)                         

# Préparation port commande relais
os.system("sudo echo "+numgpio+" > /sys/class/gpio/export")              #activation
os.system("sudo echo out > /sys/class/gpio/gpio"+numgpio+"/direction")   # Output
                                      


# connection to hostname on the port.

                             
print ("Passerelle audio client Web vers TX")


# Receive   bytes audio
async def audio(websocket_a, path):
    etat=True
    while True:
# on recupere les data du micro du client

        donnee_audio = await websocket_a.recv()
   
        s_audio.sendto(donnee_audio,(host,port_audio_GR))

        # Oscillateur pour activer le relais alimentation via un condensateur et un redressement
		# Oscillator on pin 26 as watchdog
        etat=not etat     #inversion à chaque trame recue
        
        if etat:
             os.system("echo 1 > /sys/class/gpio/gpio"+numgpio+"/value")
        else:
             os.system("echo 0 > /sys/class/gpio/gpio"+numgpio+"/value")
        


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 des commandes de configuration de l’émetteur, on utilise le protocole xmlrpc coté GNU Radio (port 9004) et toujours les websockets coté client Web (port 8004).

#!/usr/bin/python3           # 



import asyncio
import websockets
import json
import xmlrpc.client

# create a socket object



# get local machine name
host = 'localhost'                           

port_para_Web = 8004
adr_local = "http://localhost:9004"

Sxml = xmlrpc.client.ServerProxy(adr_local)



print("Passerelle Parametres TX du client WEB")

async def consumer_handler(websocket_p, path):
    async for message_recu in websocket_p:
        F=json.loads(message_recu)
       
        if "Fr_TX" in F :
              print("Fr_TX ",F["Fr_TX"])
              Sxml.set_Fr_TX(float(F["Fr_TX"]))              
       

        if "GRF_TX" in F :
              print("GainRF TX ",F["GRF_TX"])
              Sxml.set_GainRF_TX(float(F["GRF_TX"]))
			  
        if "GIF_TX" in F :
              print("GainIF TX ",F["GIF_TX"])
              Sxml.set_GainIF_TX(float(F["GIF_TX"]))	

        if "GBB_TX" in F :
              print("GainBB TX ",F["GBB_TX"])
              Sxml.set_GainBB_TX(float(F["GBB_TX"]))	  
			  
        if "LSB_USB" in F :
              print("LSB USB ",F["LSB_USB"])
              Sxml.set_LSB_USB(float(F["LSB_USB"]))
        await websocket_p.send("OK")			  
            
  



start_server_para = websockets.serve(consumer_handler, "", port_para_Web)

loop = asyncio.get_event_loop()

try:
    loop.run_until_complete(start_server_para)
    loop.run_forever()
except KeyboardInterrupt:
    logging.info("Process Para interrupted")
finally:
    loop.close()
    logging.info("Arret Para service.")

Pour le récepteur décrit ici, nous utilisons les mêmes protocoles pour passer les paramètres de configuration.

Les sources sont disponibles sur Github F1ATB/Remote-SDR.

Articles décrivant Remote-SDR

F1ATB André

Radio Amateur - Domotique - Photovoltaïque

Vous aimerez aussi...