У меня есть стационарный телефон от Укртелекома. И все бы хорошо, если бы не воровали телефонный кабель. И вот оставшись очередной раз без городской связи, я решил заняться поиском альтернатив. Интернет у меня идет по оптике. Узнав что Укртелеком предоставляет услуги SIP телефонии я уже обрадовался решению проблемы малой кровью. Однако оказалось, что номер при этом у меня изменится. А ведь старый номер это единственное, что меня останавливало от ухода с Укртелекома. Ну раз потери номера мне было не избежать, тогда я решил более плотно заняться вопросом обеспечения себя связью.

Сразу первой же альтернативой видится трубка CDMA, однако у меня в доме 6 трубок заведенные по 3 трубки на 2 базы (4 трубки в доме, 1 в летней кухне, 1 в гараже), это очень удобно, когда телефонная трубка всегда под рукой и не приходится носить ее с собою. Про CDMA терминал Huawei-1201 я тогда не знал, а если бы знал, тогда бы не было сейчас этой статьи. По этому я видел свое решение в мире SIP телефонии.

Выяснил, что для того чтобы подключить аналоговые телефоны к SIP-линии, необходим VOIP шлюз. Ну а раз телефония будет цифровая, то почему бы и не сделать «пульт управления» к ней?

На тот момент, о SIP телефонии я только читал на Хабре заголовки про Asterisk, пропуская их, думая что:

1) это очень сложно для меня.
2) мне это не пригодится.

В обоих пунктах я ошибался.

Когда-то давно я посмотрел видео Дмитрия Бачило, об установке OpenWrt на роутер TP-Link TL-WR842, где он сообщил, между прочего, что устанавливал Asterisk на подобные устройства. Спасибо Дмитрию за его видео. И когда я выбирал себе роутер, то решил что куплю роутер, на который Дмитрий ставил OpenWRT, чтобы не было потом неожиданностью, что в случае покупки другого роутера, он не поддерживает OpenWRT, плюсом было также то, что в нем был USB порт. Установив почти сразу же после покупки OpenWRT 15.05.1 на роутер и вставив в него USB флешку сделав его таким образом его домашней файлопомойкой. Было это около 10-12 месяцев назад. Скажу честно, с OpenWRT я не имел дело до этого и о многих технологиях я узнал благодаря видео Дмитрия.

Также я находил статьи о прикручивании GSM модемов к Asterisk. Поскольку usb порт в роутере у меня имелся, решил осуществить и эту задачу, правда даже не зная с какой стороны начинать ее решать.

Найдя пошаговое руководство о установке Asterisk 11 на OpenWrt я принялся его выполнять, следуя каждому шагу. Однако в конце меня ждало разочарование, при попытке запуска Asterisk 11 в OpenWRT 15 я видел ошибку Segmentation fault. Первый вопрос который возникнет у незнающего читателя: почему именно Asterisk 11? Потому что именно под эту версию есть пакет chan_dongle, который позволяет прикрутить к Астериску GSM модемы Huawei. Поискав в интернете причину Segmentation fault, я не нашел ничего внятного, кроме как «OpenWRT 15 — плохо, OpenWRT 14 — хорошо». По скольку опыта в этом вопросе не было у меня, пришлось «написанному верить». Установив 14-ю версию OpenWRT я все таки смог установить и запустить Астериск. Но ведь этого мало, его нужно еще настроить. Снова поискав в интернете, наткнулся на такого SIP-провайдера как Zadarma, у которого внутренние номера бесплатные. Для теста самое то! Зарегистрировав два аккаунта я попробовал позвонить с компьютера на смартфон. Звонок прошел. Значит я все параметры настроил правильно. На сайте есть инструкция по подключению к Астериск, однако, там не хватает одной строки, которую нужно прописать в файле sip.conf

register => 111111:password@sip.zadarma.com/111111
где 111111-номер телефона

Прописав настройки номера 101 на своем смартфоне я начал снова названивать с компьютера. Наигравшись и убедившись в жизнеспособности идеи я принялся за поиски VOIP шлюза. Перебрав кучу вариантов на OLX я решил все же заказать шлюз в Китае. Заказав Linksys pap2t, я принялся за поиски подходящего GSM модема, все на той же площадке бесплатных объявлений. Самым распространенным модемом поддерживающим передачу голоса был Huawei e1550, его я и купил. Однако по скольку USB хаба на тот момент у меня не было, я пытался установить OpenWRT на карту памяти вставленную в модем. К сожалению безуспешно. Карта памяти инициализировалась после примонтирования корневой файловой системы. Но я не оставлял попыток это сделать и даже решив попробовать полностью пересобрать OpenWRT из исходников (а вдруг поможет?). Неустанно компилируя по вечерам разные версии OpenWRT я пытался добится загрузки с карты памяти модема, но я добился совсем другого результата. Оказывается Asterisk 11 под OpenWRT 15 — работает!!! Если и прошивку и пакет компилировать вместе. Все же сдавшись я приобрел USB хаб, установил OpenWRT на флешку, вставив модем в соседний порт я принялся настраивать chan_dongle. Однако по скольку я уже компилирую прошивку самостоятельно, то и chan_dongle решил собрать из исходников.

В ожидании шлюза из Китая, я решил узнать, что я могу выжать из моей АТС, и первым делом написал на Bash скрипт, который формирует из номера звонящего голосовой файл, и затем при звонке с моего второго номера Zadarma мне проигрывался этот файл и я мог узнать номер последнего звонящего мне человека домой, даже если я находился не дома. Bash скрипт я тоже писал впервые и многое мне было не очевидным. В результате проведя эксперименты, при подключении к медленному каналу интернета и позвонив домой на номер Zadarma многие цифры было не возможно разобрать. Да и Bash скрипт был не лишен ошибок, по этому его я тут выкладывать не буду, скажу лишь, что пока пытался разобраться с вызовом скрипта наткнулся на такую замечательную вещь как AGI. Которая позволяет использовать в качестве обработчика PHP, Perl или CGI сценарии.

Параллельно написанию скриптов я названивал своим друзьям и знакомым через разные софтфоны со смартфона. Маршрут звонка был следующий: SoftFon (разные SIP клиенты) => Asterisk => GSM modem => GSM телефон. И все без исключения мне говорили о ужасном качестве моего голоса, при этом я всех слышал прекрасно. Это подвело меня к тому, что на каждый канал мне пришлось прописать разрешенные кодеки. Попробовав кодек G722, я понял, что мощностей моего роутера явно будет недостаточно для кодирования голоса и работы в качестве основного шлюза моего интернета. По этому для Астериска я решил приобрести отдельный роутер. Однако самыми оптимальными по качеству звука выявились кодеки G711(alaw/ulaw). На них и остановился, хотя качеством своего голоса я был явно недоволен.

Следующим шагом для меня стала детализация звонков, и их запись. Обе эти задачи можно решить внутренними средствами Астериска, 1 — CDR, 2 — MixMonitor. CDR — служит для детализации звонков, и записывать их может от CSV файла до базы данных MySQL, которую я и планировал использовать в качестве БД. Но позже вычитав, что MySQL для роутера будет слишком прожорливая, я сместил свой выбор в пользу SqLite3. Вот так выглядит мой файл cdr_sqlite3_custom.conf

table => cdr

columns => calldate, clid, dcontext, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, amaflags, accountcode, uniqueid, userfield, call_num, dist

values => '${CDR(start)}','${CDR(clid)}','${CDR(dcontext)}','${CDR(channel)}','${CDR(dstchannel)}','${CDR(lastapp)}','${CDR(lastdata)}','${CDR(duration)}','${CDR(billsec)}','${CDR(disposition)}','${CDR(amaflags)}','${CDR(accountcode)}','${CDR(uniqueid)}','${CDR(userfield)}','${CDR(call_num)}','${CDR(dist)}'

А обернув вызов в MixMonitor я делаю запись звонка, но запись идет в wav файл, а этот формат любит много места, по этому я установил пакет lame и после записи, я конвертирую файл в mp3.

Тем временем мне уже приехал мой Linksys pap2t и я уже мог подключить вместо смартфона для теста обычный стационарный телефон. И каково же было мое удивление, когда при звонке через этот шлюз, пропала проблема с качеством исходящего голоса. Т.е. меня уже слышали также хорошо, как и я слышал собеседника.

В поисках роутера который будет выделен только под АТС (искать решил на Али), мой выбор пал на OYE-0001, потому как в нем уже имелся встроенный кард ридер для карточек MicroSD и OpenWRT стояла из коробки. Сделав заказ снова сел за написание скриптов. Пока писал скрипты, выяснилось, что модем Huawei E1550 имеют свойство уходит в астрал, и помогает от этого только полный сброс по питанию. Т.е. вытаскивание и установка модема обратно. (Забегая вперед скажу, эта проблема у меня пока так и не решена, хотя предполагаемое решение имеется.)

Получив китайский роутер снова начал пытаться установить прошивку на внешний носитель, но на этот раз на карту памяти, вставленную в кард-ридер. На стоковой прошивке у меня получилось это сделать, однако на ней не работали необходимые мне пакеты из репозитория OpenWRT. По этому попытался снова скомпилировать прошивку самостоятельно. Пробовал собирать именно 15-ю версию. Но перепробовав разные преднастройки от подобных роутеров, на процессоре MT7620, у меня постоянно что-то, да не работало так как надо. Но поскольку опыта мало, то и решить проблему я не мог. Однако выяснилось, что 16-я (trunk, тестовая) версия OpenWRT поддерживает мой роутер из коробки и на сайте есть даже прошивка, которую я поспешил загрузить. И в данной прошивке мне удалось сделать все что я задумывал, т.е. установить OpenWRT на карту памяти, настроить сеть и установить нужные мне пакеты. Если кто будет ставить себе 16, транковую, версию OpenWRT, в ней отсутствует пакет Luci. Т.е. графический Web-интерфейс. И настройки сети необходимо будет вносить через консоль в файл /etc/config/network.

Заключительный этап — подключение городского номера.

В качестве провайдера для городского номера я выбрал себе Интертелеком. Это CDMA оператор, который предоставляет услуги SIP телефонии. Я себе видел свою домашнюю АТС следующим образом: 2-GSM модема и SIP канал от Интертелекома, т.к. chan_dongle не умел работать с CDMA модемами. Но снова собирая информацию я наткнулся на chan_cdma. Эта библиотека позволяет работать с CDMA модемом ZTE AC8710. Спасибо огромное Олегу Жабко, за написание модуля для работы с этим модемом. Но она написана под Астериск 1.8, а у меня использовался 11. Далее среди объявлений я наткнулся на модем ZTE AC8700 (он внешне 1 в 1 АС8710), за 35 грн. (это шара). По этому решил вложится в этот эксперимент и приобрел данный модем. Позже выяснил, что chan_cdma написан на основе chan_dongle. По этому для того, чтобы заставить работать модем под 11 Астериск, потребуется нудная копипаста кода с одного проекта в другой. Но проделав тщательнейшую копипасту, перенося в проект chan_dongle только участки отвечающие за работу с CDMA, но особо в смысл кода я не вникал. Завести работать модем и позвонить оператору мне увы не удалось. Тогда пришлось приложить усилий и все же начал вникать в код постоянно вставляя отладочные сообщения. Начал замечать, что в коде есть места проверки данных, которые закоментированы, а вместо них вставлены заглушки «if(1) {...}». Тогда я подобрался к коду который отвечает за проверку регистрации в сети и тоже его также «заглушил». И «о чудо!», я смог сделать вызов оператору, но поскольку назначения данных проверок я не знаю, то я лишь добавил в «пропускающие» число которое возвращал мой модем.



С библиотекой chan_cdma я мучался около 2-х недель, и за это время как раз наткнулся на CDMA терминал Huawei-1201 и поскольку в оптимистичный финал с модемом я не верил. Тогда я решил точно не зависеть от проводов, оптический кабель тоже ведь могут украсть. По этому решил организовать «план Б». Приобрести Voip шлюз с FXO портом, приобрести Huawei-1201, посадить на этот порт терминал и это все будет идти через мой Астериск сервер. Снова посмотрел объявления на сайте я наткнулся на TP-Link TD-VG3631. Почитав в интернете описания, я понял, что это именно то, что мне нужно. 2FXS порта и 1 FXO. Да еще и в моем городе продается, я незамедлительно решил купить. Но после покупки, покопавшись в настройках я был сильно разочарован. Т.к. во-первых звонить на «FXO» можно было только со внутренних телефонов, а во вторых, для этого нужно было использовать «префикс». А это уже «костыль» в моей системе, т.к. тогда звонок будет идти в обход моей АТС и не все дома запомнят, что для звонка «теперь нужно набирать дополнительные цифры». По этому до покупки терминала дело так и не дошло. Еще одним разочарованием стало то, что Tp-Link TD-VG3631 не признавал SIP номера, короче 3-х цифр. До этого мои внутренние номера были 11 и 22 соответственно. К тому моменту мне уже отремонтировали линию Укртелекома и по этому пока я решил оставить Tp-Link TD-VG3631, благо входящий вызов на FXO порт он мог перенаправлять на SIP номер.

К тому моменту у меня уже сформировался AGI скрипт обработки входящих звонков, алгоритм его работы был следующий. Если номер звонит впервые, тогда проверяем пропускаем звонок в любом случае и записываем номер в телефонную книгу, если же этот номер есть у нас в телефонной книге и он не в черном списке — пропускаем звонок, иначе сбрасываем. Файл БД телефонной книги решил разместить там же где и находится файл детализации звонков в /var/log/asterisk. Но тут снова ждало разочарование. После перезагрузки эта папка очищается. Пришлось в исходниках Астериска в файле cdr_sqlite3_custom.c изменить путь к расположению файла master.db на /www/. Также скажу, что пакет res_agi.ipk из коробки не работает и для работы требует res_speech.so. Тут я попробовал вручную подсунуть этот файл из папки сборки OpenWRT в каталог /var/lib/asterisk/modules и все заработало.

Следующим изменением файла обработки входящих звонков, номер проверялся и если он соответствовал моему второму задармашнему номеру, тогда первым делом на него высылался список из последних 5 входящих, с временем когда они звонили, а лишь затем шел звонок на внутренние номера. Вот собственно сам код.

in.php
#!/usr/bin/php-cgi -q
<?php

class MyDB extends SQLite3
{
    function __construct($filename)
    {		
		$this->path = "/www/";
		$this->filename = $filename;
		
		if(!file_exists($this->path.$filename) && $filename == 'phonebook.db'){
			$this->create_phonebook_db();
		}else{		
			$this->open($this->path.$filename);
		}
    }
    
    public function doit($sql)
    {
		$result = $this->query($sql);
    
		 $row = array(); 
		 $i=0;
		 
		 while($res = $result->fetchArray(SQLITE3_ASSOC)){ 
				  $row[$i] = $res;               
				  $i++; 
		 } 
		 
		 return $row;
	}
	
	private function create_phonebook_db()
    {
		$this->open($this->path.'phonebook.db');
		$sql="CREATE TABLE phonebook(
            id INTEGER PRIMARY KEY  AUTOINCREMENT,
            phone_num TEXT,
            name TEXT,
            blacklist INTEGER,
            last_call DATATIME             
        )";	
        $this->query($sql);
        
        $sql="CREATE TABLE sms(
            id INTEGER PRIMARY KEY  AUTOINCREMENT,
            phone_num TEXT,
            sms_text TEXT,            
            sms_time DATATIME             
        )";	
        $this->query($sql);
        
        $sql="CREATE TABLE ussd(
            id INTEGER PRIMARY KEY  AUTOINCREMENT,
            phone_num TEXT,
            sms_text TEXT,            
            sms_time DATATIME             
        )";	
        $this->query($sql);
	}
}

function show_date_from_base($date)
{
	$time = strtotime($date);
	$time+=7200;
	return date('d.m.Y в H:i:s',$time);
}
 
    set_time_limit(0);
    require('phpagi.php'); # специальная библиотека для удобства работы с AGI

    $agi = new AGI();
	$db = new MyDB('phonebook.db');    
    
    $now = date('Y-m-d H:i:s');
    $cid = $agi->request['agi_callerid'];
    
	if(substr($cid,0,1) == "+") $cid = substr($cid,1); //убираем +
	if(strlen($cid) > 10 && substr($cid,0,3) == "380") $cid = substr($cid,2); //заменяем 380ХХ на 0ХХ
	
	$agi->set_variable("CDR(call_num)", $cid);
	
	if($cid == "XXXXXX"){ //Zadarma
		$db_cdr = new MyDB('master.db');
		$sql="select * from cdr where call_num != 'sms_ussd' AND channel NOT LIKE '%ussd%' AND dist = 'in' GROUP BY call_num ORDER BY calldate DESC LIMIT 0,5";
		$calls = $db_cdr->doit($sql);    	
		
		$agi->answer();
		$agi->send_text("_____________\n");
		$agi->send_text("_____________\n");
		for($n = 0; $n < count($calls);$n++){			
			$agi->send_text($calls[$n]['call_num']."\n");
			$agi->send_text("звонил ".show_date_from_base($calls[$n]['calldate'])."\n");
		}
		$agi->wait_for_digit(10000);
		
	}
	
	$sql="select * from phonebook where phone_num = '".$cid."'";
    $book = $db->doit($sql);    
    
    if(count($book) == 0)
    {    
		$agi->exec_dial("SIP/221&SIP/222&SIP/33"); # ну и собственно звонок
		$agi->hangup(); # конец звонка
		if(trim($cid)!=""){
			$sql="insert into phonebook( phone_num, name, blacklist, last_call) VALUES ('".$cid."', '', '0', '".$now."')";
			$db->exec($sql);	
		}	
	}else{
		if($book[0]['blacklist'] == 0)
		{
			$agi->exec_dial("SIP/221&SIP/222&SIP/33"); # ну и собственно звонок
			$agi->hangup(); # конец звонка
			if(trim($cid)!=""){
				$sql="UPDATE phonebook SET last_call = '".$now."' where phone_num = '".$cid."'";
				$db->exec($sql);
			}
		}else{
			$agi->hangup(); # конец звонка
			if(trim($cid)!=""){
				$sql="UPDATE phonebook SET last_call = '".$now."' where phone_num = '".$cid."'";
				$db->exec($sql);
			}
		}		
	}
 
?>


extensions.conf
[globals]

RECDIR=/var/spool/asterisk/monitor
SAVEMP3DIR=/www/light/monitor

[dongle-incoming-sms]

exten => sms,1,Noop(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})} — ${SMS})
exten => sms,n, Set(CDR(call_num)=sms_ussd)
exten => sms,n,AGI(sms.php, ${CALLERID(num)}, ${SMS})
exten => sms,n,Hangup()

[dongle-incoming-ussd]

exten => ussd,1,Noop(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})
exten => ussd,n, Set(CDR(call_num)=sms_ussd)
exten => ussd,n,AGI(ussd.php, ussd, ${USSD})
exten => ussd,n,Hangup()

[all-in]

include => dongle-incoming-sms
include => dongle-incoming-ussd

exten => X., 1, Set(MON_FILE=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H%M)}-${CALLERID(num)}-${CDR(dst)})
exten => _X., 2, Set(CDR(userfield)=${MON_FILE});
exten => _X., 3, Set(CDR(call_num)=${CALLERID(num)})
exten => _X., 4, Set(CDR(dist)=in)
exten => _X., 5, MixMonitor(${MON_FILE}.wav)
exten => _X., 6, AGI(in.php); направлены на внутренний номер
exten => _X., 7, Hangup()
exten => _X., 8, StopMixMonitor()

exten => +X., 1, Set(MON_FILE=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H%M)}-${CALLERID(num)}-${CDR(dst)})
exten => _+X., 2, Set(CDR(userfield)=${MON_FILE});
exten => _+X., 3, Set(CDR(call_num)=${CALLERID(num)})
exten => _+X., 4, Set(CDR(dist)=in)
exten => _+X., 5, MixMonitor(${MON_FILE}.wav)
exten => _+X., 6, AGI(in.php); направлены на внутренний номер
exten => _+X., 7, Hangup()
exten => _+X., 8, StopMixMonitor()

exten => h,1,System(/usr/bin/lame -b 16 -silent ${RECDIR}/${MON_FILE}.wav ${SAVEMP3DIR}/${MON_FILE}.mp3 > /var/log/asterisk/wav_2_mp3.log)
exten => h,n,System(/bin/rm -r ${RECDIR}/${MON_FILE}.wav)

Ну а для вывода статистики, по звонкам набросал на скорую руку Web-интерфейс. Вот так вот он выглядит. И положил его в папку /www/light/.

image

> Ссылка на гитхаб веб интерфейса статистики

> Ссылка на гитхаб chan_dongle с поддержкой CDMA модемов ZTE AC8700/8710.

Makefile для компиляции в последней версии OpenWRT (необходимо заменить родной Makefile в папке /package/feeds/telephony/asterisk-11.x-chan-dongle, все патчи оставить как есть).

Makefile
#
# Copyright © 2013 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

include $(TOPDIR)/rules.mk

PKG_NAME:=asterisk11-chan-dongle
PKG_VERSION:=1.1r35
PKG_REV:=ff0a798b8f73b71af328c53862fd33ec5fe9ce85
PKG_RELEASE:=6

