В моих последних двух публикациях в блоге я показал, что вы можете использовать несколько новых API-интерфейсов, связанных с HTML5 (
webrtc ,
веб-работники ,
ориентация устройства ) прямо из браузера. Пару дней назад я столкнулся с
W3C Vibration API , который на прошлой неделе (8 мая) достиг статуса «Рекомендации кандидата». Этот API позволяет вам, как следует из названия (если у вас нет очень грязного ума), получить доступ к вибрирующим функциям вашего устройства. Или, как указано в спецификации:
«Эта спецификация определяет API, который обеспечивает доступ к механизму вибрации хост-устройства. Вибрация — это форма тактильной обратной связи».
Этот API сам по себе очень прост:
interface Vibration { void vibrate (unsigned long time); void vibrate (unsigned long[] pattern); };
Таким образом, чтобы вибрировать ваше устройство в течение 10 секунд, сделайте следующее
navigator.vibrate(10000);
Если вы хотите вибрировать по определенному шаблону, вы можете снабдить метод вибрации массивом значений. Где каждая четная запись (начинается с 0) вибрирует устройство, а каждая нечетная запись сигнализирует паузу:
navigator.vibrate([1000, 500, 2000]);
Очень прост в использовании, как вы можете видеть. Теперь давайте посмотрим, сможем ли мы создать что-то интересное с этим. Для этого урока мы создадим простое приложение HTML5 (получатель), которое может получать сообщения, закодированные азбукой Морзе, через веб-сокет и «воспроизводить» эти сообщения с помощью функции вибрации устройства. Мы также создадим простую веб-страницу (отправителя), где вы можете ввести сообщения, которые будут отправлены получателю. Обратите внимание, что я протестировал это с последним мобильным браузером Mozilla , и я не смог найти, поддерживает ли какой-либо другой браузер этот API.
На следующем видео показано приложение, которое мы будем собирать (увеличьте громкость, так как мой телефон не шумит …):
В этом видео вы можете увидеть, что мы используем один браузер (мой планшет) для отправки сообщений. Эти сообщения воспроизводятся на втором устройстве (мой мобильный телефон), которое запускает сайт в браузере.
Вибрация при получении сообщения с азбукой Морзе
Первое, что нам нужно сделать, — это вибрировать устройство при получении сообщения с азбукой Морзе. Почти все знают, что такое азбука Морзе. С помощью азбуки Морзе вы можете отправлять слова, закодированные с использованием набора коротких (точка) и более длинных (тире) сигналов. Наиболее известным из них является SOS, который кодируется как «··· — ···». Следующий обзор из Википедии показывает, как это работает более подробно:
Поэтому нам нужно определить тип получаемого нами сообщения и на основе этого сообщения мы вибрируем устройство. Давайте сначала посмотрим на очень простой формат сообщения, который мы определили. Это сообщение гласит «ПРАВИЛА HTML5»:
var morsecode=".... - -- .-.. .....|.-. ..- .-.. . ..."
Мы разделяем каждую букву, используя символ пробела («»), и разделяем каждое слово символом трубы («|»). Оглядываясь на рисунок из Википедии, мы можем теперь преобразовать это в серию вибраций для нашего устройства.
Код | продолжительность |
---|---|
, | Вибрация для 1T, после каждого. мы также делаем паузу для 1T между частями букв |
— | Вибрация для 3T, после каждого — мы также делаем паузу для 1T между частями букв |
«» | Означает паузу 3T |
| | Означает паузу 7T |
Играя со значением T, мы можем получить хороший интервал, который может быть легко обнаружен человеком, получающим сообщение Морзе. Я заметил, что работа со значением от 250 мс до 500 мс работает нормально. Позволяет преобразовать это в JavaScript.
$(document).ready(function() { addListeners(); }); // time per tick is 200 ms var T = 200; function addListeners() { $("#vibrate").click(function() { var morsecode=".... - -- .-.. .....|.-. ..- .-.. . ..."; var toPlay = playMorseCode(morsecode); navigator.mozVibrate(toPlay); }); } function playMorseCode(code) { var arrayToPlay = []; for(i=0; i<code.length ; i++) { var char = code.charAt(i); // we first check if the code we received is a "." if (char == '.') { // add vibrate of 1T arrayToPlay.push(T); } else if (char == '-') { // add vibrate of 3T arrayToPlay.push(3*T); } else if (char == ' ') { // add pause of 3T arrayToPlay.push(3*T); } else if (char == '|') { arrayToPlay.push(7*T); } // we might need to add a spacer if the next character is either a "." or a "-" // and the current char is either a "." or a "-" if (((i + 1) < code.length) && (code.charAt(i) == "." || code.charAt(i) == "-") && (code.charAt(i+1) == "." || code.charAt(i+1) == "-")) { arrayToPlay.push(T); } } return arrayToPlay; }
Приведенный выше код преобразует строку в указанном нами формате в массив, который мы можем передать функции вибрации. В этом примере я привязал функцию к простой кнопке, чтобы упростить тестирование функциональности вибрации. Я использовал следующий HTML для тестирования:
<html> <head> <script type="text/javascript" src="./lib/jquery-1.7.1.3.js"></script> <script type="text/javascript" src="./js/vibration.js"></script> <title>Morse receiver</title> </head> <body> <button id="vibrate">Test Vibrate</button> </body> </html>
Не может быть легче, чем это. Когда вы нажимаете кнопку на устройстве, поддерживающем вибрацию, в браузере, поддерживающем этот API (я тестировал браузер Firefox Mobile Beta на Android).
Это обрабатывает азбуку Морзе в части вибрации. Далее в этой статье мы немного изменим этот код для работы с веб-сокетами, но для быстрой демонстрации вы можете использовать этот код. Далее мы рассмотрим, как мы можем подключить это веб-приложение к другому с помощью веб-сокетов.
Используйте поддержку веб-сокетов Scala и Play для общения
Нам нужно установить канал между получателем азбуки Морзе и отправителем азбуки Морзе. Для этого мы создадим две веб-розетки, которые можно использовать из HTML5 для подключения. Для этого примера я использовал Play Framework 2.0 вместе со Scala. Сначала определите маршруты:
GET /sender controllers.Application.morsesender GET /receiver controllers.Application.morsereceiver
А затем определите действия, которые обрабатывают запросы websocket:
// keeps track of the last receiver var receiverOut : PushEnumerator[String] = null; /** * Receiver doesn't do much. Just register the receiverOut channel * so that it can be used by the sender. */ def morsereceiver = WebSocket.using[String] { request => receiverOut = Enumerator.imperative[String](); val in = Iteratee.foreach[String](content => {}) (in, receiverOut) } /** * The sender just pushes the received content directly to * the output. */ def morsesender = WebSocket.using[String] { request => val out = Enumerator.imperative[String](); val in = Iteratee.foreach[String](content => { if (receiverOut != null) { receiverOut.push(content); } }) (in, out) }
Все очень тривиально (больше информации о websockets и Play можно найти в одной из моих предыдущих статей здесь ). С этими маршрутами и этими действиями все запросы от отправителя Морзе немедленно отправляются получателю Морзе. Теперь, когда у нас есть веб-сокеты, которые мы можем использовать для связи между отправителем и получателем, давайте посмотрим на отправителя.
Азбука Морзе
Отправитель должен просто показать простую текстовую область, где мы можем печатать простым текстом. После нажатия на кнопку этот текст преобразуется в формат морзе, который мы определили, и отправляется в веб-сокет. Сервер передаст это на приемник, который будет вибрировать телефон. Отправитель, которого мы создаем, выглядит так:
Полный javascript для этого показан здесь:
// variable that holds ws connection var ws = null; // define how morse code is created morjs.defineMode('smartjava', [ '.', '-', '', ' ', '|' ]); $(document).ready(function() { setupMorseSender(); addListeners(); }); function setupMorseSender() { ws = new WebSocket("ws://10.0.0.157:9000/sender"); ws.onopen = function () { console.log("Openened connection to websocket"); } } function addListeners() { $("#send").click(function() { var toSend = $("#morse").val(); var encoded = morjs.encode({message: toSend , mode: 'smartjava'}); ws.send(encoded); }); $("#clear").click(function() { $("#morse").val(""); }); }
Как вы можете видеть в коде, мы конвертируем входной текст в код Морзе из javascript. Для этого я использую библиотеку mor.js. Это библиотека javascript, которая позволяет вам преобразовывать текст в азбуку Морзе, а также позволяет определять способ представления кода Морзе. Так как я хочу представить азбуку Морзе в таком формате: «…. — — .- .. ….. | .-. ..- .- …. …» нам нужно предоставить мор Библиотека .js с форматером. Это делается в предыдущем коде путем вызова функции morjs.defineMode ().
Остальная часть javascript очень проста. Мы используем jquery для добавления функциональности к двум кнопкам. После нажатия кнопки «отправить» мы создаем азбуку Морзе из введенного текста и отправляем его в виде текстового сообщения с помощью веб-сокета, который подключен к простому серверу воспроизведения / scala, работающему с «ws: //10.0.0.157: 9000 / отправитель». Это оборачивает конфигурацию отправителя. Последний шаг, который мы должны сделать, — это изменить наш пример вибрирующего кода для прослушивания веб-сокета, и как только мы получим сообщение, которое выводится через функцию вибрации устройства.
Приемник азбуки Морзе
Мы уже видели большую часть кода для получателя. В этой части я покажу, как подключить приемник к веб-розетке и вызывать функцию вибрации, когда приходит сообщение. Код, который обрабатывает веб-сокеты, показан здесь:
function setupMorseReceiver() { var ws = new WebSocket("ws://10.0.0.157:9000/receiver"); ws.onopen = function () { ws.send("message sent"); } ws.onmessage = function (msg) { ws.send("msg received:" + msg); navigator.mozVibrate(playMorseCode(msg.data)); } }
Не может быть намного проще! Мы подключаемся к веб-сокету, работающему по адресу «ws: //10.0.0.157: 9000 / sender», и, когда мы получаем сообщение, мы напрямую передаем его в функцию playMorseCode (), и статистика наших устройств вибрирует с помощью предоставленного шаблона азбуки Морзе. И это все. Как вы можете видеть из видео в начале этой статьи, теперь мы можем отправлять азбуки Морзе из одного веб-приложения в другое, где они воспроизводятся с помощью функции вибрации устройства.