Метка: asterisk

  • Настройка sms обмена для внутренних пользователей asterisk

    Настройки SMS для внутренних номеров (3 и 5 цифр) в Asterisk

    1. Основная конфигурация SIP (sip.conf)

    «`ini

    [general]

    accept_outofcall_message = yes

    auth_message_requests = yes

    allow = message

    ; Шаблон для внутренних пользователей

    [internal-template](!)

    type = friend

    host = dynamic

    context = internal-sms

    dtmfmode = rfc2833

    qualify = yes

    allow = all

    accept_outofcall_message = yes

    auth_message_requests = yes

    allow = message

    ; Примеры пользователей с 3-значными номерами

    [101](internal-template)

    secret = password101

    callerid = «User 101» <101>

    [202](internal-template)

    secret = password202

    callerid = «User 202» <202>

    [999](internal-template)

    secret = password999

    callerid = «User 999» <999>

    ; Примеры пользователей с 5-значными номерами

    [10001](internal-template)

    secret = password10001

    callerid = «User 10001» <10001>

    [54321](internal-template)

    secret = password54321

    callerid = «User 54321» <54321>

    [88888](internal-template)

    secret = password88888

    callerid = «User 88888» <88888>

    «`

    2. Диалплан для обработки SMS (extensions.conf)

    «`ini

    [internal-sms]

    ; Обработка входящих SMS для 3-значных номеров (101-999)

    exten => _[1-9][0-9][0-9],1,NoOp(Received SMS for 3-digit number: ${EXTEN})

    exten => _[1-9][0-9][0-9],n,Goto(process_sms,1)

    ; Обработка входящих SMS для 5-значных номеров (10000-99999)

    exten => _[1-9][0-9][0-9][0-9][0-9],1,NoOp(Received SMS for 5-digit number: ${EXTEN})

    exten => _[1-9][0-9][0-9][0-9][0-9],n,Goto(process_sms,1)

    ; Общая обработка SMS

    exten => process_sms,1,NoOp(Processing SMS from ${MESSAGE(from)} to ${EXTEN})

    exten => process_sms,n,Set(FROM_NUMBER=${CUT(MESSAGE(from),@,1)})

    exten => process_sms,n,Set(FROM_NUMBER=${CUT(FROM_NUMBER,:,2)})

    exten => process_sms,n,Set(SMS_TIMESTAMP=${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)})

    exten => process_sms,n,Set(SMS_ID=${STRFTIME(${EPOCH},,%Y%m%d%H%M%S)})

    ; Проверка валидности отправителя (3 или 5 цифр)

    exten => process_sms,n,GotoIf($[${LEN(${FROM_NUMBER})} = 3]?valid_sender)

    exten => process_sms,n,GotoIf($[${LEN(${FROM_NUMBER})} = 5]?valid_sender)

    exten => process_sms,n,NoOp(Invalid sender number: ${FROM_NUMBER})

    exten => process_sms,n,MessageSend(sip:${FROM_NUMBER}@localhost,sip:${EXTEN}@localhost,»Error: Invalid sender number»)

    exten => process_sms,n,Hangup()

    exten => process_sms,n(valid_sender),Set(DB(SMS/${EXTEN}/inbox/${SMS_ID}/from)=${FROM_NUMBER})

    exten => process_sms,n,Set(DB(SMS/${EXTEN}/inbox/${SMS_ID}/message)=${MESSAGE(body)})

    exten => process_sms,n,Set(DB(SMS/${EXTEN}/inbox/${SMS_ID}/timestamp)=${SMS_TIMESTAMP})

    exten => process_sms,n,Set(DB(SMS/${EXTEN}/inbox/${SMS_ID}/status)=unread)

    ; Отправляем подтверждение доставки

    exten => process_sms,n,MessageSend(sip:${FROM_NUMBER}@localhost,sip:${EXTEN}@localhost,»SMS delivered to ${EXTEN}»)

    ; Логируем доставку

    exten => process_sms,n,Set(LOG=/var/log/asterisk/sms.log)

    exten => process_sms,n,System(echo «[${SMS_TIMESTAMP}] FROM:${FROM_NUMBER} TO:${EXTEN} MSG:’${MESSAGE(body)}’» >> ${LOG})

    exten => process_sms,n,Hangup()

    ; Сервисные номера для работы с SMS

    exten => *99,1,NoOp(SMS Inbox Check for ${CALLERID(num)})

    exten => *99,n,Set(SMS_COUNT=0)

    exten => *99,n,Set(SMS_LIST=${DB_KEYS(SMS/${CALLERID(num)}/inbox,)})

    exten => *99,n,GotoIf($[${ISNULL(${SMS_LIST})}]?no_messages)

    ; Чтение сообщений

    exten => *99,n,While($[${SET(sms_id=${SHIFT(SMS_LIST)})}])

    exten => *99,n,Set(SMS_FROM=${DB(SMS/${CALLERID(num)}/inbox/${sms_id}/from)})

    exten => *99,n,Set(SMS_MSG=${DB(SMS/${CALLERID(num)}/inbox/${sms_id}/message)})

    exten => *99,n,Set(SMS_TIME=${DB(SMS/${CALLERID(num)}/inbox/${sms_id}/timestamp)})

    exten => *99,n,Playback(from)

    exten => *99,n,SayNumber(${SMS_FROM})

    exten => *99,n,PlayBACK(message)

    exten => *99,n,SayAlpha(${SMS_MSG})

    exten => *99,n,Set(DB(SMS/${CALLERID(num)}/inbox/${sms_id}/status)=read)

    exten => *99,n,Set(SMS_COUNT=$[${SMS_COUNT} + 1])

    exten => *99,n,EndWhile()

    exten => *99,n,Playback(you-have)

    exten => *99,n,SayNumber(${SMS_COUNT})

    exten => *99,n,Playback(messages)

    exten => *99,n,Hangup()

    exten => *99,n(no_messages),PlayBACK(you-have-no-new-messages)

    exten => *99,n,Hangup()

    ; Очистка всех SMS

    exten => *98,1,NoOp(Clear SMS inbox for ${CALLERID(num)})

    exten => *98,n,Set(SMS_KEYS=${DB_KEYS(SMS/${CALLERID(num)}/inbox,)})

    exten => *98,n,GotoIf($[${ISNULL(${SMS_KEYS})}]?empty_inbox)

    exten => *98,n,While($[${SET(sms_key=${SHIFT(SMS_KEYS)})}])

    exten => *98,n,Set(DB_DELETE(SMS/${CALLERID(num)}/inbox/${sms_key}))

    exten => *98,n,EndWhile()

    exten => *98,n,Playback(messages-deleted)

    exten => *98,n,Hangup()

    exten => *98,n(empty_inbox),PlayBACK(no-messages-to-delete)

    exten => *98,n,Hangup()

    ; Проверка существования номера

    exten => *97,1,NoOp(Check if number exists: ${CALLERID(num)})

    exten => *97,n,Playback(your-number-is)

    exten => *97,n,SayNumber(${CALLERID(num)})

    exten => *97,n,Playback(and-has)

    exten => *97,n,Set(SMS_EXISTS=${DB_EXISTS(SMS/${CALLERID(num)}/inbox)})

    exten => *97,n,GotoIf($[${SMS_EXISTS}]?has_messages:no_messages_97)

    exten => *97,n(has_messages),Set(MSG_COUNT=${DB_KEYS(SMS/${CALLERID(num)}/inbox,)})

    exten => *97,n,Playback(you-have)

    exten => *97,n,SayNumber(${MSG_COUNT})

    exten => *97,n,Playback(messages)

    exten => *97,n,Hangup()

    exten => *97,n(no_messages_97),PlayBACK(no-messages)

    exten => *97,n,Hangup()

    «`

    3. Утилиты для работы с SMS

    Создайте файл /usr/local/bin/sms_tool:

    «`bash

    #!/bin/bash

    function show_usage {

        echo «SMS Tool for Asterisk»

        echo «Usage: $0 {send|inbox|count|clear|list} [parameters]»

        echo »  send <from> <to> <message>»

        echo »  inbox <number>»

        echo »  count <number>»

        echo »  clear <number>»

        echo »  list [pattern]»

    }

    case «$1» in

        send)

            if [ $# -lt 4 ]; then

                echo «Usage: $0 send <from> <to> <message>»

                exit 1

            fi

            asterisk -rx «message send sip:$2@localhost sip:$3@localhost $4»

            ;;

        inbox)

            if [ $# -lt 2 ]; then

                echo «Usage: $0 inbox <number>»

                exit 1

            fi

            asterisk -rx «database show SMS/$2»

            ;;

        count)

            if [ $# -lt 2 ]; then

                echo «Usage: $0 count <number>»

                exit 1

            fi

            asterisk -rx «database show SMS/$2» | grep -c «/inbox/»

            ;;

        clear)

            if [ $# -lt 2 ]; then

                echo «Usage: $0 clear <number>»

                exit 1

            fi

            asterisk -rx «database deltree SMS/$2»

            ;;

        list)

            if [ $# -eq 2 ]; then

                asterisk -rx «database show» | grep «SMS/» | grep «$2» | cut -d/ -f2 | sort | uniq

            else

                asterisk -rx «database show» | grep «SMS/» | cut -d/ -f2 | sort | uniq

            fi

            ;;

        *)

            show_usage

            ;;

    esac

    «`

    4. Примеры использования

    Отправка SMS между разными форматами номеров:

    «`bash

    # От 3-значного к 3-значному

    asterisk -rx «message send sip:101@localhost sip:202@localhost Hello from 101!»

    # От 3-значного к 5-значному

    asterisk -rx «message send sip:999@localhost sip:10001@localhost Message to long number»

    # От 5-значного к 3-значному

    asterisk -rx «message send sip:54321@localhost sip:101@localhost Hi from 54321»

    # От 5-значного к 5-значному

    asterisk -rx «message send sip:10001@localhost sip:88888@localhost Test message»

    «`

    Использование утилиты:

    «`bash

    # Дать права на выполнение

    chmod +x /usr/local/bin/sms_tool

    # Примеры использования

    sms_tool send 101 10001 «Test message»

    sms_tool inbox 101

    sms_tool count 10001

    sms_tool list

    sms_tool clear 202

    «`

    5. Проверка конфигурации

    «`bash

    # Проверка синтаксиса конфигураций

    asterisk -rx «sip show settings» | grep -i message

    asterisk -rx «dialplan show internal-sms»

    # Мониторинг SMS трафика

    tail -f /var/log/asterisk/sms.log

    # Проверка зарегистрированных номеров

    asterisk -rx «sip show peers» | grep -E «(101|202|999|10001|54321|88888)»

    «`

    6. Важные особенности

    · ✅ Поддержка смешанной нумерации (3 и 5 цифр)

    · ✅ Проверка валидности длины номеров

    · ✅ Единая обработка для всех форматов номеров

    · ✅ Совместимость с любыми номерами, начинающимися с 1-9

    · ✅ Централизованное логирование всех операций

    Теперь система поддерживает SMS между любыми внутренними номерами длиной 3 или 5 цифр, начинающимися с любой цифры от 1 до 9.