PKG_SOURCE_SUBDIR:=asterisk11-chan-dongle-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
PKG_SOURCE_URL:=https://github.com/superl3n1n/asterisk-chan-cdma-gsm-dongle.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=$(PKG_REV)

PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)

PKG_FIXUP:=autoreconf

PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=COPYRIGHT.txt LICENSE.txt
PKG_MAINTAINER:=Jiri Slachta <jiri@slachta.eu>

include $(INCLUDE_DIR)/package.mk

define Package/asterisk11-chan-dongle
SUBMENU:=Telephony
SECTION:=net
CATEGORY:=Network
URL:=https://code.google.com/p/asterisk-chan-dongle/
DEPENDS:= asterisk11 +libiconv-full +kmod-usb-acm +kmod-usb-serial +kmod-usb-serial-option +libusb-1.0 +usb-modeswitch
TITLE:=Huawei UMTS 3G dongle support
endef

define Package/asterisk11-chan-dongle/description
Asterisk channel driver for Huawei UMTS 3G dongle.
endef

MAKE_ARGS:= \
CC="$(TARGET_CC)" \
LD="$(TARGET_CC)" \
CFLAGS="$(TARGET_CFLAGS) -DASTERISK_VERSION_NUM=110000 -DLOW_MEMORY -D_GNU_SOURCE -D_XOPEN_SOURCE=600 $(TARGET_CPPFLAGS) -I$(STAGING_DIR)/usr/lib/libiconv-full/include -I$(STAGING_DIR)/usr/include/asterisk-11/include -DHAVE_CONFIG_H -I. -fPIC" \
LDFLAGS="$(TARGET_LDFLAGS) -L$(STAGING_DIR)/usr/lib/libiconv-full/lib -liconv" \
DESTDIR="$(PKG_INSTALL_DIR)/usr/lib/asterisk/modules"

CONFIGURE_VARS += \
ac_cv_type_size_t=yes \
ac_cv_type_ssize_t=yes

define Build/Configure
$(call Build/Configure/Default, \
--with-asterisk=$(STAGING_DIR)/usr/include/asterisk-11/include \
$(MAKE_ARGS) \
)
endef

define Build/Compile
mkdir -p $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules
$(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_ARGS) all install
endef

define Package/asterisk11-chan-dongle/conffiles
/etc/asterisk/dongle.conf
endef

