function 'REALTIME'

Функция Asterisk: Получить/Записать значение в реалтайм хранилище.

Описание

Данная функция читает или записывает значение из/в Реалтайм хранилище.

Конструкция REALTIME(….) читает имена/значения, а REALTIME(….)= записывает новые значения.
При чтении, функция возвращает текстовую строку с разделителями. Имя и значение разделяются символом указанным в <delim1>,
а сами пары Имя/значение разделяются символом <delim2>. такие дела…

Если совпадений не найдено, возвращается NULL. При записи, всегда возвращается NULL.

Синтаксис

REALTIME(family,fieldmatch[,matchvalue[,delim1|field[,delim2]]])

Аргументы

  • delim1|field - Используйте <delim1> вместе <delim2> для чтения, а <field> без <delim2> для записи.

Если выполняется чтение, а <delim1> не задан, по умолчанию назначается ','.

  • delim2 - Параметр только для чтения, если не задан, по умолчанию '='.

Пример

Рассмотрим использование функции REALTIME() на простом примере реализации HOT DESK.
Абонент может занять любое рабочее место и назначить свой номер для приема звонков (hot desking).

В таблице hints реалтайм хранилища сохраняется соответствие exten > channels.

  • exten - номер набираемый для вызова абонента.
  • channels - SIP пир вызываемый системой при наборе номера exten.
+-------+------------+
| exten | channels   |
+-------+------------+
| 6666  | 0000000009 |
| 7105  | 0000000001 |
+-------+------------+

Контекст ext-login обрабатывает запрос абонента на регистрацию номера, кодом 0000ХХХХ, где ХХХХ номер абонента:

  • Set(hintdb=${EXTEN:4}) - сохраняем номер в переменную, предварительно отрезав 0000.
  • GoSub(sub-setsip,s,1(${CALLERID(NUM)},${hintdb})) - отправим вызов в контекст sub-setsip, с аргументами:
    • CALLERID(num) - это будет параметр channels
    • hintdb - это номер exten, который надо сопоставить с channels.
[ext-login]
exten => _0000XXXX,1,PlayBack(beep)
    same => n,Set(hintdb=${EXTEN:4})
    same => n,Verbose(${CALLERID(NUM)});
    same => n,GoSub(sub-setsip,s,1(${CALLERID(NUM)},${hintdb}))

В контексте sub-setsip сначала проверим есть ли запись о channels, т.е. аппарате с которого происходит запрос в таблице.
Если есть, отправим вызов на приоритет update, если нет, на приоритет new.

  • Set(_VCHAN=${CUT(REALTIME(hints,channels,${ARG1},:,:),:,4)})
  • GotoIf($[«${VCHAN}» = «${ARG1}»]?update:new)

в случае если запись для данного устройства уже существует, в приоритете update запишем новый номер в строку где channels = CALLERID(num)

  • Set(REALTIME(hints,channels,${ARG1},exten)=${ARG2})

если же строк совпадающих с CALLERID(num) устройства нет, а приоритете new создадим новую запись, при помощи функции REALTIME_STORE:

  • Set(REALTIME_STORE(hints,exten,channels)=${ARG2},${ARG1})
[sub-setsip]
exten => s,1,Verbose(***channels=${ARG1}***exten=${ARG2})
     same => n,Set(_VCHAN=${CUT(REALTIME(hints,channels,${ARG1},:,:),:,4)})
     same => n,GotoIf($["${VCHAN}" = "${ARG1}"]?update:new)
     
     same => n(update),Verbose(***UPDATE***)
     same => n,Set(REALTIME(hints,channels,${ARG1},exten)=${ARG2})
     same => n,SayDigits(${ARG2})
     same => n,PlayBack(ru/agent-loginok)
     same => n,hangup
     same => n(new),Verbose(***NEW***)
     same => n,Set(REALTIME_STORE(hints,exten,channels)=${ARG2},${ARG1})
     same => n,SayDigits(${ARG2})
     same => n,PlayBack(ru/agent-loginok)
     same => n,hangup

теперь при наборе номера 6666 (exten), система вызовет пир 0000000009 (channels):

[internal-call]
exten => _XXXX,1,Set(CALLERID(num)=${CUT(REALTIME(hints,channels,${CALLERID(num)},:,:),:,2)})
exten => _XXXX,n,Dial(SIP/${CUT(REALTIME(hints,exten,${EXTEN},:,:),:,4)},,treU(sub-monitor,s,1))
exten => h,1,Hangup

См. также

Asterisk: функции диалплана

~~socialite~~

  • asterisk/func/realtime.txt
  • Последние изменения: 2016/12/17