def on_message(mqttc, userdata, msg): print(msg.topic + " " + str(msg.payload)) # Get the response properties, abort if they're not given props = msg.properties if not hasattr(props, 'ResponseTopic') or not hasattr( props, 'CorrelationData'): print("No reply requested") return corr_id = props.CorrelationData reply_to = props.ResponseTopic # The command parameters are in the payload nums = json.loads(msg.payload) # The requested command is at the end of the topic res = 0 if msg.topic.endswith("add"): res = add(nums) elif msg.topic.endswith("mult"): res = mult(nums) # Now we have the result, res, so send it back on the 'reply_to' # topic using the same correlation ID as the request. print("Sending response " + str(res) + " on '" + reply_to + "': " + str(corr_id)) props = mqtt.Properties(PacketTypes.PUBLISH) props.CorrelationData = corr_id payload = json.dumps(res) mqttc.publish(reply_to, payload, qos=1, properties=props)
def submit_cbor(self): """ publish the data read the topic from screen read the message, convert it to cbor add qos level & retain info if command, then add return topic and corrolation id. publish the data """ my_data = self.message_entry.get('1.0', tk.END) cbor_data = None if my_data is not None and len(my_data) > 2: try: json_data = json.loads(my_data) except JSONDecodeError as e: # do whatever you want logger.log(logging.ERROR, e) return except TypeError as e: # do whatever you want in this case logger.log(logging.ERROR, e) return cbor_data = cbor.dumps(json_data) my_topic = self.topic.get() my_qos = self.level.get() my_qos_int = int(my_qos) my_retain = self.btn_var.get() print(" ====> RETAIN", my_retain) retain_flag = False if my_retain == "1": print("retain is true") retain_flag = True additional_data = " " props = None last_topic = my_topic.split("/")[-1] if last_topic in ["C", "R", "U", "D", "N"]: return_topic = self.app.client.my_udn props = mqtt.Properties(PacketTypes.PUBLISH) random_number = randrange(100000) random_string = str(random_number) props.CorrelationData = random_string.encode("utf-8") props.ResponseTopic = return_topic additional_data = "\ncorr Id: " + \ str(props.CorrelationData) + \ " Response Topic: " + props.ResponseTopic my_string = "publish: " + str(self.topic.get()) + " QOS: " + my_qos + \ " Retain: " + my_retain + " " + my_data + additional_data logger.log(logging.INFO, my_string) topic_queue.append([props.CorrelationData, my_topic, None, None]) ret = self.app.client.publish(my_topic, cbor_data, my_qos_int, retain_flag, properties=props)
def submit_disc(self): """ publish the oic/res discovery publish the data """ my_data = "" # no input for discovery cbor_data = None if my_data is not None and len(my_data) > 2: try: json_data = json.loads(my_data) except JSONDecodeError as e: # do whatever you want logger.log(logging.ERROR, e) return except TypeError as e: # do whatever you want in this case logger.log(logging.ERROR, e) return cbor_data = cbor.dumps(json_data) my_topic = "OCF/*/oic%2Fres/R" my_qos = self.level.get() my_qos_int = int(my_qos) my_retain = self.btn_var.get() print(" ====> RETAIN", my_retain) retain_flag = False if my_retain == "1": print("retain is true") retain_flag = True additional_data = " " props = None last_topic = my_topic.split("/")[-1] if last_topic in ["C", "R", "U", "D", "N"]: return_topic = self.app.client.my_udn props = mqtt.Properties(PacketTypes.PUBLISH) random_number = randrange(100000) random_string = str(random_number) props.CorrelationData = random_string.encode("utf-8") props.ResponseTopic = return_topic additional_data = "\ncorr Id: " + str( props.CorrelationData ) + " Response Topic: " + props.ResponseTopic my_string = "publish: " + str( self.topic.get() ) + " QOS: " + my_qos + " Retain: " + my_retain + " " + my_data + additional_data logger.log(logging.INFO, my_string) topic_queue.append([props.CorrelationData, my_topic, None, None]) print(my_string) ret = self.app.client.publish(my_topic, cbor_data, my_qos_int, retain_flag, properties=props)
def publish_url(client, return_topic, udn, url, command=None, cb=None, message=None): """publish the message udn + url as topic with optional command Args: client (mqtt): mqtt client return_topic (string): return topic udn (string): udn of the target device url (string): url of the target command (string, optional): command e.g. CRUDN. Defaults to None. cb (function name, optional): callback function. Defaults to None. message (any, optional): message to be published . Defaults to None. """ my_url = url my_qos_int = 0 retain_flag = False cbor_data = message if my_url[0] == "/": my_url = my_url[1:] my_url = my_url.replace("/", "%2F") my_topic = "OCF/" + udn + "/" + my_url if command is not None: if command in ["C", "R", "U", "D", "N"]: my_topic += "/" + command else: logger.log(logging.ERROR, "command not in CRUDN:" + command) props = mqtt.Properties(PacketTypes.PUBLISH) random_number = randrange(100000) random_string = str(random_number) props.CorrelationData = random_string.encode("utf-8") props.ResponseTopic = return_topic print(" publish_url publish request:", my_topic, random_string) topic_queue.append([props.CorrelationData, my_topic, cb, udn]) ret = client.publish(my_topic, cbor_data, my_qos_int, retain_flag, properties=props)
def on_message(mqttc, userdata, msg): print(msg.topic + " " + str(msg.payload)) #获取响应属性,如果没有给出则中止 props = msg.properties if not hasattr(props, 'ResponseTopic') or not hasattr( props, 'CorrelationData'): print("No reply requested") return corr_id = props.CorrelationData reply_to = props.ResponseTopic #现在我们有了结果res,所以将其发送回'reply_to' #个主题,使用与请求相同的相关性ID。 props = mqtt.Properties(PacketTypes.PUBLISH) props.CorrelationData = corr_id mqttc.publish(reply_to, msg.payload, qos=1, properties=props)
done = True # Init MQTT client client = mqtt.Client("Python test client", protocol=mqtt.MQTTv5) # optional login data: client.username_pw_set("username","password") client.on_message = on_message client.on_connect = on_connect # optional configure transport level security: client.tls_set(cert_reqs=mqtt.ssl.CERT_NONE,tls_version=mqtt.ssl.PROTOCOL_TLSv1_2) client.connect("localhost", 1883) # or 8883 when in transport level security mode client.loop_start() client.subscribe("Python/response", qos=2) # Send model properties = mqtt.Properties(mqttpackettypes.PacketTypes.PUBLISH) properties.ResponseTopic = "Python/response" properties.UserProperty = ( "a", "2" ) # User properties can be used to identify response (Warteschlangensimulator will echo them in response message) properties.UserProperty = ("c", "3") client.publish("Warteschlangensimulator/task", payload=model, qos=2, properties=properties) print( "Submitted work request together with response topic name and user properties" ) # Wait while not done:
print("USAGE: client_rpc_math.py [add|mult] n1 n2 ...") sys.exit(1) mqttc = mqtt.Client(client_id="", protocol=mqtt.MQTTv5) mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.connect(host='localhost', clean_start=True) mqttc.loop_start() # Wait for connection to set `client_id`, etc. while not mqttc.is_connected(): time.sleep(0.1) # Properties for the request specify the ResponseTopic and CorrelationData props = mqtt.Properties(PacketTypes.PUBLISH) props.CorrelationData = corr_id props.ResponseTopic = reply_to # Uncomment to see what got set #print("Client ID: "+client_id) #print("Reply To: "+reply_to) #print(props) # The requested operation, 'add' or 'mult' func = sys.argv[1] # Gather the numeric parameters as an array of numbers # These can be int's or float's args = [] for s in sys.argv[2:]: