程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python socket使用UDP控制繼電器進行硬件產品循環開關機測試

編輯:Python

  一:說明

在硬件獲取系統測試中,開關機也是一項很重要的測試項目。該項測試可以評估產品的硬件異常開關機下的穩定性。硬件環境搭建參考:搭建網絡產品、物聯網硬件產品自動化開關機測試環境_李夕的博客-CSDN博客

二:用到的工具

        硬件:

                 PC電腦、WIFI繼電器、無線路由器(2.4G)

        軟件:

                 網絡助手、python腳本

二:測試拓撲

三:構思代碼邏輯

1)根據不同的產品進行標識符的判斷,比如網絡產品能ping通表示設備啟動完成,則可以使用ping進行檢測設備啟動情況,檢測OK後進行斷電在上電。

2)斷電在上電的延時選擇分為三種,(1):斷電後經過固定的延時後進行上電。(2)斷電後在延時范圍內隨機一個時間進行上電。(3) :初始一個延時和步進,斷電後延時遞增的方式進行上電。

根據以上判斷就可以開始壘代碼了,環境是使用的python3.6的環境。

import datetime
import socket
import time
import os
import random
count = 1
delay_time = open_time = 0
relay_mac = "xxxxxxxxxxxx"
#程序開始的前奏,去連接UDP以及後續判斷斷開繼電器的標識符(這裡是以ping通DUT為判斷)
def go_start(interface_addr, relay_addr, dut_addr, up_type, relay_num):
global delay_time, count, open_time
#先進行udp本地連接
try:
udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udpSocket.bind(interface_addr)
#異常後退出
except Exception as e:
print("綁定失敗,請檢查本地IP或者查看IP是否被綁定!",e)
exit(-1)
#先進行繼電器操作在運行前先將繼電器打開,命令是固定格式,例如a1xxxxxxxxxx是 a1 + xxxxxxxx
#a1是繼電器的第一路,bcff4d2b66eb是繼電器的mac地址
command = "a" + relay_num + relay_mac
result = relay_control(udpSocket, relay_addr, command)
if result == False:
print("命令發送三次失敗,退出!")
exit(-2)
else:
recv_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
open_time = round(time.time())
print(recv_time,"---->控制繼電器開啟成功。")
#進行業務流程
try:
#進行循環判斷進行ping操作,如果ping不通會一直四循環的ping,不會在對繼電器進行操作
while True:
pingResult = os.popen('ping -n 2 -w 1 %s'%dut_addr).read()
#print(pingResult)
#這裡特指使用的是中文的windows系統,目前還沒有對英文的windows操作系統以及linux系統進行適配
if '請求超時' not in pingResult and '無法訪問目標網' not in pingResult:
#ping通被測設備後進行斷開電源操作
command = "b" + relay_num + relay_mac
result = relay_control(udpSocket, relay_addr, command)
#這裡判斷返回結果是True後則進行斷電操作
if result:
end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
close_time = round(time.time())
time_t = close_time - open_time
print(end_time, "---->ping通被測設備,繼電器斷電成功!測試次數為:%d,"
"啟動到斷電總時間 %s"%(count, time_t))
sec = down_time(up_type)
time.sleep(sec)
count += 1
delay_time = sec
#打開繼電器命令
command = "a" + relay_num + relay_mac
result = relay_control(udpSocket, relay_addr, command)
if result == False:
print("命令發送三次失敗,退出!")
exit(-2)
start_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
open_time = round(time.time())
print(start_time, "---->繼電器開啟成功!本次延時開機時間:%d" % sec)
else:
time.sleep(2)
#pass
udpSocket.close()
except KeyboardInterrupt:
exit(0)
#通過UDP控制數據發送
def relay_control(udpSocket, relay_addr, command):
send_count = 0
while send_count < 3:
try:
#UDP發送目的地址和端口
send_dest_addr = (relay_addr, 8111)
#設置UDP的超時時間
udpSocket.settimeout(2)
"""
UDP的發送和接收,由於網絡等原因,如果發送沒有接收到回復會一直卡在
recvData裡面,這裡是設置了超時時間以及捕獲超時的異常,異常後會進行再次嘗試發送。
超過3次發送都超時則判斷繼電器不在線,退出。
"""
udpSocket.sendto(command.encode('utf-8'), send_dest_addr)
recvData = udpSocket.recvfrom(1024)
return True
except socket.timeout:
send_count += 1
return False
#根據選擇的啟動類型進行篩選,對應是固定延時開機還是隨機或者升序
def down_time(up_type):
global delay_time
#啟動類型選擇1是固定模式,默認是斷電後5s進行通電
if up_type == 1:
sec_t = 5
return sec_t
#啟動類型選擇2是遞增模式,默認是限制最大是3600s。遞增是1s。
elif up_type == 2:
if delay_time > 3600:
delay_time = 0
step = 1
sec_t = delay_time + step
return sec_t
#啟動類型選擇3是隨機模式,默認是每次斷電後延時在在5~15s隨機選擇一個秒數進行斷電操作。
elif up_type == 3:
sec_t = random.randint(5, 15)
return sec_t
else:
print("停止類型設置錯誤,退出!")
exit(-3)
if __name__ == '__main__':
#配置測試電腦的IP和端口,端口是固定
interface_addr = ("xxx.xxx.xxx.xxx",8112)
#控制繼電器的IP地址
relay_addr = "xxx.xxx.xxx.xxx"
#配置被測設備的IP地址
dut_addr = "xxx.xxx.xxx.xxx"
#dut_addr = "127.0.0.1"
#配置選擇關閉後多長時間再次進行開啟 1:固定間隔 2:遞增間隔 3:隨機間隔
up_type = 3
#繼電器使用的線路對應繼電器的1~4路
relay_num = "4"
#程序入口
go_start(interface_addr, relay_addr, dut_addr, up_type, relay_num)

 以上代碼就是在以ping作為判斷標志後進行斷電操作,執行結果如下:


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved