使用paho.mqtt.client实现MQTT Client连接物联网平台(ThingsCloud)

目录

概述

1 ThingsCloud平台上创建项目

1.1 创建项目

1.2 配置App UI

2 认识paho.mqtt.client

3 实现MQTT Client

3.1 实现的接口介绍

3.2 paho.mqtt.client库函数介绍

3.3 MQTT Client类实现

3.3.1 创建项目

3.3.2 编写MQTT Client类代码

3.3.3 Log工具源码

4 实现User Client功能

4.1 功能介绍

4.1.1 上报数据

4.1.2 订阅数据

4.2 功能代码实现

4.2.1 编写代码

4.2.2 配置ThingsCloud参数

5 系统功能测试

5.1 运行Client连接ThingsCloud

5.2 App查看数据

5.3 注意问题


使用paho.mqtt.client库实现一个MQTT Client,并使其连接到ThingsCloud物联网平台。

概述

本文主要介绍使用paho.mqtt.client库实现一个MQTT Client,并使其连接到ThingsCloud物联网平台。其中包括在ThingsCloud创建项目的方法,配置参数的步骤,设计App UI的详细过程。还是用该MQTT Client发布数据至ThingsCloud,并在ThingsCloud上通过可视面板呈现出来。MQTT Client也能订阅ThingsCloud发布的Topic数据。

1 ThingsCloud平台上创建项目

1.1 创建项目

登录ThingsCloud,并在该平台上创建项目,

https://www.thingscloud.xyz/

创建项目的方法和步骤,参看文档:

https://www.thingscloud.xyz/docs/

创建完成项目后,进入到项目数据参数主页面

1.2 配置App UI

配置AppUI 需要三个步骤,具体实现过程如下:

Step - 1: 配置参数类型

Step - 2: 在设备类型面板上配置App,app上显示的参数会和客户端传递到平台上的数据绑定起来

Step -3: 打开编辑器就可以设计App UI,并将UI item和数据绑定起来

Step - 4: 创建用户,这样App上才能使用该用户名进行登录

2 认识paho.mqtt.client

paho.mqtt.client是一个Python MQTT客户端库,它提供了与MQTT代理进行通信的功能。MQTT是一种轻量级的消息传递协议,通常用于物联网应用中的设备间通信。

使用paho.mqtt.client,可以创建一个MQTT客户端,并使用其提供的方法来连接到MQTT代理,发布和订阅主题,接收和处理消息。

登录网站可以了解paho.mqtt.client的相关内容。登录地址如下:

https://mqtt.org/software/

3 实现MQTT Client

3.1 实现的接口介绍

使用paho.mqtt.client编写一个 MQTT客户端,可以实现,消息订阅,发布功能。主要功能如下:

1)和Broker相关的参数通过配置文件来实现,不能写死在代码里

2)实现publish topic和subscriber topic功能

3)实时打印publish log和subscriber log

4)使用专用的logging库来处理log数据

5)使用class的方式来实现软件功能

3.2 paho.mqtt.client库函数介绍

在使用paho.mqtt.client库函数编写代码之前,必须对它所提供的重要接口函数的用法有一个清晰的认识,这对后面的如何使用这些接口非常重要。paho.mqtt.client提供了需要参数可供使用,这里只介绍一些,编程中必须用到的接口。其他函数的功能和用法可参考官方文档。

1)connect ()

连接MQTT Broker函数,函数原型如下:

参数介绍:

参数名称功能介绍
hostMQTT Broker地址
port连接Broker的端口号
keeplive心跳包时间间隔

2)username_pw_set()

设置Client的用户名和对应的密码,函数原型如下:

参数介绍:

参数名称功能介绍
usernameClient的用户名
passwordClient的用户名对应的密码

3)loop_start()

调用该接口,启动MQTT Client工作线程,这时就可以进行publish或者subscrib 消息,函数原型如下:

4)loop_stop()

