十三、W5100S/W5500+RP2040之MicroPython开发<MQTT新版OneNET示例>

本文主要是介绍十三、W5100S/W5500+RP2040之MicroPython开发<MQTT新版OneNET示例>,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 前言
  • 2. 平台操作流程
  • 3. WIZnet以太网芯片
  • 4. 示例讲解以及使用
    • 4.1 程序流程图
    • 4.2 测试准备
    • 4.3 连接方式
    • 4.4 相关代码
    • 4.5 烧录验证
  • 5. 注意事项
  • 6. 相关链接

1. 前言

  在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发的新潮流。MicroPython作为一种精简优化的Python 3语言,为微控制器和嵌入式设备提供了高效开发和简易调试的

  当我们结合WIZnet W5100S/W5500网络模块,MicroPython和树莓派PICO的开发潜力被进一步放大。这两款模块都内置了TCP/IP协议栈,使得在嵌入式设备上实现网络连接变得更加容易。无论是进行数据传输、远程控制,还是构建物联网应用,它们都提供了强大的支持。

  本章我们将以WIZnet W5100S为例,以MicroPython的开发方式,连接至OneNET新版MQTT上,并定时上报DHT11传感器的温湿度信息以及通过平台下发指令控制板载LED灯亮灭。

2. 平台操作流程

第一步:创建产品

在这里插入图片描述

第二步:创建物模型定义

在这里插入图片描述

第三步:创建设备

在这里插入图片描述

第四步:计算参数

需要将主题的{device-name}替换为设备名(或设备ID)

密码生成工具:https://open.iot.10086.cn/doc/iot_platform/images/tools/token.exe

参数名参数值
mqttHostUrlmqtts.heclouds.com(固定不变)
port1883(固定不变)
clientIdW5100S_W5500(设备ID)
username75w4NMRceb(产品ID)
passwdversion=2018-10-31&res=products%2F75w4NMRceb%2Fdevices%2FW5100S_W5500&et=1791400694&method=md5&sign=FTnZrF14Pqy%2F3CXggctheg%3D%3D(工具计算)
上报温湿度主题$sys/75w4NMRceb/W5100S_W5500/thing/property/post(发布权限)
上报回复主题$sys/75w4NMRceb/W5100S_W5500/thing/property/post/reply(订阅权限)
设置LED状态$sys/75w4NMRceb/W5100S_W5500/thing/property/set(订阅权限)
设置状态回复$sys/75w4NMRceb/W5100S_W5500/thing/property/set_reply(发布权限)

在这里插入图片描述

3. WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max 25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max 25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  • W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  • W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  • W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存

相较于软件协议栈,WIZnet的硬件协议栈以太网芯片有以下优点

  1. 硬件TCP/IP协议栈:WIZnet的硬件协议栈芯片提供了一种硬件实现的TCP/IP协议栈,这种硬件实现的协议栈比软件实现的协议栈具有更好的性能和稳定性。
  2. 不需要额外的嵌入式系统软件栈和内存资源:由于所有的以太网传输和接收操作都由独立的以太网控制器处理,因此不需要额外的嵌入式系统软件栈和内存资源。
  3. 抵抗网络环境变化和DDoS攻击:与易受网络环境变化和DDoS攻击影响的软件TCP/IP协议栈相比,硬件协议栈芯片能够提供更稳定的以太网性能。
  4. 适用于低规格的嵌入式系统:即使在低规格的嵌入式系统中,使用WIZnet的硬件协议栈芯片也可以比使用软件TCP/IP协议栈的高规格系统显示出更高效的互联网应用操作性能。

在这里插入图片描述

4. 示例讲解以及使用

4.1 程序流程图

在这里插入图片描述

4.2 测试准备

软件:

  • Thonny
  • OneNET平台

硬件:

  • W5100S IO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • DHT11温湿度传感器
  • Micro USB 接口的数据线
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口
  • 当使用W5100S/W5500 IO模块连接RP2040时
    • RP2040 GPIO 16 <----> W5100S/W5500 MISO
    • RP2040 GPIO 17 <----> W5100S/W5500 CS
    • RP2040 GPIO 18 <----> W5100S/W5500 SCK
    • RP2040 GPIO 19 <----> W5100S/W5500 MOSI
    • RP2040 GPIO 20 <----> W5100S/W5500 RST
  • DHT11连接RP2040
    • RP2040 GPIO 2 <----> DHT11 data
    • RP2040 3V3 <----> DHT11 VCC
    • RP2040 GND <----> DHT11 GND
  • 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)

4.4 相关代码

  我们直接打开mqtt_onenet_new.py文件。

第一步:可以看到在w5x00_init()函数中,进行了SPI的初始化。以及将spi相关引脚和复位引脚注册到库中,后续则是激活网络,并使用DHCP配置网络地址信息,当DHCP失败时,则配置静态网络地址信息。当未配置成功时,会打印出网络地址相关寄存器的信息,可以帮助我们更好的排查问题。

第二步:连接OneNET的MQTT服务器,连接失败则进入复位程序。

第三步:开启定时器定时上报温湿度信息,订阅主题并在主循环中等待接收消息。

需注意:要将MQTT参数定义改为您的OneNET的MQTT参数

必须订阅上报回复主题(可以不做处理),收到消息设置主题必须回复消息,否则会报错。

#import library
from umqttsimple import MQTTClient
from usocket import socket
from machine import Pin,SPI,Timer
import dht
import network
import time
import json#mqtt config
mqtt_params = {}
mqtt_params['url'] = "mqtts.heclouds.com"
mqtt_params['port'] = 1883
mqtt_params['clientid'] = 'W5100S_W5500'
mqtt_params['username'] = '75w4NMRceb'
mqtt_params['passwd'] = 'version=2018-10-31&res=products%2F75w4NMRceb%2Fdevices%2FW5100S_W5500&et=1791400694&method=md5&sign=FTnZrF14Pqy%2F3CXggctheg%3D%3D'
mqtt_params['pubtopic'] = '$sys/' + mqtt_params['username'] + '/' + mqtt_params['clientid'] + '/thing/property/post'
mqtt_params['pubtopic_reply'] = '$sys/' + mqtt_params['username'] + '/'+mqtt_params['clientid'] + '/thing/property/post/reply'
mqtt_params['subtopic'] = '$sys/' + mqtt_params['username'] + '/' + mqtt_params['clientid'] + '/thing/property/set'
mqtt_params['subtopic_reply'] = '$sys/' + mqtt_params['username'] + '/' + mqtt_params['clientid'] + '/thing/property/set_reply'message_interval = 5
timer_1s_count =  0
tim = Timer()#DHT11 definitions
pin = Pin(2,Pin.OUT)
sensor = dht.DHT11(pin)led = Pin(25, Pin.OUT)#mqtt client
client = None"""
W5x00 chip initialization.param: None
returns: None"""
def w5x00_init():#spi initspi=SPI(0,2_000_000, mosi=Pin(19),miso=Pin(16),sck=Pin(18))nic = network.WIZNET5K(spi,Pin(17),Pin(20)) #spi,cs,reset pinnic.active(True)#network activetry:#DHCPprint("\r\nConfiguring DHCP")nic.ifconfig('dhcp')except:#None DHCPprint("\r\nDHCP fails, use static configuration")nic.ifconfig(('192.168.1.20','255.255.255.0','192.168.1.1','8.8.8.8'))#Set static network address information#Print network address informationprint("IP         :",nic.ifconfig()[0])print("Subnet Mask:",nic.ifconfig()[1])print("Gateway    :",nic.ifconfig()[2])print("DNS        :",nic.ifconfig()[3],"\r\n")#If there is no network connection, the register address information is printedwhile not nic.isconnected():time.sleep(1)print(nic.regs())"""
1-second timer callback function.param1: class timer
returns: None"""
def tick(timer):global timer_1s_countglobal clienttimer_1s_count += 1if timer_1s_count >= message_interval:sensor.measure()timer_1s_count = 0sendmsg = '{"id": "123","version": "1.0","params": {"CurrentTemperature": {"value":%s},"CurrentHumidity":{"value":%s}}}'%(str(sensor.temperature()),str(sensor.humidity()))client.publish(mqtt_params['pubtopic'],sendmsg,qos = 0)print("send:",sendmsg)"""
Connect to the MQTT server.param: None
returns: None"""
def mqtt_connect():client = MQTTClient(mqtt_params['clientid'], mqtt_params['url'], mqtt_params['port'],mqtt_params['username'],mqtt_params['passwd'],keepalive=60)client.connect()print('Connected to %s MQTT Broker'%(mqtt_params['url']))return client"""
Connection error handler.param: None
returns: None"""
def reconnect():print('Failed to connected to Broker. Reconnecting...')time.sleep(5)machine.reset() """
Subscribe to the topic message callback function. This function is entered when a message is received from a subscribed topic.param1: The topic on which the callback is triggered
param2: Message content
returns: None"""
def sub_cb(topic, msg):topic = topic.decode('utf-8')msg = msg.decode('utf-8')if topic == mqtt_params['subtopic']:print("\r\ntopic:",topic,"\r\nrecv:", msg)try:parsed = json.loads(msg)if(parsed["params"]["LEDSwitch"] == True):print("LED ON!")led.value(1)else:print("LED OFF!")led.value(0)sendmsg = '{"id": "%s","code": "200","msg": "success"}'%str(parsed["id"])client.publish(mqtt_params['subtopic_reply'],sendmsg,qos = 0)print("send:",sendmsg)sendmsg = '{"id": "123","version": "1.0","params": {"LEDSwitch": {"value":%s}}}'%str(parsed["params"]["LEDSwitch"]).lower()client.publish(mqtt_params['pubtopic'],sendmsg,qos = 0)print("send:",sendmsg)except:print("json load error!")"""
Subscribe to Topics.param: None
returns: None"""
def subscribe():client.set_callback(sub_cb)client.subscribe(mqtt_params['subtopic'],0)print('subscribed to %s'%mqtt_params['subtopic'])client.subscribe(mqtt_params['pubtopic_reply'],0)print('subscribed to %s'%mqtt_params['pubtopic_reply'])def main():global clientprint("WIZnet chip MQTT of OneNET(new version MQTT) example")w5x00_init()try: client = mqtt_connect()except OSError as e:reconnect()tim.init(freq=1, callback=tick)subscribe()while True:client.wait_msg()if __name__ == "__main__":main()

4.5 烧录验证

要测试以太网示例,必须将开发环境配置为使用Raspberry Pi Pico。

  • 所需的开发环境
    • Thonny
  • 如果你必须编译MicroPython,则必须使用Linux或Unix环境。

注意:因为MicroPython的print函数是启用了stdout缓冲的,所以有时候并不会第一时间打印出内容。

运行该脚本必须要有umqttsimple.py库支持,如何添加umqttsimple.py库请查看MQTT协议示例

第一步:将程序复制到Thonny中,然后选择环境为Raspberry Pi Pico,再运行

第二步:可以看到此时每间隔5秒上报了一次温湿度信息,并且平台上也会实时更新。

在这里插入图片描述

第三步:可以通过云平台设置板载LED的状态

在这里插入图片描述

5. 注意事项

  • 如果采用的是WIZnet的W5500来实现本章的示例,则只需烧录W5500的固件并运行示例程序即可。

6. 相关链接

WIZnet官网

本章例程链接

想了解更多,评论留言哦!

这篇关于十三、W5100S/W5500+RP2040之MicroPython开发<MQTT新版OneNET示例>的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527425

相关文章

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语