136 lines
4.4 KiB
Python
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() |