Клиент Python Socket.io останавливается с сообщением «Получен неожиданный пакет типа 1»

Моя цель состоит в том, чтобы иметь связь в режиме реального времени между несколькими 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)

Обновлено: исправлены повторяющиеся имена функций. Никаких изменений в результате.

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

Paandittya 11.03.2019 11:07

@Paandittya, правильно, хорошо замечено. Как вы думаете, это может быть? Пробую сейчас. (Также пробовал с закомментированной строкой sio.connect(), которая также, казалось, продолжала работать...) ОБНОВЛЕНИЕ: получение того же сообщения об ошибке, и сообщение об отключении по-прежнему не печатается после исправления имени функции.

Jorgos 11.03.2019 11:12

Это может показаться тривиальным, но не могли бы вы попробовать ввести time.sleep(0.1) непосредственно перед строкой if GPIO.input(10) == GPIO.HIGH:. Не забудьте import time

Paandittya 11.03.2019 11:56

Ха, кажется, работа работает...! Не могли бы вы объяснить, почему это исправляет это?

Jorgos 11.03.2019 12:30

Python пытается выполнить код в цикле while так быстро, как только может, но, в свою очередь, это может вызвать дополнительную нагрузку на процессор с течением времени и в конечном итоге привести к переполнению памяти. Это должно быть проблемой в вашем случае.

Paandittya 11.03.2019 13:15

@Paandittya Хорошо, спасибо за это!! Означает ли это, что даже сейчас это может вызвать проблему в течение более длительных периодов времени? Индикатор ЦП на малине теперь составляет 0-1%, когда сервер и скрипт Python работают и нажимают кнопки.

Jorgos 11.03.2019 13:30

Нет. Теперь ты в порядке. На самом деле, если вы чувствуете, что можете точно настроить продолжительность сна и проверить, остается ли загрузка процессора в пределах 2-3%.

Paandittya 11.03.2019 21:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
435
0

Другие вопросы по теме