Доброго времени суток уважаемые!
Была у меня задача, передать по одному изображению в секунду с удаленного Raspberry на сервер. Сервер берет картинку и обнаруживает на ней людей, выделяет в квадратик и пересохраняет.
Сначала сделал по HTTP, потом понял что это просто трындец какой-то. Переписал на TCP с Twisted. На сервере Twisted, а на Raspberry простое подключение по TCP (connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)). Вроде сначала проблем небыло, а потом я начал замечать, что у мне на сервере запросы склеиваются и все падает из-за не валидных данных. Сделал некоторые наметки, если я не на правильном пути то сразу скажите, перепишу)
# Ключи
PUSHDATA_COMMAND = bytes('@PUSHDATA', encoding='utf-8')
END = bytes("@END", encoding='utf-8')
class DetectServerProtocol(LineReceiver):
def handle_WORK(self, data=None):
# Сначала я из кусочков делаю стек
self.chunks.append(data)
# Если data заканчивается на END, то считаем что это конец данных
if data.endswith(END):
full_data = b"".join(self.chunks).split(END)[0]
# сейчас у меня такая фигня. Работает, но если данные идут
# друг за другом без интервала
# (например если на Raspberry произошла задержка),
# то получаю склеенные данные,
# а когда заканчивается на END получаю уже не валидные данные.
self.chunks = [] # Очищаю стек
# Если начинается с PUSHDATA_COMMAND, то делаем то и то
if full_data.startswith(PUSHDATA_COMMAND):
pass
Строка может начинаться с любого символа и содержать в себе любые символы в том числе @, но вероятно последовательность "@@" не будет встречаться никогда (но могу и ошибаться). Далее идет блок @PUSHDATA .... @END, это как раз и есть данные. Но иногда мне приходят вот такие строки, будем считать эту строку за test регулярного выражения:
"@PUSHDATA:1234567890:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:timestamp:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:1234567890:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:1234567890:\xcf\x84o\xcf"
Ну надеюсь суть проблемы понятна. Помогите составить регулярное выражение! Я сам убил часов 5 на решение этой задачи. Так и не добившись результата...
Грубо говоря какая бы строка не пришла мне нужно во-первых, понять есть ли в ней целые блоки, во вторых получить эти блоки вместе с ключами или без не так важно.