bonus-edge-proxy/python-work/cs.py

76 lines
2.5 KiB
Python
Raw Normal View History

2026-01-21 11:04:34 +08:00
import requests
from requests.auth import HTTPDigestAuth
import xml.etree.ElementTree as ET
def control_hikvision_door(device_ip, user_name, password, command="open"):
"""
通过 ISAPI 协议控制海康门禁设备的开关状态
Args:
device_ip (str): 设备的 IP 地址 (例如 "192.168.1.69")
user_name (str): 登录用户名
password (str): 登录密码
command (str): 控制指令默认为 "open" (常开/开门)
部分设备支持 "close" (关门), "alwaysOpen" (常开), "alwaysClose" (常闭)
Returns:
bool: 命令执行成功返回 True失败返回 False
"""
# 构建 API URL
# 对于 DS-K1T673 系列,门编号通常为 1
api_url = f"http://{device_ip}/ISAPI/AccessControl/RemoteControl/door/1"
# 构建 XML 请求体
# xmlns 命名空间通常是必须的version 可选
xml_body = f"""
<RemoteControlDoor version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema">
<cmd>{command}</cmd>
</RemoteControlDoor>
"""
headers = {
"Content-Type": "application/xml"
}
try:
# 发送 PUT 请求,必须使用 Digest 认证
response = requests.put(
api_url,
auth=HTTPDigestAuth(user_name, password),
data=xml_body,
headers=headers,
timeout=5
)
# 检查 HTTP 状态码
if response.status_code == 200:
# 解析返回的 XML 确认执行结果
# 成功通常返回 <statusCode>1</statusCode> 和 <statusString>OK</statusString>
print(f"[成功] 门禁响应: {response.text}")
return True
else:
print(f"[失败] HTTP 错误码: {response.status_code}")
print(f"[失败] 错误信息: {response.text}")
return False
except requests.exceptions.RequestException as e:
print(f"[错误] 连接异常: {e}")
return False
# --- 主程序执行 ---
if __name__ == "__main__":
# 配置参数
target_ip = "192.168.1.69"
admin_user = "admin"
admin_pass = "hzx12345"
print(f"正在尝试连接门禁 {target_ip} ...")
# 执行开门操作
is_success = control_hikvision_door(target_ip, admin_user, admin_pass, "open")
if is_success:
print("开门指令发送完毕。")
else:
print("开门指令发送失败,请检查网络或密码。")