Настройка 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.