Python物联网编程:10个IoT设备通信的脚本

news2024/10/11 19:01:06

在这里插入图片描述

今天我们要聊的是如何使用Python编写脚本来实现10个IoT设备之间的通信。物联网(IoT)是一个充满无限可能的领域,它将日常设备连接到互联网,使它们能够互相通信、收集数据并做出响应。Python以其简洁易懂的语法和强大的库支持,成为了实现IoT项目的首选语言之一。

一、基础知识:了解MQTT协议

在深入探讨之前,我们先来了解一下MQTT协议。MQTT是一种基于发布/订阅模式的轻量级消息传输协议,非常适合用于物联网设备之间低带宽、高延迟或不可靠的网络环境中。它的工作方式如下:

  • 客户端:发送消息或接收消息。

  • 代理/服务器:作为消息的中转站。

  • 主题:客户端订阅或发布的主题名称。

  • 消息:包含实际信息的数据包。

二、安装必要的库

在开始编写代码之前,我们需要安装几个库来帮助我们实现MQTT协议的功能。这里我们将使用paho-mqtt库。

pip install paho-mqtt  

三、创建MQTT客户端

接下来,让我们创建一个简单的MQTT客户端,它可以连接到MQTT代理,并发送和接收消息。

import paho.mqtt.client as mqtt  
  
# 定义回调函数  
def on_connect(client, userdata, flags, rc):  
    if rc == 0:  
        print("Connected to MQTT broker")  
    else:  
        print(f"Failed to connect, return code {rc}")  
  
def on_message(client, userdata, message):  
    print(f"Received message: {message.payload.decode()}")  
  
# 创建客户端实例  
client = mqtt.Client()  
  
# 设置回调函数  
client.on_connect = on_connect  
client.on_message = on_message  
  
# 连接到MQTT代理  
client.connect('broker.hivemq.com', 1883)  
  
# 订阅主题  
client.subscribe("iot/topic")  
  
# 发布消息  
client.publish("iot/topic", "Hello IoT!")  
  
# 开始循环处理网络事件  
client.loop_start()  

四、模拟多个设备通信

现在我们已经有了基本的MQTT客户端,接下来我们将模拟多个设备之间的通信。为了简化起见,假设我们有10个设备,每个设备都有一个唯一的ID,并且它们可以相互发送和接收消息。

import threading  
import time  
  
# 设备列表  
devices = []  
  
# 创建设备  
for i in range(10):  
    client = mqtt.Client(f"Device_{i}")  
    client.on_connect = on_connect  
    client.on_message = on_message  
    client.connect('broker.hivemq.com', 1883)  
    devices.append(client)  
  
# 模拟设备间的消息发送  
def send_messages(device_id):  
    while True:  
        for device in devices:  
            if device._client_id != f"Device_{device_id}":  
                device.publish("iot/topic", f"Message from Device_{device_id}")  
                time.sleep(1)  
  
# 启动线程模拟设备活动  
threads = []  
for i in range(10):  
    thread = threading.Thread(target=send_messages, args=(i,))  
    threads.append(thread)  
    thread.start()  
  
# 等待所有线程完成  
for thread in threads:  
    thread.join()  

这段代码首先创建了10个MQTT客户端,每个客户端代表一个设备。然后,我们为每个设备启动了一个线程,这些线程不断地向其他设备发送消息。这样就实现了设备间的简单通信。

五、增加功能:状态更新与查询

为了让我们的物联网系统更加实用,我们可以添加一些额外的功能,比如设备状态的更新与查询。下面的代码展示了如何实现这一点。

# 存储设备状态  
device_states = {}  
  
# 更新设备状态的回调函数  
def update_device_state(client, userdata, message):  
    data = message.payload.decode()  
    device_id, state = data.split(':')  
    device_states[device_id] = state  
    print(f"{device_id} updated its state to {state}")  
  
# 查询设备状态  
def query_device_state(device_id):  
    if device_id in device_states:  
        return device_states[device_id]  
    else:  
        return "Unknown"  
  
# 订阅状态更新主题  
for device in devices:  
    device.subscribe(f"iot/{device._client_id}/status")  
    device.message_callback_add(f"iot/{device._client_id}/status", update_device_state)  
  
# 更新设备状态  
def update_states():  
    for device in devices:  
        new_state = input(f"Enter new state for {device._client_id}: ")  
        device.publish(f"iot/{device._client_id}/status", f"{device._client_id}:{new_state}")  
  
# 查询所有设备的状态  
def check_all_states():  
    for device in devices:  
        print(f"{device._client_id}'s state is {query_device_state(device._client_id)}")  
  
# 示例调用  
update_states()  
check_all_states()  

六、高级功能:数据持久化与日志记录

在实际的物联网项目中,数据持久化和日志记录是非常重要的功能。我们需要记录设备的状态变化和其他重要信息,以便后续分析和调试。Python提供了多种方法来实现这一目标,例如使用SQLite数据库或日志模块。

数据持久化

首先,我们来实现一个简单的SQLite数据库来存储设备的状态信息。

import sqlite3  
  
# 初始化数据库  
conn = sqlite3.connect('iot.db')  
c = conn.cursor()  
c.execute('''CREATE TABLE IF NOT EXISTS device_status  
             (device_id TEXT PRIMARY KEY, status TEXT)''')  
conn.commit()  
  
# 更新设备状态  
def update_device_status(device_id, status):  
    c.execute("INSERT OR REPLACE INTO device_status (device_id, status) VALUES (?, ?)", (device_id, status))  
    conn.commit()  
  
# 查询设备状态  
def get_device_status(device_id):  
    c.execute("SELECT status FROM device_status WHERE device_id=?", (device_id,))  
    result = c.fetchone()  
    return result[0] if result else None  
  
# 示例调用  
update_device_status("Device_1", "on")  
print(get_device_status("Device_1"))  

这段代码创建了一个SQLite数据库表 device_status,用于存储设备的状态信息。update_device_status 函数用于更新设备状态,而 get_device_status 函数用于查询设备的状态。

日志记录

接下来,我们使用Python的日志模块来记录设备的状态变化和其他重要信息。

import logging  
  
# 配置日志  
logging.basicConfig(filename='iot.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')  
  
# 记录设备状态变化  
def log_device_status_change(device_id, old_status, new_status):  
    logging.info(f"Device {device_id} changed status from {old_status} to {new_status}")  
  
# 示例调用  
log_device_status_change("Device_1", "off", "on")  

这段代码配置了日志文件,并定义了一个函数 log_device_status_change 来记录设备状态的变化。通过这种方式,我们可以方便地查看设备的状态变化历史。

七、安全性考虑

在物联网系统中,安全性是至关重要的。我们需要确保设备之间的通信是安全的,防止数据被篡改或泄露。MQTT协议提供了几种方法来增强安全性,包括TLS加密和认证机制。

TLS加密

我们可以使用TLS加密来保护MQTT通信的安全性。这可以通过设置MQTT客户端的TLS参数来实现。

import ssl  
  
# 配置TLS参数  
tls_params = {  
    'ca_certs': '/path/to/ca.crt',  
    'certfile': '/path/to/client.crt',  
    'keyfile': '/path/to/client.key',  
    'tls_version': ssl.PROTOCOL_TLSv1_2,  
    'ciphers': None  
}  
  
# 创建客户端实例  
client = mqtt.Client()  
  
# 启用TLS  
client.tls_set(**tls_params)  
  
# 连接到MQTT代理  
client.connect('broker.example.com', 8883)  
  
# 发布消息  
client.publish("iot/topic", "Hello IoT!")  
  
# 开始循环处理网络事件  
client.loop_start()  

这段代码配置了TLS参数,并启用了TLS加密。这可以确保设备之间的通信数据是加密的,从而提高安全性。

认证机制

除了TLS加密之外,我们还可以使用认证机制来进一步增强安全性。这可以通过设置MQTT客户端的用户名和密码来实现。

# 配置认证参数  
username = 'your_username'  
password = 'your_password'  
  
# 创建客户端实例  
client = mqtt.Client()  
  
# 设置用户名和密码  
client.username_pw_set(username, password)  
  
# 连接到MQTT代理  
client.connect('broker.example.com', 1883)  
  
# 发布消息  
client.publish("iot/topic", "Hello IoT!")  
  
# 开始循环处理网络事件  
client.loop_start()  

这段代码设置了用户名和密码,确保只有经过认证的客户端才能连接到MQTT代理,从而提高系统的安全性。

八、扩展性与维护

在设计物联网系统时,我们还需要考虑系统的扩展性和维护性。随着设备数量的增加,我们需要确保系统能够轻松扩展,并且能够方便地进行维护和升级。

动态添加设备

为了支持动态添加设备,我们可以使用一个配置文件来管理设备的信息。这样,当需要添加新设备时,只需要修改配置文件即可。

import yaml  
  
# 读取设备配置文件  
with open('devices.yaml', 'r') as file:  
    devices_config = yaml.safe_load(file)  
  
# 创建设备实例  
devices = []  
for device_info in devices_config:  
    client = mqtt.Client(device_info['id'])  
    client.on_connect = on_connect  
    client.on_message = on_message  
    client.connect(device_info['broker'], device_info['port'])  
    devices.append(client)  
  
# 示例配置文件  
# devices.yaml  
"""  
- id: Device_1  
  broker: broker.example.com  
  port: 1883  
- id: Device_2  
  broker: broker.example.com  
  port: 1883  
"""  

这段代码读取了一个YAML格式的配置文件,该文件包含了设备的基本信息。通过这种方式,我们可以方便地添加或删除设备,而不需要修改代码。

监控与维护

为了方便监控和维护系统,我们可以使用一些工具和服务,例如Prometheus和Grafana。这些工具可以帮助我们实时监控设备的状态,并生成详细的图表和报告。

from prometheus_client import start_http_server, Gauge  
  
# 初始化监控指标  
device_status_gauge = Gauge('device_status', 'Device status', ['device_id'])  
  
# 更新监控指标  
def update_monitoring(device_id, status):  
    device_status_gauge.labels(device_id).set(status)  
  
# 示例调用  
update_monitoring("Device_1", "on")  
  
# 启动HTTP服务器  
start_http_server(8000)  

这段代码使用了Prometheus客户端库来初始化监控指标,并更新这些指标。通过这种方式,我们可以实时监控设备的状态,并通过Grafana生成详细的图表。

总结

本文介绍了如何使用Python编写脚本来实现10个IoT设备之间的通信。我们从基础知识入手,逐步介绍了MQTT协议的应用、设备间的简单通信、设备状态的更新与查询、数据持久化与日志记录、安全性考虑以及系统的扩展性和维护。通过这些步骤,我们可以构建一个完整的物联网系统,确保其高效、安全、可扩展且易于维护。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
在这里插入图片描述

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

👉Python必备开发工具👈

在这里插入图片描述

👉Python学习视频合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方二维码免费领取

在这里插入图片描述

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

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

相关文章

力扣题/回溯/N 皇后

N 皇后 力扣原题 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解…

代码随想录day32:动态规划part5

完全背包 二维 /* 完全背包&#xff1a;动态规划 */ int unboundedKnapsackDP(int[] wgt, int[] val, int cap) {int n wgt.length;// 初始化 dp 表int[][] dp new int[n 1][cap 1];// 状态转移for (int i 1; i < n; i) {for (int c 1; c < cap; c) {if (wgt[i -…

009——二叉树

目录 二叉树的五种基本形态&#xff1a; 1.二叉树可以是空树 2.只有一个根节点的树 3.斜树&#xff1a;只有左子树或右子树的树 4.左右孩子都有的树 二叉树的性质&#xff1a; 1.假设根节点是第一层&#xff0c;在二叉树的第i层上最多有2^(n-1)个结点 2.深度为k的二叉树…

【JAVA+flowable】工作流 获取流程节点 几种方法总结

flowable中 获取流程中任务节点的方法有好几种 1.这种是常见的一种 获取流程 正在激活 中任务节点 List<HistoricActivityInstance> historicActivityInstanceList historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId).activityTyp…

Java面试宝典-Java集合02

目录 Java面试宝典-Java集合02 21、TreeMap 和 TreeSet 在排序时如何比较元素&#xff1f; 22、ArrayList 和 LinkedList 的区别是什么&#xff1f; 23、ArrayList 和 Vector 的区别&#xff1f; 24、队列和栈是什么&#xff1f;有什么区别&#xff1f; 25、Queue和Deque的区别…

FreeRTOS对事件标志组的总结

事件标志组 事件标志组讲可以用一个例子来理解&#xff0c;“拼车”&#xff0c;一辆车上有32个座位&#xff08;一个事件标志组的长度&#xff09;&#xff0c;前8个座位用来存放车辆信息&#xff0c;车上可以坐24个人。我们可以选择当所有人都坐满再发车&#xff0c;也可以选…

常用类(一)----包装类的使用和分析

文章目录 1.包装类2.课堂测试题3.包装类方法4.Integer创建机制5.Integer面试题 1.包装类 概念&#xff1a;基本数据类型对应的类就是包装类&#xff0c;就是为了把基本数据类型转换为包装类&#xff0c;使用这个类里面的方法操作数据----装箱的过程&#xff1b; //装箱&#…

算子级血缘在数据全链路变更感知、影响分析场景下的应用

我们都知道&#xff0c;数据的完整性、可用性和准确性对企业决策至关重要。数据采集、存储、加工到消费的任何一个环节失误都可能对最终的数据质量产生负面影响。而今&#xff0c;数据量激增、数据资产多样化及数据加工链路复杂化&#xff0c;数据全链路变更感知监控和影响面精…

Magnum IO

NVIDIA Magnum IO 文章目录 前言加速数据中心 IO 性能,随时随地助力 AINVIDIA Magnum IO 优化堆栈1. 存储 IO2. 网络 IO3. 网内计算4. IO 管理跨数据中心应用加速 IO1. 数据分析Magnum IO 库和数据分析工具2. 高性能计算Magnum IO 库和 HPC 应用3. 深度学习Magnum IO 库和深度…

AndroidStudio配置MQTT连接云平台EMQX

引言 本篇博客主要介绍mqtt和emqx配置连接实现数据收发&#xff0c;我会从基础的本机连接到手机和本机连接再到手机实现mqtt连接云平台&#xff0c;大家可以根据需要自行选择观看&#xff08;后面两个教程都建立在mqtt和emqx下载完成的基础上&#xff0c;若没有下载完成&#x…

一文介绍SQL标准1986~2023的演变

SQL标准1986年制定第一版&#xff0c;到最新的2023版&#xff0c;已经有38年的历史&#xff0c;现在依然是计算机非常活跃的语言&#xff0c;50%的程序员都能掌握SQL&#xff0c;数据分析师也是SQL的主要使用人员之一。 从早期的基本语法&#xff0c;到融合了XML、JSON等复杂数…

vue-组件通信

组件通信是什么 组件通信就是组件与组件之间的数据传递 组件的数据是独立的&#xff0c;无法直接访问其他组件的数据 组件关系 组件关系的两大类&#xff1a; 组件A和B是非父子关系&#xff0c;组件C对于A和B是父子关系 父子通信 父组件通过props将数据传递给子组件 子组件利…

sed awk 第二版学习(六)—— 编写 awk 脚本

目录 一、awk 程序设计模型 二、模式匹配 三、记录和字段 1. 字段的引用和分离 2. 字段的划分 四、表达式 五、系统变量 1. FS、OFS、RS、ORS 2. NF 3. NR、FILENAME、FNR 4. CONVFMT、OFMT 5. 两个例子 &#xff08;1&#xff09;处理多行记录 &#xff08;2&am…

Alas配置更新器自动更新

之前我的部署方法有些问题&#xff0c;不应该下载源码再上传到服务器&#xff0c;这样会导致无法使用更新器&#xff0c;只能手动更新&#xff0c;比较麻烦&#xff0c;最近改用git方式获取源码&#xff0c;解决了无法使用更新器的问题&#xff0c;亲测有效 以下操作均基于雨云…

探索未知,惊喜连连 —— 盲盒小程序开发文案

在这个充满惊喜与好奇的时代&#xff0c;盲盒已经成为了一种独特的文化现象&#xff0c;它不仅仅是一种商品&#xff0c;更是一种心灵的慰藉和乐趣的源泉。为了满足广大盲盒爱好者的需求&#xff0c;我们精心打造了一款盲盒小程序&#xff0c;让惊喜触手可及&#xff0c;随时随…

数据库——创立表和库

数据库&#xff08;Database&#xff09;是一个用于存储、管理和检索数据的系统。它可以组织结构化数据&#xff0c;支持高效的存取和操作。数据库通常由一个数据库管理系统&#xff08;DBMS&#xff09;来支持&#xff0c;常见的DBMS包括&#xff1a; 关系数据库&#xff08;R…

如何正确的用引用作返回值?

错误一&#xff1a;引用作函数返回值&#xff0c;但函数中没用static修饰 下面代码输出什么结果&#xff1f; 输出结果&#xff1a; Q&#xff1a;ret应该是3&#xff0c;为什么再调用一次Add函数后&#xff0c;ret变成了7&#xff1f; 解释&#xff1a; ①&#xff1a;在第二…

steam上传游戏问题汇总

问题 首先是Library Logo 必须是png图片&#xff0c;还必须带上游戏名字你的宣传图不能使用游戏内部的截图。Library_Hero必须是空白的&#xff0c;不能有任何文字。他是和Library_logo合并在一起的。这个法律其实没必要填写。然后我错误的把EULA填写在这里了也报错了 如果你在…

《Linux从小白到高手》综合应用篇:详解Linux系统调优之服务器硬件优化

List item 本篇介绍Linux服务器硬件调优。硬件调优主要包括CPU、内存、磁盘、网络等关键硬件组。 1. CPU优化 选择适合的CPU&#xff1a; –根据应用需求选择多核、高频的CPU&#xff0c;以满足高并发和计算密集型任务的需求。CPU缓存优化&#xff1a; –确保CPU缓存&#x…

电容补偿功率因数不标准会怎样

电容补偿功率因数如果不符合标准&#xff0c;可能会对电力系统和设备运行造成多种负面影响。以下是功率因数补偿不当可能引发的问题&#xff1a; 1、欠补偿或不足补偿的影响 功率因数偏低&#xff1a;如果补偿量不足&#xff0c;功率因数未达到预期值&#xff08;通常在0.9至…