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--------- ...
 
随机推荐
- 企业应用架构研究系列二:MSF&Scrum 项目管理
			
从业软件项目这么多年,在企业应用开发项目中,项目能否成功,是否能按照项目计划有效的推进,是有很强的一套项目管理理论.最早的时候,接触的项目管理的方法论就是微软的MSF(Microsoft Soluti ...
 - winform 代码生成textbox ,checkbox
			
参考地址:https://jingyan.baidu.com/article/380abd0a6b80701d90192cde.html 首先搭建好Winform项目框架后,创建窗体页面后自行布局 这 ...
 - Redis数据结构详解(1)-redis中的字符串(SDS)
			
前提知识 我们先从百科上摘下Redis的解释: Redis是一个使用ANSI C编写的开源.支持网络.基于内存.分布式.可选持久性的键值对存储数据库. (不用过多在意ANSI,它只是一个标准,你可以理 ...
 - [使用多仓库解决] idea maven 下载源码出现:Cannot download sources Sources not found for: xxx
			
根本原因 依赖托管仓库的库存不足.有的仓库,就是没有团队上传这个依赖.所以多加几个镜像源,总有一个仓库能找到. 解决方案 修改 maven 默认配置文件 "C:\Users\<user ...
 - Kruscal algorithm
			
#include <iostream> #include <algorithm> using namespace std; #define MAX 5 #define INF ...
 - Shiro Session放到Redis中常遇到的问题
			
Shiro会话管理:https://shiro.apache.org/session-management.html#SessionManagement-CustomSessionIDs Redis主 ...
 - java线程池源码分析
			
我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...
 - scrapy--使用案例
			
1.scrapy框架 1.1 安装scrapy pip3 install wheel 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twis ...
 - 学习Squid(三)
			
Squid 缓存服务 1.缓存服务器结束 缓存服务器(cache server),即用来存储(介质为内存及硬盘)用户访问的网页.图片.文件等等信息的专用服务器,这种服务器不仅可以使用户可以最快的得到他 ...
 - Web前端初级问题—ajax登录跳转登录实现
			
当我们的用户进行系统登录时,用户名和密码的验证都是后端验证的.而且,用户登录状态也是要后端设置的,查询数据库后,用户名和密码正确,则在session中存储一个uuid,每个页面需要根据登录状态判断展示 ...