Статьи

HTML5: удаленно вибрируйте телефон с помощью азбуки Морзе с помощью веб-сокетов и API вибрации


В моих последних двух публикациях в блоге я показал, что вы можете использовать несколько новых 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 (), и статистика наших устройств вибрирует с помощью предоставленного шаблона азбуки Морзе. И это все. Как вы можете видеть из видео в начале этой статьи, теперь мы можем отправлять азбуки Морзе из одного веб-приложения в другое, где они воспроизводятся с помощью функции вибрации устройства.