TCPServerClient之嵌入式軟件調試Python3

嵌入式軟件需要測試軟件進行測試

從使用場景中尋找痛點,挖掘場景中的智能硬件需求。嵌入式開發針對實際之問題,提出對應的解決方法。單獨的產品針對應用場景在供電、電磁兼容性以及IP防護等級的要求下,對支持的功能進行梳理,在低成本和短開發週期的要求下,進行原理總圖紙的敲定以及主要芯片器件的選型。
硬件原理確定之後,軟件就可以針對主控芯片以及各個功能子系統編寫對應的驅動級別軟件,這部分作爲嵌入式軟件中相對基礎的部分,在PCBA出來之後就可以進行調試。編寫初始化和簡單獨立的控制邏輯就可以進行調試,作爲驗證原理以及板圖的手段。這部分"測試"不是我們本片要講的測試。
本片要講的測試,主要是針對智能硬件(是將板子裝到外殼裏)在實際的應用場景的測試。首先,冷冰冰的硬件之所以稱爲智能硬件,不是因爲我們能夠驅動一些子系統完成一些功能,或者是將某種協議轉換另一種協議進行透傳,而是是因爲嵌入式軟件針對需求,針對使用場景,完成了一些業務邏輯上的實現以及優化,而這部分軟件,是需要實際的業務使用才得以驗證是否沒有問題,越是深入行業的設備,這部分代碼在總工程的比重越重。其次,有很多功能子系統(諸如射頻),周圍環境對其的影響頗大,需要調整驅動部分的代碼來改變參數適應環境,甚至需要芯片的選型以及硬件的原理來達到要求。
嵌入式軟件的測試軟體不宜太龐大,用java或者c#或者Qt編寫一個針對整個產品線的測試平臺這是可以理解的,但是針對深埋某個業務場景中的智能硬件,就顯得有些臃腫。於是,使用Python這種功能強大且跨平臺的腳本語言,無論應對產品的測試,甚至是產品的功能演示,都能很好的完成。

Ptyhon環境的搭建

這裏專門說一下Python環境的搭建,是因爲這裏邊涉及一個Python2與Python3同時使用的問題。Python2與Python3在很多地方都不太一樣,我以前的大部分測試程序都用的Python2來編寫,但是Python3的庫使用起來更加簡單,所以新的測試程序我就是在用3在寫。
以前的開發用的是VSCode代碼編輯器來寫Python的,下載安裝的是Python2.7。在換3的時候發現了一個專門針對Pyhon的集成開發環境PyCharm,下載以及簡單的使用教程見鏈接: PyCharm。這裏專門說一下針對兩種不同版本解釋器的選擇:點擊File目錄下邊的Settings,選擇左側Project:Python_Project欄中的Project Interpreter,可以切換工程的解釋器,值得一提的是編譯器自帶Python3的解釋器:切換解釋器

TCPServer+Client Python3實現

下面貼的代碼是用Python3寫的TCP服務器以及TCP客戶端的實現代碼,裏邊摻雜了一點業務,都是收到了特定的字節流將業務名稱以及接收的時間打印了出來。詳細的內容見代碼。

import socketserver
import time
from socket import *
import multiprocessing
import struct
import os
import datetime

lhost = '192.168.1.100'
lport = 1008
laddr = (lhost, lport)
lbufsize = 1024




# 將字符串轉化爲16進制數
def str_to_hex(s):
    s = s.split(' ')
    send_buf = b''
    for i in range(len(s)):
        # print(s[i])
        send_buf += struct.pack('B', int(s[i], 16))
    return (send_buf)


# 自定義類來實現服務器通信處理
class MyTCPHandler(socketserver.BaseRequestHandler):
    # 必須寫入handle方法,建立鏈接時會自動執行handle方法
    def handle(self):
        flag = 0;
        t = time.time()
        nnowTime = lambda: int(round(t * 1000))
        while True:
            try:
                data = self.request.recv(1024)
                if not data: break
                nowTime = nnowTime();
                temptime = "%s" % (nowTime);
                # temptime = time.strftime( '%Y-%m-%d-%H-%M-%S', time.localtime( time.time() ) )
                for i in range(len(data)):
                    if (data[i] == 0x02 and data[i + 1] == 0x92):
                        LocalAddr = " %x%x " % (data[i - 2], data[i - 1]);
                        if (data[i + 2] == 0x01):
                            print(temptime + ',Light Up' + LocalAddr)#光電觸發
                        elif (data[i + 2] == 0x00):
                            print(temptime + ',Light Doen' + LocalAddr)#光電移開
                        else:
                            print(temptime + ',Error')

                self.request.send(data.upper())
            except ConnectionResetError:
                break
        self.request.close()

#客戶端進程
def run_proc(name):
    tcpClient = socket(AF_INET, SOCK_STREAM)  # 這裏的參數和UDP不一樣。
    tcpClient.connect(laddr)  # 由於tcp三次握手機制,需要先連接

    ldata = "00 36 0F 02"  # 設置自適應功率
    ldata = str_to_hex(ldata)

    # tcpClient.send(b"\x01\x02\x03\x03")#設置功率
    # tcpClient.send( b"\x01\x02\x03\x04" )#設置功率

    tcpClient.send(ldata)
    DataTime = 0

    while True:

        data = tcpClient.recv(lbufsize)
        # temptime = time.strftime( '%Y-%m-%d-%H-%M-%S', time.localtime( time.time() ) )
        t = time.time()
        nowTime = lambda: int(round(t * 1000))

        int(round(t * 1000))
        for i in range(len(data)):
            if (data[i] == 0x01 and data[i + 1] == 0x02 and data[i + 2] == 0x03):  # 記錄讀到標籤的時間
                DataTimeOn = nowTime();
                formated_str = "%s" % (DataTimeOn);
                print(formated_str + ',Lebal Found')
            elif (data[i] == 0x01 and data[i + 1] == 0x02 and data[i + 2] == 0x04):  # 記錄沒有讀到標籤的時間
                DataTimeOff = nowTime();
                formated_str = "%s" % (DataTimeOff);
                print(formated_str + ',Lebal Not Found')

    tcpClient.close()


if __name__ == '__main__':
    p = multiprocessing.Process(target=run_proc, args=('1',))
    p.start()
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 1234), MyTCPHandler)
    server.serve_forever()  # 鏈接循環
    p.join()

正所謂磨刀不誤砍柴工,這部分的代碼我一個經常不用Python的人查查資料,寫起來也就1個小時左右,如果使用網口助手+execl記錄這些時間,當次數多起來的時候就會體現出這種測試腳本的優勢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章