Funzionalità del Reflector Multiprotocollo XLX

di | 04/05/2020

Da alcuni anni, e con aggiornamenti abbastanza costanti, è presente nel panorama del software radioamatoriale il Reflector XLX. E’ un programma open source, con codice sorgente disponibile e modificabile, scaricabile a questo indirizzo. Sul sito sono presenti anche le modalità di compilazione e installazione. Richiede il sistema operativo Linux ed IP pubblico statico. Un elenco di porte devono essere configurate sul firewall/router affinchè tutti i protocolli siano utilizzabili. Cosa permette di fare XLX oggi ? Permette di gestire un completo sistema multiprotocollo, ovvero interconnettere tra loro i protocolli digitali radioamatoriali più usati. Può essere configurato durante la fase di compilazione per gestire da 1 a 26 moduli (stanze, room), ognuna con assegnata una lettera partendo da A. Ogni modulo accetta in ingresso connessioni da sistemi DStar (protocolli DCS,DExtra e DPlus oltre che Terminal/G3), DMR (MMDVM) e C4FM (YSF). I ripetitori connessi (e hotspot) parleranno tra loro se collegati allo stesso modulo. XLX non effettua “in uscita” connessioni, è un sistema che riceve da uno e trasmette in contemporanea a tutti quelli connessi. Ha quindi la funzionalità di “riflettore”. XLX può però essere connesso anche da altri network quali BrandMeister e DMRPlus (o reflector C4FM/YSF); chi vuole questa funzionalità dovrà richiedere la connessione di un TG (TalkGroup) DMR ai gestori/sysop dei network interessati oppure usare software aggiuntivi quali YSF2DMR o MMDVM_Bridge per collegare un modulo di XLX ad un sistema esterno. Occorre sempre prestare massima attenzione alle configurazioni dei vari software per evitare di creare malfunzionamenti alle infrastrutture di rete esistenti, e coordinarsi con i colleghi sysop dei network con i quali scambiamo i flussi per avere una ottimale funzionalità. Infine, non ultimo come importanza, valutare se ha senso installare un ulteriore XLX per magari installarci solo un hotspot personale oppure, meglio, utilizzare quei sistemi già attivi e perfettamente operativi. XLX lavora “con la transcodifica”: una radio DStar non può parlare con una DMR o C4FM se non vi è opportuno hardware (schede, chiavine USB) dedicate a questo processo. Questo significa che se su di un modulo di XLX vi sono connessi ripetitori DMR/MMDVM e C4FM/YSF potranno tra loro comunicare, diversamente un impianto DStar, senza hardware di transcodifica connesso a XLX, potrà comunicare solo con altri sistemi DStar. Da qui l’esigenza di avere un “server fisico” sul quale installare il software XLX ove dovrà esserci collegato quanto necessario al processo di transcodifica (es. due chiavine USB DV30 per gestire 1 modulo di XLX) affinchè tutti i sistemi dialoghino tra loro. Utile ricordare che più XLX possono avere moduli condivisi fra loro (e da qui i relativi sistemi presenti), ovvero il ponte ripetitore connesso su XLX1 modulo A potrà parlare con il ponte ripetitore connesso su XLX2 modulo A purchè entrambi gli XLX siano in “peer tra loro”. Non solo, entrambi dovranno anche avere l’hardware di transcodifica presente e se vi è una interconnessione ad esempio con BrandMeister anche quest’ultima dovrà essere fatta su entrambi i sistemi in peer. L’ultima (ad oggi la 2.4.0) versione di XLX supporta inoltre il protocollo Terminal/G3 ICOM e accetta connessioni dirette via internet tra l’apparato radio ICOM e XLX senza l’utilizzo di impianti RF.

