По немногочисленным просьбам трудящихся я расскажу как заворачивать GSM SMS из sip_dongle модуля для Asterisk в sip messaging с последующей маршрутизацией.
Немного ТЗ
Есть центральный узел Asterisk, на котором живет логика и пользователи (extensions). К нему подключаются через PJSIP другие оконечные Asterisk`и на которых висит по несколько GSM модемов.
- Одна из задач: принимать и отправлять GSM SMS сообщения правильно маршрутизируя их по номеру получателя.
- Вторая подзадача: дать нашим пользователям (extensions) возможность слать друг другу текстовые сообщения.
Итак. Что тут сложного и в чем подвох?
Когда у вас 1 модем и 1 extension все очень просто. Когда у вас 2 модема и 1 extension задача все еще простая.
Когда у вас “многое ко многим” — вот тут и кроется основна сложность. Т.е. нам нужно не просто понимать на какой конкретно модем какому конкретно Asterisk`у передать исходящее SMS, но и куда направить входящее из GSM сети сообщение. А так же что делать, если мы внутри себя не можем сообщения доставить.
Обозначения:
- gsmru 10.8.0.11 — оконечный сервер Asterisk на котором живут модемы
- 10.8.0.10 — центральный сервер Asterisk на котором крутится вся логика
- 101;102;103 - пользователи (extensions)
- sip - протокол ходит по 80му порту (так исторически сложилось)
Начнем разворачивать цепочку от оконечного Asterisk (gsmru) с модемами в сторону центрального сервера. Это канал приема сообщений и проще его объяснять именно так.
Работать с SMS можно по разному, но в моем случае я использую sqlite, который у меня /var/lib/asterisk/smsdb.sqlite3. Это сделано так чтобы можно было легко оперировать сообщениями, создавать очереди доставки в обе стороны и не переживать за всякие проблемы вида «я записал что-то в файл и мне нужно успеть это вычитать пока туда не записалось следующее, а заодно проверить что там нет «патча Бармина».