door_module.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import requests
  2. import yaml
  3. import os
  4. from utils.logger_config import logger
  5. CONFIG_FILE = 'door_config.yaml'
  6. def load_config():
  7. """加载门禁配置"""
  8. if not os.path.exists(CONFIG_FILE):
  9. logger.error(f"配置文件 {CONFIG_FILE} 不存在")
  10. return None
  11. try:
  12. with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
  13. config = yaml.safe_load(f)
  14. return config.get('door')
  15. except Exception as e:
  16. logger.error(f"读取配置文件失败: {e}")
  17. return None
  18. def set_emergency_control(control_way, password=None):
  19. """
  20. 设置紧急开关门方式
  21. :param control_way: 0:在线, 1:常开, 2:常闭
  22. :param password: 密码,如果未提供则从配置读取
  23. :return: (success, message)
  24. """
  25. config = load_config()
  26. if not config:
  27. return False, "无法加载配置"
  28. ip = config.get('ip')
  29. port = config.get('port', 14460)
  30. stored_password = config.get('password')
  31. # 优先使用传入的密码,否则使用配置文件的密码
  32. # 如果两者都为 None,则默认为空字符串
  33. final_password = password if password is not None else (stored_password if stored_password is not None else "")
  34. if not ip:
  35. return False, "配置中缺少IP地址"
  36. # 允许空密码,不再检查 if not final_password
  37. url = f"http://{ip}:{port}/setEmergencyControl"
  38. params = {
  39. "pass": final_password,
  40. "controlWay": control_way
  41. }
  42. try:
  43. # 根据用户提供的示例,请求体为 JSON 格式
  44. response = requests.post(url, json=params, timeout=5)
  45. if response.status_code == 200:
  46. try:
  47. resp_data = response.json()
  48. logger.info(f"门禁控制请求成功: {control_way}, 响应: {resp_data}")
  49. if resp_data.get('result') is True:
  50. return True, "设置成功"
  51. else:
  52. error_msg = resp_data.get('message', '未知错误')
  53. return False, f"设置失败: {error_msg}"
  54. except Exception as e:
  55. logger.error(f"解析响应JSON失败: {e}, 原始内容: {response.text}")
  56. return False, f"响应格式错误: {response.text}"
  57. else:
  58. logger.error(f"门禁控制请求失败: {response.status_code}, {response.text}")
  59. return False, f"请求失败, 状态码: {response.status_code}"
  60. except Exception as e:
  61. logger.error(f"门禁控制异常: {e}")
  62. return False, f"请求异常: {str(e)}"
  63. def open_door_control(door_id, password=None):
  64. """
  65. 远程开门控制
  66. :param door_id: 门编号
  67. :param password: 密码,如果未提供则从配置读取
  68. :return: (success, message)
  69. """
  70. config = load_config()
  71. if not config:
  72. return False, "无法加载配置"
  73. ip = config.get('ip')
  74. port = config.get('port', 14460)
  75. stored_password = config.get('password')
  76. # 优先使用传入的密码,否则使用配置文件的密码
  77. # 如果两者都为 None,则默认为空字符串
  78. final_password = password if password is not None else (stored_password if stored_password is not None else "")
  79. if not ip:
  80. return False, "配置中缺少IP地址"
  81. # 允许空密码,不再检查 if not final_password
  82. url = f"http://{ip}:{port}/openDoorControl"
  83. params = {
  84. "pass": final_password,
  85. "doorId": door_id
  86. }
  87. try:
  88. # 请求体为 JSON 格式
  89. response = requests.post(url, json=params, timeout=5)
  90. if response.status_code == 200:
  91. try:
  92. resp_data = response.json()
  93. logger.info(f"远程开门请求成功: {door_id}, 响应: {resp_data}")
  94. if resp_data.get('result') is True:
  95. return True, "远程开门成功"
  96. else:
  97. error_msg = resp_data.get('message', '未知错误')
  98. return False, f"远程开门失败: {error_msg}"
  99. except Exception as e:
  100. logger.error(f"解析响应JSON失败: {e}, 原始内容: {response.text}")
  101. return False, f"响应格式错误: {response.text}"
  102. else:
  103. logger.error(f"远程开门请求失败: {response.status_code}, {response.text}")
  104. return False, f"请求失败, 状态码: {response.status_code}"
  105. except Exception as e:
  106. logger.error(f"远程开门异常: {e}")
  107. return False, f"请求异常: {str(e)}"