嵌入式主機板有4個arm晶元,有4個裁剪過的arm linux系統,而且要做100個板子的批量公升級,所以需要進行合理的執行緒管理,不拘泥與ui和邏輯分離的開發,要考慮的因素比較多
因為涉及到主機和嵌入式板子的通訊,所以選擇乙個合理的通訊方式是非常有必要的。
telnet
之所以還會用這種不安全的通訊方式,是因為系統的公升級方式有很多種。第一種是通過串列埠(uart)通訊,在uboot模式下進行系統映象的燒寫,第二種是通過乙個ap機(外設主機)進行通訊公升級,第三種是通過網口進行系統的公升級。telnet適用於網口通訊,佔據23埠。如果板載系統處於uboot模式,並想要通過網口進行系統公升級,只能通過telnet實現,因為uboot模式可以將telnet的client端集中進去,而ssh是不行的
import telnetlib(只能進行命令列的傳輸)
serial
串列埠通訊是在板子沒有系統時進行公升級的唯一外部方式。如果是命令列可以直接用serial.write(),如果是包的傳輸,要使用xmodem,ymodem,zmodem這樣的協議進行串列埠包的傳輸,但是傳輸速率不快
import serial(命令列傳輸)
xmodem的方式可以寫成乙個類,git上有,自行參考(包的傳輸)
import serial
ser=serial.serial(
"/dev/ttyusb0"
,9600
,timeout=
0.5)
#使用usb連線序列口
ser=serial.serial(
"/dev/ttyama0"
,9600
,timeout=
0.5)
#使用樹莓派的gpio口連線序列口
ser=serial.serial(1,
9600
,timeout=
0.5)
#winsows系統使用com1口連線序列口
ser=serial.serial(「com1」,
9600
,timeout=
0.5)
#winsows系統使用com1口連線序列口
ser=serial.serial(
"/dev/ttys1"
,9600
,timeout=
0.5)
#linux系統使用com1口連線序列口
ser.
open()
#開啟埠
s = ser.read(10)
#從埠讀10個位元組
ser.write(「hello」)
#向埠些資料
ser.close(
)#關閉埠
data = ser.read(20)
#是讀20個字元
data = ser.readline(
)#是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。
#以下為獲取輸入快取區的資料大小,然後再讀取資料(這是讀取資料的常規操作,必須的乙個步驟)
n = self.serial.in_waiting
if n:
buf = self._serial_read(n)
ssh sftp
網口的安全通訊方式,如果系統處於啟用狀態進行公升級,這是最好的通訊方式。
python的包 paramiko封裝了ssh的功能,paramiko包含兩個核心元件:sshclient和sftpclient。
import paramiko
client = paramiko.sshclient(
)client.set_missing_host_key_policy(paramiko.autoaddpolicy())
client.connect(hostname=
'192.168.1.105'
, port=
22, username=
'root'
, password=
'123456'
)stdin, stdout, stderr = client.exec_command(
'df -h '
)# stdout 為正確輸出,stderr為錯誤輸出,同時是有1個變數有值
print
(stdout.read(
).decode(
'utf-8'))
client.close(
)
tftp
埠號固定為69,tftp是乙個傳輸檔案的簡單協議,它基於udp協議而實現。適合在區域網內進行小檔案的傳輸,如果按照規則配置tftp,會比較麻煩,所以可以直接使用開源的第三包,呼叫api介面就可以了,第三包是tftpy
import tftpy
struct
mcu通過網口進行公升級的時候,這個包是非常重要的。首先通過socket的方式進行主機和mcu板載網口的通訊,而socket.write()和mcu通訊需要的是位元組流(bytes),而python都是字元流,所以需要進行轉換。至於這兩者的區別,可以自行baidu。
logging
logging.basicconfig(
level=logging.debug,
format
='[%(levelname)s] %(asctime)s %(filename)s:%(lineno)d %(message)s'
) logging.info(
"輸出至log檔案"
)
threadingdef
start
(self)
: logging.debug(
'tftp server start on %s'
% self.tftp_root)
self.tftpd_thread = threading.thread(target=self._tftpd_worker)
#_tftpd_worker函式單獨進行
self.tftpd_thread.setdaemon(
true
)#設定為true,則主線程消失,該執行緒也跟著消失
self.tftpd_thread.start(
)#開始工作
return
true
defisalive
(self)
:return self.tftpd_thread.isalive(
)
常用的python包如上,可以先好好學一下各部分的功能,有些git有整合的包,可以直接用 Visual Studio開發工具公升級注意事項
由於前幾年公司開發的系統使用的開發工具版本不統一,現在後期維護公升級在開發人員的電腦上要同時安裝好幾個不同的開發工具,比如vs2008,vs2010,vs2012,甚至還有用vs2003開發的介面之類的程式,這種還在目前的win 7系統上無法安裝,只好安裝在虛擬機器 上了。這樣導致開發人員的電腦安裝...
公升級工具改寫
一,公升級工具重構要解決的問題 在所公升級的產品的每個公升級項只有兩種正常狀態 初始release版本狀態或是下一release版本狀態 的前提下,公升級工具在執行乙個公升級任務前,如果該公升級任務的最終效果已經存在,那麼要保證公升級任務的執行結果不會與之衝突.最終效果已經存在的情況主要有以下幾種情...
公升級Windows Phone 開發環境
令人期盼已久的windows phone 重大更新mango終於出來了,具體的更新可以參考chenkai的windows phone 7 mango 更新發布會session 整理 還等什麼呢,趕緊公升級我們的開發環境吧。我之前的開發環境是win 7 visual studio 2010 ulitm...