Смерть факса сильно преувеличена! Twilio Programmable Fax позволяет работать с факсами через REST API, которые уже знакомы разработчикам. Вместо того чтобы загружать стопки бумаги в лоток факса, мы можем отправлять и получать факсы в облаке.
Но что насчёт тех красивых физических факсов? Помните жужжание, мигающие лампочки и минуты ожидания, пока страница напечатается? Вместо того чтобы покупать факс и подключать стационарный телефон (что не так уж и весело), мы можем собрать собственный факс с помощью JavaScript и недорогого оборудования Tessel.
Наш факс должен быть физическим устройством — машиной, которую можно поставить на полку, стол или рядом с копиром. Существует множество микроконтроллеров для интернета вещей, но в этой статье мы будем использовать открытую платформу разработки Tessel 2.
Почему Tessel? Две причины. Во-первых, он работает на JavaScript и поддерживает npm с огромным количеством модулей, которые можно использовать или адаптировать. Во-вторых, это отличная платформа для быстрого прототипирования, поддерживающая Wi-Fi, Ethernet, USB и последовательные порты прямо «из коробки», так что дополнительные модули не нужны.
Вот эта плата. Помимо сетевых возможностей и USB, у неё есть два модульных порта с правой стороны. С небольшой доработкой эти порты можно использовать для отправки факсов. Пока что мы сосредоточимся на приёме факсов.
Помимо Tessel, нам понадобятся следующие аппаратные компоненты:
— термопринтер — без принтера факса не бывает. Я использую AdaFruit Mini Thermal Receipt Printer, но другие принтеры с последовательным портом тоже должны работать с небольшими изменениями в коде;
— блок питания для Tessel и термопринтера. Принтеру требуется отдельный источник питания на 5–9 В и 2 А, так как Tessel не может его запитать. Я использую отдельный блок питания для принтера и USB-зарядку для Tessel;
— много рулонов термобумаги;
— соединительные провода для подключения микрокомпьютера к принтеру.
После того как вы собрали всё оборудование, осталось выполнить три последних подготовительных шага:
— зарегистрируйтесь в Twilio — это можно сделать бесплатно здесь;
— убедитесь, что у вас настроена среда разработки Node.js, включая npm.
Если вы впервые работаете с Tessel, сначала следуйте руководству по установке. Не волнуйтесь, это просто и займёт не больше 15 минут. В руководстве по началу работы есть простое приложение, которое заставляет светодиоды Tessel мигать.
В общих чертах разработка для Tessel выглядит так:
Создайте новый проект Node.js на своём компьютере и добавьте в него строку `const tessel = require(‘tessel’)`. Подключите плату к USB-порту и запускайте JavaScript-файлы из командной строки с помощью:
В фоновом режиме код передаётся в оперативную память Tessel и выполняется.
Возможно, самое сложное для разработчиков ПО и самое простое для экспертов по интернету вещей — это подключение принтера к Tessel. Принтер имеет последовательный интерфейс, а Tessel оснащён модулем UART (Universal Asynchronous Receiver/Transmitter), что является просто причудливым названием последовательного порта.
Последовательная шина состоит всего из двух проводов — один для отправки данных, другой для приёма. Поэтому последовательные устройства должны иметь два контакта: приёмник (RX) и передатчик (TX). В нашей установке мы только отправляем байтовые команды на принтер. Поэтому достаточно подключить TX (передающий контакт) Tessel к RX (принимающему контакту) принтера и соединить общую землю (GND).
Мы не хотим использовать двоичные команды принтера прямо в коде приложения, поэтому в проекте есть небольшая библиотека `Printer.js`, которая преобразует команды, такие как «жирный шрифт», «перевод строки» или «печать», в двоичные команды.
Сначала проверьте, правильно ли подключены провода. Для этого мы используем простое тестовое приложение `tessel-printer-test.js`:
Как видно из кода, с помощью объекта Printer команды преобразуются в байтовые команды и отправляются на последовательный порт.
Разверните и запустите этот код на Tessel, выполнив команду `t2 run tessel-printer-test.js` в командной строке. Если всё работает правильно, принтер должен начать печать.
Теперь Tessel может печатать с помощью термопринтера, но как превратить его в факс? Здесь на помощь приходит Twilio.
Сначала нам нужен номер телефона от Twilio. Номер должен поддерживать факс, поэтому обязательно установите флажок «fax» при поиске номера.
После того как у нас будет номер с поддержкой факса, нужно настроить его для приёма факсов. Для этого мы создадим статический TwiML и разместим его в TwiML Bin. Можно также разместить файл на своём сервере, но использование TwiML Bin избавляет от необходимости управлять и мониторить сервер — всё это сделает Twilio.
Вот всё, что нам нужно: для каждого входящего факса Twilio будет получать наш TwiML, принимать входящий факс с помощью глагола
На данный момент Tessel подключён к принтеру, а номер телефона в Twilio настроен для приёма всех входящих факсов. В следующих шагах мы настроим плату для получения и печати факсов, принятых на Twilio.
Tessel 2 — это быстрая платформа, и мы могли бы напрямую подключить плату к API Twilio, но наличие небольшого скрипта на сервере имеет свои преимущества. Во-первых, нам не нужно управлять учётными данными доступа на Tessel. Кроме того, вместо того чтобы открывать вебхук для Twilio, мы можем периодически опрашивать API Twilio на наличие новых факсов. При такой настройке нам не нужен публичный адрес для сервера, и мы можем разместить его в локальной сети, если захотим.
Давайте пройдёмся по настройке. Мы добавим серверную часть в тот же проект Node.js, который позже будем использовать для Tessel, то есть у нас будет один проект: одна часть будет работать на плате, другая — на (локальном) сервере.
Файл `app.js` в корневой папке проекта содержит весь необходимый серверный код. Мы инициализируем библиотеку-помощник Twilio Node с API-ключами, которые можно создать в консоли Twilio, так как их легко отозвать позже.
Мы устанавливаем API-ключ, секрет и Account SID в качестве переменных окружения. Ещё одно значение, которое нужно установить, — это `process.env.TWILIO_FAX_NUMBER`, то есть номер телефона, который мы настроили ранее.
API Twilio Fax — это RESTful API. К счастью, нам не нужно разбираться с какой-либо факс-специфичной технологией или протоколами: все факсы, отправленные на наш номер, автоматически сохраняются и легко извлекаются. Сначала с помощью библиотеки-помощника мы запрашиваем список факсов за последний час. Затем фильтруем этот список по параметру `direction=incoming` и проверяем, что `status=received`.
Второй маршрут `/images/:id` запрашивается Tessel позже для получения изображения факса из Twilio. Важно отметить, что мы печатаем только первую страницу, но можно расширить код и обрабатывать многостраничные факсы, перебирая список прикреплённых медиафайлов. Twilio предоставляет факс в виде изображения формата TIFF размером с лист Letter (1728×2256 пикселей). Термопринтер, который я использую, может печатать только 384 пикселя в строке, поэтому перед отправкой на принтер нам нужно изменить размер TIFF. Кроме того, мы преобразуем изображение из TIFF в PNG, чтобы упростить отправку данных на принтер. Для этого нам нужно добавить несколько пакетов в проект.
Вот список модулей, которые нам понадобятся на этом этапе:
После изменения размера TIFF и преобразования в PNG изображение передаётся клиенту в виде потока. Теперь мы готовы к окончательной сборке всех частей приложения.
Вот что у нас есть на данный момент. Все входящие факсы принимаются TwiML, который мы разместили на Twilio. Мы создали два сервиса: один запрашивает REST API Twilio и возвращает список факсов, другой возвращает изображения шириной 384 пикселя. На последнем этапе мы программируем Tessel периодически запрашивать наш API и печатать все полученные изображения.
Нам нужно разместить написанный код API. Для этого не требуется входящее подключение из интернета, поэтому пока можно запустить его на своём компьютере.
Чтобы запустить сервер, выполните команду:
Чтобы наш факс был готов к работе, осталось сделать три вещи:
— корпус для устройства;
— подключение Tessel к Wi-Fi;
— постоянная установка кода на устройство.
Корпус я оставлю на другой день, а пока перейдём к подключению Tessel к Wi-Fi, что можно сделать с помощью следующей команды:
Эта команда подключит устройство к локальной сети Wi-Fi и сохранит учётные данные. При следующем запуске оно попытается подключиться автоматически.
Далее установим код на устройство:
Эта команда передаст и сохранит наш код на Tessel. Ранее в этой статье мы использовали команду `run`, которая передаёт код только в оперативную память, а с помощью `push` мы сохраняем его постоянно.
После этого можно отключить USB-кабель от факса — всё готово, осталось только ждать факсов.
Если вы хотите протестировать всю установку и у вас есть доступ к факсу, просто отправьте факс на номер, который мы настроили ранее. Если физического факса нет, можно легко отправить факс с помощью Twilio на свой номер.
Создайте новый файл `send-fax.js` и добавьте в него следующие строки:
Чтобы отправить факс с помощью Twilio, нужно задать три обязательных параметра в REST API: `from` — исходящий идентификатор звонящего (можно использовать тот же номер, который настроен для приёма факсов, или любой другой номер Twilio), `to` — номер факса, который мы настроили ранее, и `mediaUrl` — ссылка на PDF-файл, который Twilio получит и отправит в качестве содержимого факса.
Замените соответствующие параметры, сохраните файл и выполните его, запустив команду:
Подождите немного, и ваш принтер должен начать печатать факс!
Вот и всё. Собрать собственный факс так же просто, как объединить несколько аппаратных компонентов, немного Node.js и щепотку Twilio в крутой хак, который перенесёт вас прямиком в 1987 год!
Есть вопросы по использованию Twilio Fax или создали что-то крутое с его помощью? Напишите мне в комментариях ниже или, что ещё лучше, отправьте факс с комментариями на номер 1 (206) 735-3585.