mirror of
https://github.com/NanjingForestryUniversity/supermachine--tomato-passion_fruit.git
synced 2025-11-09 23:03:58 +00:00
211 lines
8.0 KiB
Python
211 lines
8.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
# @Time : 2024/4/12 16:54
|
||
# @Author : TG
|
||
# @File : qt_test.py
|
||
# @Software: PyCharm
|
||
|
||
import numpy as np
|
||
import socket
|
||
import logging
|
||
import matplotlib.pyplot as plt
|
||
import cv2
|
||
import os
|
||
import time
|
||
from utils import DualSock, try_connect, receive_sock, parse_protocol, ack_sock, done_sock
|
||
|
||
|
||
def rec_socket(recv_sock: socket.socket, cmd_type: str, ack: bool) -> bool:
|
||
if ack:
|
||
cmd = 'A' + cmd_type
|
||
else:
|
||
cmd = 'D' + cmd_type
|
||
while True:
|
||
try:
|
||
temp = recv_sock.recv(1)
|
||
except ConnectionError as e:
|
||
logging.error(f'连接出错, 错误代码:\n{e}')
|
||
return False
|
||
except TimeoutError as e:
|
||
logging.error(f'超时了,错误代码: \n{e}')
|
||
return False
|
||
except Exception as e:
|
||
logging.error(f'遇见未知错误,错误代码: \n{e}')
|
||
return False
|
||
if temp == b'\xaa':
|
||
break
|
||
|
||
# 获取报文长度
|
||
temp = b''
|
||
while len(temp) < 4:
|
||
try:
|
||
temp += recv_sock.recv(1)
|
||
except Exception as e:
|
||
logging.error(f'接收报文长度失败, 错误代码: \n{e}')
|
||
return False
|
||
try:
|
||
data_len = int.from_bytes(temp, byteorder='big')
|
||
except Exception as e:
|
||
logging.error(f'转换失败,错误代码 \n{e}, \n报文内容\n{temp}')
|
||
return False
|
||
|
||
# 读取报文内容
|
||
temp = b''
|
||
while len(temp) < data_len:
|
||
try:
|
||
temp += recv_sock.recv(data_len)
|
||
except Exception as e:
|
||
logging.error(f'接收报文内容失败, 错误代码: \n{e},\n报文内容\n{temp}')
|
||
return False
|
||
data = temp
|
||
if cmd.strip().upper() != data[:4].decode('ascii').strip().upper():
|
||
logging.error(f'客户端接收指令错误,\n指令内容\n{data}')
|
||
return False
|
||
else:
|
||
if cmd == 'DIM':
|
||
print(data)
|
||
|
||
# 进行数据校验
|
||
temp = b''
|
||
while len(temp) < 3:
|
||
try:
|
||
temp += recv_sock.recv(1)
|
||
except Exception as e:
|
||
logging.error(f'接收报文校验失败, 错误代码: \n{e}')
|
||
return False
|
||
if temp == b'\xff\xff\xbb':
|
||
return True
|
||
else:
|
||
logging.error(f"接收了一个完美的只错了校验位的报文,\n data: {data}")
|
||
return False
|
||
|
||
|
||
# def main():
|
||
# socket_receive = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
# socket_receive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||
# socket_receive.bind(('127.0.0.1', 21123))
|
||
# socket_receive.listen(5)
|
||
# socket_send = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
# socket_send.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||
# socket_send.bind(('127.0.0.1', 21122))
|
||
# socket_send.listen(5)
|
||
# print('等待连接')
|
||
# socket_send_1, receive_addr_1 = socket_send.accept()
|
||
# print("连接成功:", receive_addr_1)
|
||
# # socket_send_2 = socket_send_1
|
||
# socket_send_2, receive_addr_2 = socket_receive.accept()
|
||
# print("连接成功:", receive_addr_2)
|
||
# while True:
|
||
# cmd = input('请输入指令:').strip().upper()
|
||
# if cmd == 'IM':
|
||
# with open('data/newrawfile_ref.raw', 'rb') as f:
|
||
# data = np.frombuffer(f.read(), dtype=np.float32).reshape(750, 288, 384)
|
||
# data = data[:, [91, 92, 93, 94, 95, 96, 97, 98, 99, 100], :]
|
||
# n_rows, n_bands, n_cols = data.shape[0], data.shape[1], data.shape[2]
|
||
# print(f'n_rows:{n_rows}, n_bands:{n_bands}, n_cols:{n_cols}')
|
||
# n_rows, n_cols, n_bands = [x.to_bytes(2, byteorder='big') for x in [n_rows, n_cols, n_bands]]
|
||
# data = data.tobytes()
|
||
# length = len(data) + 10
|
||
# print(f'length: {length}')
|
||
# length = length.to_bytes(4, byteorder='big')
|
||
# msg = b'\xaa' + length + (' ' + cmd).upper().encode('ascii') + n_rows + n_cols + n_bands + data + b'\xff\xff\xbb'
|
||
# socket_send_1.send(msg)
|
||
# print('发送成功')
|
||
# result = socket_send_2.recv(5)
|
||
# length = int.from_bytes(result[1:5], byteorder='big')
|
||
# result = b''
|
||
# while len(result) < length:
|
||
# result += socket_send_2.recv(length)
|
||
# print(result)
|
||
# data = result[4:length].decode()
|
||
# print(data)
|
||
|
||
def main():
|
||
socket_receive = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
socket_receive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||
socket_receive.bind(('127.0.0.1', 21123))
|
||
socket_receive.listen(5)
|
||
socket_send = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
socket_send.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||
socket_send.bind(('127.0.0.1', 21122))
|
||
socket_send.listen(5)
|
||
print('等待连接')
|
||
socket_send_1, receive_addr_1 = socket_send.accept()
|
||
print("连接成功:", receive_addr_1)
|
||
socket_send_2, receive_addr_2 = socket_receive.accept()
|
||
print("连接成功:", receive_addr_2)
|
||
|
||
# while True:
|
||
# cmd = input().strip().upper()
|
||
# if cmd == 'IM':
|
||
# image_dir = r'D:\project\Tomato\20240410tomatoRGBtest2\data'
|
||
# image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(".bmp")]
|
||
# for image_path in image_paths:
|
||
# img = cv2.imread(image_path)
|
||
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
||
# img = np.asarray(img, dtype=np.uint8)
|
||
# width = img.shape[0]
|
||
# height = img.shape[1]
|
||
# print(width, height)
|
||
# img_bytes = img.tobytes()
|
||
# length = len(img_bytes) + 8
|
||
# print(length)
|
||
# length = length.to_bytes(4, byteorder='big')
|
||
# width = width.to_bytes(2, byteorder='big')
|
||
# height = height.to_bytes(2, byteorder='big')
|
||
# send_message = b'\xaa' + length + (' ' + cmd).upper().encode('ascii') + width + height + img_bytes + b'\xff\xff\xbb'
|
||
# socket_send_1.send(send_message)
|
||
# print('发送成功')
|
||
# result = socket_send_2.recv(5)
|
||
# print(result)
|
||
while True:
|
||
cmd = input().strip().upper()
|
||
if cmd == 'IM':
|
||
image_dir = r'D:\project\Tomato\20240410tomatoRGBtest2\data'
|
||
send_images(image_dir, socket_send_1, socket_send_2)
|
||
def send_images(image_dir, socket_send_1, socket_send_2):
|
||
image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(".bmp")]
|
||
num_images = len(image_paths)
|
||
num_groups = (num_images + 4) // 5
|
||
|
||
for group_idx in range(num_groups):
|
||
start = group_idx * 5
|
||
end = start + 5
|
||
group_images = image_paths[start:end]
|
||
|
||
group_start = time.time()
|
||
|
||
for image_path in group_images:
|
||
|
||
img_start = time.time()
|
||
|
||
img = cv2.imread(image_path)
|
||
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
||
img = np.asarray(img, dtype=np.uint8)
|
||
width = img.shape[0]
|
||
height = img.shape[1]
|
||
print(width, height)
|
||
img_bytes = img.tobytes()
|
||
length = len(img_bytes) + 8
|
||
print(length)
|
||
length = length.to_bytes(4, byteorder='big')
|
||
width = width.to_bytes(2, byteorder='big')
|
||
height = height.to_bytes(2, byteorder='big')
|
||
send_message = b'\xaa' + length + (' ' + 'IM').upper().encode('ascii') + width + height + img_bytes + b'\xff\xff\xbb'
|
||
socket_send_1.send(send_message)
|
||
|
||
img_end = time.time()
|
||
print(f'图片发送时间: {img_end - img_start}秒')
|
||
|
||
print('图片发送成功')
|
||
|
||
group_end = time.time()
|
||
print(f'第 {group_idx + 1} 组图片发送时间: {group_end - group_start}秒')
|
||
|
||
result = socket_send_2.recv(5)
|
||
print(f'第 {group_idx + 1} 组结果: {result}')
|
||
|
||
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main() |