Python-mqtt:通过运行深入理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_26940175/article/details/88640331

参考文献: paho-mqtt 1.1    steves-internet-guide

broker --- sudo apt-get install mosquitto  在ubuntu上安装,使用MQTT Mosquitto

client ---- pip install paho-mqtt                 mqtt documents in python

什么是消息队列

MQTT协议从服务端到客户端详解

MQTT协议 几个重要的属性

example: 1>mqtt client python example  2>Python简单试用MQTT服务器

Table of Contents

一般用法流程如下:

1.创建客户端实例:

Client(client_id = “” , clean_session = True , userdata = None, protocol= MQTTv311 , transport = “tcp” )

reinitialise(client_id="", clean_session=True, userdata=None)

2.使用connect*()函数之一连接到代理

connect (host , port = 1883 , keepalive = 60 , bind_address = “” )

connect_async (host , port = 1883 , keepalive = 60 , bind_address = “” )

connect_srv(domain , keepalive = 60 , bind_address = “” )

Callback(connect_srv)

reconnect()

Callback (reconnect)

3.调用其中一个loop*()  函数来维护代理的网络流量

loop(timeout=1.0, max_packets=1)

loop_start ()/ loop_stop (force = False )

loop_forever (timeout = 1.0 , max_packets = 1 , retry_first_connection = False )

4.使用subscribe()订阅主题并接收消息

订阅: subscribe (topic , qos = 0 )

退订:unsubscribe(topic)

Callback (unsubscribe)

5.使用publish()将消息发布到代理

发布:publish(topic , payload = None , qos = 0 , retain = False )

6.使用disconnect()断开与代理的连接

断开:disconnect()

回调:Callback (disconnect)

7.所有回调函数:

1. on_connect (client , userdata , flags , rc )

2.on_disconnect (client , userdata , rc )

3.on_message(client, userdata, message)

4.message_callback_add (sub , callback )

5.message_callback_remove (sub )

6. on_publish (client , userdata , mid )

7.on_subscribe (client , userdata , mid , granted_qos )

8.on_unsubscribe (client , userdata , mid )

9.on_log (client , userdata , level , buf )

10.on_socket_open(client,userdata,sock)

11.on_socket_close(client,userdata,sock)

12.on_socket_register_write(client,userdata,sock)

13.on_socket_unregister_write(client,userdata,sock)

8.外部事件循环支持:

1.loop_read (max_packets = 1 )

2.loop_write (max_packets = 1 )

3.loop_misc ()

4.socket ()

5.want_write ()

6.STATE CALLBACKS

9.全局辅助函数:

    客户端模块还提供一些全局帮助程序功能。topic_matches_sub(sub,topic)

connack_string(connack_code)

error_string(mqtt_errno)

10.Publish

single(topic, payload=None, qos=0, retain=False, hostname="localhost",    port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,    protocol=mqtt.MQTTv311, transport="tcp")

multiple(msgs, hostname="localhost", port=1883, client_id="", keepalive=60,    will=None, auth=None, tls=None, protocol=mqtt.MQTTv311, transport="tcp")

11.订阅

simple(topics, qos=0, msg_count=1, retained=False, hostname="localhost",    port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,    protocol=mqtt.MQTTv311)

callback(callback, topics, qos=0, userdata=None, hostname="localhost",        port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,        protocol=mqtt.MQTTv311)


一般用法流程如下:

1.创建客户端实例:

Client(client_id = “” , clean_session = True , userdata = None, protocol= MQTTv311 , transport = “tcp” )

    client_id --- 连接到代理时使用的唯一客户端ID字符串。如果 client_id为零长度或无,则将随机生成一个。在这种情况下,clean_session参数必须为True。
    clean_session --- 一个确定客户端类型的布尔值。如果为True,代理将在断开连接时删除有关此客户端的所有信息。如果为False,则客户端是持久客户端,当客户端断开连接时,将保留订阅信息和排队消息。请注意,客户端永远不会在断开连接时丢弃自己的传出消息。调用connect()或reconnect()将导致重新发送消息。使用reinitialise()将客户端重置为其原始状态。
    userdata --- 用户定义的任何类型的数据,作为userdata参数传递给回调。可以使用user_data_set()函数稍后更新它 。
    protocol --- 用于此客户端的MQTT协议版本。可以是 MQTTv31或MQTTv311
    transport --- 设置为“websockets”以通过WebSockets发送MQTT。保留默认值“tcp”以使用原始TCP。
    构造函数示例:
        import paho.mqtt.client as mqtt
        mqttc = mqtt.Client()

reinitialise(client_id="", clean_session=True, userdata=None)

simon总结:不能正常调用,只能通过Client实例化,不能初始化。

    在重新初始化()函数,就好像它刚刚创建的客户重置为初始状态。它采用与Client()构造函数相同的参数。
    重新初始化示例:
        mqttc.reinitialise()

    选项功能:
    这些函数表示可以在客户端上设置以修改其行为的选项。在大多数情况下,必须在连接到connecting 之前完成此操作。
    1>max_inflight_messages_set(self, inflight)
    设置QoS> 0的最大消息数,这些消息可以一次通过其网络流。默认为20.增加此值将消耗更多内存,但可以增加吞吐量。
    2>max_queued_messages_set (self , queue_size )
    设置QoS> 0的传出消息的最大数量,该消息可以在传出消息队列中挂起。默认为0. 0表示无限制。当队列已满时,将丢弃任何进一步的传出消息。
    3>message_retry_set(retry)
    如果代理没有响应,则设置重试QoS> 0的消息之前的时间(以秒为单位)。默认设置为5秒,通常不需要更改。
    4>ws_set_options (self , path = “/ mqtt” , headers = None )
    设置websocket连接选项。仅当transport =“websockets”传递给Client()构造函数时,才会使用这些选项。
        path --- 要在代理上使用的mqtt路径。
        head --- 指定应附加到标准websocket标头的额外标头列表的字典,或者采用正常websocket标头并返回带有一组标头以连接到代理的新字典的字典。
     5>tls_set(ca_certs=None, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED,tls_version=ssl.PROTOCOL_TLS, ciphers=None)
       配置网络加密和身份验证选项。启用S​​SL / TLS支持。
       ca_certs
        证书颁发机构证书文件的字符串路径,该文件将被此客户端视为受信任。如果这是给出的唯一选项,则客户端将以与Web浏览器类似的方式运行。也就是说,它将要求代理在ca_certs中拥有由证书颁发机构签名的证书,并使用TLS v1进行通信,但不会尝试任何形式的身份验证。这提供了基本的网络加密,但可能不够,具体取决于代理的配置方式。默认情况下,在Python 2.7.9+或3.4+上,使用系统的默认证书颁发机构。在较旧的Python版本中,此参数是必需的。
       certfile,密钥文件
         字符串分别指向PEM编码的客户端证书和私钥。如果这些参数不是None,那么它们将用作基于TLS的身份验证的客户端信息。对此功能的支持取决于代理。请注意,如果这些文件中的任何一个加密并需要密码才能解密,Python将在命令行中询问密码。目前无法定义回调来提供密码。
       cert_reqs
          定义客户端对代理施加的证书要求。默认情况下,这是ssl.CERT_REQUIRED,这意味着代理必须提供证书。有关此参数的更多信息,请参见ssl pydoc。
        tls_version
          指定要使用的SSL / TLS协议的版本。默认情况下(如果python版本支持它),检测到最高的TLS版本。如果不可用,则使用TLS v1。以前的版本(所有以SSL开头的版本)都是可能的,但由于可能存在安全问题,因此不推荐使
       ciphers
         指定此连接允许哪些加密密码的字符串,或使用默认值的None。有关更多信息,请参阅ssl pydoc。
    必须在connect *()之前调用。
  6>tls_set_context (context = None )
    配置网络加密和认证上下文。启用S​​SL / TLS支持。
    content
        一个ssl.SSLContext对象。默认情况下,这由ssl.create_default_context()提供(如果可用)(在Python 3.4中添加)。
    如果您不确定使用此方法,请使用默认上下文,或使用tls_set方法。有关更多信息,请参阅ssl模块文档部分有关安全性注意事项。必须在connect *()之前调用。
  7>tls_insecure_set (value )
      配置服务器证书中服务器主机名的验证。
      如果value设置为True,则无法保证您连接的主机不会模拟您的服务器。这在初始服务器测试中非常有用,但可以使恶意第三方通过DNS欺骗来模拟您的服务器。
    请勿在实际系统中使用此功能。将值设置为True意味着使用加密没有意义。
    必须在connect *()之前和tls_set()或tls_set_context()之后调用。
   8>enable_logger (logger = None )
    使用标准python日志包启用日志记录(请参阅PEP 282)。这可以与on_log回调方法同时使用。
    如果指定了logger,那么将使用该logging.Logger对象,否则将自动创建一个。
      根据以下映射将Paho日志记录级别转换为标准级别:
        泛美卫生组织            记录
        MQTT_LOG_ERR            logging.ERROR
        MQTT_LOG_WARNING    logging.WARNING
        MQTT_LOG_NOTICE            logging.INFO (没有直接的等价物)
        MQTT_LOG_INFO            logging.INFO
        MQTT_LOG_DEBUG            logging.DEBUG
   9>disable_logger ()
    使用标准python日志包禁用日志记录。这对on_log回调没有影响。
  10>username_pw_set(username, password=None)
    为代理身份验证设置用户名和密码。必须在connect *()之前调用。
  11>user_data_set (userdata )
    设置生成事件时将传递给回调的私有用户数据。将此用于您自己的目的,以支持您的应用程序。
  12>will_set (topic , payload = None , qos = 0 , retain = False )
    设置要发送给经纪人的遗嘱。如果客户端在未调用disconnect()的情况下 断开连接,则代理将代表其发布消息。
    topic话题
    应该发布遗嘱消息的主题。
    payload
    要作为遗嘱发送的消息。如果没有给出,或者设置为None,则将使用零长度消息作为遗嘱。传递int或float将导致有效负载转换为表示该数字的字符串。如果您希望发送一个真正的int / float,请使用struct.pack()来创建所需的有效负载。
    qos
    用于意志的服务质量水平。
    retain                        Mqtt精髓系列之保留消息Retained Messages
    如果设置为True,则will消息将被设置为主题的“最后已知好”/保留消息。
如果qos不是0,1或2,或者topic为 None或者字符串长度为零,则引发ValueError。
  13>reconnect_delay_set (min_delay = 1 , max_delay = 120 )
    客户端将自动重试连接。在每次尝试之间,它将在min_delay和max_delay之间等待几秒钟。当连接丢失时,最初重新连接尝试延迟 min_delay秒。在后续尝试max_delay之间加倍。
连接完成后,延迟将重置为min_delay(例如,收到CONNACK,而不仅仅建立TCP连接)。

2.使用connect*()函数之一连接到代理

连接/重新连接/断开连接

connect (host , port = 1883 , keepalive = 60 , bind_address = “” )

    该连接()函数的客户端连接到代理。这是一个阻止功能。它需要以下参数:
        host --- 远程代理的主机名或IP地址
        port --- 要连接的服务器主机的网络端口。默认为1883.请注意,MQTT over SSL / TLS的默认端口为8883,因此如果您使用 tls_set()或tls_set_context(),则端口可能需要手动提供
        keepalive --- 与代理通信之间允许的最长时间(以秒为单位)。如果没有交换其他消息,则控制客户端将ping消息发送给代理的速率 心跳检测是什么
        bind_address --- 假设存在多个接口,则绑定此客户端的本地网络接口的IP地址
        Callback --- 当客户端响应连接从代理接收到CONNACK消息时,它会生成on_connect()回调。
    连接示例:
       mqttc.connect("iot.eclipse.org")

connect_async (host , port = 1883 , keepalive = 60 , bind_address = “” )

    异步连接,与loop_start()结合使用以非阻塞方式连接。在调用loop_start()之前,连接不会完成。
Callback (connect)
    当客户端响应连接从代理接收到CONNACK消息时,它会生成on_connect()回调。

connect_srv(domain , keepalive = 60 , bind_address = “” )

    DNS连接,使用SRV DNS查找连接到代理以获取代理地址。采用以下参数:
        domain --- 用于搜索SRV记录的DNS域。如果为None,请尝试确定本地域名。
        有关keepalive和bind_address 参数的说明,请参阅connect()。

Callback(connect_srv)

    当客户端响应连接从代理接收到CONNACK消息时,它会生成on_connect()回调。
    SRV Connect示例:
        mqttc.connect_srv("eclipse.org")

reconnect()

    使用先前提供的详细信息重新连接到代理。在调用此函数之前,您必须调用connect *()。

Callback (reconnect)

    当客户端响应连接从代理接收到CONNACK消息时,它会生成on_connect()回调。

3.调用其中一个loop*()  函数来维护代理的网络流量

    网络循环:Network loop
    这些功能是客户背后的驱动力。如果未调用它们,则不会处理传入的网络数据,并且可能无法及时发送传出的网络数据。管理网络循环有四种选择。这里描述了三个,下面是“外部事件循环支持”中的第四个。不要混合不同的循环功能。

loop(timeout=1.0, max_packets=1)

    定期致电处理网络事件。此调用在select()中等待,直到网络套接字可用于读取或写入(如果适用),然后处理传入/传出数据。此功能可以阻止超时秒。超时不得超过客户端的keepalive值,否则代理将定期断开您的客户端。
    该max_packets说法已经过时,应该保留未设置。
    循环示例:
        run = True
        while run:
            mqttc.loop()

loop_start ()/ loop_stop (force = False )

    这些函数实现了网络循环的线程接口。在connect *()之前或之后调用 loop_start()一次,在后台运行一个线程以自动调用loop()。这释放了可能阻塞的其他工作的主线程。此调用还处理重新连接到代理。调用loop_stop()来停止后台线程。该部队 目前参数将被忽略。
    循环启动/停止示例:
      mqttc.connect("iot.eclipse.org")
      mqttc.loop_start()
      while True:
        temperature = sensor.blocking_read()
        mqttc.publish("paho/temperature", temperature

loop_forever (timeout = 1.0 , max_packets = 1 , retry_first_connection = False )

    这是网络循环的阻塞形式,在客户端调用disconnect()之前不会返回。它会自动处理重新连接。
    除使用connect_async时的第一次连接尝试外,使用 retry_first_connection = True使其重试第一次连接。警告:这可能会导致客户端保持连接到非现有主机而不会失败的情况。
    在超时和max_packets参数已过时,应保留未设置。

4.使用subscribe()订阅主题并接收消息

订阅: subscribe (topic , qos = 0 )

    将客户订阅到一个或多个主题。可以通过三种不同方式调用此函数:
        1. 简单的字符串和整数
                e.g. subscribe("my/topic", 2)
        topic --- 指定要订阅的订阅主题的字符串。
        Qos --- 订阅所需的服务质量水平。默认为0。
        2. 字符串和整数元组
                e.g. subscribe(("my/topic", 1))
        topic -- (topic, qos)的元组。主题和qos都必须存在于元组中。
        Qos --- 不曾用过。
        3. 字符串和整数元组的列表
                e.g. subscribe([("my/topic", 0), ("another/topic", 2)])
        这允许在单个SUBSCRIPTION命令中进行多个主题订阅,这比使用subscribe()的多个调用更有效。
        topic --- 格式元组列表(主题,qos)。主题和qos都必须存在于所有元组中。
        Qos ---  不曾用过。
    该函数返回一个元组(result,mid),其中结果是 MQTT_ERR_SUCCESS表示成功,或者(MQTT_ERR_NO_CONN,None)如果客户端当前未连接。 mid是订阅请求的消息ID。中间值可用于通过检查on_subscribe()回调中的mid参数来跟踪订阅请求(如果已定义)。
    如果qos不是0,1或2,或者topic为None或者字符串长度为零,或者topic不是字符串,元组或列表,则引发ValueError。
Callback (subscribe):
    当代理确认订阅时, 将生成on_subscribe()回调。

退订:unsubscribe(topic)

    取消订阅客户端的一个或多个主题。
        topic --- 单个字符串或作为要取消订阅的订阅主题的字符串列表。
    返回元组(result,mid),其中结果是MQTT_ERR_SUCCESS以指示成功,或者(MQTT_ERR_NO_CONN,None)如果客户端当前未连接。mid是取消订阅请求的消息ID。中间值可用于通过检查on_unsubscribe()回调中的mid参数来跟踪取消订阅请求(如果已定义)。
    如果topic为None或者字符串长度为零,或者不是字符串或列表,则引发ValueError。

Callback (unsubscribe)

    当代理确认取消订阅时, 将生成on_unsubscribe()回调。

5.使用publish()将消息发布到代理

发布:publish(topic , payload = None , qos = 0 , retain = False )

    这会导致将消息发送到代理,然后从代理发送到订阅匹配主题的任何客户端。它需要以下参数:
        topic --- 应该发布消息的主题
        payload --- 要发送的实际消息。如果没有给出,或者设置为None,将使用零长度消息。传递int或float将导致有效负载转换为表示该数字的字符串。如果您希望发送一个真正的int / float,请使用struct.pack()来创建所需的有效负载
        Qos -- 要使用的服务质量水平
        retain --- 如果设置为True,则将消息设置为主题的“最后已知好”/保留消息。Mqtt精髓系列之保留消息Retained Messages
    返回MQTTMessageInfo,它公开以下属性和方法:
        1>rc,发布的结果。它可以是MQTT_ERR_SUCCESS以指示成功,MQTT_ERR_NO_CONN(如果客户端当前未连接)或MQTT_ERR_QUEUE_SIZE(当max_queued_messages_set用于指示消息既未排队也未发送时)。
        2>mid是发布请求的消息ID。中间值可用于通过检查on_publish()回调中的mid参数来跟踪发布请求 (如果已定义)。wait_for_publish可能会更容易,具体取决于您的用例。
        3>wait_for_publish()将阻塞,直到消息发布。如果消息未排队,则会引发ValueError(rc == MQTT_ERR_QUEUE_SIZE)。
        4>如果消息已发布,则is_published返回True。如果消息未排队,则会引发ValueError(rc == MQTT_ERR_QUEUE_SIZE)。
    A ValueError异常将如果主题是提高无,长度为零或无效(包含通配符)中,如果服务质量是不为0,1或2中的一个,或者如果所述有效载荷的长度比268435455个字节。
Callback(public)
    当消息已发送到代理时,将生成on_publish()回调。

MQTT最大的优势是解耦了发布消息的客户(发布者)与订阅消息的客户(订阅者)之间的关系,这意味着发布者和订阅者之间并不需要直接建立联系,只要认识同一个消息代理即可。

运用MQTT协议,设备可以很方便地连接到物联网云服务,管理设备并处理数据,最后应用到各种业务场景;二进制协议,紧凑、占用空间小,协议头只有2个字节 ,还提供了三种消息可能性保障(Qos):0:最多一次 、1:最少一次、2:只有一次。

Mqtt之服务质量等级Qos

大致模式:

6.使用disconnect()断开与代理的连接

断开:disconnect()

    彻底断开与经代理的联系。使用disconnect()不会导致代理发送will消息。断开连接不会等待发送所有排队的消息,以确保传递所有消息,应使用来自MQTTMessageInfo的wait_for_publish()。有关详细信息,请参阅publish()。

回调:Callback (disconnect)

    当客户端发送了断开连接消息时,它会生成 on_disconnect()回调。

    将调用回调以允许应用程序根据需要处理事件。这些回调描述如下:

7.所有回调函数:

1. on_connect (client , userdata , flags , rc )

    当代理响应我们的连接请求时调用。
        client --- 此回调的客户端实例
        userdata --- Client()或user_data_set()中设置的私有用户数据
        flags --- 经纪人发送的响应标志
        RC --- 连接结果
        flags是一个包含来自代理的响应标志的字典:
        flags ['session present'] --- 此标志对于客户端非常有用
        使用clean session设置为0。如果具有干净 session=0的客户端重新连接到先前已连接到的代理,则此标志指示代理是否仍具有客户端的会话信息。如果为1,则会话仍然存在。
        rc的值表示成功与否:
            0:连接成功
            1:连接被拒绝 - 协议版本
            2:   错误-连接被拒绝 - 客户端标识符无效
            3:连接被拒绝 - 服务器不可用
            4:连接被拒绝 - 用户名或密码错误

            5:连接被拒绝 - 未授权6-255:当前未使用。
    在连接示例:
        def on_connect(client, userdata, flags, rc):
            print("Connection returned result: "+connack_string(rc))
        mqttc.on_connect = on_connect
        ...

2.on_disconnect (client , userdata , rc )

    当客户端与代理断开连接时调用。
        client --- 此回调的客户端实例   

        userdata --- Client()或user_data_set()中设置的私有用户数据
        RC --- 断开的结果
            rc参数表示断开状态。如果MQTT_ERR_SUCCESS (0),则调用回调以响应disconnect()调用。如果有任何其他值,则断开连接是意外的,例如。
   在断开连接示例:
   def on_disconnect(client, userdata, rc):
       if rc != 0:
           print("Unexpected disconnection.")
   mqttc.on_disconnect = on_disconnect
   ...

3.on_message(client, userdata, message)

    在收到客户端订阅的主题的消息并且消息与现有主题过滤器回调不匹配时调用。使用message_callback_add()定义将为特定主题过滤器调用的回调。当没有匹配时,on_message将作为后备。
        client --- 此回调的客户端实例
        userdata --- Client()或user_data_set()中设置的私有用户数据
        message --- MQTTMessage的一个实例。这是一个包含成员主题,有效负载,qos,retain的类。
    在消息示例:
     def on_message(client, userdata, message):
        print("Received message '" + str(message.payload) + "' on topic '"
           + message.topic + "' with QoS " + str(message.qos))
     mqttc.on_message = on_message

     ...

4.message_callback_add (sub , callback )

    此函数允许您定义处理特定订阅筛选器的传入消息的回调,包括通配符。例如,这可以让您订阅传感器/#并有一个回调来处理传感器/温度,另一个回调 来处理传感器/湿度。

        message_callback_add (sub , callback )sub --- 要与此回调匹配的订阅筛选器。每个文字子字符串只能定义一个回调
        callback --- 要使用的回调。采用与on_message 回调相同的形式。

    如果使用message_callback_add()和on_message,则只有与特定于订阅的过滤器不匹配的消息才会传递给on_message 回调。
    如果多个子匹配主题,则将调用每个回调(例如,子传感器/# 和子+ /湿度都匹配具有主题传感器/湿度的消息,因此两个回调将处理该消息)。

5.message_callback_remove (sub )

    使用message_callback_add()删除先前注册的主题/订阅特定回调 。
        sub --- 要删除的订阅过滤器

6. on_publish (client , userdata , mid )

    当使用publish()调用发送的消息已完成向代理的传输时调用。对于QoS级别为1和2的消息,这意味着已完成相应的握手。对于QoS 0,这仅表示消息已离开客户端。所述中间变量从相应的返回的中间可变匹配发布()调用,以允许跟踪传出消息。
    此回调很重要,因为即使publish()调用返回成功,也并不总是意味着消息已被发送。

7.on_subscribe (client , userdata , mid , granted_qos )

    当代理响应订阅请求时调用。该中期变量从相应返回的中期可变匹配订阅()调用。该granted_qos变量是给QoS级别的经纪人已经授予每个不同的订阅请求的整数列表。

8.on_unsubscribe (client , userdata , mid )

    当代理响应取消订阅请求时调用。该中期变量从相应返回的中期可变匹配退订() 调用。

9.on_log (client , userdata , level , buf )

    当客户端有日志信息时调用。定义以允许调试。的 电平可变给出了消息的严重程度和将其中 MQTT_LOG_INFO,MQTT_LOG_NOTICE,MQTT_LOG_WARNING,MQTT_LOG_ERR,和MQTT_LOG_DEBUG。消息本身就是buf。
    这可以与标准Python日志记录同时使用,可以通过enable_logger方法启用。

10.on_socket_open(client,userdata,sock)

    打开插座时调用。使用此命令注册带有外部事件循环的套接字以进行读取。

11.on_socket_close(client,userdata,sock)

    当插座即将关闭时调用。使用此选项从外部事件循环取消注册套接字以进行读取。

12.on_socket_register_write(client,userdata,sock)

    当对套接字的写操作失败时调用,因为它将被阻塞,例如输出缓冲区已满。使用此命令向外部事件循环注册套接字以进行写入。

13.on_socket_unregister_write(client,userdata,sock)

     在先前失败后对套接字的写操作成功时调用。使用此选项从外部事件循环中取消注册套接字以进行写入。

8.外部事件循环支持:

1.loop_read (max_packets = 1 )

    套接字准备好读取时调用。max_packets已过时,应保留未设置状态。

2.loop_write (max_packets = 1 )

    套接字准备好写入时调用。max_packets已过时,应保留未设置状态。

3.loop_misc ()

    每隔几秒调用一次,以处理消息重试和ping。

4.socket ()

    返回客户端中使用的套接字对象,以允许与其他事件循环进行交互。此调用对基于选择的循环特别有用。请参阅examples / loop_select.py。

5.want_write ()

    如果有等待写入的数据,则返回true,以允许客户端与其他事件循环接口。此调用对基于选择的循环特别有用。请参阅examples / loop_select.py。

6.STATE CALLBACKS

    on_socket_open
    on_socket_close
    on_socket_register_write
    on_socket_unregister_write
    使用这些回调可以获得有关套接字状态更改的通知。这对于注册或取消注册用于读取和写入的套接字的事件循环特别有用。有关示例,请参阅examples / loop_asyncio.py。
    打开套接字时,将调用on_socket_open。使用事件循环注册套接字以进行读取。
    当即将关闭套接字时,将调用on_socket_close。从事件循环中取消注册套接字以进行读取。
    当对套接字的写入失败,因为它将被阻塞,例如输出缓冲区已满, 则调用on_socket_register_write。使用事件循环注册套接字以进行写入。
    当下一次写入套接字成功时,将调用on_socket_unregister_write。从事件循环中取消注册套接字以进行写入。
    始终按此顺序调用回调:
        on_socket_open
        Zero or more times:
            on_socket_register_write
            on_socket_unregister_write
        on_socket_close

9.全局辅助函数:

    客户端模块还提供一些全局帮助程序功能。

topic_matches_sub(sub,topic)

    可用于检查主题是否 与订阅匹配。
        eg:
            the topic foo/bar would match the subscription foo/# or +/bar
            the topic non/matching would not match the subscription non/+/+

connack_string(connack_code)

     返回与CONNACK结果关联的错误字符串。

error_string(mqtt_errno)

    返回与Paho MQTT错误号关联的错误字符串。

10.Publish

    该模块提供了一些辅助函数,允许以一次性方式直接发布消息。换句话说,它们对于您希望发布到代理的单个/多个消息的情况很有用,然后在没有其他任何需要的情况下断开连接。
  提供的两个函数是single()和multiple()。

single(topic, payload=None, qos=0, retain=False, hostname="localhost",
    port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,
    protocol=mqtt.MQTTv311, transport="tcp")

    将单个消息发布到代理,然后彻底断开连接。
        topic --- 唯一必需的参数必须是有效负载将发布到的主题字符串。
        payload --- 要发布的有效载荷。如果为“”或“无”,则将发布零长度有效负载。
       qos --- 发布时使用的qos,默认为0。
        retain --- 设置要保留的消息(True)或不保留(False)。
        hostname --- 包含要连接的代理的地址的字符串。默认为localhost。
        port --- 连接到代理的端口。默认为1883。
        CLIENT_ID --- 要使用的MQTT客户端ID。如果“”或“无”,Paho库将自动生成客户端ID。
        keepalive --- 客户端的keepalive超时值。默认为60秒。
        will --- 包含客户端的will参数的dict:
            will = {'topic':“<topic>”,'payload':“<payload”>,'qos':<qos>,'retain':<retain>}。
        topic是必需的,所有其他参数都是可选的,默认分别为None,0和False。默认为None,表示不应使用。
        auth --- 包含客户端身份验证参数的dict:
            auth = {'username':“<username>”,'password':“<password>”}
       username是必需的,密码是可选的,如果没有提供,则默认为无。默认为None,表示不使用身份验证。
       TLS --- 包含客户端的TLS配置参数的dict:
            dict = {‘ca_certs’:”<ca_certs>”, ‘certfile’:”<certfile>”, ‘keyfile’:”<keyfile>”, ‘tls_version’:”<tls_version>”, ‘ciphers’:”<ciphers”>}
       ca_certs是必需的,所有其他参数都是可选的,如果没有提供,则默认为None,这会导致客户端使用默认行为 - 请参阅paho.mqtt.client文档。默认为None,表示不应使用TLS。
        protocol --- 选择要使用的MQTT协议版本。使用MQTTv31或MQTTv311。
        transport --- 设置为“websockets”以通过WebSockets发送MQTT。保留默认值“tcp”以使用原始TCP。
发布单个示例:
    import paho.mqtt.publish as publish
    publish.single("paho/test/single", "payload", hostname="iot.eclipse.org")

multiple(msgs, hostname="localhost", port=1883, client_id="", keepalive=60,
    will=None, auth=None, tls=None, protocol=mqtt.MQTTv311, transport="tcp")

    将多条消息发布到代理,然后干净地断开连接。
        msg --- 要发布的消息列表。每条消息都是字典或元组。
    如果是dict,只有主题必须存在。默认值将用于任何缺少的参数。dict必须是以下形式:
            msg = {'topic':“<topic>”,'payload':“<payload>”,'qos':<qos>,'retain':<retain>}
        主题必须存在且可能不是空的。如果有效载荷为“”,无或不存在,则将发布零长度有效载荷。如果qos不存在,则使用默认值0。如果不存在retain,则使用默认值False。
         如果是一个元组,那么它必须是以下形式:
          (“<topic>”,“<payload>”,qos,retain)
    有关hostname,port,client_id,keepalive,will,auth,tls,protocol,transport的说明,请参阅single()。

发布多个示例

        import paho.mqtt.publish as publish
        msgs = [{'topic':"paho/test/multiple", 'payload':"multiple 1"},("paho/test/multiple", "multiple 2", 0, False)]
        publish.multiple(msgs, hostname="iot.eclipse.org")

11.订阅

该模块提供了一些辅助函数,允许直接订阅和处理消息。提供的两个函数是simple()和callback()。

simple(topics, qos=0, msg_count=1, retained=False, hostname="localhost",
    port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,
    protocol=mqtt.MQTTv311)

    simple:订阅一组主题并返回收到的消息。这是一个阻止功能。

        topics --- 唯一必需的参数是客户端将订阅的主题字符串。如果应订阅多个主题,则可以是字符串或字符串列表。
        Qos --- 订阅时使用的qos,默认为0。
        msg_count --- 要从代理检索的消息数。默认为1.如果为1,将返回单个MQTTMessage对象。如果> 1,将返回MQTTMessages列表。
        retained --- 设置为True以考虑保留的消息,设置为False以忽略具有保留标志集的消息。
        hostname --- 包含要连接的代理的地址的字符串。默认为localhost。
        port --- 连接到代理的端口。默认为1883。
        client_id --- 要使用的MQTT客户端ID。如果“”或“无”,Paho库将自动生成客户端ID。
        keeplive --- 客户端的keepalive超时值。默认为60秒。
        will --- 包含客户端的will参数的dict:
            will = {'topic':“<topic>”,'payload':“<payload”>,'qos':<qos>,'retain':<retain>}。
            主题是必需的,所有其他参数都是可选的,默认分别为None,0和False。默认为None,表示不应使用。
        auth --- 包含客户端身份验证参数的dict:
            auth = {'username':“<username>”,'password':“<password>”}
           用户名是必需的,密码是可选的,如果没有提供,则默认为无。默认为None,表示不使用身份验证。
        tls --- 包含客户端的TLS配置参数的dict:
      dict = {'ca_certs':“<ca_certs>”,'certfile':“<certfile>”,'keyfile':“<keyfile>”,
'tls_version':“<tls_version>”,'ciphers':“<ciphers “>}
            ca_certs是必需的,所有其他参数都是可选的,如果没有提供,则默认为None,这会导致客户端使用默认行为 - 请参阅paho.mqtt.client文档。
            默认为None,表示不应使用TLS。

        protocol --- 选择要使用的MQTT协议版本。使用MQTTv31或MQTTv311。
    简单的例子:
        import paho.mqtt.subscribe as subscribe
        msg = subscribe.simple("paho/test/simple", hostname="iot.eclipse.org")
        print("%s %s" % (msg.topic, msg.payload))

callback(callback, topics, qos=0, userdata=None, hostname="localhost",
        port=1883, client_id="", keepalive=60, will=None, auth=None, tls=None,
        protocol=mqtt.MQTTv311)

    订阅一组主题并使用用户提供的回调处理收到的消息。
        callback --- 一个“on_message”回调,将用于收到的每条消息和表单
            def  on_message (client , userdata , message )
        topic --- 客户端将订阅的主题字符串。如果应订阅多个主题,则可以是字符串或字符串列表。
        Qos --- 订阅时使用的qos,默认为0。
        userdata --- 用户提供的对象,在收到消息时将传递给on_message回调。
    有关hostname,port,client_id,keepalive,will,auth,tls,protocol的说明,请参阅simple()。
    回调示例:
        import paho.mqtt.subscribe as subscribe
        def on_message_print(client, userdata, message):
            print("%s %s" % (message.topic, message.payload))
        subscribe.callback(on_message_print, "paho/test/callback", hostname="iot.eclipse.org")

猜你喜欢

转载自blog.csdn.net/sinat_26940175/article/details/88640331