ATS-4 est un système d'acceptation et de tabulation automatique pour les concours amateurs-radio, basé sur QXSL. N'hésitez pas à visiter ALLJA1 ATS-4.
L'image Docker est disponible. Collez l'ensemble du script suivant dans le terminal et exécutez-le.
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 -dEnsuite, pointez votre navigateur sur http: // localhost et vérifiez qu'ATS-4 est en cours d'exécution.
Tout d'abord, créez docker-compose.yaml comme suit:
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.confEnsuite, suivez les instructions ci-dessous.
Créer proxy.conf comme suit:
server {
server_name localhost;
location / {
proxy_pass http://ATS4:9000;
location ~ /admin {
allow 127.0.0.1 ;
deny all ;
}
}
} Assurez-vous que les clients non autorisés ne peuvent pas accéder aux pages d'administration sous /admin . Exposez le port 80 du conteneur à Internet afin que la page d'administration ne soit pas accessible.
Configurer les variables d'environnement dans docker-compose.yaml comme suit:
environment :
ATS4_MAIL_HOST : $host
ATS4_MAIL_USER : $user
ATS4_MAIL_PASS : $pass
ATS4_MAIL_MOCK : falseModifiez correctement les paramètres.
Configurer les variables d'environnement dans docker-compose.yaml comme suit:
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 Bien sûr, vous pouvez spécifier différentes règles en montant des fichiers rubis externes dans le conteneur. Voir ats.rb par exemple.
Enfin, créez un conteneur comme suit:
$ docker compose up -dAccédez à 80 port du conteneur.
Arrêtez et retirez le conteneur comme suit:
$ docker compose downTirez la dernière image comme suit:
$ docker pull ghcr.io/nextzlog/ats4:masterVous pouvez modifier le code Scala et la configuration sans redémarrer en démarrant ATS-4 en mode de développement comme suit:
$ sbt runEnsuite, accédez à http: // localhost: 9000 / admin / shell pour développer les règles de concours de manière interactive. Vous pouvez tester l'algorithme de notation en attachant des données QSO au formulaire Web.
ATS-4 fournit l'API de streaming pour le concours en temps réel.
Les participants au concours enregistreront à l'avance les informations de leur compte avec ATS-4. ATS-4 renvoie une clé de sécurité (UUID) en envoyant une demande GET à http://localhost:8873?id=<UUID> . Les clients peuvent récupérer la clé en écoutant sur le port 8873 et Access /agent/<UUID> .
Lorsque le concours démarre, le client se connecte toujours au serveur via WebSocket. Chaque fois qu'un participant contacte un autre participant à l'air, le client envoie la différence dans les enregistrements QSO au serveur. Les messages des clients vers le serveur doivent suivre le format ci-dessous.
| position | champ |
|---|---|
| 1er octet | Nombre de QSOS supprimés |
| séquence | En-tête des données QSO |
| séquence | Entités QSO à supprimer |
| séquence | Entités QSO pour ajouter |
Les deuxième octets et suivants des messages sont formatés sous forme de fichier journal électronique. Le format doit être officiellement soutenu par la bibliothèque QXSL.
Le serveur reçoit les enregistrements QSO, le marque, attend quelques secondes, puis avertit tous les clients de la mise à jour du score. Les messages JSON du serveur aux clients sont formatés comme suit:
{
"14MHz" : [
{ "call" : " JA1ZLO " , "score" : 200 , "total" : 2200 },
{ "call" : " JA1YWX " , "score" : 100 , "total" : 2100 }
]
}Un client WebSocket simple pour ATS-4 peut être écrit comme suit:
<!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 >Le programme JavaScript référencé peut être écrit comme suit:
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 ) ;
} N'hésitez pas à faire des problèmes à Nextzlog / TODO. Suivez @Nextzlog sur Twitter.
無線部開発班
Ce programme est un logiciel gratuit: vous pouvez le redistribuer et / ou le modifier en vertu des termes de la licence publique générale GNU publiée par la Free Software Foundation, soit la version 3 de la licence, ou (à votre option) n'importe quelle version ultérieure.
Ce programme est distribué dans l'espoir qu'il sera utile, mais sans aucune garantie ; Sans même la garantie implicite de qualité marchande ou d'adéquation à un usage particulier . Voir la licence publique générale GNU pour plus de détails.
Vous devriez avoir reçu une copie de la licence publique générale GNU avec ce programme. Sinon, voir http://www.gnu.org/licenses/.