Python paho-mqtt使用心得
一、概述
一)基本概念
使用回调处理从MQTT代理返回的数据,要使用回调需要先定义回调函数然后将其指派给客户端实例(client)。
例如:
# 定义一个回调函数
def on_connect(client, userdata, flags, rc):
print("Connection returned " + str(rc))
# 将回调函数指派给客户端实例
client.on_connect = on_connect
所有的回调函数都有client和userdata参数。
client是调用回调的客户端实例;
userdata可以使任何类型的用户数据,可以在创建新客户端实例时设置或者使用user_data_set(userdata)设置。
二)paho-mqtt总的说来分为三部分:
**种类:**
1.服务器连接on_connect()/服务器断开 on_disconnect()
2.信息的回调 on_message()
3.信息的发布on_publish()/信息的订阅on_subscribe()
**介绍:**
1. 使用connect()/connect_async() 连接MQTT代理
2. 频繁的调用loop()来维持与MQTT代理之间的流量
2.1. 或者使用loop_start()来设置一个线程为你调用loop()
2.2. 或者在一个阻塞的函数中调用loop_forever()来为你调用loop()
3.使用subscribe()订阅一个主题(topic)并接受消息(messages)
4.使用publish()来发送消息
5.使用disconnect()来断开与MQTT代理的连接
二、paho-mqtt 在Python中的安装方法
pip install paho-mqtt
三、on_connect()回调函数介绍
当代理响应连接请求时调用。
on_connect(client, userdata, flags, rc):
rc的值决定了连接成功或者不成功:
值 连接情况
0 连接成功
1 协议版本错误
2 无效的客户端标识
3 服务器无法使用
4 错误的用户名或密码
5 未经授权
import paho.mqtt.client as mqtt
#定义一个on_connect方法
def on_connect(client,userdata,flags,rc):
return str(rc)
class IotSubDevViewSet(viewsets.ModelViewSet):
#系统启动后,会把SUBSCRIBED状态的设备加入订阅进程
def init_subscribe():
iotsubdevs = IotSubDev.objects.all()
for iotsubdev in iotsubdevs:
try:
devices_pk = iotsubdev.device.id
client = mqtt.Client()
client.username_pw_set(username=settings.MQTT_USERNAME, password=settings.MQTT_PASSWORD)#设置mqtt服务器用户名和密码
client.on_connect = on_connect
client.on_message = on_message
rc = client.connect(settings.MQTT_HOST, port=1883, keepalive=60)
if(rc==0 and iotsubdev.status=="SUBSCRIBED"):
print("初始化开始sub")
client.subscribe(topic=str(devices_pk),qos=0)
client.loop_start()
print("初始化sub结束")
else:
# print("连接失败")
pass
except:
pass
init_subscribe()
三、on_message()回调函数介绍
import json
def on_message(client, userdata, msg):
msg = msg.payload #将信息转换成json格式
try:
params = json.loads(msg)
except:
return (False)
#Beilai BL102
if tmp =="sensorDatas":
for dc_tmp in params[tmp]:
print(dc_tmp)
timestamp = datetime.now()
try:
ctrlchannel = CtrlChannel.objects.filter(id=dc_tmp['flag']).first()
metricdata = MetricData(ctrlchannel=ctrlchannel,
timestamp=timestamp,
value=dc_tmp['value'],
direction="UP")
metricdata.save()
except:
pass
else:
tmp = "Wrong Parameters"
return tmp
print("Subscribed is OK")
return True
四、on_publish()回调函数介绍
import paho.mqtt.publish as publish
class MetricDataViewSet(viewsets.ModelViewSet):
""""
list:
查询数据点信息列表
create:
创建数据点信息
如果方向为DOWN,支持MQTT发布信息
retrieve:
查询数据点信息详情
update:
更新数据点信息,不建议使用
partial_update:
更新数据点信息的部分属性,不建议使用
destroy:
删除数据点信息
"""
serializer_class = MetricDataSerializer
permission_classes = (permissions.IsAuthenticated,)
# pagination_class = StanderResultsSetPagination
authentication_classes = (authentication.JWTAuthentication,)
queryset = MetricData.objects.all()
def create(self,request , *args, **kwargs):
serializer =self.get_serializer(data=request.data)
if serializer.is_valid(raise_exception=True):
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
try:
if request.data['direction'] == 'DOWN':
ctrlchannels_id = request.data["ctrlchannel"]
ctrlchannels_value = request.data["value"]
# payload = json.dumps(request.data)
#beilai BL102
jsonload ={"sensorDatas":[{"sensorsId":100,
"flag":ctrlchannels_id,
"value": str(ctrlchannels_value)}],
"down":"down"}
print(jsonload)
payload = json.dumps(jsonload)
# print(ctrlchannels_id)
publish.single(topic=ctrlchannels_id+"/100",
payload=payload,
hostname=settings.MQTT_HOST,
auth={'username':settings.MQTT_USERNAME, 'password':settings.MQTT_PASSWORD})
# self.perform_create(serializer)
except:
pass
return Response(serializer.data,status=status.HTTP_201_CREATED,headers=headers)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
Python paho-mqtt使用心得的更多相关文章
- Python实现MQTT接收订阅数据
一.背景 目前MQTT的标准组织官网:http://www.mqtt.org,里面列出了很多支持的软件相关资源. 一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运 ...
- python链接mqtt订阅与发布
什么是mqtt: MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的"轻量级"消息协议.该协议构 ...
- python 爬虫抓取心得
quanwei9958 转自 python 爬虫抓取心得分享 urllib.quote('要编码的字符串') 如果你要在url请求里面放入中文,对相应的中文进行编码的话,可以用: urllib.quo ...
- Paho - MQTT C Cient的实现
来自我的CSDN博客 在前几天,我大致了解了一下Paho C项目,并对其的一些内容进行了翻译.俗话说,光说不练假把戏,今天就给大家讲一下使用Paho的客户端库文件实现MQTT C Client的过 ...
- PyInstaller打包python脚本的一些心得
PyInstaller打包python脚本的一些心得 因为在公司经常要帮同事做一个从excel表格中提取出需要的内容的重复工作,比较繁琐还容易出错:于是就想着要写个程序,但是同事又不可能在电脑上也装上 ...
- [3] MQTT,mosquitto,Eclipse Paho---怎样使用 Eclipse Paho MQTT工具来发送订阅MQTT消息?
在上两节,笔者主要介绍了 MQTT,mosquitto,Eclipse Paho的基本概念已经怎样安装mosquitto. 在这个章节我们就来看看怎样用 Eclipse Paho MQTT工具来发送接 ...
- vc2015编译paho.mqtt.c-1.1.0
vc2015打开“\paho.mqtt.c-1.1.0\Windows Build\Paho C MQTT APIs.sln” 将文件“\paho.mqtt.c-1.1.0\src\VersionIn ...
- paho.mqtt.embedded-c MQTTPacket transport.c hacking
/******************************************************************************* * paho.mqtt.embedde ...
- paho.mqtt.embedded-c MQTTPacket pub0sub1.c hacking
/******************************************************************************* * paho.mqtt.embedde ...
- 阅读Python官方文档心得
我会每天都阅读一些python的官方文档,并每天更新心得体会. -------------------------------------------------2016.12.08--------- ...
随机推荐
- FusionCube 9000 虚拟化之数据库场景(虚拟化超融合基础设施)
1.本场景为fusioncube9000虚拟化场景,带两台dbn节点. 配置清单: 1台cna节点 2台dbn节点,部署数据库操作系统,一般安装oracle数据双机. 2台mcna节点,作为管理节点, ...
- OpenCores注册步骤和成功提交
一 OpenCores 网站简介,这个是全世界最大的FPGA开源IP核网站.由于最近在学习USB2.0host control IP,所以想去网上下载相关的IP例程学习.通过搜索发现,有两个网站十分 ...
- bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树)
bzoj5315/luoguP4517 [SDOI2018]战略游戏(圆方树,虚树) bzoj Luogu 题目描述略(太长了) 题解时间 切掉一个点,连通性变化. 上圆方树. $ \sum |S| ...
- Hadoop2.x与Hadoop3.x副本选择机制
HDFS 上的文件对应的 Block 保存多个副本,且提供容错机制,副本丢失或者宕机自动恢复,默认是存 3 个副本. 2.8.x之前的副本策略 官方文档说明: https://hadoop.apach ...
- Ls 命令执行什么功能?可以带哪些参数,有什么区别?
ls 执行的功能:列出指定目录中的目录,以及文件 哪些参数以及区别:a 所有文件 l 详细信息,包括大小字节数,可读可写可执行的权限等
- 什么是内部类? Static Nested Class 和 Inner Class的不同?
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员. 内部类作为其外部类的一个成员,因此内部类可以直接访问外部类的成员.但有一点需要指出:静态成员不能访问非静态成员,因此静态内部类不能访问外部 ...
- 为什么Java中 wait 方法需要在 synchronized 的方法中调用?
另一个棘手的核心 Java 问题,wait 和 notify.它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上 ...
- Dubbo SPI 和 Java SPI 区别?
JDK SPI JDK 标准的 SPI 会一次性加载所有的扩展实现,如果有的扩展吃实话很耗时,但 也没用上,很浪费资源. 所以只希望加载某个的实现,就不现实了 DUBBO SPI 1,对 Dubbo ...
- 什么是Spring MVC框架的控制器?
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现.控制器解析用户输入并将其转换为一个由视图呈现给用户的模型.Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器.
- pg数据库排序和limit同时使用遇到的奇怪问题
这两天由于一位实习生同事回学校答辩,因此我来跟进他之前开发的功能进行测试,测试反馈上来这么一个问题: 也就是说下面这两条sql查询出来的数据前10条的数据不一样. select * from tabl ...