103 lines
3.2 KiB
JavaScript
103 lines
3.2 KiB
JavaScript
require('dotenv').config();
|
|
const {Express} = require("./core/Express");
|
|
const {promisePostRequest} = require('./core/httpClient')
|
|
const noble = require('@abandonware/noble');
|
|
|
|
const EVENT_TYPE = {
|
|
Heartrate: "HEART_RATE"
|
|
}
|
|
|
|
let discoverableDevices = [];
|
|
let listenablePeripherals = [];
|
|
let listeningPeripherals = [];
|
|
|
|
initBluetooth();
|
|
listenHeartrateEvents();
|
|
|
|
const express = new Express(process.env.PORT_READER, "Reader")
|
|
express.get('/', (_, res) => {
|
|
res.send('Service is alive')
|
|
});
|
|
|
|
express.post('/register', (req, res) => {
|
|
let device = req.body.device;
|
|
let serialNumber = req.body.serialNumber;
|
|
let deviceType = req.body.deviceType;
|
|
|
|
if (device) {
|
|
console.log("New device received: " + device);
|
|
discoverableDevices.push(device);
|
|
let body = {
|
|
token: process.env.API_TOKEN_MANAGER,
|
|
device: device,
|
|
type: deviceType,
|
|
serialNumber: serialNumber,
|
|
creationDatetime: new Date().getTime()
|
|
};
|
|
|
|
promisePostRequest(process.env.INTERNAL_URL_MANAGER_REGISTER_DEVICE, body);
|
|
|
|
res.status(200).send("Successfully registered");
|
|
|
|
} else {
|
|
res.status(403).send("Bad request");
|
|
}
|
|
});
|
|
|
|
async function initBluetooth() {
|
|
noble.on('stateChange', async (state) => {
|
|
if (state === 'poweredOn') {
|
|
await noble.startScanningAsync([], true);
|
|
}
|
|
});
|
|
|
|
noble.on('discover', async (peripheral) => {
|
|
|
|
const isDiscoverable = discoverableDevices.some(device => device === peripheral.id);
|
|
|
|
if (isDiscoverable) {
|
|
listenablePeripherals.push(peripheral);
|
|
discoverableDevices = discoverableDevices.filter(device => device !== peripheral.id && device !== peripheral.address);
|
|
await peripheral.connectAsync();
|
|
console.log('Connected to peripheral:', peripheral.address);
|
|
console.log('Peripheral name:', peripheral.advertisement.localName);
|
|
console.log('Peripheral advertisement data:', peripheral.advertisement);
|
|
}
|
|
});
|
|
}
|
|
|
|
async function listenHeartrateEvents() {
|
|
|
|
setInterval(function () {
|
|
const devicesToListen = listenablePeripherals.filter(item => !listeningPeripherals.includes(item));
|
|
|
|
devicesToListen.every(async peripheral => {
|
|
const {characteristics} = await peripheral.discoverSomeServicesAndCharacteristicsAsync(['180D'], ['2A37']);
|
|
|
|
characteristics.forEach(function (characteristic) {
|
|
characteristic.on('data', function (data, isNotification) {
|
|
|
|
let body = {
|
|
token: process.env.API_TOKEN_MANAGER,
|
|
type: EVENT_TYPE.Heartrate,
|
|
value: parseInt(data.toString('hex'), 16),
|
|
device: peripheral.id,
|
|
creationDatetime: new Date().getTime()
|
|
};
|
|
|
|
promisePostRequest(process.env.INTERNAL_URL_MANAGER_NEW_EVENT, body);
|
|
|
|
});
|
|
|
|
characteristic.subscribe(function (error) {
|
|
// Handle the subscription error
|
|
console.error("Error", error);
|
|
});
|
|
});
|
|
listeningPeripherals.push(peripheral);
|
|
});
|
|
|
|
}, 3000);
|
|
}
|
|
|
|
express.run(); |