调用该接口,销毁MQTT Client工作线程,函数原型如下:

5)subscribe()

订阅消息接口,函数原型如下:

参数介绍:

参数名称功能介绍
topic订阅的主题,例如:subscribe("my/topic", 2)
qos消息的服务质量等级
options and properties这两个参数在MQTT v5.0的版本中使用,当前版本不使用这两个参数

6)unsubscribe()

取消订阅消息接口,函数原型如下:

参数介绍:

参数名称功能介绍
topic取消订阅的主题,例如:unsubscribe("my/topic")
properties这个参数在MQTT v5.0的版本中使用,当前版本不使用这个参数

7)publish()

发布消息接口,函数原型如下:

参数介绍:

参数名称功能介绍
topic发布消息的主题
payload消息内容
qos消息服务等级
retainBroker是否保留消息
properties这个参数在MQTT v5.0的版本中使用,当前版本不使用这个参数

3.3 MQTT Client类实现

3.3.1 创建项目

本项目使用PyCharm 作为开发工具,运行代码前必须安装 paho.mqtt.client库。详细安装方法和步骤见官网文档。创建项目之后编写如下代码

3.3.2 编写MQTT Client类代码

编写一个MQTTClient的user类,实现MQTT Client的基本功能,函数列表和介绍如下:

函数名描述
start注册回调函数和连接MQTT Client
stop断开连接和销毁MQTT Client
usr_subscribe订阅函数
usr_publish发布消息函数
usr_unsubscribe取消订阅函数
usr_on_message订阅消息回调函数
usr_log_callbacklog监控函数
receive_msg接收消息函数

详细代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @describe : mqtt handler
# @Time    : 2022/03/18 16:21
# @Author  : ming fei.tang
import logging
from queue import Queue
​
import paho.mqtt.client as mqtt
​
__all__ = ["MQTTClient"]
​
​
class MQTTClient:
​def __init__(self, host, port, qos, heartbeat, client_id, username, password):self.host = hostself.port = portself.qos = qosself.queue = Queue()self.mqtt_client_id = client_idself.heartbeat = heartbeatself.username = usernameself.password = passwordself.mqtt_client = None
​def usr_on_message(self, user, data, msg):payload = msg.payload.decode('utf-8')payload = payload.replace('\n', '').replace('\r', '').replace(' ', '')logging.debug('subscribe: %s , payload: %s, QoS = %s' % (msg.topic, payload, msg.qos))
​self.queue.put(msg)
​def usr_subscribe(self, topic):self.mqtt_client.subscribe(topic, self.qos)logging.info('subscribe the topic: %s' % topic)
​def usr_unsubscribe(self, topic):self.mqtt_client.unsubscribe(topic)logging.info('unsubscribe %s' % topic)
​def receive_msg(self, timeout=None):logging.info('waiting for message.')if timeout is None:timeout = self.heartbeatreturn self.queue.get(timeout=timeout)
​def usr_publish(self, topic, payload, qos, retain=False):self.mqtt_client.publish(topic, payload, qos, retain)logging.debug('public topic = %s, payload = %s , qos = %s, retain = %s' % (topic, payload, qos, retain))
​def usr_log_callback(self, client, userdata, level, msg):# logging.info('public topic: %s ' % msg)pass
​def start(self):if self.mqtt_client is None:self.mqtt_client = mqtt.Client(client_id=self.mqtt_client_id)self.mqtt_client.on_log = self.usr_log_callbackself.mqtt_client.on_message = self.usr_on_messageself.mqtt_client.username_pw_set(self.username, self.password)self.mqtt_client.connect(self.host, self.port, self.heartbeat)self.mqtt_client.loop_start()logging.info("client('%s') is connected" % self.mqtt_client_id)else:logging.error("mqtt_client object is None")
​def stop(self):if self.mqtt_client is not None:self.mqtt_client.loop_stop()logging.info("client('%s')  is disconnected" % self.mqtt_client_id)self.mqtt_client.disconnect()self.mqtt_client = None

