Подсчет MT SMS от разных пользователей средствами Kannel

При внедрении агрегационных SMS-платформ одним из важных требований является возможность учета трафика от различных клиентов. В этой заметке я хочу рассмотреть простейший способ учета исходящих (MT) SMS, не требующий никаких внешних систем - все делается средствами самого Kannel.

Для этих целей можно использовать файлы протокола работы SMS-шлюза, которые содержат достаточно подробную информацию.

Для начала включим такое протоколирование в секции group = core

access-log = "/var/log/kannel/access.log"

В логи теперь польются строчки вида:

MT SMS

2009-12-07 16:12:13 Sent SMS [SMSC:smpp1] [SVC:netsds] [ACT:123] [BINF:] [FID:64358495] [META:] [from:111] [to:+380111111111] [flags:-1:0:-1:-1:3] [msg:4:test] [udh:0:]

DLR

2009-12-07 16:12:18 Receive DLR [SMSC:smpp1] [SVC:netsds] [ACT:prov] [BINF:] [FID:64358495] [META:?smpp?dlr_err=000&] [from:111] [to:+3380111111111] [flags:-1:-1:-1:-1:1] [msg:106:id:0064358495 sub:001 dlvrd:001 submit date:0912071615 done date:0912071615 stat:DELIVRD err:000 text:test] [udh:0:]

Теперь у нас есть следующие варианты разделения трафика:

  1. Учет по исходящему номеру (выбор фрагментов [from:XXX])
  2. Учет по аккаунтам sendsms-user (выбор фрагмента [SVC:XXX])
  3. Явная установка своего идентификатора ([ACT:XXX]).

Последний способ интересен тем, что позволяет через один аккаунт sendsms API пускать трафик разных клиентов и разделять его в файлах журналирования). В примере выше для этого использовалось указание параметра account в HTTP API sendsms:

GET -e 'http://127.0.0.1:13013/cgi-bin/sendsms?user=netsds&password=secret&from=111&to=%2B380111111111&text=test&smsc=smpp1&dlr-mask=3&coding=0&charset=utf-8&account=123'

Естественно, кроме 123 можно указать любой другой идентификатор нашего клиента, чтобы потом выставить ему счет или сгенерировать себе красивый график на стенку.

Небольшая сложность заключается в том, что параметр account можно отслеживать только в отправляемых SMS. Однако, эта проблема не так страшна, т.к. всегда можно отследить соответствие получаемых DLR по идентификатору сообщения, выданному SMSC. В примере он содержится в поле [FID:XXXXX].