По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Для пользователей, которые обладают премиальной лицензии на Cisco Unified Contact Center Express (UCCX), одной из самых крутых фич является наличие возможной интеграции и отправки запросов в базу данных. Сами запросы могут строиться на базе введенной звонящим информации, его номера – чего угодно.
Безусловно важно сделать ¬¬изначальный дизайн скриптов правильным и учитывать нагрузку. Большие и тяжелые скрипты, которые имеют много «плеч» в БД (базу данных), значительно увеличивают нагрузку на ресурсы сервера. А если БД еще и удалена от сервера CCX и имеет место сетевая задержка, то может иметь место прямое воздействие на бизнес и лояльность звонящего вам клиента.
Обзор Cisco Unified CCX Script Editor
Для создания и управления IVR скриптами в UCCX используется специальный инструмент - Cisco Unified CCX Editor. Он позволяет визуально управлять некими блоками, которые отвечают за то, или иное действие. Выглядит эта палетта следующим образом:
Давайте рассмотрим раздел Database. Здесь мы видимо 4 пункта:
DB Get - сопоставление полученных данных из БД к переменным скрипта;
DB Read - подключение к серверу и запрос;
DB Release - закрываем подключение к БД;
DB Write - если нужно внести изменения в БД, используем Write метод;
На скриншоте выше видно, что каждый скрипт начинается с события Start и заканчивается событием End. Во время звонка, по ходу выполнения скрипта, мы можем запрашивать данные из БД сколько угодно раз. Каждый запрос имеет свой отдельный список шагов, которые указаны в списке из 4х пунктов выше.
Мы рекомендуем предварительно обкатать все SQL запросы, доступ системы и прочие рабочие факторы перед выгрузкой в продуктивную среду
Например, давайте посмотрим, что скрыто внутри блока DB Read:
Взглянем на поля, которые доступны для конфигурации:
DB Resource Name - метка запроса. Своего рода метка;
Data Source Name - источник данных (DSN), указанное в административной консоли UCCX (Cisco Unified CCX Administration Database);
Timeout (in sec) - пауза выполнения запроса. Этот интервал защитит вашу систему от, например, потери связи с БД. То есть, максимум 7 секунд ожидания. Кстати, если указано как 0, то запрос не будет ограничен по времени;
Теперь из вкладки General переходим во вкладку Field Selection:
Запрос - SQL – команда (запрос), который вы ходите выполнить. Например, SELECT fld1, fld2 from tbl where fld1 = $variable - выбираем два поля из таблицы, где одно из полей равно переменной, которую, мы ранее, присвоили в скрипте (DTMF от клиента, например);
Test (кнопка) - нажмите на эту кнопку, чтобы проверить синтаксис запроса и подключение к БД;
Number of rows returned - количество вернувшихся строк запроса, в случае, если была нажата кнопка Test;
Show all fields (select table/view) - показать все поля в таблице, к которой выполняется подключение;
Отлично, разобрались. Теперь давайте взглянем на блок DB Get:
DB Resource Name - лэйбл или имя для этого запроса;
Data Source Name - имя БД (настраивается на стороне Cisco Unified CCX Administration);
Refresh Database Schema (кнопка) - кнопка, которая отвечает за подтягивание данных БД и таблицы в CCX Editor;
Переходим во вкладку Field Selection:
Table/View - данное поле показывает имя таблицы из БД, которая выбрана во вкладке General, которую мы описывали выше;
Табличное поле:
Field Name - имя поля, в выбранной БД;
Data Type - типа данных (строка/число и так далее);
Local Variable - переменная скрипта, которая будет хранить соответствующее поле;
Add/Modify (кнопки) - кнопки, которые отвечают за модификацию полей (кроме типа данных, он read only);
Полученные данные можно использовать в скрипте, например, чтобы озвучивать клиенту (TTS) его данные по номеру телефона, или по введенным цифрам (номер заказа). Кстати, аналогичную фичу мы реализовали в связке Yandex.SpeechKit и Asterisk.
Многим приложениям нужно обмениваться данными между клиентом и сервером.
Долгое время эталонным форматом данных для обмена информацией между двумя объектами считался XML. Затем, в начале 2000-х, появился альтернативный формат JSON.
В данной статье вы узнаете все о JSON. Мы рассмотрим, что это, и как им пользоваться, а также разберем ряд популярных заблуждений.
Что такое JSON?
JSON (JavaScript Object Notation, нотация объектов JavaScript) - это текстовый формат обмена данными. Он представлен наборами пар "ключ-значение", причем ключ - это всегда строка, а значение может задаваться одним из следующих типов:
число;
строка;
логическое значение;
массив;
объект;
нулевое значение null.
Несколько важных правил:
В формате данных JSON ключи прописываются в двойных кавычках.
Ключ и значение разделяются двоеточием (:).
Может быть несколько пар "ключ-значение". Каждая пара отделяется запятой (,).
В данных JSON недопустимы комментарии (// или /* */). (Но при желании это ограничение можно обойти)
Ниже приведен пример простых данных в JSON:
{
"name": "Alex C",
"age": 2,
"city": "Houston"
}
Допустимые данные в JSON возможны в 2 разных форматах:
Набор пар «ключ-значение» в фигурных скобках {...}. Это показано в примере выше.
Упорядоченные списки пар «ключ-значение», разделенных запятой (,) и заключенных в квадратные скобки [...]. См. пример ниже:
[
{
"name": "Alex C",
"age": 2,
"city": "Houston"
},
{
"name": "John G",
"age": 40,
"city": "Washington"
},
{
"name": "Bala T",
"age": 22,
"city": "Bangalore"
}
]
Предположим, вы уже писали что-то на JavaScript. Тогда у вы можете ошибочно предположить, что формат JSON и объекты JavaScript (и массивы объектов) очень похожи. Но это не так. Чуть позже мы подробно об этом поговорим.
Структура JSON разработана на основе синтаксиса объектов JavaScript, и это единственное, что объединяет JSON и объекты JavaScript.
Формат JSON не зависит от языка программирования. Мы можем использовать JSON в Python, Java, PHP и многих других языках.
Примеры формата данных JSON
Сохранять данные JSON можно в файле с расширением .json. Давайте создадим файл employee.json с атрибутами сотрудника. Они представлены в виде ключей и значений.
{
"name": "Aleix Melon",
"id": "E00245",
"role": ["Dev", "DBA"],
"age": 23,
"doj": "11-12-2019",
"married": false,
"address": {
"street": "32, Laham St.",
"city": "Innsbruck",
"country": "Austria"
},
"referred-by": "E0012"
}
В примере выше присутствуют следующие атрибуты сотрудника:
name – имя сотрудника. Значение в строковом формате (String). Оно указано в двойных кавычках.
id – уникальный идентификатор сотрудника. Опять же, в строковом формате.
role – роли, которые сотрудник выполняет в организации. Таких ролей может быть несколько, поэтому лучше перечислять эти данные в формате массива (Array).
age – текущий возраст сотрудника. Это числовое значение (Number).
doj – дата найма сотрудника. Поскольку это дата, ее добавляют в двойных кавычках и обрабатывают как строку.
married – замужем/женат ли сотрудник? Ответом может быть да/нет (то есть true или false), так что это логический формат (Boolean).
address – адрес сотрудника. Может состоять из нескольких частей: улица, город, страна, индекс и т.д. Такое поле лучше представлять в виде объекта (Object с парами «ключ-значение»).
referred-by – идентификатор сотрудника, который порекомендовал этого человека на должность в организацию. Если сотрудник пришел по рекомендации, то атрибут имеет значение. В остальных случаях поле остается пустым, т.е. null.
Теперь давайте создадим набор данных по сотрудникам в формате JSON. Если мы хотим добавить несколько записей о разных сотрудниках, то необходимо прописать их в квадратных скобках [...].
[
{
"name": "Aleix Melon",
"id": "E00245",
"role": ["Dev", "DBA"],
"age": 23,
"doj": "11-12-2019",
"married": false,
"address": {
"street": "32, Laham St.",
"city": "Innsbruck",
"country": "Austria"
},
"referred-by": "E0012"
},
{
"name": "Bob Washington",
"id": "E01245",
"role": ["HR"],
"age": 43,
"doj": "10-06-2010",
"married": true,
"address": {
"street": "45, Abraham Lane.",
"city": "Washington",
"country": "USA"
},
"referred-by": null
}
]
Обратите внимание на значение атрибута referred-by для сотрудника Боба Вашингтона (Bob Washington). Оно пустое. То есть никто из сотрудников не давал ему рекомендаций.
Как использовать данные JSON в качестве значения строки
Мы узнали, как форматировать данные внутри файла JSON. Еще можно использовать данные JSON в качестве строковых значений и присваивать их переменной. Поскольку JSON считается текстовым форматом, в большинстве языков программирования его можно обрабатывать как строку.
Давайте рассмотрим пример, как это делается JavaScript. Вы можете добавить данные JSON в одну строку. Перечисление делается через одинарные кавычки '...'.
const user = '{"name": "Alex C", "age": 2, "city": "Houston"}';
Если вы хотите сохранить форматирование, то данные JSON лучше создавать с помощью шаблонных литералов (template literals).
const user = `{
"name": "Alex C",
"age": 2,
"city": "Houston"
}`;
Кроме того, это очень удобное решение, если нужно создать данные JSON с динамическими значениями.
const age = 2;
const user = `{
"name": "Alex C",
"age": ${age},
"city": "Houston"
}`;
console.log(user);
// Output
{
"name": "Alex C",
"age": 2,
"city": "Houston"
}
Объекты JavaScript и JSON – это НЕ одно и то же
Формат данных JSON создавался на базе объектной структуры JavaScript. Но все сходства на этом заканчиваются.
Объекты в JavaScript:
у объектов JavaScript могут быть методы, а у JSON – нет;
ключи можно добавлять без кавычек;
разрешены комментарии;
отдельные сущности
Как преобразовать JSON в объект JavaScript и наоборот
В JavaScript есть 2 встроенных метода по преобразованию данных JSON в объекты JavaScript и наоборот.
Как преобразовать данные JSON в объект JavaScript
Для преобразования данных JSON в объект JavaScript используется метод JSON.parse(). Он проводит синтаксический разбор (парсинг) допустимой строки JSON в объект JavaScript.
const userJSONData = `{
"name": "Alex C",
"age": 2,
"city": "Houston"
}`;
const userObj = JSON.parse(userJSONData);
console.log(userObj);
Вывод:
Как преобразовать объект JavaScript в данные JSON
Для преобразования объекта JavaScript в данные JSON используется метод JSON.stringify().
const userObj = {
name: 'Alex C',
age: 2,
city: 'Houston'
}
const userJSONData = JSON.stringify(userObj);
console.log(userJSONData);
Вывод:
Должно быть, вы обратили внимание на слово JSON, которое используется для вызова методов parse() и stringify(). Это встроенный объект JavaScript, который, хоть и называется JSON (хотя с тем же успехом он мог бы называться JSONUtil), но не имеет никакого отношения к формату JSON. Так что, пожалуйста, помните об этом.
Как обрабатывать ошибки "Unexpected token u in JSON at position 1" и другие?
При обработке JSON могут возникать ошибки. Это нормально. Например, при разборе данных JSON в объект JavaScript вдруг появляется следующее сообщение:
Если возникает такая ошибка, обязательно проверьте корректность ваших данных в JSON. Чаще всего причина синтаксического сбоя кроется в небольшой ошибке, которую вы случайно сделали в исходных данных JSON. Проверить правильность данных и форматов JSON можно с помощью JSON Linter.
Для начальной настройки маршрутизатора (здесь и далее в качестве примера взяты устройства компании Cisco) нужно выполнить следующие шаги в режиме конфигурации роутера, перейти к которому можно командой configure terminal:
1. Задаем название устройства
Router(config)# hostname
2. Задаем пароль для входа в привилегированный режим.
Router(config)# enable secret password
3. Задаем пароль на подключение через консоль.
Router(config)# line console 0
Router(config-line)# password password
Router(config-line)# login
4. Задаем пароль для удаленного доступа по Telnet / SSH.
Router(config-line)# line vty 0 4
Router(config-line)# password password
Router(config-line)# login
Router(config-line)# transport input {ssh | telnet}
5. Шифруем все пароли введенные на устройстве.
Router(config-line)# exit
Router(config)# service password-encryption
6. Задаем баннер, который будет выводится при подключении к устройству. В данном баннере обычно указывается правовая информация о последствиях несанкционированного подключения
Router(config)# banner motd delimiter message delimiter
7. Сохраняем конфигурацию.
Router(config)# end
Router# copy running-config startup-config
Пример базовой настройки маршрутизатора
В данном руководстве на маршрутизаторе R1 из топологии ниже будет сделана первичная конфигурация:
Чтобы настроить маршрутизатор вводим следующие команды:
Router> enable
Router# configure terminal
Enter configuration commands, one per line.
End with CNTL/Z.
Router(config)# hostname R1
R1(config)#
Все методы доступа к настройкам маршрутизатора должны быть защищены. Привилегированный режим EXEC дает пользователю полный доступ к устройству и его настройкам. Поэтому нужно надёжно защитить доступ к этому режиму.
Следующие команды позволяют защитить доступ к пользовательскому и привилегированному режимам EXEC, включает Telnet/SSH и шифрует все пароли в конфигурации.
R1(config)# enable secret class
R1(config)#
R1(config)# line console 0
R1(config-line)# password cisco
R1(config-line)# login
R1(config-line)# exit
R1(config)#
R1(config)# line vty 0 4
R1(config-line)# password cisco
R1(config-line)# login
R1(config-line)# transport input ssh telnet
R1(config-line)# exit
R1(config)#
R1(config)# service password-encryption
R1(config)#
Далее сконфигурируем баннер Message of the Day. Обычно такой баннер включает в себя юридическое уведомление предупреждающее пользователей о том, что доступ к устройству разрешен только авторизованным лицам. Данный тип баннера конфигурируется следующим образом:
R1(config)# banner motd #
Enter TEXT message. End with a new line and the #
***********************************************
WARNING: Unauthorized access is prohibited!
***********************************************
#
R1(config)#
Настройка интерфейсов маршрутизатора
На данный момент на нашем роутере выполнена первичная настройка. Так как без настроек интерфейсов роутеры не будут доступны для других устройств, далее сконфигурируем его интерфейсы. На маршрутизаторах компании Cisco бывают разные интерфейсы. Например, маршрутизатор Cisco ISR 4321 оснащен двумя гигабитными интерфейсами.
GigabitEthernet 0/0/0
GigabitEthernet 0/0/1
Для настройки интерфейсов маршрутизатора нужно ввести следующие команды:
Router(config)# interface type-and-number
Router(config-if)# description description-text
Router(config-if)# ip address ipv4-address subnet-mask
Router(config-if)# ipv6 address ipv6-address/prefix-length
Router(config-if)# no shutdown
Как только порт включиться, на консоли выведется соответствующее сообщение.
Несмотря на то, что команда description не требуется для включения интерфейса, все же рекомендуется ее использовать. Это может быть полезно при устранении неполадок в производственных сетях, предоставляя информацию о типе подключенной сети. Например, если интерфейс подключается к поставщику услуг или провайдеру услуг, команда description будет полезна для ввода внешнего соединения и контактной информации. Длина текста description составляет 240 символов.
Команда no shutdown используется для включения интерфейса, это похоже на включение питания на интерфейсе. Также маршрутизатор следует подключить к другому устройству, чтобы установилась связь на физическом уровне.
Пример настройки интерфейсов на маршрутизаторе
В данном примере на маршрутизаторе R1 включим непосредственно подключенные порты.
Для настройки портов на R1 введите следующие команды:
R1> enable
R1# configure terminal
Enter configuration commands, one per line.
End with CNTL/Z.
R1(config)# interface gigabitEthernet 0/0/0
R1(config-if)# description Link to LAN
R1(config-if)# ip address 192.168.10.1 255.255.255.0
R1(config-if)# ipv6 address 2001:db8:acad:10::1/64
R1(config-if)# no shutdown
R1(config-if)# exit
R1(config)#
*Aug 1 01:43:53.435: %LINK-3-UPDOWN: Interface GigabitEthernet0/0/0, changed state to down
*Aug 1 01:43:56.447: %LINK-3-UPDOWN: Interface GigabitEthernet0/0/0, changed state to up
*Aug 1 01:43:57.447: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/0, changed state to up
R1(config)#
R1(config)#
R1(config)# interface gigabitEthernet 0/0/1
R1(config-if)# description Link to R2
R1(config-if)# ip address 209.165.200.225 255.255.255.252
R1(config-if)# ipv6 address 2001:db8:feed:224::1/64
R1(config-if)# no shutdown
R1(config-if)# exit
R1(config)#
*Aug 1 01:46:29.170: %LINK-3-UPDOWN: Interface GigabitEthernet0/0/1, changed state to down
*Aug 1 01:46:32.171: %LINK-3-UPDOWN: Interface GigabitEthernet0/0/1, changed state to up
*Aug 1 01:46:33.171: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/1, changed state to up
R1(config)#
Информационные сообщения говорят нам, что оба порта включены.
Проверка настроек портов
Для проверки настроек портов используются несколько команд. Самыми полезные из них это команды show ip interface brief и show ipv6 interface brief.
R1# show ip interface brief
Interface IP-Address OK? Method Status Protocol
GigabitEthernet0/0/0 192.168.10.1 YES manual up up
GigabitEthernet0/0/1 209.165.200.225 YES manual up up
Vlan1 unassigned YES unset administratively down down
R1# show ipv6 interface brief
GigabitEthernet0/0/0 [up/up]
FE80::201:C9FF:FE89:4501
2001:DB8:ACAD:10::1
GigabitEthernet0/0/1 [up/up]
FE80::201:C9FF:FE89:4502
2001:DB8:FEED:224::1
Vlan1 [administratively down/down]
unassigned
R1#