Как транслировать частоту сердечных сокращений в реальном времени с помощью WebSockets
22 декабря 2022 г.Мы разработали API, который позволяет легко передавать данные о частоте сердечных сокращений с носимых устройств и датчиков и понял, что существует очень мало рекомендаций по использованию веб-сокетов, поэтому вот краткое руководство:
Прежде всего, WebSockets — это технология двунаправленного обмена данными в реальном времени между браузер и сервер. Они обеспечивают полнодуплексную связь, то есть сервер и клиент могут одновременно отправлять и получать данные.
WebSockets создаются с использованием протокола WebSocket, который является стандартным протоколом для установления постоянного двунаправленного соединения между веб-клиентом и сервером.
Протокол WebSocket использует протокол HTTP для инициирования соединения, но как только соединение установлено, протокол WebSocket вступает во владение и обеспечивает полнодуплексную связь.
Вот как работают веб-сокеты:
- Веб-клиент отправляет HTTP-запрос на сервер, чтобы обновить соединение до соединения WebSocket. Этот запрос включает специальный заголовок Upgrade, указывающий, что клиент хочет использовать протокол WebSocket.
- Сервер получает HTTP-запрос и проверяет заголовок Upgrade. Если заголовок Upgrade присутствует и указывает, что клиент хочет использовать протокол WebSocket, сервер отправляет ответ HTTP, который включает заголовок Upgrade, чтобы подтвердить переключение на протокол WebSocket.
- После обновления соединения до соединения WebSocket сервер и клиент могут отправлять и получать данные. Это обеспечивает двустороннюю связь между сервером и клиентом в режиме реального времени.
- Сервер и клиент могут отправлять и получать данные асинхронно, при этом клиенту не нужно постоянно опрашивать сервер на наличие новых данных. Это обеспечивает эффективную и быструю связь между сервером и клиентом.
- Чтобы разорвать соединение 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 имеет свой протокол и может не придерживаться одного и того же протокола. Однако идея всегда одна и та же: вы инициируете соединение, завершаете рукопожатие и делаете что-то «при сообщении, при открытии и закрытии».
Оригинал