*В этом посте использовались глаголы TwiML Dial и SIP, а также Twilio Message Rest API*
Если вы уже работали с Twilio, то наверняка не раз слышали тот самый приятный звонок на своём телефоне. Но сегодня мы отправляемся в неизведанные воды — вы узнаете, как заставить телефон звонить, даже если он не подключён к традиционной телефонной сети! Всё, что вам понадобится, — это несколько простых аппаратных компонентов и тот старый стационарный телефон, который годами пылился в шкафу.
Возможно, вы уже видели наши предыдущие уроки на базе Arduino, посвящённые созданию собственного Twilio-робота или автоматизации дома с помощью Twilio SMS, но сегодня мы попробуем что-то новое и воспользуемся удивительным мини-компьютером Raspberry Pi.
Для начала соберём необходимые компоненты. Вам понадобятся Raspberry Pi, устройство Obihai OBi100 и традиционный стационарный телефон. Для Raspberry Pi также потребуются SD-карта (рекомендую 4 ГБ), Ethernet-кабель и кабель питания Micro-USB. Я также советую иметь под рукой USB-клавиатуру, мышь и HDMI-монитор на случай, если не удастся подключиться к Raspberry Pi по SSH.
Когда все компоненты собраны, можно приступать к настройке Raspberry Pi — но пока не включайте его. Прежде чем запускать устройство, необходимо установить операционную систему на SD-карту, которая будет служить жёстким диском для Pi. Обычно используется Raspbian — оптимизированная версия Debian для Raspberry Pi. Однако в нашем случае мы воспользуемся заранее подготовленным образом RasPBX, который уже содержит предустановленные Asterisk и FreePBX.
Процесс установки может быть немного сложным, но я подготовил пошаговую инструкцию для пользователей Mac OS X. Если у вас возникнут трудности или вы используете другую операционную систему, настоятельно рекомендую ознакомиться с этими инструкциями по установке.
**Шаг 1:** Скачайте образ RasPBX здесь. После завершения загрузки распакуйте архив.
**Шаг 2:** Вставьте SD-карту в компьютер и откройте «Дисковую утилиту» (просто введите название в поиске Spotlight). В списке слева вы должны увидеть свою SD-карту. Отформатируйте её в файловой системе FAT. Для этого процесса потребуются права администратора! (Инструкции адаптированы из руководства по лёгкой настройке RPi)
**Шаг 3:** Откройте окно Терминала и введите команду **df -h**, чтобы увидеть список подключённых дисков.
**Шаг 4:** Отмонтируйте диск с помощью команды **sudo diskutil unmount /dev/disk3s1** — замените /dev/disk3s1 на имя файловой системы вашей SD-карты из предыдущего результата.
**Шаг 5:** Определите имя raw-устройства для SD-карты, удалив «s1» и заменив «disk» на «rdisk» (если вы укажете неверное имя устройства, то можете стереть весь жёсткий диск — будьте осторожны!).
Например, на моей системе **/dev/disk3s1** превращается в **/dev/rdisk3**.
Затем выполните следующую команду (заменив /dev/rdisk3 на имя вашего устройства SD-карты, а также указав путь к распакованному файлу raspbx.img). **Убедитесь, что выбрали правильное устройство, иначе можете стереть всю систему!**
sudo dd bs=1m if=/Users/jonmarkgo/Downloads/raspbx-04-11-2012/raspbx-04-11-2012.img of=/dev/rdisk3
Выполнение команды займёт некоторое время, так что можете пока перекусить. Когда вернётесь, вы должны увидеть вывод, похожий на тот, что отображается в моём терминале ниже:
**Шаг 6:** Извлеките SD-карту, введя команду **sudo diskutil eject /dev/rdisk3** (замените rdisk3 на имя вашего устройства SD-карты).
**Шаг 7:** Вставьте её в Raspberry Pi и включите устройство. Также подключите Raspberry Pi к Ethernet-роутеру. Посмотрите на мигающие индикаторы!
Теперь, когда Raspberry Pi загрузился с нашим модифицированным дистрибутивом RasPBX, можно приступать к программной настройке. Первым делом либо подключитесь по SSH к Raspberry Pi, либо используйте клавиатуру, мышь и монитор для открытия окна терминала. На Mac можно использовать команду **ssh root@raspbx.local**, а на Windows — **ssh root@raspbx**. Имя пользователя по умолчанию — **root**, пароль — **raspberry**.
Успешный вход выглядит примерно так:
На этом этапе нужно настроить некоторые базовые параметры Raspberry Pi и узнать его IP-адрес. Чтобы узнать IP-адрес, используйте команду **ifconfig**, а для начала настройки введите **raspi-config**. Здесь доступно множество опций, но пока мы воспользуемся только «expand_rootfs», как показано на следующем изображении. После расширения файловой системы перезагрузите устройство (вам будет предложено это сделать), а затем снова войдите в терминал.
Теперь можно приступать к настройке FreePBX (которая управляет конфигурационными файлами Asterisk). Войдите в FreePBX, открыв в браузере http://raspbx.local/ (или другое имя хоста, которое вы использовали для доступа) и нажав на «FreePBX Administration». Имя пользователя и пароль по умолчанию — **admin**.
Теперь настроим Asterisk для приёма входящих звонков от Twilio и передачи их на OBi100.
**Шаг 1:** Перейдите в раздел Settings->Asterisk SIP Settings и настройте параметры NAT. В моём случае я вручную указал статический и локальный IP-адреса, но вам, возможно, потребуется настроить их иначе в зависимости от конфигурации вашей сети. Обратите внимание, что Raspberry Pi должен быть доступен из интернета через публичный IP-адрес.
В моей конфигурации я просто открыл DMZ в своей сети (примечание: это небезопасная настройка), но вам, возможно, потребуется другой подход в зависимости от конфигурации сети.
Также отключите все кодеки, кроме «ulaw», так как это единственный кодек, который поддерживает Twilio на данный момент.
**Шаг 2:** Перейдите на вкладку Applications и добавьте новое устройство типа «Generic SIP Device» — здесь мы настроим внутренний номер, который Asterisk будет перенаправлять на OBi100 и в конечном итоге на стационарный телефон. Я буду использовать номер внутреннего номера «1337», поэтому введу его в поля User Extension и Display Name.
Затем нужно ввести пароль (называемый «secret») в разделе Device Options. Я выберу не очень надёжный пароль и установлю его как «obihai100». Как ни странно, это всё, что нужно для настройки Asterisk для работы с OBi100.
Теперь просто нажмите «Submit» — мы применим конфигурацию позже.
**Шаг 3:** Далее нужно настроить Asterisk для приёма входящих звонков от Twilio. Для этого потребуется вручную отредактировать файл через терминал, поэтому вернёмся к нему и откроем файл «/etc/asterisk/sip_custom_post.conf» в выбранном редакторе.
Добавим следующую конфигурацию:
Вернёмся в FreePBX и нажмём большую красную кнопку «Apply Config», чтобы сохранить все настройки и перезапустить Asterisk. На этом настройка Raspberry Pi, FreePBX и Asterisk завершена.
Теперь, когда Raspberry Pi полностью настроен, можно завершить настройку устройства OBi100. Подключите его к розетке, стационарному телефону и Ethernet-роутеру с помощью прилагаемых кабелей (спасибо, Obihai!). После полной загрузки откройте панель управления в браузере, перейдя по локальному IP-адресу OBi100. Чтобы узнать этот адрес, мне пришлось войти в панель управления роутером и выяснить, какой IP-адрес был назначен устройству — возможно, вам потребуется немного поэкспериментировать, если вы раньше не пользовались панелью управления роутером.
Когда вы найдёте IP-адрес OBi100 и откроете его в браузере, появится окно аутентификации. Имя пользователя и пароль снова — **admin**. Теперь нужно выполнить несколько настроек.
**Шаг 1:** Перейдите в раздел Voice Services->SP1 Service. Здесь нужно настроить параметры SIP. Ваш AuthUserName — это номер внутреннего номера, который вы настроили в FreePBX (у меня это 1337), а AuthPassword — ваш секрет (у меня это obihai100). Затем просто нажмите Submit, чтобы сохранить изменения.
**Шаг 2:** Перейдите в раздел Service Providers->ITSP Profile A->SIP. Здесь нужно выполнить ещё несколько настроек — необходимо указать OBi100, где находится наш сервер Asterisk. Сначала установите переменную ProxyServer на локальный IP-адрес Raspberry Pi.
Затем активируйте параметр X_SpoofCallerID, чтобы Caller ID корректно передавался от Asterisk.
Снова нажмите Submit, чтобы сохранить изменения, а затем нажмите кнопку Reboot в верхней панели, чтобы перезагрузить OBi100. Теперь всё оборудование настроено, и осталось только настроить номер Twilio, который сможет звонить на нашу новую систему.
Если вы впервые пользуетесь Twilio, рекомендую посмотреть наш видеоролик SMS Quickstart Screencast, который показывает, как впервые купить номер. В противном случае просто купите номер и настройте URL для голоса, указав на новый TwiML-файл, который мы создадим ниже.
В TwiML-файле по этому URL введите следующее:
Основное изменение, которое нужно внести в этот TwiML, — обновить Uri, на который осуществляется звонок. Формат выглядит как @, поэтому в моём примере внутренний номер — 1337, а IP-адрес — 74.66.246.104.
**Обновление:** Мы получили сообщения о том, что некоторые пользователи сталкиваются с проблемами авторизации на основе IP. Можно перенастроить Asterisk для приёма любых входящих соединений без авторизации — это небезопасное решение, но оно подойдёт для временного тестирования системы!
Здесь может потребоваться пояснение. Ранее мы настроили сервер Asterisk так, чтобы он принимал соединения только с трёх определённых IP-адресов — тех, которые принадлежат серверам SIPOut API от Twilio. Из-за особенностей работы конфигурационных файлов Asterisk нам пришлось создать трёх отдельных входящих пользователей, по одному для каждого IP. Здесь мы звоним на все три одновременно, и только один из них будет успешным (в зависимости от того, какой сервер Twilio отправляет запрос на ваш сервер Asterisk).
На этом всё готово. Просто позвоните на свой новый номер Twilio, и ваш стационарный телефон должен зазвонить — **ПОТРЯСАЮЩЕ**!
Теперь выходите и создавайте свой собственный аппаратный телефон Twilio или подключайте Twilio к существующему SIP-серверу с помощью нашей новой функции SIPOut. Удачного хакинга!
Если у вас есть вопросы, отзывы или недовольства, не стесняйтесь писать в Твиттер @jonmarkgo или отправлять письмо на jonmarkgo@twilio.com.