Как транслировать частоту сердечных сокращений в реальном времени с помощью WebSockets

Как транслировать частоту сердечных сокращений в реальном времени с помощью WebSockets

22 декабря 2022 г.

Мы разработали API, который позволяет легко передавать данные о частоте сердечных сокращений с носимых устройств и датчиков и понял, что существует очень мало рекомендаций по использованию веб-сокетов, поэтому вот краткое руководство:

Прежде всего, WebSockets — это технология двунаправленного обмена данными в реальном времени между браузер и сервер. Они обеспечивают полнодуплексную связь, то есть сервер и клиент могут одновременно отправлять и получать данные.

WebSockets создаются с использованием протокола WebSocket, который является стандартным протоколом для установления постоянного двунаправленного соединения между веб-клиентом и сервером.

Протокол WebSocket использует протокол HTTP для инициирования соединения, но как только соединение установлено, протокол WebSocket вступает во владение и обеспечивает полнодуплексную связь.

Вот как работают веб-сокеты:

  1. Веб-клиент отправляет HTTP-запрос на сервер, чтобы обновить соединение до соединения WebSocket. Этот запрос включает специальный заголовок Upgrade, указывающий, что клиент хочет использовать протокол WebSocket.
  2. Сервер получает HTTP-запрос и проверяет заголовок Upgrade. Если заголовок Upgrade присутствует и указывает, что клиент хочет использовать протокол WebSocket, сервер отправляет ответ HTTP, который включает заголовок Upgrade, чтобы подтвердить переключение на протокол WebSocket.
  3. После обновления соединения до соединения WebSocket сервер и клиент могут отправлять и получать данные. Это обеспечивает двустороннюю связь между сервером и клиентом в режиме реального времени.
  4. Сервер и клиент могут отправлять и получать данные асинхронно, при этом клиенту не нужно постоянно опрашивать сервер на наличие новых данных. Это обеспечивает эффективную и быструю связь между сервером и клиентом.
  5. Чтобы разорвать соединение WebSocket, либо сервер, либо клиент могут отправить уникальный кадр закрытия, чтобы инициировать закрытие соединения. После закрытия соединения сервер и клиент больше не могут отправлять или получать данные через соединение WebSocket.

Поддержание соединения и установление рукопожатия:

const WebSocket = require("ws")

const WS_CONNECTION = "wss://ws.tryterra.co/connect";

function initWS(token) {
    const socket = new WebSocket(WS_CONNECTION)

    var expectingHeartBeatAck = false

    socket.addEventListener('open', function (event) {
        console.log("Connection Established");
    })

    function heartBeat(){   
        if(!expectingHeartBeatAck){
            var heartBeatPayload = JSON.stringify({
                "op": 0
            })
            socket.send(heartBeatPayload)
            console.log("↑  " + heartBeatPayload)
            expectingHeartBeatAck = true
        }
        else socket.close()
    }

    socket.addEventListener('message', function (event) {
        console.log("↓  " + event.data);
        var message = JSON.parse(event.data)
        if (message["op"] == 2){
            heartBeat()
            setInterval(heartBeat, message["d"]["heartbeat_interval"])
            var payload = JSON.stringify(
                {
                    "op": 3,
                    "d": {
                        "token": token,
                        "type": 1  //0  for user, 1 for developer
                    }
                }
            )
            socket.send(payload)
        }
        if (message["op"] == 1){
            expectingHeartBeatAck = false
        }
    })


    socket.addEventListener('close', function (event) {
        console.log('close');
        console.log(event.reason);
    })


    socket.addEventListener('error', function (event) {
        console.log('error');
        console.log(event);
    })
}

Запуск функции:

initWs(token)

Вот что происходит:

Connection Established
  {"op":2,"d":{"heartbeat_interval":40000}}
  {"op":0}
  {"op":3,"d":{"token":"dGVzdGluZ0VsbGlvdHQ.MU1fASa1nR9EpQWQx67xIN7veTFKFwudaB4HbN4kw9A","type":1}}
  {"op":1}
  {"op":4}
  {"op":0}
  {"op":1}
  {"op":5,"d":{"ts":"2022-06-01T14:47:08.055Z","val":86.0},"uid":"100b370c-d2be-42a2-b757-01fc85c41031","seq":12254,"t":"HEART_RATE"}
  {"op":5,"d":{"ts":"2022-06-01T14:47:08.701Z","val":87.0},"uid":"100b370c-d2be-42a2-b757-01fc85c41031","seq":12255,"t":"HEART_RATE"}
  {"op":5,"d":{"ts":"2022-06-01T14:47:09.698Z","val":86.0},"uid":"100b370c-d2be-42a2-b757-01fc85c41031","seq":12256,"t":"HEART_RATE"}
  {"op":5,"d":{"ts":"2022-06-01T14:47:11.041Z","val":86.0},"uid":"100b370c-d2be-42a2-b757-01fc85c41031","seq":12257,"t":"HEART_RATE"}
  {"op":5,"d":{"ts":"2022-06-01T14:47:12.049Z","val":86.0},"uid":"100b370c-d2be-42a2-b757-01fc85c41031","seq":12258,"t":"HEART_RATE"}

Каждый сервер WebSocket имеет свой протокол и может не придерживаться одного и того же протокола. Однако идея всегда одна и та же: вы инициируете соединение, завершаете рукопожатие и делаете что-то «при сообщении, при открытии и закрытии».


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE