Files
UPC-Resent/bin/192.168.8.73.py
2026-03-22 17:17:44 +08:00

127 lines
5.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import socket
import os
import time
import logging
import sys
# reload(sys) 和 sys.setdefaultencoding('utf-8') 在 Python 3 中不再需要
if __name__ == '__main__':
#======修改以下参数======
TmsServerIp='192.168.8.9' #TMS服务器IP用于绑定服务等待外部指令
TmsPor='10079' #TMS服务器端口用于绑定服务等待外部指令
upc_dev_ip="192.168.8.73" #自动化控制设备IP
upc_dev_port="502" #自动化控制设备端口
# 注意Senderfile 指向的 sender.py 脚本也需要是 Python 3 版本!
Senderfile='/opt/upc_resent/bin/sender.py' #发送程序位置
Logfile='/opt/upc_resent/log/192.168.8.73.log' #日志文件位置
pythonpath="/usr/bin/python3" # Python 3 执行文件的位置可在操作系统中使用which python3命令获取
#========================
BUFSIZE = 1024
# 配置日志,只执行一次
logging.basicConfig(filename=Logfile,filemode="a", level=logging.DEBUG)
ISOTIMEFORMAT='%Y-%m-%d %X'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.bind((TmsServerIp, int(TmsPor))) #启动TMS本地服务等待外部设备发送指令
sock.listen(500)
except OSError as e: # 在 Python 3 中使用 OSError 替代 socket.error
logstr="!!!!!ERROR!!!!!"+time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) )+" 无法绑定端口 %s:%s - %s" % (TmsServerIp, TmsPor, e)
logging.error(logstr)
print(logstr) # Python 3 print 函数
sys.exit(1) # 绑定失败则退出
logging.info("服务启动,监听 %s:%s" % (TmsServerIp, TmsPor))
while True:
connection,address = sock.accept()
try:
connection.settimeout(5) #GDC系统长连接
# 接收到的数据是 bytes需要解码成 str 进行比较
buf_bytes = connection.recv(BUFSIZE)
buf = buf_bytes.decode('utf-8').strip() # 解码成 str 并移除空白符
operation = "nodata" # 默认值,如果没有匹配的命令
datetime_str=time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) )
logstr="==="+datetime_str+"收到客户端"+ address[0]+":"+str(address[1])+"发送的指令: '" +str(buf)+"'"
logging.info(logstr)
# 根据接收到的外部命令,映射到单个内部操作指令
if buf == 'open':
operation = 'openall4'
elif buf == 'close':
operation = 'closeall4'
elif buf == 'open1':
operation = 'open1'
elif buf == 'close1':
operation = 'close1'
elif buf == 'open2':
operation = 'open2'
elif buf == 'close2':
operation = 'close2'
elif buf == 'open3':
operation = 'open3'
elif buf == 'close3':
operation = 'close3'
elif buf == 'open4':
operation = 'open4'
elif buf == 'close4':
operation = 'close4'
elif buf == 'open5': # 新增 5-8 路的命令映射
operation = 'open5'
elif buf == 'close5':
operation = 'close5'
elif buf == 'open6':
operation = 'open6'
elif buf == 'close6':
operation = 'close6'
elif buf == 'open7':
operation = 'open7'
elif buf == 'close7':
operation = 'close7'
elif buf == 'open8':
operation = 'open8'
elif buf == 'close8':
operation = 'close8'
elif buf == 'guanggao-guan': # 外部命令 'guanggao-guan' 映射到 'closeall4' (全关)
operation = 'closeall4'
# else: operation 保持为 "nodata"
if operation == "nodata":
logstr="==="+datetime_str+" 未知指令: '" +str(buf)+"'"
logging.warning(logstr)
print(logstr) # Python 3 print 函数
# 给客户端一个反馈,需要编码成 bytes
connection.send(('Unknown command: %s' % buf).encode('utf-8'))
else:
logstr="==="+datetime_str+" 映射到内部指令: '" +str(operation)+"'"
logging.info(logstr)
# 直接执行一次外部脚本
os_command=str(pythonpath)+" " +Senderfile+ " " + str(upc_dev_ip)+" "+str(upc_dev_port)+" "+str(operation)+" "+str(Logfile)
logging.info("执行外部命令: %s" % os_command)
os.system(os_command) # 执行发送指令的脚本
# 成功处理后给客户端反馈,需要编码成 bytes
connection.send(('Command %s processed as %s' % (buf, operation)).encode('utf-8'))
except socket.timeout:
datetime_str=time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) )
logstr="==="+datetime_str+" 客户端连接超时: "+ address[0]+":"+str(address[1])+"==="
logging.warning(logstr)
print('time out') # Python 3 print 函数
except Exception as e: # 捕获其他可能的异常
datetime_str=time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) )
logstr="==="+datetime_str+" 处理客户端 "+ address[0]+":"+str(address[1])+" 请求时发生错误: "+str(e)+"==="
logging.error(logstr, exc_info=True) # 记录异常详情
print("Error processing request:", e) # Python 3 print 函数
# 给客户端一个错误反馈,需要编码成 bytes
connection.send(('Error processing command: %s' % str(e)).encode('utf-8'))
finally:
connection.close() # 确保每次连接都被关闭