3.3.3 Log工具源码

创建logging_tool.py,编写如下代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2020/4/9 13:05
# @Author  : ming fei.tang
# @File    : log tools
# ---------------------
import os
import logging
import datetime
import sys
​
import coloredlogs
​
__all__ = ["LogTool"]
​
​
class LogTool:def __init__(self):self.log_folder = 'clog' + os.sep + datetime.datetime.now().strftime('%Y%m%d')
​def setup_logging(self, level=logging.DEBUG, filename=None):if os.path.exists(self.log_folder) is False:os.makedirs(self.log_folder)
​log_filename = Noneif filename is not None:log_filename = self.log_folder + os.sep + filename
​log_format = '%(asctime)5s - %(levelname)5s - %(lineno)4s - %(filename)18s - %(message)s'if log_filename is not None:console = logging.StreamHandler(stream=sys.stdout)console.setLevel(logging.getLogger().level)console.setFormatter(logging.Formatter(log_format))logging.getLogger().addHandler(console)
​logging.basicConfig(filename=log_filename, level=level, format=log_format)coloredlogs.install(level=level, fmt=log_format, milliseconds=True)
​def remove_log_folder(self):if os.path.exists(self.log_folder) is False:os.remove(self.log_folder)
​

4 实现User Client功能

4.1 功能介绍

4.1.1 上报数据

上报的数据结构

payload = {"temperature": 0,"humidity": 62.5, "luminosity": 2000, "co2": 62.5, "switch": True}

数据类型说明:

参数数据类型描述
temperatureNumber (数值)温度值
humidityNumber (数值)湿度值
luminosityNumber (数值)光照值
co2Number (数值)CO2浓度值
switchSwitch (开关量)开关量状态值

上报数据的Topic:

attributes

4.1.2 订阅数据

订阅数据的Topic:

attributes/push

ThingsCloud发布的控制量为:

4.2 功能代码实现

4.2.1 编写代码

使用Pycharm 创建工程,创建user_mqttClient.py,实现如下代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2024/3/9 21:05
# @Author  : ming fei.tang
# @File    : mqtt client test
# ---------------------
import json
import logging
import random
import time
​
from lib.MQTT_Client import MQTTClient
from lib.logging_tool import LogTool
​
​
class UserMqttClient(MQTTClient):def __init__(self, broker_address, mqtt_port, qos, heartbeat, client_ID, user_name, user_password):# prepare log filesuper().__init__(broker_address, mqtt_port, qos, heartbeat, client_ID, user_name, user_password)self.debug = LogTool()self.debug.setup_logging()self.debug.remove_log_folder()try:self.start()except Exception as e:logging.exception(e)assert False, e
​def load_para(self):pass
​def user_publish(self, topic):switch = False# = {"temperature": 12.5, "light": 1500, "switch": True,"humidity": 62.5}payload = {"temperature": 0,"humidity": 62.5, "luminosity": 2000, "co2": 62.5, "switch": True}while True:payload["temperature"] = 12.5 + random.randint(1, 10) * 0.1# lightpayload["luminosity"] = 2550 + random.randint(10, 55)# humiditypayload["humidity"] = 62.5 + random.randint(10, 15) * 0.1
​# co2payload["co2"] = 1757 + random.randint(1, 10)
​payload["switch"] = switch
​pub_payload = json.dumps(payload)self.usr_publish(topic, pub_payload, 1, True)time.sleep(30)if switch:switch = Falseelse:switch = True
​
​
if __name__ == '__main__':host = "sh-3-mqtt.iot-api.com"port = 1883client_id = ""username = ""password = ""
​user_client = UserMqttClient(host, port, 0, 60, client_id, username, password)
​user_client.usr_subscribe("switch")user_client.usr_subscribe("attributes/push")
​user_client.user_publish(topic="attributes")

