Предисловие: приведенный ниже код представляет собой микропайтон и работает на микроконтроллере, вопрос сам по себе, я думаю, независим от платформы и связан с тем, как работают сокеты, что я действительно новичок.
В приложенииЯ отправляю данные из 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.