define Package/asterisk11-chan-dongle/install
$(INSTALL_DIR) $(1)/etc/asterisk
$(INSTALL_DATA) $(PKG_BUILD_DIR)/etc/dongle.conf $(1)/etc/asterisk/
$(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_dongle.so $(1)/usr/lib/asterisk/modules/
endef

$(eval $(call BuildPackage,asterisk11-chan-dongle))
Поделиться с друзьями
-->

Комментарии (53)


  1. trunov_sasha
    24.12.2016 17:06
    +1

    киньте ссылку на «пошаговое руководство о установке Asterisk 11». )


    1. Superl3n1n
      24.12.2016 17:08

      я делал все этой инструкции.


  1. bravosierrasierra
    24.12.2016 18:33

    Один мой знакомый поставил у себя в компании астериск и связал его через провайдера с обычной телефонной сетью. И вот приходит он как-то в понедельник на работу, а его встречает звонок: «Здравствуйте, когда вы оплатите Ваш счёт на 180000р?». Разбирались недолго: проломили его линукс и стал его астериск шлюзом для телефонии добрых людей. Всё пришлось оплатить.


    1. pwrlnd
      24.12.2016 18:48
      +5

      И к чему это? Если кто-то рукожоп в плане настройки безопасности, то астериск здесь не виноват.


      1. bravosierrasierra
        24.12.2016 19:30
        +2

        это к тому, что когда вы решите развернуть у себя нечто подобное, то стоит посчитать риски и возможно с их учётом будет выгоднее переложить их на сторонний сервис. Человеческий фактор это такая штука, которую трудно просчитать на 100%, особенно в отношении себя.


        1. Superl3n1n
          24.12.2016 19:46

          Ну в моем случае, у меня в качестве исходящих каналов выступают GSM и CDMA модемы, в которых стоят пакеты на предоплате. Из SIP оператора подключен только Zadarma, который внутри своей сети бесплатный. Но даже сторонний сервис не гарантирует 100% надежность, особенно, если украли кабель.


          1. HunterCHE
            26.12.2016 16:54

            Для физических лиц, по крайней мере в бывшем СНГ, существует отдельное регулирование и правоприменительная практика. Ну встрянет человек максимум баксов на 300 в год максимум. Больше теряешь от изобретения способов связи.


        1. pwrlnd
          24.12.2016 19:50
          +4

          Человеческий фактор это такая штука, которую трудно просчитать на 100%, особенно в отношении себя

          С такой логикой лучше никогда не садиться за руль и убрать все ножи из дома. А то человеческий фактор же… По факту дело в безответственном подходе к настройке.


          1. d-stream
            24.12.2016 20:49
            +3

            Именно. Поэтому даже в автошколах начинают не с методов «вваливания боком», а с концепции, что ПДД писаны кровью и приемов оказания первой помощи. К практическим занятиям переходят примерно во второй половине курса…

            Да и родители обычно ножи-вилки размещают на кухне так, чтобы мелкие дети вначале подросли, а потом уже дотягивались -)


      1. d-stream
        24.12.2016 19:40

        Видимо к комментам выше про «инструкцию»


        1. Superl3n1n
          24.12.2016 20:14

          В данной инструкции вопрос безопасности не поднимается, там лишь первая часть инструкции — это перенос OpenWRT на usb флешку, а вторая часть, это установка пакетов необходимых для работы Asterisk 11.


          1. d-stream
            24.12.2016 20:46

            Угу. Со всеми вытекающими последующими достаточно частыми «требуют денег за международные звонки».


            1. Superl3n1n
              24.12.2016 20:51
              +1

              Можете поделиться информацией, как обезопасить себя от подобного взлома и последующих проблем?


              1. d-stream
                24.12.2016 21:02
                +1

                Самое простое — пусть астериск живет за NAT'ом и подключается к сервисам как клиент. Ну а на себя абонентов принимает только внутри локальной сети.

                Для домашнего применения — этого выше крыши, а для 1-2 «внешних» абонентов — можно и потанцевать с l2tp/pptp вариантами подключений.

                p/s/ да: sip и nat — это иногда может оказаться проблемным…


                1. aleksashka
                  25.12.2016 11:34
                  +1

                  Я в итоге закрыл на домашнем астере доступ на 5060 извне, оставив только OpenVPN-порт на сертификатах. Теперь и с NAT'ом не надо воевать, и "левые" товарищи не ломятся на астер.


                  1. d-stream
                    25.12.2016 12:21

                    Тоже вариант.

                    В общем для _домашнего_ применения — он астер должен жить исключительно внутри локальной сети. Тогда можно полностью исключить усилия по мониторингу и устранению свежих уязвимостей.

                    Правда есть нюансик другого плана: когда одна железка выполняет и роль файерволла и атс — ее уязвимость может оказаться фатальной…



    1. rub_ak
      24.12.2016 20:56

      В компании все намного проще, отдельный ip, на него файрвалл (лучше железный) который блочит все кроме сипа с адресов провайдера(даже пинг), или даже pptp до провайдера, чтобы трафик не прослушивали (какое-никакое но шифрование) также с полным блоком всего.

      А вот дома отдельный ip да ещё и железку не каждый может позволить, тут и правду стоит подумать.


      1. alien1900
        26.12.2016 07:19
        +1

        Следуя вашей логике — «железный» межсетевой экран настраивать не нужно, и багов или бэк-доров в его ПО не бывает?


        1. rub_ak
          26.12.2016 10:03

          Я такого не говорил.
          «блочит все кроме сипа с адресов провайдера(даже пинг)» под этим и подразумеваться настройка. Железный я советую из тех соображений что обновлять их обычно проще, не стоит задумываться о том что все сломается, и чем меньше сущностей (служб, приложений и т.д), тем меньше потенциальных дыр.
          Спорить что лучше софтовый или железный firewall я не буду, тут у каждого свое мнение.


          1. alien1900
            26.12.2016 10:31

            А как Вы определяете что такое «железный» а что такое «софтовый»? Вот, например Cisco PIX506E собран на базе обычного процессора от Intel. И ПО которое пишут для «железных» то же бывает с кучей багов, хоть «занастраивайся». За примером далеко ходить не надо. Вроде как ничего лишнего, а дыра космического масштаба. По каким причинам она там появилась — это отдельный разговор.
            Ну в заключение про обновление — здесь то же не все так безоблачно. Некоторые производители так существенно меняют концепцию в ходе разработки, что без переписывания конфига с нуля не стартануть на новом релизе ПО.
            В общем, как ни крути, без головы на плечах ничто не спасет от криво работающего девайса :)


    1. Calc
      25.12.2016 16:03

      Оператор не имеет права предоставлять услуги в минус без согласия клиента.
      Можно было спокойно оспорить в суде.


      1. BigD
        25.12.2016 16:56
        +1

        если договор постоплатный, то может.


  1. reaferon
    24.12.2016 20:53

    если бы не воровали телефонный кабель

    Дикость какая! Там же меди на копейки, или я ошибаюсь? Просто ко мне в квартиру с лестничной клетки подходит телефонный кабель, в котором медные жилы нужно под микроскопом разглядывать.


    1. EmmGold
      24.12.2016 23:54

      Возможно имеется ввиду «полёвка», там меди существенно больше и сталька есть.
      Либо магистральный кабель, толщиной с руку.


      1. Ugrum
        25.12.2016 11:35

        Я бы скорее понимал «украли кабель» как физическое подключение злодея к чужой абонентской линии (например в подъезде в коробке накинуть провода и некоторое время звонить за чужой счёт).


        1. Superl3n1n
          25.12.2016 14:20

          Нет. Действительно вырезали кабель. Несколько кварталов остались без телефонной связи. Речь идет про частный сектор.


    1. Karpion
      26.12.2016 04:26

      Если украсть достаточно длинный кусок кабеля целиком, то его можно реализовать как кабель, а не как металлолом меди. И я так понимаю — воровали многопарник, а не двужильный кабель, идущий непосредственно к абоненту.


  1. utya
    25.12.2016 12:15

    Извините можно поподробней, я тоже хочу подключить sip номер от укртелеком, поскольку то кабель ломается то связь гавно, то треск то ещё чёто. С сайта я понял, чтобы подключить sip номер надо позвонить со своего домашнего и тебе там продиктуют пароль. Но вот убил ваш коммент, типа номер меняется когда подключаешь sip номер это как? или может мы имеем разные услуги:
    я вот это хочу подключить, взамен так сказать стационарного


    1. Superl3n1n
      25.12.2016 14:14

      Я позвонил на горячую линию и там задавал эти вопросы. Мне сообщили что для SIP выделяется отдельный номер. Если желаете и SIP и проводной номер (текущий), но чтобы все заходило на SIP номер, можно заказать дополнительно услугу переадресации. Но не все линии поддерживают данную услугу, для более детальной информации мне рекомендовали сходить на мою АТС.


  1. Ziptar
    25.12.2016 12:58

    Установить астериск просто, настроить диалпланы тоже относительно просто, а вот заставить работать blf… у меня пока не получается.


    1. brestows
      25.12.2016 14:03

      Да как бы и BLF настроить проблем нет, как для одного Asterisk так и для набора.
      в sip.conf в раздел general добавляете:

      subscribecontext=BLF
      allowsubscribe=yes
      notifyhold=yes
      callcounter=yes
      notifyringing=yes
      


      после чего в extensions.conf пишите:
      [BLF]
      exten => _18xx,hint,SIP/${EXTEN}
      

      где _18xx это маска ваших внутренних звонков, в моем случае это подписка на номера 1800-1899
      После чего делаете:
      asterisk -rx reload
      


      и наблюдаете как телефоны начинаю моргать как навогодняя ёлка :) Если надо передавать события между двумя и более серверами Asterisk то тут можно использовать или jabber (xmpp) или переводить asterisk c sip на pjsip


      1. Ziptar
        25.12.2016 14:06

        Ааа, видимо, мне просто не хватало той части, что в extensions.conf. Благодарю, попробую.


  1. MHEMOHuK
    25.12.2016 19:15

    Укртелеком позволяет сделать переадресацию на свои номера с SIP номеров. А так, спасибо за статью, полезно.


  1. estet
    25.12.2016 21:06

    Прочитал по диагонали. А вы рассматривали связку Siemens Gigaset и внешний SIP провайдер?


    1. Superl3n1n
      25.12.2016 21:26

      До Вашего комментария, я даже не знал существовании такой линейки продуктов. Но моя статья это развернутый ответ на Ваш вопрос, почему я делал выбор в пользу того или иного решения. Признаюсь также, что затраты я тоже старался сделать минимальные.


      1. estet
        25.12.2016 21:42

        Общая стоимость решения это не только стоимость настройки и установки, но и стоимость дальнейшей поддержки. Поэтому спорно получилось ли оно в итоге дешевле.


        1. Superl3n1n
          25.12.2016 22:31

          В статье описан мой личный опыт. Но раз Вы ставите вопрос о экономической целесообразности, то я постараюсь кратко описать сделанные мной затраты, а Вы напишите, стоимость возможной дальнейшей поддержки.
          _______________________________

          Изначально имеются 6 стационарных DECT трубок, заведенные по 3 трубки на базу.

          Финансовые затраты:
          VOIP шлюз Linksys pap2t — 17$ (пока лежит как запасной)
          Роутер OYE-0001 — 26$
          USB hub с доп. питанием (б.у) — 6$ (150 грн.)
          3G GSM модем HUAWEI E1550 (б.у) — 7$ (170 грн.)
          3G GSM модем HUAWEI E1550 (б.у) — 5$ (120 грн.)
          3G CDMA модем ZTE AC8700 (б.у) — 1.5$ (35 грн.)
          Подключение к провайдеру CDMA и прошивка модема — 5$ (130 грн.)
          TP-Link TD-VG3631 (б.у.) — 24$ (650 грн.)
          Итого 91.5$ (растянутые на 3 месяца)
          _______________________________

          Установка и настройка OpenWRT — своими силами — 0$ (также удалось немного больше разобраться в данной ОС)
          Установка и настройка Asterisk — своими силами — 0$ (также удалось немного больше разобраться в SIP телефонии)
          Написание AGI скриптов для упрощения настройки диалплана — своими силами — 0$
          Подключение к SIP провайдеру Zadarma — 0$, абонплата — 0$

          _______________________________

          Что имеем в результате:
          Домашняя телефонная инфраструктура — без изменений (все трубки на своих местах, новые провода тянуть не пришлось)

          В качестве входящих источников звонка 2 GSM оператора (по воздуху), 1 CDMA оператор (по воздуху), старый канал от Укртелеком (пока всем не сообщил свой новый номер, оставил на время), SIP провайдер Zadarma (на случай если потребуется позвонить домой через интернет, также настроил IVR меню с возможность звонить с городского телефона, даже будучи далеко от дома и возможность получить список последних звонивших, а также на него можно сделать переадресацию при необходимости)

          В качестве исходящих источников звонков могут использоваться все перечисленные выше. Но у меня используется только CDMA модем.

          О каких затратах на дальнейшую поддержку идет речь? И может ли Ваше решение предложить тоже самое?


          1. tea
            25.12.2016 22:36
            +1

            Для домашней телефонии, а это кроме всего прочего родственники, разнесенные территорияально на 6 часовых поясов, использую бесплатный аккаунт на pbxes.org. Подлючено несколько sip провайдеров для экономии звонков по разным напрвлениям, подключены родственники, с вязь с которыми теперь стала бесплатной. Все это крутится в облаке. Все, кроме исходящей связи – бесплатно.


          1. estet
            25.12.2016 22:57

            > О каких затратах на дальнейшую поддержку идет речь?

            Я не навязывался вам рассчитывать стоимость поддержки всей этой инфраструктуры. По-моему опыту чем проще дома инфраструктура, тем дешевле она обходится. Поэтому избавился от всех серверов дома и сделал все максимально просто.
            Вы в своих расчетах пишете что настройках обошлась вам в 0$, а мое время небесплатное и я не готов его на такие вещи тратить.

            > И может ли Ваше решение предложить тоже самое?

            Связка Gigaset + МГТС + Zadarma полностью покрывает мои потребности. Чтобы понять, может ли это решение стать для вас альтернативой вам надо самому почитать документацию на Gigaset.
            Я например, считаю IVR излишеством для дома, а переадресацией я никогда не пользуюсь и ни разу от этого не страдал.

            P.S. я тоже когда-то изучал астериск, писал для него dialplan для домашнего применения и хотел купить Linksys PAP2T. Потом понял, что единственное что я хочу от SIP это дешевые звонки. Поэтому всё обошлось покупкой железного SIP телефона для дома и установкой SIP клиента на смартфоне. Спорить что лучше не хочу, каждый делает так как хочет. Просто указал на альтернативу. Как говорится, кто-то любит арбуз, а кто-то свинной хрящик :)


            1. Superl3n1n
              25.12.2016 23:06
              +1

              Вы в своих расчетах пишете что настройках обошлась вам в 0$, а мое время небесплатное и я не готов его на такие вещи тратить.

              Лично для меня этот проект был интересным, а мне нравится тратить время на то, что мне интересно. В любом случае, потраченное время компенсируется приобретенным опытом.


            1. tea
              25.12.2016 23:09

              По поводу IVR — zadarma нынче дает свою pbx бесплатно (для домашних нужд или маленького офиса), в ней легко реализуются простые меню и приветствия.


    1. tea
      25.12.2016 22:29

      Есть в наличии несколько б/у комплектов C610A IP, состояние 4++. Готов растаться с ними за недорого.


  1. tea
    25.12.2016 23:14

    По поводу подвисающих модемов – сейчас не вспомню где видел, но примцып решения примерно такой: на лнию питания usb ставится ключ, управления ключом завязано на один из светодиодов, светодиоды управляются програмно. Ставится watchdog на доступность модема, если недоступен то посылаем сигнал и перезагружаем можем по питанию. Найду статью – скину ссылку.


    1. tea
      25.12.2016 23:19

      Нашел https://habrahabr.ru/post/184940/


    1. RamonSantiago
      26.12.2016 16:53

      Есть замечательный проект https://github.com/codazoda/hub-ctrl.c
      Позволяет управлять питанием отдельных портов usb на некоторых хабах.
      Я использую d-link dub-h7 при отключении питания на порту остается напряжение около 2х вольт, но для модема этого достаточно.


  1. electronus
    26.12.2016 05:13
    +1

    pap2t выбросьте, и купите Cisco 7940 или 7960. Потом скажите спасибо за качество голоса.
    Чтобы хуавеи не вешались — обеспечьте им нормальные, непросаживаемые 5 вольт. Начните с выкусывания полифьюза в цепи +5В, потом повесьте внутри роутера, возле usb разъема, между +5 и землей парочку танталловых конденсаторов на 220мкФ


    1. electronus
      26.12.2016 05:16
      +1

      ЗЫ. Увидел роутер OYE-0001. Замените в нем блок питания на нечто с 5В и током минимум 2А и с кабелем достаточного сечения. Этот шаг может убрать зависания даже без описанной выше модификации


      1. Markscheider
        26.12.2016 13:22

        Еще дело может быть в деградации электролитических конденсаторов. Как минимум, два случая из моей практики было. Первый — БП от роутера асус (500-я серия, популярная). Сначала выдает честные 5В 2А. Через год начинаются глюки. Помогает либо полная замена БП на что-то жырное и надежное, либо разбор и замена конденсаторов. От жары им там быстро кирдык приходил.
        Второй случай — тоже конденсаторы, но в плазменном ТВ. Прожили они долго, года 4. Потом экран начал моргать и схлопываться. Заменил кондеры — все ОК. Причина та же — жара…


        1. tea
          26.12.2016 17:46

          Давно выкидываю штатные блоки питания на оборудовании которое работает 24/31/12 и ставлю что-то типа
          image


          1. Markscheider
            26.12.2016 18:25

            Это слишком :)
            Зачем выкидывать — из пятивольтовой, например, можно соорудить зарядку для смартфона. И держать на работе в качестве резервной. Пропадет — не жалко…


    1. tea
      26.12.2016 09:39

      А как IP-телефон сможет заменить адаптер с FXO/FXS?


  1. Markscheider
    26.12.2016 12:44

    У меня есть стационарный телефон от Укртелекома. И все бы хорошо, если бы не воровали телефонный кабель.

    У вас медный кабель воруют злоумышленники, а у нас — Ростелеком (МГТС). Повально всех переводят на оптику, почти что насильно ставят в квартире модем. А магистральную медь, как я понимаю, снимают и сдают в утиль. Ну и в пустующих зданиях АТС гостиницы делают.
    По сабжу — пока меня не отключили от меди, на вход использую городскую линию (с минимальным тарифным планом). На выход — VoIP шлюз Audiocodes (самый простой) и бесплатный тариф от одного из операторов. Семья, в основном, мобильными пользуется, так что включенных минут хватает.

    Я бы совсем перешел на VoIP, но телефонный номер менять не хочется. Жаль, что нельзя как с мобильным — отвязал городской номер от МГТС и к VoIP-провайдеру его перенес :(