一:说明

在硬件获取系统测试中,开关机也是一项很重要的测试项目。该项测试可以评估产品的硬件异常开关机下的稳定性。硬件环境搭建参考:搭建网络产品、物联网硬件产品自动化开关机测试环境_李夕的博客-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_macresult = 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_macresult = 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_timeprint(end_time, "---->ping通被测设备,继电器断电成功!测试次数为:%d,""启动到断电总时间 %s"%(count, time_t))sec = down_time(up_type)time.sleep(sec)count += 1delay_time = sec#打开继电器命令command = "a" + relay_num + relay_macresult = 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)#passudpSocket.close()except KeyboardInterrupt:exit(0)
#通过UDP控制数据发送
def relay_control(udpSocket, relay_addr, command):send_count = 0while 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 Trueexcept socket.timeout:send_count += 1return False
#根据选择的启动类型进行筛选,对应是固定延时开机还是随机或者升序
def down_time(up_type):global delay_time#启动类型选择1是固定模式,默认是断电后5s进行通电if up_type == 1:sec_t = 5return sec_t#启动类型选择2是递增模式,默认是限制最大是3600s。递增是1s。elif up_type == 2:if delay_time > 3600:delay_time = 0step = 1sec_t = delay_time + stepreturn sec_t#启动类型选择3是随机模式,默认是每次断电后延时在在5~15s随机选择一个秒数进行断电操作。elif up_type == 3:sec_t =  random.randint(5, 15)return sec_telse: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作为判断标志后进行断电操作,执行结果如下:

python socket使用UDP控制继电器进行硬件产品循环开关机测试相关推荐

  1. python udp 直播_[Python] socket发送UDP广播实现聊天室功能

    原博文 2018-11-24 12:33 − 一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Wi ...

  2. python socket之udp说明

    UDP方式 UDP 号称无连接传输,全然没有TCP那么复杂,三次握手,错误重传之类的机制都没有,发的只管发,收得只管收,收到没有?不知道,顺序不对怎么办?不管!就是 这样,但是速度就要比TCP高得多了 ...

  3. Socket之UDP客户端【Python】

    下面是其他相关的终端的创建: Socket之TCP服务器[Python] Socket之TCP客户端[Python] Socket之UDP服务器[Python] 在我们编写的4个终端中,UDP客户端的 ...

  4. Socket之UDP服务器【Python】

    下面是其他相关的终端的创建: Socket之TCP服务器[Python] Socket之TCP客户端[Python] Socket之UDP客户端[Python] UDP服务器不需要TCP服务器的那么多 ...

  5. python socket sendto sendall_网络通信 Python Socket UDP Select

    前言 工作中遇到各种各样的网络通信.有MQTT和CoAP这样的物联网应用层协议,也有各种自定义的TCP或UDP协议.使用各种不同的计算机语言和框架开发网络通信,例如Java的Netty框架,C语言原始 ...

  6. python socket udp并发_Python进阶----UDP协议使用socket通信,socketserver模块实现并发

    Python进阶----UDP协议使用socket通信,socketserver模块实现并发 一丶基于UDP协议的socket 实现UDP协议传输数据 代码如下:

  7. python应用系列教程——python使用socket创建udp服务器端和客户端

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用socket创建udp服务器端和客户端. 服务器端为一个时间戳服务器,在接收到客户端发来的数据后,自动回复. 客户端,等待用户 ...

  8. python中socket与UDP使用与通信详解

           网络层的"ip地址"可以唯一标识网络中的主机,而传输层的"协议+端口"可以唯一标识主机中的应用进程(进程).这样利用ip地址+协议+端口就可以标识 ...

  9. python socket udp_python网络-Socket之udp编程(24)

    一.udp简介 udp --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议. udp不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地. udp在 ...

最新文章

  1. CentOS7上编译多版本PHP并同时运行及systemd设置
  2. c++ 三次多项式拟合_非线性回归模型(一)--多项式回归
  3. “雪花”项目:Microsoft探索在.NET中实现手工内存管理
  4. 如何找回由于IO设备错误移动磁盘的文件
  5. Intellij IDEA打开就闪退或关闭
  6. 遍历 HashMap 的 5 种最佳方式,我不信你全知道!
  7. 为何Windows版QuickTime突然寿终正寝?
  8. oracle 数据操作的相关参数
  9. Gradle发布4.7版本,支持Java 10
  10. leetcode567. 字符串的排列
  11. 如何优雅地关闭Kubernetes集群中的Pod
  12. Python ImportError: No module named Image
  13. 软件测试是什么,测试从一个点出发。
  14. Java基础IDEA快捷键
  15. ipv6正则表达式 java_正则表达式,匹配所有有效格式的IPv6地址
  16. 什么是黑盒测试?它的常用方法有哪些?
  17. IBM PureApplication System中的硬件之旅:第二代
  18. hive学习笔记-数据操作
  19. 哈希(哈希表与哈希函数)
  20. TDH添加自定义参数

热门文章

  1. 服务端的网络并发,详细解读网络io与线程进程的关系
  2. 词霸天下---词根254【-ident- 相 同】
  3. 10年大厂程序员是如何高效学习使用redis的丨redis源码分析丨redis存储原理
  4. Python3 矩阵求最简行阶梯矩阵
  5. 暗夜精灵6新电脑装机历史
  6. 探讨防火墙内核监听模式:ISA2006系列之十六
  7. 如何将ASP.NET MVC2项目升级到MVC 3 RC
  8. android application 全局变量 空指针,Android编程之Application设置全局变量及传值用法实例分析...
  9. 邮票的孔怎么做出来的_邮票怎么做防潮工作,防潮柜有用吗【中华古画古物邮票吧】...
  10. webpack 通用模块(每个页面都用到的js)编译