149 lines
5.3 KiB
Python
149 lines
5.3 KiB
Python
|
import time
|
||
|
import os
|
||
|
import socket
|
||
|
import ssl
|
||
|
|
||
|
from NativeLog import NativeLog
|
||
|
from TCAction import PerformanceTCBase
|
||
|
from Utility import MakeFolder
|
||
|
|
||
|
|
||
|
SEND_CMD = ("CIPSEND, CIPSENDBUF", "CIPSENDEX")
|
||
|
|
||
|
LOG_PATH = os.path.join("AT_LOG", "Performance", "AT_SEND")
|
||
|
|
||
|
|
||
|
class TCPSendPerf(PerformanceTCBase.PerformanceTCBase):
|
||
|
def __init__(self, name, test_env, cmd_set, timeout=120, log_path=None):
|
||
|
PerformanceTCBase.PerformanceTCBase.__init__(self, name, test_env, cmd_set=cmd_set,
|
||
|
timeout=timeout, log_path=log_path)
|
||
|
# init value for ip and port
|
||
|
self.pc_ip = "pc_ip"
|
||
|
self.server_port = "test_tcp_port1"
|
||
|
self.packet_len = 1
|
||
|
self.test_count = 100
|
||
|
self.send_cmd = "CIPSEND"
|
||
|
self.baudrate = 115200
|
||
|
self.rtscts = 0
|
||
|
self.link_type = "TCP"
|
||
|
# load param from excel
|
||
|
for i in range(1, len(cmd_set)):
|
||
|
if cmd_set[i][0] != "dummy":
|
||
|
cmd_string = "self." + cmd_set[i][0]
|
||
|
exec cmd_string
|
||
|
pass
|
||
|
|
||
|
def process(self):
|
||
|
pc_ip = self.get_parameter(self.pc_ip)
|
||
|
server_port = self.get_parameter(self.server_port)
|
||
|
packet_len = self.packet_len
|
||
|
test_count = self.test_count
|
||
|
send_cmd = self.send_cmd
|
||
|
baudrate = self.baudrate
|
||
|
rtscts = self.rtscts
|
||
|
result = True
|
||
|
link_type = self.link_type
|
||
|
|
||
|
# create TCP connection
|
||
|
sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
|
||
|
sock.bind((pc_ip, server_port))
|
||
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||
|
sock.settimeout(10)
|
||
|
sock.listen(1)
|
||
|
|
||
|
self.serial_write_line("AT1", "AT+CIPSTART=0,\"%s\",\"%s\",%d" % (link_type, pc_ip, server_port))
|
||
|
sock_client = sock.accept()[0]
|
||
|
if link_type == "SSL":
|
||
|
sock_client = ssl.wrap_socket(sock_client,
|
||
|
server_side=True,
|
||
|
certfile=os.path.join("Certificate", "default.cer"),
|
||
|
keyfile=os.path.join("Certificate", "default.key"))
|
||
|
pass
|
||
|
if self.check_response("AT1", "OK") is False:
|
||
|
result = False
|
||
|
|
||
|
self.serial_write_line("AT1", "AT+UART_CUR=%d,8,1,0,%d" % (baudrate, rtscts))
|
||
|
if self.check_response("AT1", "OK\r\n") is False:
|
||
|
result = False
|
||
|
|
||
|
self.reconfig_serial_port("AT1", baudrate, rtscts)
|
||
|
|
||
|
# restore to read line mode
|
||
|
self.test_env.uart_ports["AT1"].set_performance_flag(flag=True)
|
||
|
|
||
|
sock_client.settimeout(0)
|
||
|
|
||
|
for _dummy in range(1):
|
||
|
if result is False:
|
||
|
NativeLog.add_trace_critical("Fail to create TCP connection")
|
||
|
break
|
||
|
# send TCP packets
|
||
|
data = "A" * packet_len
|
||
|
time1 = time.time()
|
||
|
|
||
|
i = 0
|
||
|
data_recv_len = 0
|
||
|
while i < test_count:
|
||
|
self.serial_write_line("AT1", "AT+%s=0,%d" % (send_cmd, packet_len))
|
||
|
if self.check_response("AT1", ">", 0.05) is False:
|
||
|
continue
|
||
|
|
||
|
i += 1
|
||
|
self.serial_write("AT1", data)
|
||
|
if send_cmd == "CIPSENDBUF":
|
||
|
result = self.check_response("AT1", "Recv %d bytes" % packet_len, 3)
|
||
|
else:
|
||
|
result = self.check_response("AT1", "SEND OK", 3)
|
||
|
if result is False:
|
||
|
NativeLog.add_trace_critical("Fail during sending data")
|
||
|
break
|
||
|
try:
|
||
|
if link_type == "TCP":
|
||
|
data_recv = sock_client.recv(10*1460)
|
||
|
elif link_type == "SSL":
|
||
|
data_recv = sock_client.read(10*1024)
|
||
|
else:
|
||
|
raise StandardError()
|
||
|
data_recv_len += len(data_recv)
|
||
|
except socket.error, e:
|
||
|
if e.errno == 10035:
|
||
|
pass
|
||
|
elif e.message == "The read operation timed out":
|
||
|
pass
|
||
|
else:
|
||
|
NativeLog.add_exception_log(e)
|
||
|
else:
|
||
|
self.set_result("Succeed")
|
||
|
|
||
|
time2 = time.time()
|
||
|
|
||
|
folder_path = MakeFolder.make_folder(LOG_PATH)
|
||
|
file_name = os.path.join(folder_path,
|
||
|
"%s_%s_%s.log" % (send_cmd,
|
||
|
packet_len,
|
||
|
time.strftime("%d%H%M%S", time.localtime())))
|
||
|
with open(file_name, "ab+") as f:
|
||
|
f.write("\r\n[performance] %f packets per second "
|
||
|
"(including failed send operation)"
|
||
|
% (test_count/(time2-time1)))
|
||
|
f.write("\r\n[performance] %f Kbps" % (data_recv_len/(125*(time2-time1))))
|
||
|
|
||
|
self.serial_write_line("AT1", "AT+UART_CUR=115200,8,1,0,3")
|
||
|
self.check_response("AT1", "OK\r\n")
|
||
|
self.restore_serial_port("AT1")
|
||
|
|
||
|
# restore to read line mode
|
||
|
self.test_env.uart_ports["AT1"].set_performance_flag(flag=False)
|
||
|
# close socket
|
||
|
sock.close()
|
||
|
sock_client.close()
|
||
|
pass
|
||
|
|
||
|
|
||
|
def main():
|
||
|
pass
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|