Как автоматически обновлять сокет.ввод-вывод с помощью arduino?

#javascript #express #socket.io #arduino #serial-communication

#javascript #экспресс #socket.io #arduino #последовательная связь

Вопрос:

В настоящее время я работаю над проектом arduino. Был ли arduino связан с сервером NodeJS через serialport, а сервер отправлял данные клиенту через socket.io

У меня уже есть информация, которая будет отображаться в браузере (тег h1 со счетчиком arduino в режиме реального времени).

Проблема в том, что для обновления счетчика мне нужно обновить браузер. Моя цель — убедиться, что эта информация обновляется автоматически. Я просмотрел документацию и не нашел никаких событий для сокета.ввод-вывод, который относится к обновлению.

Вот мой код:

index.js

 const express = require('express');
const app = express();
const http = require('http').createServer(app);
app.use(express.static(__dirname   '/public'));
let expressPort = process.env.PORT || 3000;

// Socket:
const io = require('socket.io')(http);


// Arduino Stuff:
const SerialPort = require('serialport');
const ReadLine = SerialPort.parsers.Readline;
const port = new SerialPort('COM3', { baudRate: 9600 });
const parser = port.pipe(new ReadLine({ delimiter: 'rn' }));

parser.on('data', data => {
    let counter = data;
    console.log(counter);

    io.on('connection', socket => {
        io.emit('arduino', counter);
    });

});

parser.on('error', error => {
    console.log(error);
});

// Express stuff
app.use(express.static(__dirname   '/public'));

app.get('/', (req, res) => {
    res.sendFile(__dirname   '/public/');
});


http.listen(expressPort, () => {
    console.log(`Listening on port: ${expressPort}`);
});
 

index.html

 <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Arduino Stuff</title>
</head>

<body>
    <h1 id="counter"></h1>
    <script src="/socket.io/socket.io.js"></script>
    <script src="app.js" charset="UTF-8"></script>
</body>
 

app.js

 const socket = io();

socket.on('arduino', data => {
    console.log(data);
    const counter = document.getElementById('counter');
    counter.innerHTML = data;
});
 

Заранее большое вам спасибо 🙂

Редактировать:

Я забыл ввести код arduino, но в основном это просто счетчик с dealay:

 int counter = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(  counter, DEC);
  delay(3000);
}
 

Ответ №1:

Ну, я глупый, просто не оборачивайте метод de emit с помощью io.on(‘connection’ …), как такового метода ‘update’ не существует, для достижения этого достаточно метода emit, но, если вы вставите его в ‘connection’, ну, этопросто вызывается при первом подключении, следовательно, просто отображается информация в обновлении.

Результат:

 parser.on('data', data => {
    let counter = data;
    console.log(counter);

    io.emit('arduino', counter);

});
 

Извините, что потратили ваше время, ребята: (