【雕爷学编程】MicroPython手册之 WiPy Telnet 服务器

在这里插入图片描述
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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
WiPy是一款基于MicroPython的无线微控制器模块,它提供了一个完整的硬件和软件解决方案,旨在简化物联网(IoT)设备的开发和部署。

1、微控制器模块:WiPy是一种集成了处理器、内存、无线通信模块和其他必要组件的微型计算机模块。它的设计目标是提供一个紧凑、低功耗的硬件平台,能够运行MicroPython这样的高级编程语言,并具备连接到互联网和其他设备的能力。
2、MicroPython:MicroPython是一种精简版的Python编程语言,专为嵌入式系统和微控制器设计而开发。它提供了Python语言的核心功能和语法,使得开发者能够使用熟悉的Python语法进行硬件控制和物联网应用开发。WiPy作为MicroPython的运行环境,能够直接解释和执行MicroPython代码。
3、物联网(IoT):物联网是指将各种物理设备(如传感器、执行器、嵌入式系统等)通过互联网连接起来,实现智能化、互联互通的网络。WiPy作为一种无线微控制器模块,具备无线通信能力,能够连接到物联网中的其他设备和云平台,实现远程控制和数据交换。
4、无线通信模块:WiPy内置了一种或多种无线通信模块,常见的包括Wi-Fi、蓝牙(Bluetooth)和LoRa等。这些无线通信模块使得WiPy能够通过无线网络与其他设备进行通信,实现数据传输、远程控制、云连接等功能。开发者可以根据具体需求选择适合的无线通信模块。
5、开发和部署:WiPy提供了一套方便的开发工具和开发环境,使得开发者能够快速进行应用程序的开发、调试和测试。开发完成后,WiPy可以直接部署到实际的物联网设备中,与其他设备进行通信和交互。WiPy的紧凑设计和低功耗特性,使得它非常适合嵌入式系统和物联网设备的部署。

在这里插入图片描述
MicroPython的WiPy Telnet服务器是一种基于Telnet协议的服务器功能,用于远程终端访问和控制。

主要特点:

远程终端访问:WiPy Telnet服务器提供了远程终端访问功能,使得用户可以通过Telnet客户端连接到WiPy设备,并在远程环境中执行MicroPython代码和操作设备。
简单易用:WiPy Telnet服务器使用简单,通过配置和启动Telnet服务器,即可实现远程访问。用户可以在Telnet会话中输入命令和代码,与WiPy设备进行交互。
灵活性和可扩展性:WiPy Telnet服务器基于MicroPython语言,具有灵活性和可扩展性。用户可以编写自定义的命令和功能,根据具体需求扩展和定制WiPy的远程控制能力。

应用场景:

教学和学习:WiPy Telnet服务器可用于教学和学习MicroPython编程。教师和学生可以通过Telnet客户端连接到WiPy设备,并在远程终端上编写、运行和调试MicroPython代码,实现实时交互和学习。
远程设备管理:WiPy Telnet服务器可用于远程设备管理和监控。通过Telnet远程访问,管理员可以远程配置和控制WiPy设备,更新固件、修改设置、收集数据等,无需直接访问设备物理位置。
嵌入式系统开发:WiPy Telnet服务器适用于嵌入式系统开发和调试。开发人员可以通过Telnet连接到WiPy设备,实时查看和调试设备状态、运行代码,并进行系统性能分析和故障排查。

注意事项:

安全性:WiPy Telnet服务器使用明文传输,不提供加密功能,因此需要注意安全性。建议在安全的网络环境中使用,或者通过其他安全机制(如VPN)对Telnet连接进行加密保护。
访问控制:为了保护WiPy设备的安全性,需要设置适当的访问控制措施,如设置Telnet访问密码、限制访问IP等,以防止未经授权的访问。
网络稳定性:WiPy Telnet服务器的稳定性受到网络连接的影响。确保网络连接稳定和可靠,避免因网络中断导致的远程终端访问中断或异常。

综上所述,MicroPython的WiPy Telnet服务器提供了远程终端访问和控制的功能,适用于教学、远程设备管理和嵌入式系统开发等场景。在使用WiPy Telnet服务器时,需要注意安全性、访问控制和网络稳定性等方面,以确保远程访问的安全和可靠性。

在这里插入图片描述

案例1:使用MicroPython创建Telnet服务器

from machine import UART, Pin
import time

uart = UART(2, baudrate=9600)
rx_pin = Pin(4, Pin.IN)
tx_pin = Pin(5, Pin.OUT)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 23))
server_socket.listen(1)

print("Telnet server is running on port 23...")

while True:
    # 等待客户端连接
    client_socket, client_address = server_socket.accept()
    print("Client connected: {0}".format(client_address))

    # 接收客户端发送的数据并回显
    while True:
        data = rx_pin.value()
        if not data:
            break
        client_socket.sendall(data)

    # 关闭客户端连接
    client_socket.close()

案例2:使用MicroPython从Telnet客户端读取数据

from machine import UART, Pin
import time
import socket

uart = UART(2, baudrate=9600)
rx_pin = Pin(4, Pin.IN)
tx_pin = Pin(5, Pin.OUT)

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 23))

while True:
    # 等待服务器发送数据
    data = uart.read()
    if data:
        # 将接收到的数据发送给服务器
        tx_pin.value(data)
        client_socket.sendall(data)
    else:
        break

# 关闭连接
client_socket.close()

案例3:使用MicroPython向Telnet客户端发送数据

from machine import UART, Pin
import time
import socket

uart = UART(2, baudrate=9600)
tx_pin = Pin(4, Pin.OUT)

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 23))

while True:
    # 等待用户输入数据并发送给服务器
    data = input("Enter data to send: ")
    tx_pin.value(data)
    client_socket.sendall(data.encode())

# 关闭连接
client_socket.close()

案例4:远程控制

你可以通过telnet连接到WiPy设备,并发送命令来控制它。例如,你可以发送一个命令来点亮或关闭一个LED,或者控制一个电机。以下是一个简单的示例:

import network  
wlan = network.WLAN(network.STA_IF)  
wlan.active(True)  
print(wlan.ifconfig())  
  
# Connect to the WiPy telnet server  
telnet = network.Telnet()  
telnet.open("192.168.1.100") # Change to the IP address of your WiPy  
  
# Send a command to turn on the LED  
telnet.write("led.on()")  
telnet.write('\n') # follow the command with a newline character  
  
# Read the response to make sure the command executed successfully  
response = telnet.read_until('\n') # read until the next newline character  
print(response)  
  
# Close the telnet connection  
telnet.close()

案例5:数据收集

你可以通过telnet连接到WiPy设备,并从它那里收集数据。例如,你可以收集温度读数,或者读取一个传感器的值。你可以编写一个脚本,定期通过telnet连接到WiPy,并读取数据,然后存储或分析这些数据。以下是一个简单的示例:

import network  
import utime  
  
wlan = network.WLAN(network.STA_IF)  
wlan.active(True)  
print(wlan.ifconfig())  
  
# Connect to the WiPy telnet server  
telnet = network.Telnet()  
telnet.open("192.168.1.100") # Change to the IP address of your WiPy  
  
# Read a sensor value and send it through telnet  
while True:  
    value = read_sensor() # replace with your function to read the sensor value  
    telnet.write(str(value) + '\n') # send the value to the telnet server  
    utime.sleep(1) # wait for 1 second before reading again

案例6:远程日志记录

你可以通过telnet连接到WiPy设备,并将日志信息发送到一个远程服务器。例如,你可以将传感器读数、环境条件或其他任何信息发送到一个日志服务器。以下是一个简单的示例:

import network  
import utime  
import ujson as json # import the JSON library for serializing the data  
  
wlan = network.WLAN(network.STA_IF)  
wlan.active(True)  
print(wlan.ifconfig())  
  
# Connect to the WiPy telnet server  
telnet = network.Telnet()  
telnet.open("192.168.1.100") # Change to the IP address of your WiPy  
  
# Collect log data and send it through telnet as JSON objects separated by newlines  
while True:  
    data = {
    
    "timestamp": utime.time(), "value": read_sensor()} # replace with your function to read the sensor value and get the current timestamp  
    telnet.write(json.dumps(data) + '\n') # send the JSON object to the telnet server  
    utime.sleep(1) # wait for 1 second before logging again

案例7:一个使用 telnetlib 库来远程登录 WiPy 并执行命令的案例1。telnetlib 是一个用于实现 Telnet 客户端功能的库,可以通过网络连接到 WiPy 上的 Telnet 服务器,并与之交互。代码如下:

# 导入 telnetlib 库和其他必要的库
import telnetlib
import getpass
import sys

# 定义 WiPy 的 IP 地址和端口号
HOST = "192.168.0.10"
PORT = 23

# 获取用户输入的用户名和密码
user = input("Enter your remote account: ")
password = getpass.getpass()

# 创建一个 Telnet 对象,连接到 WiPy 的 IP 地址和端口号
tn = telnetlib.Telnet(HOST, PORT)

# 等待登录提示,发送用户名和密码
tn.read_until(b"Login as: ")
tn.write(user.encode('ascii') + b"\n")
if password:
    tn.read_until(b"Password: ")
    tn.write(password.encode('ascii') + b"\n")

