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
См. также
~~socialite~~