4.2.2 配置ThingsCloud参数

User MQTT Client要连接到ThingsCloud必须配置一些参数,这些参数是ThingsCloud分配给每个Client的。在ThingsCloud平台的设备,面板中找到这些参数,并把它们配置到Client中。

在Client的代码需要将上面的参数填在如下位置:

5 系统功能测试

5.1 运行Client连接ThingsCloud

在Ubuntu上运行Client代码会看见:

此时,ThingsCloud平台已经显示该Client上线

如果配置过可视化面板,可以在这个面板,通过UI可以实时显示当前的数据

5.2 App查看数据

进入到用户应用面板,点击微信小程序。

点击微信小程序,扫描其提供的二维码,就能进入到App

进入到App后,可以实时查看当前的数据:

5.3 注意问题

上报至ThingsCloud数据的频率不能太快,否则会出现如下情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2869349.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

客户端:Vue3,服务端:Node,基于Socket.IO实现单聊的功能

目录 1.介绍 2.环境搭建 3.本功能实现的主要逻辑 4.客户端和服务端的主要代码 5.效果展示 6.socket.io的运作原理 1.介绍 本篇主要讲讲基于Socket.IO实现单聊功能的主要实现,包括了客户端和服务端Node。 在这个即时通讯无处不在的时代,实时聊天功能…

Java面试题总结18之springcloud四种分布式事务解决方案

XA规范:分布式事务规范,规定了分布式事务模型 四个角色:事务管理器(协调者TM),资源管理器(参与者RM),应用程序AP,通信资源管理器CRM 全局事务:一…

【Hadoop大数据技术】——MapReduce分布式计算框架(学习笔记)

📖 前言:MapReduce是Hadoop系统核心组件之一,它是一种可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算问题,是目前分布式计算模型中应用较为广泛的一种。 目录 🕒 1. MapReduce概述&am…

JVM学习-JMM

