[英]sending a ihex (intel Hex) file over UDP using python Sockets
我正在使用python-2.7處理IPv6和UDP套接字 。 我特別關注IPv6多播 ff02::1
,其中每個本地鏈接地址設備(帶有fe80::
響應來自中央服務器實體的查詢。
我有連接到這些設備的微控制器,它們需要以.ihex
( Intel Hex )形式的程序。 該文件的片段如下:
:103100005542200135D0085A8245381131400031EE
:103110003F4002000F9308249242381120012F8370
:103120009F4F1E390011F8233F4036000F930724AC
我的東西去它的方法是使用struct
,並使用類似功能pack
和unpack
,但我不知道是否發出這樣的ihex文件,該文件是在幾KB的大小就可以解決的目的。
我可以做類似的事情嗎?
#!/usr/bin/env python
from struct import pack, unpack
import socket
. # Create a UDP socket and Bind it..
.
myHexCode = open("Filename.ihex")
dataToSend = struct.pack('Paramaters for packing', myHexCode)
.
. Send data to socket..
什么是包裝參數? (對於十六進制文件,我應該做!
或大或小的Endian >
或<
?)
我不能使用scp
或sftp
因為這兩個協議都可以在TCP上運行並且不支持多播,並且我正在網絡中損耗可能更高的環境中工作( 無線介質 )
另外,是否應按照該查詢的建議將Intel Hex文件轉換為二進制文件,然后打包二進制文件?
將UDP與多播一起使用將文件發送給多個使用者似乎充滿了問題-除非整個文件都適合單個數據包。 UDP數據包可能由於多種原因而被丟棄/丟棄,您已經說過網絡有損。 您需要為每個使用者提供一種跟蹤並通知發件人有關丟包的方法。
話雖如此,這肯定是可行的。 一個想法:構造一個初始數據包,該數據包會多次組播,這之間可能會有隨機的延遲(以確保所有站點都收到它)。 這個初始數據包的意思是“即將發送新節目-預期N個后續記錄數據包”)。
然后發送N個數據包,每個數據包可能兩次。 在每個數據包中放入一個標識序列號,讓消費者跟蹤他們收到的序列號。 延遲一段時間后(或已收到所有數據包時),讓每個消費者用一個狀態數據包回應,說“我得到了所有N個數據包”或“我沒有得到記錄5、98、144和3019”(或任何方案)根據有損情況而適當)。
然后,發件人可以收集這些丟失的記錄ID,然后重新發送這些記錄ID,直到所有使用者都滿意他們已收到整個文件為止。
對於將它們打包到數據報中,我認為發送“ inte hex”還是二進制並不重要。 無論哪種情況,您都希望將其作為字節流發送。 二進制文件會更小,因此需要更少的數據包,但是在發送它們的過程中沒有其他區別。 出於同樣的原因,您選擇的字節順序也不會有所不同。 對於簡單的字節流,根本不需要使用struct
打包它們。 您可以發送它們。
注意:python3區分
bytes
和str
類型,因此您需要以“二進制”模式打開文件,以便在python3中保持正確。
但是,如果如上所述,您最終在每個數據包中發送了一個序列號,則該序列號將需要以某種方式進行格式化。 您可以將數字格式化為ascii字符串,不需要struct.pack
。 或者,如果您將其格式化為二進制格式,則需要選擇打包格式。 傳統上,網絡數據包使用“網絡字節順序”(實際上與big-endian相同),但這只是一個約定。
如果執行此操作,則可以使用以下命令構造每個記錄:
然后,您可以使用以下內容創建有效負載:
payload = struct.pack("!BHH", record_type, record_id, len(record_data))
+ record_data
在這里,我們使用struct.pack
創建一個5字節的字符串, struct.pack
包含“ header”字段(使用網絡字節順序打包),然后簡單地附加已經是字節字符串的record_data。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.