Вверх ↑
Этот топик читают: Гость
Ответов: 36
Рейтинг: 7
#1: 2024-11-25 18:36:36 ЛС | профиль | цитата
Подскажите кто может позязя.
Нужно переслать бинарник по TCP сокету частями по 4 килобайта.
На питоне это выглядит так:
b_ok = bytes("OK\r\n", 'utf-8')

# Send file over TCP socket in binary chunks of max 4 kBytes.
def send_file(self):
chunkSize = 4096
sizeBytes = os.path.getsize(self.binFilePath)
totalNofChunks = (sizeBytes + chunkSize - 1) / chunkSize
with open(self.binFilePath, "rb") as f:
chunkNr = 1
while True:
chunk = f.read(4096)
if chunk:
print("sending part %d of %d (%d bytes)" % (chunkNr, totalNofChunks, len(chunk)))
h = bytes(("!%04x" % (len(chunk) + 5)), 'utf-8') + chunk
result1 = self.send_command(h)
if result1 != b_ok:
return result1
chunkNr = chunkNr + 1
else:
break;
return b"OK\r\n"

def send_command(self, cmd):
totalSent = 0
while totalSent < len(cmd):
sent = self.socket.send(cmd[totalSent:])
if sent == 0:
raise RuntimeError("Socket connection broken TX")
totalSent = totalSent + sent

# print("Sent %d bytes, waiting for response..." % totalSent)

chunks = []
bytesReceived = 0
while 1:
chunk = self.socket.recv(1)
if chunk == b'':
print("RX %d bytes" % bytesReceived)
raise RuntimeError("Socket connection broken RX")
chunks.append(chunk)
bytesReceived = bytesReceived + len(chunk)
if chunk[-1:] == b'\n':
#if bytesReceived > 3:
break
data = b''.join(chunks)
#print("rx data = '%s'" % data)
return data
Знаю что должно быть не сложно, но не знаю как.

Спасибо за помощь!

Редактировалось 4 раз(а), последний 2024-11-25 19:00:02
карма: 0

0
Ответов: 36
Рейтинг: 7
#2: 2024-11-27 10:59:17 ЛС | профиль | цитата
Тогда такой вопрос: как считывать из файла xxx.bin по 4 килобайта в цикле?
карма: 0

0
Ответов: 793
Рейтинг: 168
#3: 2024-11-27 12:40:32 ЛС | профиль | цитата
wasp писал(а):
Нужно переслать бинарник по TCP сокету частями по 4 килобайта.

Если не секрет, почему именно частями по 4 kb?
Просто поделить файл на части недостаточно. Для его сборки нужна дополнительная информация (имя файла, размер файла для проверки, смешение части файла, возможно, контрольную сумму.)
Набросал небольшие схемы, не всё идеально, но для начала пойдёт.

Сервер (запускать первым)

Add(MainForm,11176470,182,217)
{
Left=20
Top=105
Width=380
Height=161
Caption="Receive file"
Position=1
Point(onClose)
link(onCreate,37674:doOpen,[])
link(onClose,37674:doClose,[])
}
Add(TCP_Server,37674,245,231)
{
Port=130
DataType=3
Point(onError)
Point(onProgress)
link(onRead,12923094:doSeparateMT,[])
link(onConnect,10294395:doOn,[(284,244)(284,307)])
link(onDisconnect,10294395:doOff,[(298,251)(298,300)])
}
Add(StreamUnPack,5706248,357,231)
{
DataCount=#8:FileName|8:Filepart|8:PartSize|8:FileSize|8:Position|
link(onUnPack,16532332:doEvent1,[])
}
Add(MT_MultiData,12923094,308,231)
{
Count=1
link(onData1,5706248:doUnPack,[])
}
Add(LED,10294395,308,287)
{
Left=315
Top=85
}
Add(FileStream,4065350,546,231)
{
Mode=1
Point(doCopyFromStream)
Point(doPosition)
link(FileName,5706248:FileName,[(552,208)(468,208)(468,278)(363,278)])
}
Add(Hub,16532332,420,231)
{
OutCount=4
link(onEvent1,4065350:doOpen,[])
link(onEvent2,15520801:doData,[(473,244)(473,258)])
link(onEvent3,15675089:doCopy,[(445,251)(445,342)])
link(onEvent4,4065350:doClose,[(452,258)(452,251)(480,251)(480,244)])
}
Add(StreamCopy,15675089,546,336)
{
link(Dest,4065350:Stream,[])
link(Source,5706248:Filepart,[(559,327)(370,327)])
link(Count,5706248:PartSize,[(566,320)(377,320)])
}
Add(DoData,15520801,497,252)
{
link(onEventData,4065350:doPosition,[])
link(Data,5706248:Position,[(503,222)(412,222)(412,271)(391,271)])
}

Клиент (запустить и перетащить на форму файл для отправки).

