Записать произвольные данные POST в сокет с буфером фиксированного размера - PullRequest
0 голосов
/ 15 ноября 2018

Предисловие: приведенный ниже код представляет собой микропайтон и работает на микроконтроллере, вопрос сам по себе, я думаю, независим от платформы и связан с тем, как работают сокеты, что я действительно новичок.

В приложенииЯ отправляю данные из i2c eeprom на сервер, используя сокет.

import usocket

buf = bytearray(64)
#...
socket = usocket.socket(*addrinfo[:3])
socket.connect(addrinfo[-1])
#...
socket.write('{0} /{1} HTTP/1.0\r\n'.format(method, path))
socket.write('Host: {0}\r\n'.format(host))
socket.write(b'Content-Length: {0}\r\n'.format(eeprom.payload_size))
socket.write('\r\n')
#... fill buf with eeprom data...
socket.write(buf)

Это работает для небольших объемов данных.

Проблема в том, что данные могут превышать 64 байта - eeprom составляет 8 Кбайт иТеоретически у меня может возникнуть необходимость отправить их всем - и я хотел бы записать все данные в один и тот же сокет, многократно используя один и тот же буфер.

Я пытался с помощью итератора, отправляется только первый буфер, а затем socket.write теряется

def ipayload(self, buf):
    size = len(buf)
    for memaddr in range(self.__head_pointer, self.__tail_pointer, size):
        self.read_into(memaddr, buf)
        yield min(self.__tail_pointer - memaddr, size)

#...
for c in eeprom.ipayload(buf):
    socket.write(buf)

На стороне сервера я использую PHP и читаю весь поток ввода (я полагаю):

$content_lenght = $_SERVER['CONTENT_LENGTH'];
$input = fopen('php://input', 'rb');
while (!feof($input) && $data = fread($input, 8)){
    $content_lenght -= 8
    //use data
}

Также проверка на $_SERVER['CONTENT_LENGTH'] и $content_lenght показывает, что я всегда получаю 64 байта, поэтому только первый буфер.

Как я могу это сделать?В настоящее время я позволяю python выделять память для новой строки байтов каждый раз, когда я читаю из eeprom, рискуя переполниться в случае отправки 4Kb.

...