Этот проект теперь прекращен.
Это потому, что я наткнулся на проект Drachtio, который разделяет то же видение и структуру, которые я имел в виду для этого проекта. Drachtio является только одним из компонентов этого проекта, поэтому этот прогнозируемый превратился в другие проекты, которые в конечном итоге отключится от всех компонентов, необходимых для мягкого УАТС.
Есть еще многое, включая присутствие.
Project MediaSwitch предназначен для масштабируемого выключателя VoIP. Забудьте о швейцарском армии, поддерживающем 20 протоколов, соединяющих старые маршруты ISDN с H323 или SIP. Этот проект предназначен для того, чтобы быть тонким, эффективным и быстрым с использованием асинхронной архитектуры, управляемой событиями. SIP, Call Control и RTP.
Дизайн разбит на 3 основных компонента. Каждый компонент представляет собой в первую очередь единственная архитектура с портами ввода/вывода для сети (например, Nginx Over Apache). Это:
ПРИМЕЧАНИЕ RE Зеленые потоки - иначе известные как кооперативное многопоточное. Единственным недостатком использования этой техники является то, что ваше программное обеспечение должно сотрудничать с другими потоками - т.е. отказаться от времени обработки. Компонент SIP использует C ++ Boost Asio, а Call Control использует Node JS - оба очень хорошие структуры для этого стиля. Оба являются высокопроизводительными рамками. RTP также использует C ++ Boost Asio.
Для большинства пользователей это означает, что когда вы пишете сценарии узлов для своих собственных сценариев управления вызовом, вы должны понимать асинхронную природу узла и как правильно писать асинхронный Javascript. Вы можете заблокировать весь резерность управления, не отказавшись от времени процессора. Однако, когда вы понимаете это правильно, вы получите очень эффективный сервер.
3 основных компонента:
Каждый компонент может работать либо на одном и том же сервере, либо на отдельных серверах. Это позволяет, например, на сервере 1 запуск SIP и управления вызовами, то если вы сильно транскод, который увеличивает нагрузку серверов RTP, несколько RTP -серверов.
События передаются с помощью механизма событий HTTP. то есть, если клиент генерируется новый вызов SIP (который отправляет приглашение SIP), то Project-SIP передаст HTTP-запрос обратно на сервер управления. Затем сервер управления передаст инструкции обратно как серверу SIP, так и на RTP -сервер.
Дизайн этого проекта предназначен для работы с облачными сервисами, чтобы рабочие нагрузки могли быть масштабированы вверх и вниз.
Часть дизайна должна быть в памяти. т.е. SIP -сервер не должен потребоваться запросить базу данных для получения информации о каталоге. После начала информацию о каталоге следует пережить на SIP -сервер (либо сервером управления, либо на вашем веб -сайте - дружелюбный хост) - подумайте Memcache.
Все три проекта предназначены для запуска на одном и том же физическом сервере или отдельных серверах. Таким образом, балансировка нагрузки между серверами может быть достигнута. Затем можно запустить несколько серверов RTP для обработки больших объемов транскодирования для каждого сервера SIP и управления.
Все услуги общаются друг с другом через HTTP. В следующем разделе определяется интерфейсы. В этом разделе все примеры используют Curl для получения или публикации данных.
Как и Project-SIP, контроль имеет интерфейс HTTP. Это упрощается библиотекой управления, написание сценариев управления вызовом становятся простыми:
/* Indicate ringing to the caller - did we really need a comment! */
call . ring ( ) ;Библиотека может быть включена с
const projectcontrol = require ( "projectcontrol" )(Обратите внимание, что это изменится при выпуске!).
SIP -сервер требует, чтобы пользовательская информация была загружена на него.
projectcontrol . directory ( "bling.babblevoice.com" , [ { "username" : "1003" , "secret" : "1123654789" } ] )Мы можем контролировать, какие кодеки мы разрешаем. Support: PCMA, PCMU, 722, ILBC@20, 2833. (Примечание ILBC и 2833 TODO).
projectcontrol . codecs = [ "722" , "pcma" , "pcmu" , "ilbc" , "2833" ]Мы хотели бы сообщить о новых звонках
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
}Объект «Call», который передается, содержит внутреннюю информацию для отслеживания вызова. Информация относительно того, звонит, отвечает, подумать и т. Д. Вы также можете установить функции обратного вызова на вызове
projectcontrol . onnewcall = ( call ) =>
{
console . log ( "new call" )
call . onhangup = ( ) =>
{
console . log ( "hung up" )
}
/* Indicate ringing to the caller - not needed as the second leg ringing signal will be passed back */
call . ring ( )
/* Make a call */
if ( "3" == call . destination )
{
call . newcall ( { to : { user : "1003" } } )
}
}После того, как ProjectControl настроен, запустите потребность в вызове, который ставит все это в свой цикл событий.
projectcontrol . run ( )СПИСОК СЕТАТЕРЫ ДЛЯ ЗАЯВЛЕНИЯ ВЫЗОВАНИЯ В PROJECTCONTROL:
Их можно называться несколько раз, и обратные вызовы будут сложены и все называются.
Getters
Методы
Подобно SIP -серверу пригласить этот вызов, вызовет новый вызов, но сначала он пройдет обработку вызовов (по сравнению с интерфейсом SIP, который слепо вызовет конечную точку SIP).
Уведомите сервер управления регистрацией SIP. Сгенерировано сервером SIP и отправлено на сервер управления, настроенный с использованием интерфейса каталога.
Поместите http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
{
"host" : " 127.0.0.1 " ,
"port" : 45646 ,
"agent" : " Z 5.2.28 rv2.8.114 "
}Хост и порт являются клиентской сетью (откуда поступил запрос), а агент - это строка агента, сообщаемое клиентом SIP.
Пример: curl -x post -data -raw '{"domain": "bling.babblevoice.com", "user": "1000"}' -h "content -type: application/json" http: // control/reg.
Сгенерировано сервером SIP и отправлено по адресу управления против домена, настроенного с использованием интерфейса каталога. Уведомить сервер управления об отсеих регистрации.
Удалить http://127.0.0.1:9001/reg/bling.babblevoice.com/1003
Пример с использованием curl: curl -x delete -data -raw '{"domain": "bling.babblevoice.com", "user": "1000"}' -h "
Этот интерфейс используется для добавления информации о каталоге на сервер SIP.
Поместите http://127.0.0.1:9000/dir/bling.babblevoice.com
{
"control" : " http://127.0.0.1:9001 " ,
"users" :
[
{
"username" : " 1003 " ,
"secret" : " 1123654789 "
}
]
}Возврат 201 об успехе.
Пример с использованием curl:
curl -X PUT --data-raw '{ "control": "http://127.0.0.1:9001", "users": [ { "username": "1003", "secret": "1123654789"}]}' -H "Content-Type:application/json" http://127.0.0.1/dir/bling.babblevoice.com
Это синонимично с патчем.
Это заменит только пользователя. Когда поместите домен, это заменяет весь объект домена.
Поместите http://127.0.0.1:9000/dir/bling.babblevoice.com/1003
{
"secret" : " 1123654789 "
}curl -x put -data -raw '{"secret": "1123654789"}' -h "Content-Type: Application/json" http://127.0.0.1/dir/bling.babblevoice.com/1003
Возвращает JSON, перечисляя эту запись доменов в каталоге.
Снимите запись в каталоге. Пользователь также может быть указан - /dir/bling.babblevoice.com/1003.
Возвращает количество зарегистрированных клиентов.
Пример:
Получить http://127.0.0.1:9000/reg/bling.babblevoice.com
или фильтровать для конкретного пользователя
Получите http://127.0.0.1:9000/reg/bling.babblevoice.com/1003
Возвращает 200 с телом:
{
"domain" : " bling.babblevoice.com " ,
"count" : 3 ,
"registered" : 1 ,
"users" : {
"1000" : {
"registered" : false
},
"1001" : {
"registered" : false
},
"1003" : {
"registered" : true ,
"outstandingping" : 0 ,
"remote" : {
"host" : " 127.0.0.1 " ,
"port" : 42068 ,
"agent" : " Z 5.2.28 rv2.8.114 "
},
"epochs" : {
"registered" : 1552507958
}
}
}
}Когда запрос на конкретный домен, поля:
Получить http://127.0.0.1:9000/reg/
Возвращает 200 с телом:
{
"count" : 1255
}Это полный подсчет всех регистраций на этом SIP -сервере.
Изовать новый звонок.
curl -x post -data -raw '[{"domain": "bling.babblevoice.com", "to:" "," from ":" "," maxforwards ": 70," callerid ": {" № ":" 123 "," name ":" 123 "," Calmid ": {" Comply ": {" host ":" 127 ". }}] '-H "Content -Type: Application/json" http://127.0.0.1/invite
Параметр управления необязательна. Если в этом есть сервер, который будет получать обновления относительно потока вызовов. Если нет, то будет использоваться по умолчанию в поле «to». Если нет, то обновления не будут отправлены.
Пример: curl -x post -data -raw '{"callid": "", "alertinfo": "somealertinfo"}' -h "content -type: application/json" http: // sip/dir
Если звонок не в состоянии звонка или ответа, он отправит 180 звонков вместе с информацией о предупреждении, если отправлено.
Размещение пустого документа создаст новый канал.
Пример: curl -x post -data -raw '{}' -h "content -type: application/json" http: // rtp/
Сервер вернет документ JSON. Включая статистику, касающуюся рабочей нагрузки сервера, чтобы сервер управления мог принимать решения на основе рабочей нагрузки, а также маршрутизации.
Обратите внимание, я включил здесь RFC 4028 для возможной будущей работы.
SIP -сервер может быть запущен с тестовым флагом:
Project-Sip-тест
В файлах испытаний папок также есть и другие тестовые файлы.
Порты по умолчанию для сервера составляют 9000 для веб -сервера и 5060 для SIP -сервера.
Некоторые примечания об использовании Valgrind для тестирования памяти.
valgrind-tool = massif project-rtp--fg
После запуска это создаст файл массива в направлении, на котором вы запускаете Valgrind. т.е. massif.out.3823 Вы можете использовать MS_PRINT, чтобы претендовать на эти Econtents этого файла:
MS_PRINT Massif.out.3823
valgrind-check = yes project-rtp--fg
RegisterClient.xml & .csv.
Которые представляют собой файлы конфигурации, которые будут использоваться с SIPP, которые могут проверить различные сценарии.
SIPP 127.0.0.1:9997 -SF RegisterClient.xml -Inf registClient.csv -m 1 -l 1 -trace_msg -Trace_err
или без файлов журнала.
SIPP 127.0.0.1:9997 -SF RegisterClient.xml -Inf registClient.csv -m 1 -l 1
Для загрузки тестовых данных в SIP -сервер использования
SIPP 127.0.0.1 -SF UAClateOffer.xml -m 1 -l 1
DNF установить CCache @Development-Tools G ++ Boost-Devel ILBC-Devel SpandSp-Devel OpenSsl-Devel Nodejs