O ATS-4 é um sistema de aceitação e tabulação automática para concursos de raios amadores, com base no QXSL. Sinta-se à vontade para visitar o Allja1 ATS-4.
A imagem do docker está disponível. Cole todo o script seguinte no terminal e execute -o.
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 -dEm seguida, aponte seu navegador para http: // localhost e verifique se o ATS-4 está em execução.
Primeiro, crie docker-compose.yaml da seguinte forma:
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.confEm seguida, siga as instruções abaixo.
Crie proxy.conf da seguinte forma:
server {
server_name localhost;
location / {
proxy_pass http://ATS4:9000;
location ~ /admin {
allow 127.0.0.1 ;
deny all ;
}
}
} Certifique -se de que clientes não autorizados não possam acessar páginas de administração em /admin . Exponha a porta 80 do contêiner à Internet para que a página de administração não possa ser acessada.
Configure variáveis de ambiente em docker-compose.yaml da seguinte forma:
environment :
ATS4_MAIL_HOST : $host
ATS4_MAIL_USER : $user
ATS4_MAIL_PASS : $pass
ATS4_MAIL_MOCK : falseModifique as configurações corretamente.
Configure variáveis de ambiente em docker-compose.yaml da seguinte forma:
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 Obviamente, você pode especificar regras diferentes montando arquivos de rubi externos no contêiner. Veja ats.rb por exemplo.
Finalmente, crie um recipiente da seguinte maneira:
$ docker compose up -dAcesse 80 porta do contêiner.
Pare e remova o recipiente da seguinte forma:
$ docker compose downPuxe a imagem mais recente da seguinte forma:
$ docker pull ghcr.io/nextzlog/ats4:masterVocê pode alterar o código e a configuração do Scala sem reiniciar iniciando o ATS-4 no modo de desenvolvimento da seguinte forma:
$ sbt runEm seguida, acesse http: // localhost: 9000/admin/shell para desenvolver regras do concurso interativamente. Você pode testar o algoritmo de pontuação anexando dados QSO ao formulário da Web.
O ATS-4 fornece a API de streaming para o concurso em tempo real.
Os participantes do concurso registrarão as informações da conta no ATS-4 com antecedência. O ATS-4 retorna uma chave de segurança (UUID) enviando uma solicitação GET para http://localhost:8873?id=<UUID> . Os clientes podem recuperar a chave ouvindo na porta 8873 e acesso /agent/<UUID> .
Quando o concurso começa, o cliente sempre se conecta ao servidor via WebSocket. Cada vez que um participante entra em contato com outro participante no AIR, o cliente envia a diferença nos registros QSO para o servidor. As mensagens dos clientes para o servidor devem seguir o formato abaixo.
| posição | campo |
|---|---|
| 1º byte | Número de QSOs excluídos |
| Sequência | Cabeçalho dos dados QSO |
| Sequência | Entidades QSO para excluir |
| Sequência | Entidades QSO para anexar |
Os segundos e subsequentes bytes das mensagens são formatados como um único arquivo de log eletrônico. O formato deve ser oficialmente suportado pela biblioteca QXSL.
O servidor recebe os registros QSO, obtém -o, aguarda alguns segundos e notifica todos os clientes da atualização de pontuação. As mensagens JSON do servidor para os clientes são formatadas da seguinte forma:
{
"14MHz" : [
{ "call" : " JA1ZLO " , "score" : 200 , "total" : 2200 },
{ "call" : " JA1YWX " , "score" : 100 , "total" : 2100 }
]
}Um cliente WebSocket simples para ATS-4 pode ser escrito da seguinte maneira:
<!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 >O programa JavaScript referenciado pode ser escrito da seguinte maneira:
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 ) ;
} Sinta -se à vontade para fazer problemas no NextZlog/TODO. Siga @Nextzlog no Twitter.
無線部開発班
Este programa é um software livre: você pode redistribuí -lo e/ou modificá -lo nos termos da licença pública geral da GNU, conforme publicado pela Free Software Foundation, versão 3 da licença ou (por sua opção) qualquer versão posterior.
Este programa é distribuído na esperança de que seja útil, mas sem garantia ; sem a garantia implícita de comercialização ou aptidão para uma finalidade específica . Veja a licença pública geral da GNU para obter mais detalhes.
Você deveria ter recebido uma cópia da licença pública geral da GNU junto com este programa. Caso contrário, consulte http://www.gnu.org/license/.