簡體   English   中英

使用python套接字通過UDP發送ihex(intel Hex)文件

[英]sending a ihex (intel Hex) file over UDP using python Sockets

我正在使用python-2.7處理IPv6和UDP套接字 我特別關注IPv6多播 ff02::1 ,其中每個本地鏈接地址設備(帶有fe80::響應來自中央服務器實體的查詢。

我有連接到這些設備的微控制器,它們需要以.ihexIntel Hex )形式的程序。 該文件的片段如下:

:103100005542200135D0085A8245381131400031EE
:103110003F4002000F9308249242381120012F8370
:103120009F4F1E390011F8233F4036000F930724AC

我的東西去它的方法是使用struct ,並使用類似功能packunpack ,但我不知道是否發出這樣的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 >< ?)

注意

  • 我不能使用scpsftp因為這兩個協議都可以在TCP上運行並且不支持多播,並且我正在網絡中損耗可能更高的環境中工作( 無線介質

  • 另外,是否應按照該查詢的建議將Intel Hex文件轉換為二進制文件,然后打包二進制文件?

將UDP與多播一起使用將文件發送給多個使用者似乎充滿了問題-除非整個文件都適合單個數據包。 UDP數據包可能由於多種原因而被丟棄/丟棄,您已經說過網絡有損。 您需要為每個使用者提供一種跟蹤並通知發件人有關丟包的方法。

話雖如此,這肯定是可行的。 一個想法:構造一個初始數據包,該數據包會多次組播,這之間可能會有隨機的延遲(以確保所有站點都收到它)。 這個初始數據包的意思是“即將發送新節目-預期N個后續記錄數據包”)。

然后發送N個數據包,每個數據包可能兩次。 在每個數據包中放入一個標識序列號,讓消費者跟蹤他們收到的序列號。 延遲一段時間后(或已收到所有數據包時),讓每個消費者用一個狀態數據包回應,說“我得到了所有N個數據包”或“我沒有得到記錄5、98、144和3019”(或任何方案)根據有損情況而適當)。

然后,發件人可以收集這些丟失的記錄ID,然后重新發送這些記錄ID,直到所有使用者都滿意他們已收到整個文件為止。

對於將它們打包到數據報中,我認為發送“ inte hex”還是二進制並不重要。 無論哪種情況,您都希望將其作為字節流發送。 二進制文件會更小,因此需要更少的數據包,但是在發送它們的過程中沒有其他區別。 出於同樣的原因,您選擇的字節順序也不會有所不同。 對於簡單的字節流,根本不需要使用struct打包它們。 您可以發送它們。

注意:python3區分bytesstr類型,因此您需要以“二進制”模式打開文件,以便在python3中保持正確。

但是,如果如上所述,您最終在每個數據包中發送了一個序列號,則該序列號將需要以某種方式進行格式化。 您可以將數字格式化為ascii字符串,不需要struct.pack 或者,如果您將其格式化為二進制格式,則需要選擇打包格式。 傳統上,網絡數據包使用“網絡字節順序”(實際上與big-endian相同),但這只是一個約定。

如果執行此操作,則可以使用以下命令構造每個記錄:

  • 記錄類型(二進制,一個字節-區分這是一個數據包)
  • 記錄ID(二進制,兩個字節-序列號[或更大,取決於文件的大小])
  • 記錄數據長度(二進制,兩個字節表示記錄數據字段的長度)
  • 記錄數據(二進制,N字節)

然后,您可以使用以下內容創建有效負載:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM