Quantcast
Channel: IP АТС Asterisk
Viewing all articles
Browse latest Browse all 1041

function 'REALTIME'

$
0
0

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


Viewing all articles
Browse latest Browse all 1041


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>