207 lines
7.1 KiB
Python
207 lines
7.1 KiB
Python
# config/config_manager.py
|
||
import logging
|
||
import os
|
||
import json
|
||
import configparser
|
||
import time
|
||
import threading
|
||
from common.logging_service import logging_service
|
||
from common.ini_handler import IniHandler
|
||
|
||
|
||
class IniManager:
|
||
"""
|
||
settings.init配置管理类,读取API相关配置
|
||
暂不支持多个配置文件
|
||
"""
|
||
|
||
def __init__(self):
|
||
"""初始化实例变量"""
|
||
self._DEFAULT_CONFIG_FILE = os.path.join(
|
||
os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
||
'settings.ini'
|
||
)
|
||
self.ini_handler = IniHandler(self._DEFAULT_CONFIG_FILE)
|
||
# 默认配置值
|
||
self._DEFAULT_API_MAX_RETRIES = 3
|
||
self._DEFAULT_API_RETRY_INTERVAL = 1.0
|
||
self._DEFAULT_API_TIMEOUT = 30.0
|
||
self._DEFAULT_API_AUTH_TIMEOUT = 12 * 60 * 60 # 12小时
|
||
self._DEFAULT_API_BASE_URL = "https://www.shnthy.com:9154"
|
||
self._DEFAULT_API_LOGIN_MODEL = {
|
||
"Program": 11,
|
||
"SC": "1000000001",
|
||
"loginName": "leduser",
|
||
"password": "bfcda35cf4eba92d4583931bbe4ff72ffdfa8b5c9c4b72611bd33f5babee069d"
|
||
}
|
||
|
||
# 参数缓存字典,格式:{参数名: {'value': 值, 'mtime': 文件修改时间}}
|
||
self._param_cache = {}
|
||
# 缓存锁,确保多线程安全
|
||
self._cache_lock = threading.RLock()
|
||
# 文件修改时间缓存
|
||
self._file_mtime_cache = None
|
||
|
||
def _get_file_mtime(self):
|
||
"""获取文件修改时间,带缓存"""
|
||
try:
|
||
current_mtime = os.path.getmtime(self._DEFAULT_CONFIG_FILE)
|
||
return current_mtime
|
||
except (FileNotFoundError, OSError):
|
||
raise FileNotFoundError(f"配置文件不存在或无法访问: settings.ini")
|
||
|
||
def _read_config_value(self, section, key, default_value, value_type=str):
|
||
"""读取配置值,带参数级缓存
|
||
|
||
Args:
|
||
section: 配置段
|
||
key: 配置键
|
||
default_value: 默认值
|
||
value_type: 值类型
|
||
|
||
Returns:
|
||
配置值
|
||
"""
|
||
cache_key = f"{section}.{key}"
|
||
current_mtime = self._get_file_mtime()
|
||
# 检查缓存
|
||
if cache_key in self._param_cache:
|
||
cached_data = self._param_cache[cache_key]
|
||
# 如果文件未修改,直接返回缓存值
|
||
if cached_data['value'] is not None and cached_data['mtime'] == current_mtime:
|
||
return cached_data['value']
|
||
|
||
try:
|
||
# 获取值
|
||
if value_type == int:
|
||
value = self.ini_handler.get_int_value(section, key)
|
||
elif value_type == float:
|
||
value = self.ini_handler.get_float_value(section, key)
|
||
else:
|
||
value = self.ini_handler.get_value(section, key)
|
||
|
||
except Exception as e:
|
||
value = default_value
|
||
logging_service.log_message(logging.ERROR,str(e))
|
||
|
||
# 使用锁确保缓存操作的线程安全
|
||
with self._cache_lock:
|
||
self._param_cache[cache_key] = {
|
||
'value': value,
|
||
'mtime': current_mtime
|
||
}
|
||
return value
|
||
|
||
@property
|
||
def api_max_retries(self):
|
||
"""获取API最大重试次数"""
|
||
return self._read_config_value('api', 'max_retries', self._DEFAULT_API_MAX_RETRIES, int)
|
||
|
||
@property
|
||
def api_retry_interval(self):
|
||
"""获取API重试间隔(秒)"""
|
||
return self._read_config_value('api', 'retry_interval', self._DEFAULT_API_RETRY_INTERVAL, float)
|
||
|
||
@property
|
||
def api_timeout(self):
|
||
"""获取API请求超时时间(秒)"""
|
||
return self._read_config_value('api', 'timeout', self._DEFAULT_API_TIMEOUT, float)
|
||
|
||
@property
|
||
def api_auth_timeout(self):
|
||
"""获取API授权失效前最大时间(秒)"""
|
||
return self._read_config_value('api', 'auth_timeout', self._DEFAULT_API_AUTH_TIMEOUT, int)
|
||
|
||
@property
|
||
def api_base_url(self):
|
||
"""获取API基础URL"""
|
||
return self._read_config_value('api', 'base_url', self._DEFAULT_API_BASE_URL, str)
|
||
|
||
@property
|
||
def jbl_api_url(self):
|
||
"""获取搅拌楼API基础URL"""
|
||
return self._read_config_value('api', 'jbl_api_url', 'http://10.6.242.111:5002', str)
|
||
|
||
@property
|
||
def api_login_url(self):
|
||
"""获取API登录URL"""
|
||
return f"{self.api_base_url}/api/user/perlogin"
|
||
|
||
@property
|
||
def api_login_model(self):
|
||
"""获取API登录模型(字典格式)"""
|
||
login_model_str = self._read_config_value('api', 'login_model', None, str)
|
||
if login_model_str:
|
||
try:
|
||
value = json.loads(login_model_str)
|
||
except Exception as e:
|
||
print(f"解析API登录模型失败: {e}")
|
||
value = self._DEFAULT_API_LOGIN_MODEL
|
||
else:
|
||
value = self._DEFAULT_API_LOGIN_MODEL
|
||
|
||
return value
|
||
|
||
@property
|
||
def log_path(self):
|
||
"""获取日志文件路径"""
|
||
return self._read_config_value('app', 'LOG_PATH', 'logs/app.log', str)
|
||
|
||
@property
|
||
def opcua_endpoint(self):
|
||
"""获取OPC UA服务器端点"""
|
||
return self._read_config_value('app', 'OPCUA_ENDPOINT', 'opc.tcp://192.168.250.64:4840/zjsh_feed/server/', str)
|
||
|
||
@property
|
||
def upper_transmitter_ip(self):
|
||
"""获取上料斗变送器IP"""
|
||
return self._read_config_value('app', 'UPPER_TRANSMITTER_IP', '192.168.250.63', str)
|
||
|
||
@property
|
||
def upper_transmitter_port(self):
|
||
"""获取上料斗变送器端口"""
|
||
return self._read_config_value('app', 'UPPER_TRANSMITTER_PORT', 502, int)
|
||
|
||
@property
|
||
def lower_transmitter_ip(self):
|
||
"""获取下料斗变送器IP"""
|
||
return self._read_config_value('app', 'LOWER_TRANSMITTER_IP', '192.168.250.66', str)
|
||
|
||
@property
|
||
def lower_transmitter_port(self):
|
||
"""获取下料斗变送器端口"""
|
||
return self._read_config_value('app', 'LOWER_TRANSMITTER_PORT', 8234, int)
|
||
|
||
@property
|
||
def relay_host(self):
|
||
"""获取网络继电器IP"""
|
||
return self._read_config_value('hardware', 'relay_host', '192.168.250.62', str)
|
||
@property
|
||
def relay_port(self):
|
||
"""获取网络继电器端口"""
|
||
return self._read_config_value('hardware', 'relay_port', 50000, int)
|
||
|
||
@property
|
||
def upper_plc_ip(self):
|
||
"""获取上料斗PLC IP"""
|
||
return self._read_config_value('hardware', 'upper_plc_ip', '192.168.250.233', str)
|
||
@property
|
||
def upper_plc_port(self):
|
||
"""获取上料斗PLC端口"""
|
||
return self._read_config_value('hardware', 'upper_plc_port', 9600, int)
|
||
|
||
|
||
|
||
ini_manager = IniManager()
|
||
|
||
|
||
# if __name__ == '__main__':
|
||
# logging_service.init_log(ini_manager.log_path)
|
||
# try:
|
||
|
||
# logging_service.log_message(logging.INFO, "测试INI配置管理类")
|
||
# logging_service.log_message(logging.ERROR, f"api_max_retries")
|
||
# except Exception as e:
|
||
# logging_service.log_message(logging.ERROR,str(e))
|
||
|
||
# time.sleep(1000) |