Я создаю веб-панель управления на RPI, которая отображает данные датчиков в реальном времени, которые в реальном времени записываются в текстовый файл (log.txt). В main.py я извлекаю эти данные в прямом эфире из log.txt и пытаюсь отобразить их с помощью python -socketio . Однако, когда я отображаю данные на странице, js <script>
кажется, что код WebSocket на стороне клиента необходимо перезапускать каждый раз, когда я хочу отобразить новые данные из log.txt. Тем не менее, страница не должна быть перезагружена, чтобы это произошло, если я просто нажму другую кнопку с поддержкой WebSocket, которая отправляет серверную часть console.log
, она отображает новые данные.
Интересно, есть ли способ просто автоматически отображать эти новые данные в реальном времени без каких-либо вмешательств пользователя?
Спасибо!
Код (здесь не все, что нужно для датчика некоторые функции кода только для тестирования):
main.py
from aiohttp import web
import socketio
path = '/home/pi/pysocket/log.txt'
data = open(path,'r')
# data.read()
sio = socketio.AsyncServer(cors_allowed_origins='http://192.168.0.194:8080')
app = web.Application()
sio.attach(app)
async def index(request):
with open('index.html') as f:
return web.Response(text=f.read(), content_type='text/html')
@sio.on('message')
async def print_message(sid, message):
print("Socket ID: " , sid)
print(message)
await sio.emit('message', data.read())
# We bind our aiohttp endpoint to our app
# router
app.router.add_get('/', index)
# We kick off our server
if __name__ == '__main__':
web.run_app(app)
index. html
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<button onClick="sendMsg()">Hit Me</button>
<p id="demo"></p>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script>
const socket = io("http://localhost:8080");
function sendMsg() {
socket.emit("message", "working");
}
var div = document.getElementById("demo");
socket.on("message", function(data){
div.innerHTML += "<p>"+data+"</p>";
});
</script>
</body>
</html>