目录 1.什么是JMM 2.JMM怎样保障数据的可见性、有序性、原子性 2.1保证原子性 2.2.保证可见性 2.3保证有序性 3.CAS 3.1乐观锁和悲观锁 3.2 CAS介绍 4.重量级锁的自旋优化 1.什么是JMM JMM即Java内存模型 ,定义了一套在多线程读写共享数据(如数组、成…

贪心算法(算法竞赛、蓝桥杯)--糖果传递

1、B站视频链接&#xff1a;A31 贪心算法 P2512 [HAOI2008] 糖果传递_哔哩哔哩_bilibili 题目链接&#xff1a;[HAOI2008] 糖果传递 - 洛谷 #include <bits/stdc.h> using namespace std; const int N1000005; int n,a[N],c[N]; long long b,ans;int main(){scanf(&quo…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:UIExtensionComponent (系统接口))

UIExtensionComponent用于支持在本页面内嵌入其他应用提供的UI。展示的内容在另外一个进程中运行&#xff0c;本应用并不参与其中的布局和渲染。 通常用于有进程隔离诉求的模块化开发场景。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0…

QT C++ QButtonGroup应用

//QT 中&#xff0c;按钮数量比较少&#xff0c;可以分别用各按钮的信号和槽处理。 //当按钮数量较多时&#xff0c;用QButtonGroup可以实现共用一个槽函数&#xff0c;批量处理&#xff0c;减少垃圾代码&#xff0c; //减少出错。 //开发平台&#xff1a;win10QT6.2.4 MSVC…

Xilinx FPGA模式配置

Xilinx FPGA模式配置 Xilinx UltraScale FPGA有7种配置模式&#xff0c;由模式输入引脚M[2:0]决定。七种模式如图1所示。 图1 7种配置模式 7种模式可分为3大类&#xff0c; 1、JTAG模式&#xff08;可归为从模式&#xff09;&#xff1b; 2、主模式&#xff1b; 3、从模式…

基于SpringBoot SSM vue办公自动化系统

基于SpringBoot SSM vue办公自动化系统 系统功能 登录 个人中心 请假信息管理 考勤信息管理 出差信息管理 行政领导管理 代办事项管理 文档管理 公告信息管理 企业信息管理 会议室信息管理 资产设备管理 员工信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: S…

OpenCV4.9.0开源计算机视觉库在 Linux 中安装

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 环境变量参考 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 引言&#xff1a; OpenCV是一个开源的计算机视觉库&#xff0c;由英特尔公司所赞助。它是一个跨…

【LeetCode热题100】146. LRU 缓存(链表)

一.题目要求 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c…

wsl or 虚拟机 安装

1.wsl2安装 WSL全称Windows Subsystem for Linux&#xff0c;是微软开发的适用于Linux的Windows子系统 如今已经有两代了&#xff1a; 所以用的多的还是wsl2。 安装前需要先去设置启用或关闭Windows功能&#xff1a; 打开适用于linux的子系统和虚拟机平台。 Microsoft Store里…

matlab simulink 工业现场漆包机烘炉模糊PID控制算法

1、内容简介 略 70-可以交流、咨询、答疑 2、内容说明 matlab simulink 工业现场漆包机烘炉模糊PID控制算法 第五章 控制算法仿真与分析 在第二章系统分析结合工业现场漆包机烘炉数学模型详细分析模糊PID控制算法以及解耦控制算法的优缺点、实现原理&#xff0c;为本章算法…

Jmeter---分布式

分布式&#xff1a;多台机协作&#xff0c;以集群的方式完成测试任务&#xff0c;可以提高测试效率。 分布式架构&#xff1a;控制机&#xff08;分发任务&#xff09;与多台执行机&#xff08;执行任务&#xff09; 环境搭建&#xff1a; 不同的测试机上安装 Jmeter 配置基…

Acwing-基础算法课笔记之动态规划(线性DP)

Acwing-基础算法课笔记之动态规划&#xff08;线性DP&#xff09; 一、数字三角形1、概述2、闫氏dp分析法代码示例 二、最长上升子序列1、概述2、闫氏dp分析法3、过程模拟4、代码演示 三、最长上升子序列强化版1、概述2、代码示例 四、最长公共子序列&#xff08;LCS&#xff0…

FFmpeg查看所有支持的编码/解码器/封装/解封装/媒体格式/滤镜

查看所有支持的编码器与解码器 ffmpeg -codecs 只查看所有编码器: ffmpeg -encoders 只查看所有解码器: ffmpeg -decoders 只查看H264编码器: ffmpeg -h encoderh264 只查看H264解码器: ffmpeg -h decoderh264 查看所有支持的封装: ffmpeg -muxers 查看所有支持的解封装…

三.使用java的API文档

在Java中&#xff0c;API是指“应用程序接口”&#xff08;Application Programming Interface&#xff09;。Java API是Java编程语言中提供的类和接口的集合&#xff0c;用于开发各种类型的应用程序。类比C的STL&#xff08;标准模板库&#xff09;。 通俗理解就当做些封装好…

Spark-Scala语言实战(1)

在之前的文章中&#xff0c;我们学习了如何在Linux安装Spark以及Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark及Scala的安装https:/…

如何在Windows11上安装WSL和Linux子系统以及搭建Docker环境

今天给大家介绍一下如何在Windows11上安装Docker 打开控制面板&#xff1a; 打开程序&#xff1a; 打开启用或关闭Windows功能。 勾选Linux子系统&#xff1a; 此时&#xff0c;可能需要重启电脑。 以管理员身份打开PowerShell执行&#xff1a; bcdedit /set hyperv…

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了&#xff0c;指针数组的存放指针的数组&#xff0c;那数组指针变量是什么呢&#xff1f; 显而易见&#xff0c;数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址&#xff0c;我们可以…