Add(FileStream,16236154,273,98)
{
link(onLoad,9790843:doFor,[])
}
Add(StreamCopy,9519870,147,280)
{
Count=4096
link(onCopy,8314133:doPack,[])
link(Dest,7365015:Var2,[])
link(Source,16236154:Stream,[(160,138)(279,138)])
}
Add(MemoryStream,13204596,147,210)
{
}
Add(DropFile,6373852,133,98)
{
link(onDropFile,1668532:doValue,[])
}
Add(For,9790843,336,98)
{
Step=4096
link(onEvent,15192085:doEvent1,[(375,104)(375,83)(88,83)(88,272)])
link(End,10049041:Var3,[(349,89)(328,89)(328,145)])
}
Add(Memory,1668532,182,98)
{
link(onData,10733663:doEvent1,[])
}
Add(WinTools,7758873,581,126)
{
link(Handle,11176470:Handle,[])
}
Add(Hub,250598,637,70)
{
link(onEvent1,52372:doOpen,[(690,76)(690,90)])
link(onEvent2,7758873:doPopup,[(662,83)(662,111)(571,111)(571,139)])
}
Add(MainForm,11176470,581,70)
{
Left=20
Top=105
Width=377
Height=134
Caption="Send file"
Position=1
Point(onClose)
Point(Handle)
link(onCreate,250598:doEvent1,[(627,90)(627,76)])
link(onClose,52372:doClose,[])
}
Add(TCP_Client,52372,700,84)
{
Port=130
IP="127.0.0.1"
DataType=3
Point(onError)
Point(onProgress)
link(onConnect,10294395:doOn,[(739,97)(739,111)])
link(onDisconnect,10294395:doOff,[])
}
Add(StreamPack,8314133,259,280)
{
DataCount=#8:FileName|8:Filepart|8:PartSize|8:FileSize|8:Position|
link(onPack,52372:doSend,[(669,286)(669,104)])
link(FileName,2362305:GetData,[(265,246)(244,246)])
link(Filepart,7365015:Var3,[(272,257)])
link(FileSize,10049041:Var2,[])
link(Position,720744:Value,[])
}
Add(GetDataEx,10049041,280,140)
{
link(Data,16236154:Size,[])
}
Add(FilePartElm,15176478,182,168)
{
link(onPart,2362305:doData,[])
link(FileName,1668532:Value,[])
}
Add(EventFromData,2362305,238,168)
{
link(onEvent,15176478:doPart,[(277,174)(277,160)(172,160)(172,174)])
}
Add(Hub,15192085,98,266)
{
OutCount=3
link(onEvent1,720744:doValue,[(277,272)(277,216)])
link(onEvent2,13204596:doClear,[(123,279)(123,223)])
link(onEvent3,9519870:doCopy,[])
}
Add(Memory,720744,287,210)
{
Point(Data)
link(Data,16236154:Position,[])
}
Add(Hub,10733663,238,98)
{
link(onEvent1,16236154:doOpen,[])
link(onEvent2,16236154:doClose,[])
}
Add(GetDataEx,7365015,147,252)
{
link(Data,13204596:Stream,[])
}
Add(Label,12195882,119,357)
{
Left=465
Top=140
Align=5
Font=[MS Sans Serif,12,0,0,1]
Caption="Перетащите на форму файл для отправки"
AutoSize=1
Alignment=2
}
Add(LED,10294395,756,91)
{
Left=320
Top=60
}

карма: 16

0
Ответов: 36
Рейтинг: 7
#4: 2024-11-28 11:32:51 ЛС | профиль | цитата
Спасибо большое! Почему по 4 килобайта? Есть удаленное устройство в котором нужно сделать обновление прошивки. Сервер отсылает ему бинарник по 4кб и тот подтверждает после каждого пакета что получил. Изначально задумывалось это делать скриптом на питоне, но он почемуто с ним не соединяется. Вот решил попробовать на HiAsm, помню что на нем такие вещи просто сделать, но не знаю как.
карма: 0

0
Ответов: 4630
Рейтинг: 749
#5: 2024-11-29 20:31:29 ЛС | профиль | цитата
Модифицированный DataToFile умеет считывать строку указанной длины из файла.
карма: 26

0
Ответов: 315
Рейтинг: 26
#6: 2024-12-06 19:14:31 ЛС | профиль | цитата
Что-то очень странно.
По 4kb и подтверждает?
Первый раз встречаю такое.
Есть обновление, отправляется все как есть и потом сравнивается контрольная сумма.
Результат сравнения верен, происходит прошивка, что-то пошло не так то ответ получим ошибка.
Каждые 4кб проверять сомнительно.
карма: 2
0
Ответов: 36
Рейтинг: 7
#7: 2024-12-09 11:54:51 ЛС | профиль | цитата
Что-то очень странно.
По 4kb и подтверждает?


Ну да, по 4kb. Вот тут описание: https://blog.classycode.com/over-the-air-updating-an-esp32-29f83ebbcca2
Но я уже на QT сделал.
карма: 0

0
7
Сообщение
...
Прикрепленные файлы
(файлы не залиты)