ATS-4는 QXSL을 기반으로 한 아마추어-라 디오 콘테스트를위한 자동 승인 및 표지 시스템입니다. Allja1 ATS-4를 방문하십시오.
도커 이미지를 사용할 수 있습니다. 다음 스크립트 전체를 터미널에 붙여 넣고 실행하십시오.
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 -d그런 다음 브라우저를 http : // localhost로 가리키고 ATS-4가 실행 중인지 확인하십시오.
먼저 다음과 같이 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그런 다음 아래 지침을 따르십시오.
다음과 같이 proxy.conf 를 만듭니다.
server {
server_name localhost;
location / {
proxy_pass http://ATS4:9000;
location ~ /admin {
allow 127.0.0.1 ;
deny all ;
}
}
} 무단 고객이 /admin 에서 관리 페이지에 액세스 할 수 없는지 확인하십시오. 관리 페이지에 액세스 할 수 없도록 컨테이너의 포트 80을 인터넷에 노출시킵니다.
docker-compose.yaml 에서 환경 변수를 다음과 같이 구성하십시오.
environment :
ATS4_MAIL_HOST : $host
ATS4_MAIL_USER : $user
ATS4_MAIL_PASS : $pass
ATS4_MAIL_MOCK : false설정을 올바르게 수정하십시오.
docker-compose.yaml 에서 환경 변수를 다음과 같이 구성하십시오.
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 물론 외부 루비 파일을 컨테이너에 장착하여 다른 규칙을 지정할 수 있습니다. 예를 들어 ats.rb 참조하십시오.
마지막으로 다음과 같이 컨테이너를 만듭니다.
$ docker compose up -d컨테이너의 80 포트에 액세스하십시오.
다음과 같이 컨테이너를 중지하고 제거하십시오.
$ docker compose down다음과 같이 최신 이미지를 가져옵니다.
$ docker pull ghcr.io/nextzlog/ats4:master다음과 같이 개발 모드에서 ATS-4를 시작하여 다시 시작하지 않고 스칼라 코드 및 구성을 변경할 수 있습니다.
$ sbt run그런 다음 http : // localhost : 9000/admin/shell에 액세스하여 컨테스트 규칙을 대화식으로 개발하십시오. QSO 데이터를 웹 양식에 연결하여 스코어링 알고리즘을 테스트 할 수 있습니다.
ATS-4는 실시간 콘테스트를 위해 스트리밍 API를 제공합니다.
컨테스트 참가자는 ATS-4에 계정 정보를 미리 등록합니다. ATS-4는 http://localhost:8873?id=<UUID> 에 GET 요청을 보내서 보안 키 (UUID)를 반환합니다. 클라이언트는 8873 포트 및 액세스 /agent/<UUID> 에서 청취하여 키를 검색 할 수 있습니다.
컨테스트가 시작되면 클라이언트는 항상 WebSocket을 통해 서버에 연결합니다. 참가자가 방송으로 다른 참가자에게 연락 할 때마다 클라이언트는 QSO 레코드의 차이를 서버로 보냅니다. 클라이언트에서 서버로의 메시지는 아래 형식을 따라야합니다.
| 위치 | 필드 |
|---|---|
| 첫 번째 바이트 | 삭제 된 QSO 수 |
| 순서 | QSO 데이터 헤더 |
| 순서 | QSO 엔티티 삭제 |
| 순서 | QSO 엔티티가 추가됩니다 |
메시지의 두 번째 및 후속 바이트는 단일 전자 로그 파일로 형식화됩니다. 형식은 QXSL 라이브러리에서 공식적으로 지원해야합니다.
서버는 QSO 레코드를 수신하고, 점수를 매기고, 몇 초를 기다린 다음 모든 클라이언트에게 점수 업데이트를 통지합니다. 서버에서 클라이언트로의 JSON 메시지는 다음과 같이 형식화됩니다.
{
"14MHz" : [
{ "call" : " JA1ZLO " , "score" : 200 , "total" : 2200 },
{ "call" : " JA1YWX " , "score" : 100 , "total" : 2100 }
]
}ATS-4의 간단한 WebSocket 클라이언트는 다음과 같이 작성 될 수 있습니다.
<!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 >참조 된 JavaScript 프로그램은 다음과 같이 작성 될 수 있습니다.
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 ) ;
} Nextzlog/Todo에서 자유롭게 문제를 해결하십시오. 트위터에서 @nextzlog를 팔로우하십시오.
無線部開発班
이 프로그램은 무료 소프트웨어입니다. Free Software Foundation, 라이센스의 버전 3 또는 이후 버전에서 게시 한 GNU 일반 공개 라이센스의 조건에 따라 재분배 및/또는 수정할 수 있습니다.
이 프로그램은 유용 할 것이지만 보증이 없다는 희망으로 배포됩니다. 상업성 또는 특정 목적에 대한 적합성 에 대한 묵시적 보증조차 없습니다. 자세한 내용은 GNU 일반 공개 라이센스를 참조하십시오.
이 프로그램과 함께 GNU 일반 공개 라이센스 사본을 받았어야합니다. 그렇지 않은 경우 http://www.gnu.org/licenses/를 참조하십시오.