136 lines
4.4 KiB
Python

import paho.mqtt.client as mqtt
import json
import requests
from datetime import datetime
BROKER = "192.168.8.139"
PORT = 1883
SITE_CODE = "124127"
TOPIC_REQUEST = f"HCMS/{SITE_CODE}/M2S/request"
TOPIC_RESPONSE = f"HCMS/{SITE_CODE}/S2M/response"
RATE_API_URL = "http://example.com/api/rate_model"
def fetch_rate_model_from_api():
try:
response = requests.get(RATE_API_URL)
response.raise_for_status()
data = response.json()
return {
"rateModelID": data.get("rateModelID", "default_id"),
"rateList": data.get("rateList", []),
"rateDetailsList": data.get("rateDetailsList", [])
}
except requests.RequestException as e:
print(f"Failed to fetch rate model from API: {e}")
return None
# 连接回调
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker successfully")
client.subscribe(TOPIC_RESPONSE)
print(f"Subscribed to {TOPIC_RESPONSE}")
else:
print(f"Connection failed with code {rc}")
# 消息处理回调
def on_message(client, userdata, msg):
payload = msg.payload.decode()
topic = msg.topic
print(f"Received: {topic} - {payload}")
try:
data = json.loads(payload)
header = data.get("header", {})
data_body = data.get("dataBody", {})
function = header.get("function", "unknown")
if function == "rateModeSyncResp":
result = data_body.get("result", 2)
reason = data_body.get("reason", "No reason provided")
print(f"Rate Mode Sync Response: Result={result}, Reason={reason}")
elif function == "checkRateModelResp":
rate_model_id = data_body.get("rateModelID", "unknown")
rate_list = data_body.get("rateList", [])
rate_details_list = data_body.get("rateDetailsList", [])
print(f"Rate Model Query Response: ID={rate_model_id}")
print(f"Rate List: {json.dumps(rate_list, indent=2)}")
print(f"Rate Details List: {json.dumps(rate_details_list, indent=2)}")
except json.JSONDecodeError:
print("Failed to parse JSON payload")
# 发送费率模型同步请求
def send_rate_model_sync(client, rate_model_id, rate_list, rate_details_list):
request_payload = {
"header": {
"version": "V2.0",
"timeStamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"index": 1,
"function": "rateModeSyncReq"
},
"dataBody": {
"rateModelID": rate_model_id,
"rateList": rate_list,
"rateDetailsList": rate_details_list
}
}
client.publish(TOPIC_REQUEST, json.dumps(request_payload), qos=0)
print(f"Sent rate model sync request: {json.dumps(request_payload)}")
# 发送费率模型查询请求
def send_rate_model_query(client, rate_model_id):
request_payload = {
"header": {
"version": "V2.0",
"timeStamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"index": 2,
"function": "checkRateModelReq"
},
"dataBody": {
"rateModelID": rate_model_id
}
}
client.publish(TOPIC_REQUEST, json.dumps(request_payload), qos=0)
print(f"Sent rate model query request: {json.dumps(request_payload)}")
# 主程序
def main():
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.on_connect = on_connect
client.on_message = on_message
try:
client.connect(BROKER, PORT, 60)
# 从 HTTP 接口获取费率数据
rate_data = fetch_rate_model_from_api()
if rate_data:
send_rate_model_sync(client, rate_data["rateModelID"],
rate_data["rateList"], rate_data["rateDetailsList"])
send_rate_model_query(client, rate_data["rateModelID"])
else:
print("Using default rate data due to API failure")
rate_model_id = "default_id"
rate_list = [{"rateType": 1, "electPrice": 1.0, "servicePrice": 0.3}]
rate_details_list = [{"rateType": 1, "startTime": "2025-03-05 00:00:00", "stopTime": "2025-03-05 23:59:59"}]
send_rate_model_sync(client, rate_model_id, rate_list, rate_details_list)
send_rate_model_query(client, rate_model_id)
client.loop_forever()
except Exception as e:
print(f"Failed to connect to {BROKER}:{PORT}: {e}")
if __name__ == "__main__":
main()