Моя цель состоит в том, чтобы иметь связь в режиме реального времени между несколькими Raspberry Pi через сервер. Мне нужен сервер для живого доступа к логированию.
Я использую библиотеку python Socket.io из здесь для подключения к серверу NodeJS Express/socket.io. В конце концов я намерен запустить сервер NodeJS на реальном сервере, но в настоящее время я запускаю сервер и клиент на одном Raspberry Pi 3.
Мне удалось наладить связь в обоих направлениях, но после нескольких минут бездействия (этого не происходит, когда есть поток данных) скрипт python зарегистрирует «Получен неожиданный пакет типа 1» и полностью перестанет работать. Я тестировал соединение с обычным html/js-клиентом, где этого не произошло.
Я также использую функцию фоновой задачи, предоставляемую библиотекой python socket.io, для прослушивания нажатий кнопок через контакты Pi GPIO.
Любая идея, что может привести к остановке процесса? Событие «отключение» не срабатывает. Я гуглил сообщение, но пока ничего не нашел, но я также новичок в Python...
Я думаю, это связано с несколькими процессами? Когда я комментирую строку start_background_task(buttons), этого не происходит.
Спасибо!! Я не могу найти слишком много о SocketIO на стороне клиента python...
app.js (узелJS)
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(client) {
console.info('Client connected...');
client.on('button', function(data){
console.info(data);
});
});
server.listen(4200);
клиент.py
import socketio
import RPi.GPIO as GPIO
GPIO.setwarnings(False) # Ignore warning for now
GPIO.setmode(GPIO.BOARD) # Use physical pin numbering
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
sio = socketio.Client()
@sio.on('connect')
def on_connect():
print('connected to server')
@sio.on('disconnect')
def on_disconnect():
print('disconnected from server')
def buttons():
while True:
if GPIO.input(10) == GPIO.HIGH:
print("Button was pushed!")
sio.emit('button', {"pi":1, "button": 1})
if __name__ == '__main__':
sio.connect('http://localhost:4200')
sio.start_background_task(buttons)
Обновлено: исправлены повторяющиеся имена функций. Никаких изменений в результате.
@Paandittya, правильно, хорошо замечено. Как вы думаете, это может быть? Пробую сейчас. (Также пробовал с закомментированной строкой sio.connect(), которая также, казалось, продолжала работать...) ОБНОВЛЕНИЕ: получение того же сообщения об ошибке, и сообщение об отключении по-прежнему не печатается после исправления имени функции.
Это может показаться тривиальным, но не могли бы вы попробовать ввести time.sleep(0.1) непосредственно перед строкой if GPIO.input(10) == GPIO.HIGH:. Не забудьте import time
Ха, кажется, работа работает...! Не могли бы вы объяснить, почему это исправляет это?
Python пытается выполнить код в цикле while так быстро, как только может, но, в свою очередь, это может вызвать дополнительную нагрузку на процессор с течением времени и в конечном итоге привести к переполнению памяти. Это должно быть проблемой в вашем случае.
@Paandittya Хорошо, спасибо за это!! Означает ли это, что даже сейчас это может вызвать проблему в течение более длительных периодов времени? Индикатор ЦП на малине теперь составляет 0-1%, когда сервер и скрипт Python работают и нажимают кнопки.
Нет. Теперь ты в порядке. На самом деле, если вы чувствуете, что можете точно настроить продолжительность сна и проверить, остается ли загрузка процессора в пределах 2-3%.






Откуда 2 функции с одинаковыми именами
on_connect?