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

在这里插入图片描述

今天我们要聊的是如何使用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.rhkb.cn/news/444773.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈 WMS 的应用行业_SunWMS智慧仓储物流系统

【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。一站式数智工厂解决方案服务商】 仓库管理系统(WMS)已经成为众多行业优化运营、提高效率和竞争力的重要工具。WMS 的应用范围广泛,涵盖了制造业、零售业、电商、…

调用第三方接口

目录 一、分析给出的接口文档 二、请求体格式之间的区别 三、示例代码 一、分析给出的接口文档 一般的接口文档包括以下几大部分: 1、请求URL:http://{ip}:{port}/api/ec/dev/message/sendCustomMessageSingle 2、请求方式:POST、GET等 3、…

基于SpringBoot+Vue的超市管理系统设计实现(协同过滤算法、图形化分析)

🎈系统亮点:协同过滤算法、图形化分析; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端: 技术:框…

主数据驱动的数据治理高清书籍领取

主数据驱动的数据治理 原理、技术与实践 高清版本电子书领取 绝对高清版本的电子书,抓紧来获取吧~~~

【宽字节注入】

字符编码 url 编码 GBK编码 utf8 编码 宽字节注入 php中的转译函数 宽字节注入介绍 练习 正常输入没有回显: 没有回显 usernameadmin&passwordadmin 闭合单引号,依旧没有回显 usernameadmin and 11%23&passwordadmin利用宽字节尝试闭合,依旧…

DIFY上使用多种大语言模型(MindCraft API)

注册MindCraft并创建API KEY 首先我们在智匠MindCraft上注册账号并创建API KEY,参考接口调用文档,查看我们能调用哪些模型。我们可以看到这个开发平台上整合了主流的大语言模型,并且是兼容openai接口的。 进入DIFY的设置界面 然后我们在DIFY上…

ArcGIS属性表怎么连接Excel表格?

ArcGIS中,属性表是存储空间要素非几何特征属性的重要工具。有时,我们需要将这些属性与外部数据,如Excel表格中的数据进行连接。以下是如何在ArcGIS中实现这一过程的步骤。 要把Excel表里的数据导入到ArcGIS里的地图数据里面,对数…

C语言 | Leetcode C语言题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; const int dx[4] {0, 1, 0, -1}; const int dy[4] {1, 0, -1, 0};int dfs(int x, int y, int** grid, int n, int m) {if (x < 0 || x > n || y < 0 || y > m || grid[x][y] 0) {return 1;}if (grid[x][y] 2) {return 0;}g…

统信服务安装mysql8.4版本,二进制文件

一&#xff1a;建立MySQL用户和用户组 sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql 二&#xff1a;下载MySQL安装包 MySQL :: Download MySQL Community Server (Archived Versions) 找对应的版本 三&#xff1a;解压二进制安装包&#xff0c;从命…

【Linux复习】指令

文章目录 1.>2. cat3.系统命令bash和shell和kernel权限只被认证一次粘滞位引入前提知识场景解释为什么普通用户&#xff08;无w权限&#xff09;可以删除文件&#xff1f;为什么普通用户通过sudo设置文件权限为000后仍能删除文件&#xff1f; 结论 粘滞位是干什么的&#xf…

8款宝藏手机app,适配安卓和苹果手机

好用的手机APP太多&#xff0c;差点挑花了眼&#xff01;今天来分享4款苹果手机和4款安卓手机上的宝藏软件&#xff0c;看看你喜欢哪一款~ IOS系统APP 1.搜图神器 一款拥有海量图片资源的图片搜索神器&#xff0c;它聚合海内外知名搜索引擎&#xff0c;想要图片直接搜索就行…

Vue3 响应式数据

ref 基本数据类型响应式 语法&#xff1a;let xxx ref(初始值)。**返回值&#xff1a;**一个RefImpl的实例对象&#xff0c;简称ref对象或ref&#xff0c;ref对象的value属性是响应式的。注意点&#xff1a; TS中操作数据需要&#xff1a;xxx.value&#xff0c;但模板中不需要…

第三届“讯方杯”大赛常见问题解答

9月20日&#xff0c;第三届“讯方杯”全国大学生信息技术应用及创新大赛正式拉开帷幕。自大赛报名启动以来&#xff0c;全国各大高校热烈响应、广泛参与。为了更好地服务于各参赛团队&#xff0c;大赛组委会针对收集到的各类常见问题&#xff0c;整理了热点问答集锦&#xff0c…

大型公共建筑用电管理集中监测平台功能介绍

在当国家对能源管理和环境保护日益重视的背景下&#xff0c;相关政策不断出台&#xff0c;推动企业用能向智能化管理、数字化管理方向转型。电能因为方便传输、易于转换、便于控制等特性&#xff0c;成为广大企事业单位生产、办公主要的能量来源。双碳背景下&#xff0c;由于电…

动态内存管理练习题的反汇编代码分析(底层)

目录 1.练习题回顾 2.反汇编代码 3.分析 lea指令的作用 1.给普通指针赋值 反汇编显示 2.给结构体指针赋值 反汇编显示 mov 指令的作用 1.取普通指针指向地址的值(等价为C语言的*) 反汇编显示 2.取结构体指针指向地址里的值 反汇编显示 3.总结->的作用 4.回到…

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SABO-SVR减法平均算法优化…

Robust多模态模型的开发

本文所涉及所有资源均在 传知代码平台 可获取。 目录 Robust 多模态模型&#xff1a;寻找遗失的模态&#xff01; 一、研究背景 二、模型结构和代码 三、数据集介绍 六、性能展示 六、实现过程 七、运行过程 Robust 多模态模型&#xff1a;寻找遗失的模态&#xff01; 近年来&a…

最新项目全功能知识付费小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 知识付费小程序源码系统是一款基于先进技术架构设计的综合性平台。它旨在为用户提供一站式的知识付费解决方案&#xff0c;涵盖了从内容创作到用户管理的各个环节。 该系统采用了现代化的开发理念和技术手段&#xff0c;确保了系统的稳定性、安全性和高效性。它具有…

ClickHouse 24.9 版本发布说明

本文字数&#xff1a;7295&#xff1b;估计阅读时间&#xff1a;19 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 又到新版本发布的时间了&#xff01; 发布概要 本次ClickHouse 24.9 版本包含了23个新功能&#x1f381;、14项性能优化&#x1f6f…

Golang反射解说

在Go语言中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时检查、修改和操作变量的类型信息。 反射主要用于处理那些在编译时无法确定类型的情况&#xff0c;比如处理接口类型的值、实现通用的函数等。 Go语言中反射的基本…