1
This commit is contained in:
126
bin/192.168.8.73.py
Normal file
126
bin/192.168.8.73.py
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/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() # 确保每次连接都被关闭
|
||||
|
||||
Reference in New Issue
Block a user