Top > calendar - 日記

2026年 03月 の 日記

<< 2026.3 >>
[日記]
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

07
March, 2026Edit

接続局読み上げ

自ノード(53197) に接続している局名を読み上げる。←これは内部コマンドです。

【概要】
AllStarLinkは、自ノードに直接接続しているノードがたとえ1つでも、そのノードが複数のノードと接続している場合は
その接続局リストも自ノードまでノード番号が流れてくる仕組みになっているので、そのリストを出力して
そのリスト(ノード番号)から/var/lib/asterisk/astdb.txtを利用してコールサインを抽出して読み上げる。

【準備】

  1. OS 環境のLANGを変更しておく。
     英語で正確に読み上げるために、OS環境を LANG=en_GB.UTF-8 になるように以下の手順で変更しておく。
    # イギリス英語のロケールを生成
    sudo locale-gen en_GB.UTF-8
    
    # システムのデフォルトロケールを en_GB.UTF-8 に設定
    sudo localectl set-locale LANG=en_GB.UTF-8
    
    # 設定を反映させるために一度ログアウトするか、以下のコマンドを実行
    source /etc/default/locale
    
    以下のコマンドを打ち、LANG=en_GB.UTF-8 と表示されればOK。
    locale | grep LANG=
      

【スクリプト作成】

  1. list_links.sh
    $ sudo nano /etc/asterisk/scripts/list_links.sh

    #!/bin/bash

    TARGET_NODE="53197"
    AST_DB="/var/lib/asterisk/astdb.txt"
    
    # 1. 接続リストの抽出(Tから始まる行を特定)
    RAW_NODES=$(asterisk -rx "rpt nodes $TARGET_NODE" | grep "T[0-9]")
    # 2. カンマをスペースに変え、単語の頭(\b)にあるTだけを削除(JH1BLTのTは残る)
    LINKED_NODES=$(echo "$RAW_NODES" | sed 's/,/ /g' | sed 's/\bT//g')
    
    declare -A SEEN_CALLS
    CALL_LIST=()
    
    for NODE in $LINKED_NODES
    do
       [ "$NODE" == "$TARGET_NODE" ] && continue
       if [[ "$NODE" =~ ^[0-9]+$ ]]; then
           [ "$NODE" -le 2000 ] && continue
       fi
    
       CALLSIGN=$(grep "^${NODE}|" "$AST_DB" | cut -d'|' -f2)
       [ -z "$CALLSIGN" ] && CALLSIGN="$NODE"
    
       if [ -z "${SEEN_CALLS[$CALLSIGN]}" ]; then
           CALL_LIST+=("$CALLSIGN")
           SEEN_CALLS[$CALLSIGN]=1
       fi
    done
     
    TOTAL_COUNT=${#CALL_LIST[@]}
    
    if [ "$TOTAL_COUNT" -eq 0 ]; then
       asl-tts -n "$TARGET_NODE" -t "No links."
    else
       # 全体の件数を通知
       asl-tts -n "$TARGET_NODE" -t "$TOTAL_COUNT stations linked."
       sleep 0.4
    
       for CALL in "${CALL_LIST[@]}"
       do
           # 1文字ずつ分解してハイフンで繋ぐ(例: J-A-2-C-C-V)
           SPACED_CALL=$(echo "$CALL" | tr '[:lower:]' '[:upper:]' | sed 's/[A-Z0-9]/&- /g' | sed 's/- $//')
    
           echo "Announcing: $CALL"
           # オプションを標準(-n と -t のみ)に修正
           asl-tts -n "$TARGET_NODE" -t "$SPACED_CALL"
           sleep 0.4
       done
    fi
    
    TOTAL_COUNT=${#CALL_LIST[@]}
    
    # 3. 音声アナウンス開始
    if [ "$TOTAL_COUNT" -eq 0 ]; then
        asl-tts -n "$TARGET_NODE" -t "No links."
    else
       # 冒頭文を短くしてテンポアップ
       asl-tts -n "$TARGET_NODE" -t "$TOTAL_COUNT stations linked."
    
       # 待ち時間をさらに短縮 (0.8 -> 0.4)
       sleep 0.4
    
       for CALL in "${CALL_LIST[@]}"
       do
           # 【改良】カンマを消して「スペースのみ」に。これでポーズが最小限になります。
           SPACED_CALL=$(echo "$CALL" | tr '[:lower:]' '[:upper:]' | sed 's/./& /g')
    
           echo "Announcing: $CALL"
           # 標準オプションのみ使用
           asl-tts -n "$TARGET_NODE" -t "$SPACED_CALL"
    
           # 次の局までの待ち時間を最短に (0.8 -> 0.4)
           sleep 0.4
       done
    fi
     なお、list_links.sh はchmod 755 list_links.sh として実行権を与えておいてください。
      

【機能追加】

  1. list_links.sh をDTMF で実行
    /etc/asterisk/rpt.conの[functions] に以下のように追加する。
    [functions]
    ;;;;;;;;;;;;;;;;;;; functions stanza ;;;;;;;;;;;;;;;;;;;
    ; Prefix    Functions
    ; *1        Disconnect Link
    ; *2        Monitor Link
    83 = cmd,/etc/asterisk/scripts/list_links.sh
     
  2. DTMFの実行
     *83 でノード内に現在の接続ノード数とコールサインを読み上げる。
      サンプル:file53197.mp3

    URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White



    ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS