Python编写MQTT的客户端

服务器是阿里云的ubuntu服务器建立的mosquitto MQTT服务器

使用的库为paho
安装方式

pip install paho-mqtt

我们使用的是这个库的客户端
import paho.mqtt.client as mqtt

一般使用流程:
使用connect连接MQTT服务器
调用loop来维持客户端与服务器的通信
		用loop_start()设置一个线程为之调用
		用循环函数loop_forever()一直调用loop
使用subscribe()订阅主题并接受消息
使用publish()来发送主题消息
使用disconnect()断开与MQTT服务器的连接


回调:
	连接
	当服务器响应客户端的请求时,调用这个函数并返回状态码,RC就是状态码
def on_connect(client,userdata,flag,rc):
	print("connect returnd" + str(rc))
	0		-连接成功
	1		-协议版本错误
	2		-无效的客户端
	3		-服务器无法使用
	4		-密码错误/账户
	5		-未经授权
	
	使用回调函数处理MQTT服务器返回的数据,使用之前你需要定义这个函数,并且要将这个函数的位置告诉客户端
	断开
在与客户端断开连接时使用

def on_disconnect(client, userdata, rc):

RC就是断开状态码。
   消息接受处理
相当于如果有中断处理函数,比如闹钟响了那么你要知道该干嘛。消息收到了的处理函数

on_message(client, userdata, message):

消息内容包含主题和主题内容message.tobic和message.payload
	发送主题被送到
	
	on_publish(client, userdata, mid):
	
当使用publish()发送相关主题和内容到服务器时,盗用此函数
对于Qos级别为1和2的消息,这意味着已经完成了与代理的握手。
对于Qos级别为0的消息,这只意味着消息离开了客户端。
mid变量与从相应的publish()返回的mid变量匹配,以允许跟踪传出的消息。
	服务器同意客户端请求
on_subscribe(client, userdata, mid, granted_qos):

mid变量匹配从相应的subscri be()返回的mid变量。
‘granted_qos’变量是一个整数列表,它提供了代理为每个不同的订阅请求授予的QoS级别。
	客户端取消订阅
	
on_unsubscribe(client, userdata, mid):

mid匹配从相应的unsubscribe()调用返回的中间变量。

构造一个客户端

import paho.mqtt.client as mqtt
client = mqtt.Client()

重启将客户端重置为其开始状态,就像它刚刚创建一样。 它采用与Client()构造函数相同的参数。

client.reinitialise()

连接服务器

client.connect(host, port=1883, keepalive=60, bind_address="")
传入 
主机地址、端口号、最大连接缓冲时间(以秒为单位)、假设存在多个接口,将绑定此客户端的本地网络接口的IP地址

重新连接

client.reconnect()
使用之前联机的提供的地址等、重新连接服务器;必须使用一次connect才可用

断开连接

client.disconnect()
完全的从服务器断开与本地的连接。使用此函数将导致服务器不会发送遗嘱函数

处理网络数据

run = True
while run:
    client.loop()
    
client.loop(timeout=1.0, max_packets=1)
此调用在select()中等待,直到网络套接字可用于读取或写入(如果适用),然后处理传入/传出数据

网络循环的线程接口

loop_start()
loop_stop()
在connect*()之前或之后调用loop_start()一次,会在后台运行一个线程来自动调用loop()。这释放了可能阻塞的其他工作的主线程。这个调用也处理重新连接到服务器。
调用loop_stop()来停止后台线程
client.connect("iot.eclipse.org")
client.loop_start()

while True:
    temperature = sensor.blocking_read()
    client.publish("paho/temperature", temperature)

重复扫描

这是网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接
loop_forever(timeout=1.0, max_packets=1, retry_first_connection=False)
除了使用connect_async时的第一次连接尝试以外,请使用retry_first_connection = True使其重试第一个连接。这可能会导致客户端连接到一个不存在的主机的情况。

发送主题消息

从客户端发送消息给服务器

publish(topic, payload=None, qos=0, retain=False)
主题、内容、服务质量级别、如果设置为True,则该消息将被设置为该主题的“最后已知良好”/保留的消息

订阅一个/多个主题

subscribe(topic, qos=0)
有三种调用方式

(1)字符串、整数
subscribe("topic", 2)
topic	一个字符串,指定要订阅的订阅主题
qos	期望的服务质量等级。 默认为0。

(2)字符串和整数元组
subscribe(("topic", 1))

传入(topic,qos)的元组。 传入的topic和qos的元组形式
qos	没有使用

(3)字符串和整数元组的列表【多个订阅】
这允许在单个SUBSCRIPTION命令中使用多个主题订阅,这比使用多个订阅subscribe()更有效。

subscribe([("my/topic", 0), ("another/topic", 2)])

topic	格式元组列表(topic,qos)。 topic和qos都必须出现在所有的元组中。
qos	没有使用


用完后返回(result,mid)

注意
如果qos不是0,12,或者主题为None或字符串长度为零,或者topic不是字符串,元组或列表,则引发ValueError。

取消一个/多个订阅

unsubscribe(topic)

主题的单个字符串或者字符串列表
import paho.mqtt.client as mqtt


def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("chat")#订阅一个主题为chat


def on_message(client, userdata, msg):
    print(msg.topic+" " + ":" + str(msg.payload))





client = mqtt.Client()#创建一个客户端

client.on_connect = on_connect#连接时调用的函数

client.on_message = on_message#消息订阅后返回时指向处理函数

client.connect("101.122.125.40", 1883, 10)#连接到相应的客户端
print(1)
type(client.loop_forever())#循环的与服务通信
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酸奶可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值