Функция Asterisk: Получить/Записать значение в реалтайм хранилище.
Описание
Данная функция читает или записывает значение из/в Реалтайм хранилище.
Конструкция REALTIME(….) читает имена/значения, а REALTIME(….)= записывает новые значения.
При чтении, функция возвращает текстовую строку с разделителями.
Имя и значение разделяются символом указанным в <delim1>,
а сами пары Имя/значение разделяются символом <delim2>. такие дела…
Если совпадений не найдено, возвращается NULL. При записи, всегда возвращается NULL.
Синтаксис
REALTIME(family,fieldmatch[,matchvalue[,delim1|field[,delim2]]])
Аргументы
Если выполняется чтение, а <delim1> не задан, по умолчанию назначается ','.
Пример
Рассмотрим использование функции REALTIME() на простом примере реализации HOT DESK.
Абонент может занять любое рабочее место и назначить свой номер для приема звонков (hot desking).
В таблице hints реалтайм хранилища сохраняется соответствие exten > channels.
+-------+------------+ | exten | channels | +-------+------------+ | 6666 | 0000000009 | | 7105 | 0000000001 | +-------+------------+
Контекст ext-login обрабатывает запрос абонента на регистрацию номера, кодом 0000ХХХХ, где ХХХХ номер абонента:
[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.
в случае если запись для данного устройства уже существует, в приоритете update запишем новый номер в строку где channels = CALLERID(num)
если же строк совпадающих с CALLERID(num) устройства нет, а приоритете new создадим новую запись, при помощи функции REALTIME_STORE:
[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~~