Questa presentazione di XLX ci serve anche per capire l’attuale configurazione del nostro reflector multiprotocollo XLX039 che è connesso “in peer” con altri sistemi reflector e con la rete BrandMeister (server italiano 2222) sul modulo B. Con tale network è collegato sul TG 22292 e a sua volta, in cascata, con la rete DMRPlus (TG 222/SL1). Rimandiamo alla lettura di altri articoli presenti su questo sito per la panoramica delle connessioni operative sul modulo B. Il modulo A invece è stato “modificato” nel codice di XLX per accettare trasmissioni SOLO DSTAR. Questo non significa che tale modulo sia isolato da altri protocolli/network ma che, con connessione diretta al 39, siano accettate su A solo comunicazioni DStar. Riportiamo le modifiche effettuate prima della compilazione nel caso servisse effettuare ai colleghi che gestiscono sistemi XLX analoga configurazione, magari per risolvere problematiche sulla transcodifica.

 

Limitazione transcodifica ad alcuni moduli (patch creata da OE1KBC)

Modificare il file presente nei sorgenti cpacketstream.cpp come riportato sotto (in questo caso transcodifica limitata al modulo B) nella posizione della funzione indicata.

bool CPacketStream::Open(const CDvHeaderPacket &DvHeader, CClient *client)
{
bool ok = false;
// not already open?
if ( !m_bOpen )
{
// update status
m_bOpen = true;
m_uiStreamId = DvHeader.GetStreamId();
m_uiPacketCntr = 0;
m_DvHeader = DvHeader;
m_OwnerClient = client;
m_LastPacketTime.Now();

if (DvHeader.GetRpt2Module() == ‘B’)
    m_CodecStream = g_Transcoder.GetStream(this, client->GetCodec());
else
    m_CodecStream = g_Transcoder.GetStream(this, CODEC_NONE);

ok = true;
}
return ok;
}

 

Limitazione connessioni DMR (protocollo MMDVM)

Se non vogliamo permettere le connessioni DMR su un particolare modulo basta modificare nel file cdmrmmdvmprotocol.cpp la funzione sotto adattando l’if (ad esempio nel caso seguente non è permesso il collegamento al modulo A [reflector >= 4002]).

char CDmrmmdvmProtocol::DmrDstIdToModule(uint32 tg) const
{
    // is it a 4xxx ?
    if ( (tg >= 4002) && (tg <= (4000 + NB_OF_MODULES)) ) // it was 4001 to start from A
    {
        return ((char)(tg – 4001) + ‘A’);
    }
    return ‘ ‘;
}

uint32 CDmrmmdvmProtocol::ModuleToDmrDestId(char m) const
{
    return (uint32)(m – ‘A’)+4001;
}

 

Limitazione connessioni C4FM (protocollo YSF)

Se non vogliamo permettere le connessioni YSF su un modulo occorre modificare nel file cwiresxcmdhandler.cpp nella funzione CWiresxCmdHandler::Task la parte sotto evidenziata (in questo caso la condizione aggiunta Cmd.GetArg() > 1 non permette la connessione al modulo A)

case WIRESX_CMD_CONN_REQ:
if ( (Cmd.GetArg() >= 1) && (Cmd.GetArg() <= NB_OF_MODULES) && (Cmd.GetArg() > 1) )
{
cModule = ‘A’ + (char)(Cmd.GetArg() – 1);
std::cout << “Wires-X CONN_REQ command to link on module ” << cModule << ” from ” << Cmd.GetCallsign() << ” at ” << Cmd.GetIp() << std::endl;
// acknowledge
ReplyToWiresxConnReqPacket(Cmd.GetIp(), Info, cModule);
// change client’s module
CClients *clients = g_Reflector.GetClients();
CClient *client = clients->FindClient(Cmd.GetCallsign(), Cmd.GetIp(), PROTOCOL_YSF);
if ( client != NULL )
{
client->SetReflectorModule(cModule);
}
g_Reflector.ReleaseClients();
}
else
{
std::cout << “Wires-X CONN_REQ command with illegal argument from ” << Cmd.GetCallsign() << ” at ” << Cmd.GetIp() << std::endl;