config.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """
  2. 系统配置文件
  3. 用于管理系统参数,如缓冲区大小、超时设置等
  4. """
  5. import os
  6. from dotenv import load_dotenv
  7. # 加载环境变量
  8. load_dotenv()
  9. # 缓冲区配置
  10. MAX_BUFFER_SIZE = 1000 # 数据缓冲区最大条目数
  11. SERIAL_READ_BUFFER_SIZE = 4096 # 串口读取缓冲区大小(字节)
  12. # 串口配置
  13. DEFAULT_BAUDRATE = 9600 # 默认波特率
  14. DEFAULT_SERIAL_TIMEOUT = 1 # 默认串口超时时间(秒)
  15. SERIAL_RECONNECT_INTERVAL = 5 # 串口重连间隔(秒)
  16. SERIAL_RECONNECT_MAX_RETRIES = 5 # 串口最大重连次数
  17. # MQTT配置
  18. DEFAULT_MQTT_PORT = 1883 # 默认MQTT端口
  19. DEFAULT_MQTT_TLS_PORT = 8883 # 默认MQTT TLS端口
  20. DEFAULT_MQTT_KEEPALIVE = 60 # 默认MQTT心跳时间(秒)
  21. MQTT_RECONNECT_INTERVAL = 5 # MQTT重连间隔(秒)
  22. MQTT_RECONNECT_MAX_RETRIES = 5 # MQTT最大重连次数
  23. DEFAULT_MQTT_CLIENT_ID_PREFIX = "serial_mqtt_gateway_" # 默认MQTT客户端ID前缀
  24. DEFAULT_MQTT_PUBLISH_TOPIC = "serial/data" # 默认MQTT发布主题
  25. DEFAULT_MQTT_SUBSCRIBE_TOPIC = "command/serial" # 默认MQTT订阅主题
  26. # WebSocket配置
  27. SOCKETIO_ASYNC_MODE = 'threading' # SocketIO异步模式
  28. SOCKETIO_MESSAGE_QUEUE = None # SocketIO消息队列,生产环境可配置Redis
  29. SOCKETIO_TRANSPORTS = ['websocket', 'polling'] # SocketIO传输方式
  30. SOCKETIO_ALLOWED_ORIGINS = '*' # SocketIO允许的来源
  31. # Flask配置
  32. FLASK_SECRET_KEY = os.getenv('FLASK_SECRET_KEY', 'serial_mqtt_gateway_secret_key')
  33. FLASK_DEBUG = os.getenv('FLASK_DEBUG', 'False').lower() == 'true'
  34. FLASK_HOST = os.getenv('FLASK_HOST', '0.0.0.0')
  35. FLASK_PORT = int(os.getenv('FLASK_PORT', '5001'))
  36. # 日志配置
  37. LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO')
  38. LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  39. LOG_FILE = os.getenv('LOG_FILE', None) # 如果设置了值,则将日志写入文件
  40. # 性能配置
  41. MAX_CONCURRENT_SOCKETIO_CLIENTS = 100 # 最大并发SocketIO客户端数
  42. SOCKETIO_HEARTBEAT_INTERVAL = 25 # SocketIO心跳间隔(秒)
  43. SOCKETIO_HEARTBEAT_TIMEOUT = 30 # SocketIO心跳超时(秒)
  44. # 转发配置
  45. DEFAULT_FORWARD_SERIAL_TO_MQTT = False # 默认是否启用串口到MQTT转发
  46. DEFAULT_FORWARD_MQTT_TO_SERIAL = False # 默认是否启用MQTT到串口转发
  47. # 主题配置
  48. SOCKETIO_NAMESPACE_DATA = '/data' # 数据命名空间
  49. SOCKETIO_NAMESPACE_STATUS = '/status' # 状态命名空间
  50. SOCKETIO_NAMESPACE_CONTROL = '/control' # 控制命名空间
  51. # API路径配置
  52. API_PREFIX = '/api'
  53. API_SERIAL_PREFIX = f'{API_PREFIX}/serial'
  54. API_MQTT_PREFIX = f'{API_PREFIX}/mqtt'
  55. API_DATA_PREFIX = f'{API_PREFIX}/data'
  56. API_FORWARD_PREFIX = f'{API_PREFIX}/forward'
  57. API_HEALTH = f'{API_PREFIX}/health'
  58. # 错误码定义
  59. ERROR_CODES = {
  60. 'SUCCESS': 0,
  61. 'SERIAL_CONNECTION_ERROR': 1001,
  62. 'SERIAL_SEND_ERROR': 1002,
  63. 'SERIAL_RECEIVE_ERROR': 1003,
  64. 'MQTT_CONNECTION_ERROR': 2001,
  65. 'MQTT_PUBLISH_ERROR': 2002,
  66. 'MQTT_SUBSCRIBE_ERROR': 2003,
  67. 'CONFIG_ERROR': 3001,
  68. 'NETWORK_ERROR': 4001,
  69. 'UNKNOWN_ERROR': 9999
  70. }
  71. # 错误消息定义
  72. ERROR_MESSAGES = {
  73. ERROR_CODES['SUCCESS']: '成功',
  74. ERROR_CODES['SERIAL_CONNECTION_ERROR']: '串口连接失败',
  75. ERROR_CODES['SERIAL_SEND_ERROR']: '串口发送数据失败',
  76. ERROR_CODES['SERIAL_RECEIVE_ERROR']: '串口接收数据失败',
  77. ERROR_CODES['MQTT_CONNECTION_ERROR']: 'MQTT连接失败',
  78. ERROR_CODES['MQTT_PUBLISH_ERROR']: 'MQTT发布消息失败',
  79. ERROR_CODES['MQTT_SUBSCRIBE_ERROR']: 'MQTT订阅主题失败',
  80. ERROR_CODES['CONFIG_ERROR']: '配置错误',
  81. ERROR_CODES['NETWORK_ERROR']: '网络错误',
  82. ERROR_CODES['UNKNOWN_ERROR']: '未知错误'
  83. }
  84. # DTU配置
  85. DEFAULT_CUSTOMER_ID = os.getenv('CUSTOMER_ID', 'default_customer')
  86. DEFAULT_DTU_ID = os.getenv('DTU_ID', 'dtu_001')
  87. DTU_HEARTBEAT_INTERVAL = 60 # DTU状态上报间隔(秒) - 协议 7.13 要求
  88. DTU_OFFLINE_TIMEOUT = 180 # DTU 离线判定超时(秒) - 协议 7.13 要求
  89. # MQTT主题前缀(可配置 - 通过web界面设置)
  90. DEFAULT_MQTT_TOPIC_PREFIX = os.getenv('MQTT_TOPIC_PREFIX', '线架系统')
  91. # DTU MQTT主题模板(运行时根据topic_prefix动态生成)
  92. # 格式: {topic_prefix}/{customer_id}/dtu/{dtu_id}/{topic}
  93. DTU_REGISTRATION_TOPIC = 'register'
  94. DTU_STATUS_TOPIC = 'status'
  95. DTU_CONTROL_TOPIC = 'control'
  96. DTU_RESPONSE_TOPIC = 'response'
  97. DTU_EVENT_TOPIC = 'event'
  98. DTU_ALARM_TOPIC = 'alarm'
  99. DTU_BROADCAST_TOPIC = 'broadcast'
  100. # 面板配置
  101. MAX_PANELS = 8 # 最大面板数
  102. MAX_PORTS_PER_PANEL = 24 # 每个面板最大端口数
  103. # DHT11 环境传感器配置(本地 GPIO 读取)
  104. DHT11_ENABLED = os.getenv('DHT11_ENABLED', 'true').lower() in ('1', 'true', 'yes')
  105. DHT11_GPIO_PIN = int(os.getenv('DHT11_GPIO_PIN')) if os.getenv('DHT11_GPIO_PIN') else None
  106. DHT11_GPIO_CHIP = os.getenv('DHT11_GPIO_CHIP', 'gpiochip0')
  107. DHT11_POLL_INTERVAL = int(os.getenv('DHT11_POLL_INTERVAL', '5'))
  108. DHT11_SIMULATE = os.getenv('DHT11_SIMULATE', 'false').lower() in ('1', 'true', 'yes')
  109. DHT11_MAX_HISTORY = 1000 # 保留最近 1000 条历史记录