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