# 发送一些命令,例如 ls 和 exit
tn.write(b"ls\n")
tn.write(b"exit\n")

# 读取并打印所有的输出
print(tn.read_all().decode('ascii'))

案例8:一个使用 socket 库和 _thread 库来创建一个多线程的 Telnet 服务器的案例2。socket 是一个用于实现网络通信功能的库,可以创建一个监听指定端口的 socket 对象,并接受客户端的连接请求。_thread 是一个用于实现多线程功能的库,可以为每个客户端创建一个新的线程,并在该线程中处理客户端的输入和输出。代码如下:

# 导入 socket 库和 _thread 库
import socket
import _thread

# 定义 WiPy 的 IP 地址和端口号
HOST = "192.168.0.10"
PORT = 23

# 创建一个 socket 对象,设置为 TCP 模式和 IPv4 协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定 socket 到 WiPy 的 IP 地址和端口号
s.bind((HOST, PORT))

# 开始监听端口,最多允许 5 个连接
s.listen(5)

# 定义一个处理客户端连接的函数,作为线程的目标函数
def handle_client(client, addr):
    # 打印客户端地址
    print('Got a connection from {}'.format(addr))
    # 向客户端发送欢迎信息和登录提示
    client.send(b'Welcome to WiPy Telnet Server!\n')
    client.send(b'Login as: ')
    # 接收客户端发送的用户名,最多 1024 字节
    user = client.recv(1024)
    # 向客户端发送密码提示
    client.send(b'Password: ')
    # 接收客户端发送的密码,最多 1024 字节
    password = client.recv(1024)
    # 如果用户名和密码正确,则进入交互模式,否则关闭连接
    if user == b'admin\n' and password == b'admin\n':
        # 向客户端发送登录成功信息和命令提示符
        client.send(b'Login successful!\n')
        client.send(b'> ')
        # 循环接收客户端发送的命令,最多 1024 字节
        while True:
            command = client.recv(1024)
            # 如果命令为空,则跳出循环
            if not command:
                break
            # 如果命令为 exit,则向客户端发送退出信息,并跳出循环
            if command == b'exit\n':
                client.send(b'Bye!\n')
                break
            # 否则,向客户端发送回显信息和命令提示符
            else:
                client.send(b'You typed: ' + command)
                client.send(b'> ')
    else:
        # 向客户端发送登录失败信息
        client.send(b'Login failed!\n')
    # 关闭客户端 socket
    client.close()

# 循环接受客户端的连接请求
while True:
    # 接受一个连接请求,返回一个客户端 socket 和地址
    client, addr = s.accept()
    # 为该客户端创建一个新的线程,调用 handle_client 函数
    _thread.start_new_thread(handle_client, (client, addr))

案例9:一个使用 machine 库和 uos 库来实现一个简单的 shell 程序的案例3。machine 是一个用于控制 WiPy 上的硬件功能的库,可以通过 UART 对象来读写串口数据。uos 是一个用于操作 WiPy 上的文件系统的库,可以通过 listdir 函数来列出指定目录下的文件和文件夹。代码如下:

# 导入 machine 库和 uos 库
import machine
import uos

# 创建一个 UART 对象,连接到 UART0,设置波特率为 115200
uart = machine.UART(0, 115200)

# 定义一个字典,存储不同命令对应的函数
commands = {
    
    
    'ls': uos.listdir, # 列出当前目录下的文件和文件夹
    'cd': uos.chdir, # 改变当前目录
    'pwd': uos.getcwd, # 显示当前目录
    'reset': machine.reset, # 重置 WiPy
}

# 定义一个执行命令的函数
def execute(command):
    # 如果命令为空,则直接返回
    if not command:
        return
    # 将命令按空格分割为列表,例如 'ls /flash' -> ['ls', '/flash']
    args = command.split()
    # 取出列表的第一个元素作为命令名,例如 'ls'
    name = args[0]
    # 如果命令名在字典中,则调用对应的函数,并传入剩余的参数,例如 uos.listdir('/flash')
    if name in commands:
        func = commands[name]
        try:
            result = func(*args[1:])
            # 如果函数有返回值,则打印返回值
            if result is not None:
                print(result)
        except Exception as e:
            # 如果函数抛出异常,则打印异常信息
            print(e)
    else:
        # 如果命令名不在字典中,则打印错误信息
        print('Unknown command: {}'.format(name))

# 循环读取串口输入,并执行命令
while True:
    # 从串口读取一行数据,解码为字符串,去掉末尾的换行符
    command = uart.readline().decode().strip()
    # 执行命令
    execute(command)

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。确保正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133413829