ATS-4 es un sistema automático de aceptación y tabulación para concursos de radios amateur, basado en QXSL. No dude en visitar Allja1 ATS-4.
La imagen de Docker está disponible. Pegue todo el siguiente script en el terminal y ejecutarlo.
echo -n ' enter mail hostname: '
read host
echo -n ' enter mail username: '
read user
echo -n ' enter mail password: '
read pass
cat << EOS > docker-compose.yaml
version: '3'
services:
ATS4:
image: ghcr.io/nextzlog/ats4:master
ports:
- 9000:9000
volumes:
- ./ats/data:/ats/data
- ./ats/logs:/ats/logs
command: /ats/bin/ats4
environment:
TZ: Asia/Tokyo
ATS4_MAIL_HOST: $host
ATS4_MAIL_USER: $user
ATS4_MAIL_PASS: $pass
ATS4_MAIL_MOCK: false
ATS4_RULE_FILE: /rules/ats.rb
www:
image: nginx:latest
ports:
- 80:80
volumes:
- ./proxy.conf:/etc/nginx/conf.d/default.conf
EOS
echo -n ' enter server domain: '
read name
cat << EOS > proxy.conf
server {
server_name $name ;
location / {
proxy_pass http://ATS4:9000;
location ~ /admin {
allow 127.0.0.1;
deny all;
}
}
}
EOS
docker compose up -dLuego, apunte a su navegador a http: // localhost y verifique que ATS-4 se esté ejecutando.
Primero, cree docker-compose.yaml como sigue:
version : ' 3 '
services :
ATS4 :
image : ghcr.io/nextzlog/ats4:master
ports :
- 9000:9000
volumes :
- ./ats/data:/ats/data
- ./ats/logs:/ats/logs
command : /ats/bin/ats4
environment :
TZ : Asia/Tokyo
ATS4_MAIL_HOST : $host
ATS4_MAIL_USER : $user
ATS4_MAIL_PASS : $pass
ATS4_MAIL_MOCK : false
ATS4_RULE_FILE : /rules/ats.rb
www :
image : nginx:latest
ports :
- 80:80
volumes :
- ./proxy.conf:/etc/nginx/conf.d/default.confLuego, siga las instrucciones a continuación.
Crear proxy.conf de la siguiente manera:
server {
server_name localhost;
location / {
proxy_pass http://ATS4:9000;
location ~ /admin {
allow 127.0.0.1 ;
deny all ;
}
}
} Asegúrese de que los clientes no autorizados no puedan acceder a las páginas de administración bajo /admin . Exponga el puerto 80 del contenedor a Internet para que no se pueda acceder a la página de administración.
Configurar variables de entorno en docker-compose.yaml como sigue:
environment :
ATS4_MAIL_HOST : $host
ATS4_MAIL_USER : $user
ATS4_MAIL_PASS : $pass
ATS4_MAIL_MOCK : falseModifique la configuración correctamente.
Configurar variables de entorno en docker-compose.yaml como sigue:
environment :
ATS4_RULE_FILE : /rules/ats.rb
# ATS4_RULE_FILE: /rules/1am.rb
# ATS4_RULE_FILE: /rules/ja1.rb
# ATS4_RULE_FILE: /rules/uec.rb Por supuesto, puede especificar diferentes reglas montando archivos rubí externos en el contenedor. Ver ats.rb Por ejemplo.
Finalmente, cree un contenedor de la siguiente manera:
$ docker compose up -dAcceda a 80 puertos del contenedor.
Detente y retire el contenedor de la siguiente manera:
$ docker compose downTire de la última imagen de la siguiente manera:
$ docker pull ghcr.io/nextzlog/ats4:masterPuede cambiar el código y la configuración de Scala sin reiniciar iniciando ATS-4 en modo de desarrollo de la siguiente manera:
$ sbt runLuego, acceda a http: // localhost: 9000/admin/shell para desarrollar reglas del concurso de manera interactiva. Puede probar el algoritmo de puntuación adjuntando datos QSO al formulario web.
ATS-4 proporciona la API de transmisión para el concurso en tiempo real.
Los participantes del concurso registrarán la información de su cuenta con ATS-4 por adelantado. ATS-4 devuelve una clave de seguridad (UUID) enviando una solicitud GET a http://localhost:8873?id=<UUID> . Los clientes pueden recuperar la clave escuchando en el puerto 8873 y el acceso /agent/<UUID> .
Cuando se inicia el concurso, el cliente siempre se conecta al servidor a través de WebSocket. Cada vez que un participante contacta a otro participante en el aire, el cliente envía la diferencia en los registros QSO al servidor. Los mensajes de los clientes al servidor deben seguir el formato a continuación.
| posición | campo |
|---|---|
| 1er byte | Número de QSO eliminados |
| secuencia | encabezado de los datos de QSO |
| secuencia | Entidades QSO para eliminar |
| secuencia | Entidades QSO para agregar |
El segundo y posterior bytes de los mensajes se formatean como un solo archivo de registro electrónico. El formato debe ser compatible oficialmente por la biblioteca QXSL.
El servidor recibe los registros de QSO, lo obtiene, espere unos segundos y luego notifica a todos los clientes de la actualización de puntaje. Los mensajes JSON desde el servidor a los clientes están formateados de la siguiente manera:
{
"14MHz" : [
{ "call" : " JA1ZLO " , "score" : 200 , "total" : 2200 },
{ "call" : " JA1YWX " , "score" : 100 , "total" : 2100 }
]
}Se puede escribir un cliente de WebSocket simple para ATS-4 de la siguiente manera:
<!DOCTYPE html >
< html lang =' ja ' >
< head >
< title > ATS-4 </ title >
< script type =" application/javascript " src =" client.js " > </ script >
</ head >
< body >
< h1 > Streaming Demo </ h1 >
< textarea cols =' 160 ' rows =' 30 ' id =' QSOs ' > </ textarea >
< p >
< label > Delete < input type =' number ' id =' trim ' min =' 0 ' max =' 255 ' value =' 0 ' > QSOs, </ label >
< label > Submission Key: < input type =' text ' id =' UUID ' placeholder =' /agent/UUID ' > </ label >
< button type =' button ' onclick =' access(); ' > Access </ button >
< button type =' button ' onclick =' submit(); ' > Submit </ button >
</ p >
< div id =' messages ' > </ div >
</ body >
</ html >El programa JavaScript referenciado puede escribirse de la siguiente manera:
let sock ;
function access ( ) {
const uuid = document . getElementById ( 'UUID' ) . value ;
sock = new WebSocket ( 'ws://localhost:9000' + uuid ) ;
sock . binaryType = 'arraybuffer' ;
sock . onmessage = function ( msg ) {
const decoder = new TextDecoder ( ) ;
const data = decoder . decode ( new Uint8Array ( msg . data ) ) ;
const text = document . createTextNode ( data ) ;
const node = document . createElement ( 'div' ) ;
document . getElementById ( 'messages' ) . appendChild ( node ) ;
node . appendChild ( text ) ;
} ;
}
function submit ( ) {
const encoder = new TextEncoder ( ) ;
const QSOs = document . getElementById ( 'QSOs' ) . value ;
const trim = document . getElementById ( 'trim' ) . value ;
const data = new TextEncoder ( ) . encode ( QSOs ) ;
const full = new ( data . constructor ) ( data . length + 1 ) ;
full [ 0 ] = parseInt ( trim ) ;
full . set ( data , 1 ) ;
sock . send ( full ) ;
} Siéntase libre de hacer problemas en NextZlog/TODO. Sigue a @NextzLog en Twitter.
無線部開発班
Este programa es un software gratuito: puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU publicada por Free Software Foundation, ya sea la versión 3 de la licencia o (a su opción) cualquier versión posterior.
Este programa se distribuye con la esperanza de que sea útil, pero sin ninguna garantía ; Sin siquiera la garantía implícita de comerciabilidad o estado físico para un propósito particular . Vea la Licencia Pública General de GNU para más detalles.
Debería haber recibido una copia de la Licencia Pública General de GNU junto con este programa. Si no, consulte http://www.gnu.org/licenses/.