MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。
MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。
MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。
使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。
总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
MicroPython 的 network 模块是一个用于配置和控制网络连接的接口。该模块中的函数和类允许实现对不同类型的网络硬件和协议的访问和操作。使用该模块,需要安装具有网络功能的 MicroPython 版本或构建。
network 模块的主要特点有:
它提供了一个通用的网络适配器接口,用于定义所有网络接口类的公共方法和属性。这些方法和属性包括激活或停用接口、连接或断开网络服务、查询或设置接口配置等。
它提供了一些具体的网络类实现,用于创建和管理特定类型的网络接口对象。这些类包括 WLAN(无线局域网)、LAN(有线局域网)、PPP(点对点协议)、Bluetooth(蓝牙)等。
它提供了一些网络功能函数,用于实现一些常用的网络任务。这些函数包括 ping(测试网络连通性)、route(查询或设置路由表)、reset(重置网络模块)等。
network 模块可以用于以下一些应用场景:
无线连接:利用 network 模块,可以实现对无线网络的连接和配置。例如,可以使用 network 模块来设置 ESP8266 或 ESP32 的 WiFi 连接模式(作为站点或接入点)、扫描可用的 WiFi 网络、连接到指定的 WiFi 网络、查询或设置 WiFi 接口的 IP 地址等。
有线连接:利用 network 模块,可以实现对有线网络的连接和配置。例如,可以使用 network 模块来设置以太网或 PPP 接口的 MAC 地址、IP 地址、子网掩码、网关、DNS 等。
蓝牙通信:利用 network 模块,可以实现对蓝牙设备的通信和控制。例如,可以使用 network 模块来设置蓝牙接口的名称、可见性、配对码、服务等,并与其他蓝牙设备进行扫描、连接、数据传输等。
使用 network 模块时,需要注意以下事项:
在使用该模块上的任何其他方法之前,必须先调用相应类的构造函数来创建一个网络接口对象。创建时,需要传入一些与硬件相关的参数,如引脚号、频率、颜色格式等。
在对网络接口进行修改操作后(如连接或断开网络服务),需要调用 ifconfig 方法来查询或设置接口配置。否则,修改可能会丢失或不一致。
在处理数据时,需要注意数据类型和长度的限制和转换。键和值都必须是 bytes 类型的对象,且长度不能超过 255 字节。如果要存储其他类型的对象,需要先序列化为 bytes 类型。
以下是一些使用 MicroPython 的 network 模块的实际运用程序案例:
案例1:WiFi 扫描:这是一个使用 network 模块来扫描附近可用的 WiFi 网络,并打印它们的 SSID 和信号强度的程序案例。
# 导入 network 模块
import network
# 创建一个 WLAN 对象,作为站点模式
wlan = network.WLAN(network.STA_IF)
# 激活 WLAN 接口
wlan.active(True)
# 扫描附近可用的 WiFi 网络,并返回一个列表
nets = wlan.scan()
# 遍历列表中的每个元素
for net in nets:
# 获取当前 WiFi 网络的 SSID 和信号强度
ssid, bssid, channel, rssi, authmode, hidden = net
# 打印 SSID 和信号强度
print(ssid, rssi)
案例2:以太网配置:这是一个使用 network 模块来配置以太网接口,并获取其 IP 地址的程序案例。:
# 导入 network 模块
import network
# 创建一个 LAN 对象,连接到以太网控制器
lan = network.LAN(mdc = Pin(23), mdio = Pin(18), power = Pin(12), phy_type = network.PHY_LAN8720, phy_addr=0, clock_mode=network.ETH_CLOCK_GPIO17_OUT)
# 激活 LAN 接口
lan.active(True)
# 连接到以太网网络,使用 DHCP 协议自动获取 IP 地址
lan.ifconfig('dhcp')
# 等待连接成功
while not lan.isconnected():
pass
# 获取 LAN 接口的 IP 地址
ip = lan.ifconfig()[0]
# 打印 IP 地址
print(ip)
案例3:蓝牙配对:这是一个使用 network 模块来设置蓝牙接口,并与其他蓝牙设备进行配对的程序案例。:
# 导入 network 和 bluetooth 模块
import network
import bluetooth
# 创建一个 Bluetooth 对象,连接到蓝牙控制器
bt = network.Bluetooth()
# 设置蓝牙接口的名称为 "MicroPython"
bt.config(name="MicroPython")
# 设置蓝牙接口的可见性为 True
bt.config(visible=True)
# 设置蓝牙接口的配对码为 "1234"
bt.config(pin="1234")
# 创建一个回调函数,用于处理配对请求事件
def pair_cb (bt_o):
# 获取事件类型和数据
event, data = bt_o.irq()
# 如果事件类型是配对请求
if event == bluetooth.BT_EVENT_PAIRING:
# 获取请求方的 MAC 地址
mac = data[0]
# 获取请求方的名称(如果有的话)
name = data[1] or "?"
# 打印 MAC 地址和名称
print("Pairing request from: {}, {}".format(mac, name))
# 接受配对请求
bt_o.pair(mac)
# 注册回调函数,用于处理配对请求事件
bt.irq(pair_cb)
案例4:MQTT 客户端:这是一个使用 network 模块来创建一个 MQTT 客户端,可以连接到一个 MQTT 代理,并订阅和发布一些主题的程序案例。
# 导入 network 和 umqtt.simple 模块
import network
import umqtt.simple
# 创建一个 WLAN 对象,作为站点模式
wlan = network.WLAN(network.STA_IF)
# 激活 WLAN 接口
wlan.active(True)
# 连接到一个 WiFi 网络,使用 SSID 和密码
wlan.connect("SSID", "password")
# 等待连接成功
while not wlan.isconnected():
pass
# 打印 WLAN 接口的 IP 地址
print(wlan.ifconfig()[0])
# 定义 MQTT 代理的地址和端口
MQTT_BROKER = "broker.hivemq.com"
MQTT_PORT = 1883
# 创建一个 MQTTClient 对象,使用客户端 ID 和代理地址和端口
client = umqtt.simple.MQTTClient("client_id", MQTT_BROKER, MQTT_PORT)
# 连接到 MQTT 代理
client.connect()
# 打印连接成功的信息
print("Connected to {}".format(MQTT_BROKER))
# 定义一个回调函数,用于处理订阅主题的消息
def sub_cb(topic, msg):
# 打印主题和消息的内容
print("Topic: {}, Message: {}".format(topic, msg))
# 设置回调函数,用于处理订阅主题的消息
client.set_callback(sub_cb)
# 订阅一个主题,如 "test/topic"
client.subscribe(b"test/topic")
# 定义一个无限循环,用于接收和发送消息
while True:
# 尝试接收订阅主题的消息,如果有消息,则调用回调函数处理
client.check_msg()
# 发布一个消息到另一个主题,如 "test/another"
client.publish(b"test/another", b"Hello, MQTT!")
案例5:连接WiFi并获取IP地址:
import network
# 连接WiFi
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("Your_SSID", "Your_Password")
# 等待连接成功
while not wifi.isconnected():
pass
# 获取IP地址
ip_address = wifi.ifconfig()[0]
print("成功连接WiFi,IP地址为:", ip_address)
在这个例子中,我们使用network.WLAN()函数创建一个WiFi对象,并使用active(True)方法激活WiFi。通过调用connect()方法连接到WiFi网络,需要提供SSID和密码。使用isconnected()方法检查是否成功连接到WiFi网络。使用ifconfig()方法获取WiFi接口的IP地址。
案例6:创建一个简单的Web服务器::
import network
import usocket as socket
# 创建WiFi对象并连接到WiFi网络
# 创建Web服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 80))
s.listen(5)
while True:
conn, addr = s.accept()
request = conn.recv(1024)
response = "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\nHello, World!"
conn.send(response)
conn.close()
在这个例子中,我们先使用network.WLAN()函数创建一个WiFi对象并连接到WiFi网络(此处省略)。然后,使用usocket库中的socket模块创建一个套接字对象。通过调用bind()方法绑定IP地址和端口号,这里使用80端口。使用listen()方法开始监听连接请求。
在循环中,使用accept()方法接受来自客户端的连接请求,并使用recv()方法接收客户端发送的请求。然后,构造响应消息并使用send()方法发送给客户端。最后,使用close()方法关闭连接。
案例7:发送HTTP请求::
import network
import usocket as socket
# 创建WiFi对象并连接到WiFi网络
# 发送HTTP请求
def send_http_request(url):
_, _, host, path = url.split('/', 3)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ai = socket.getaddrinfo(host, 80)
addr = ai[0][4]
s.connect(addr)
request = "GET /{path} HTTP/1.0\r\nHost: {host}\r\n\r\n".format(path=path, host=host)
s.send(request)
response = s.recv(4096)
s.close()
return response
# 执行HTTP请求
response = send_http_request("http://example.com")
print(response)
在这个例子中,我们先使用network.WLAN()函数创建一个WiFi对象并连接到WiFi网络(此处省略)。然后,定义一个send_http_request()函数来发送HTTP请求。将URL作为参数传入,解析出主机和路径信息。
使用usocket库中的socket模块创建一个套接字对象,并使用getaddrinfo()函数获取主机的IP地址。调用connect()方法连接到主机的80端口。
构造HTTP请求消息,并使用send()方法发送给主机。使用recv()方法接收主机返回的响应消息。最后,关闭套接字连接,并返回响应消息。
案例8:连接到Wi-Fi网络:使用network模块连接到Wi-Fi网络并获取IP地址。
import network
# 连接到Wi-Fi网络
ssid = 'your_network_ssid'
password = 'your_network_password'
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(ssid, password)
# 等待连接成功
while not wifi.isconnected():
pass
# 打印IP地址
print('IP address:', wifi.ifconfig()[0])
案例9:创建Web服务器:使用network模块创建一个简单的Web服务器,可以提供静态内容。:
import network
import usocket as socket
# 创建Web服务器
html = """
HTTP/1.0 200 OK
<!DOCTYPE html>
<html>
<head>
<title>MicroPython Web Server</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
"""
def handle_request(client_socket):
request = client_socket.recv(1024)
client_socket.send(html)
client_socket.close()
# 配置网络
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid='MicroPython', password='micropythoN')
# 启动Web服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 80))
server_socket.listen(5)
while True:
client_socket, addr = server_socket.accept()
handle_request(client_socket)
案例10:发送HTTP请求:使用network模块发送HTTP请求并接收响应。:
import network
import usocket as socket
# 发送HTTP请求
def send_http_request(url):
_, _, host, path = url.split('/', 3)
addr = socket.getaddrinfo(host, 80)[0][-1]
client_socket = socket.socket()
client_socket.connect(addr)
client_socket.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
response = client_socket.recv(4096)
client_socket.close()
print(response.decode('utf8'))
# 连接到Wi-Fi网络
ssid = 'your_network_ssid'
password = 'your_network_password'
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(ssid, password)
# 等待连接成功
while not wifi.isconnected():
pass
# 发送HTTP请求
send_http_request('http://www.example.com')
这些案例展示了MicroPython的network模块的一些实际运用程序。通过使用network模块,可以连接到Wi-Fi网络、创建Web服务器和发送HTTP请求等网络相关操作。请注意,在使用network模块时,需要根据具体的网络环境和需求进行相应的配置和适配。