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()