#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);
});
Извините, что потратили ваше время, ребята: (