传统开发通常通过线缆连接开发板;后续开发则应尽可能支持无线控制。许多简单的物联网设备并不会预留连接计算机的有线接口,例如智能照明设备。
这时就需要无线连接。开发板接入网络后,无需再连接计算机也能联网(参见 上一节的手机配网模式)。无线编程的基础,就是先让开发板以简单方式接入本地网络,再从网络中控制它。
MicroPython 使用 Python REPL 作为交互接口,可以反复执行命令。它不同于完整的 Linux 系统,特点是简单易用。
有线连接时通常使用串口 REPL;无线连接时则可以使用 WebREPL。顾名思义,它是通过网络访问的 REPL,如下图所示:
WebREPL 可以直接操作开发板,响应速度较快,使用体验与有线连接相近。
不过 WebREPL 自带的编辑器功能较简单,因此 Mpfshell 也适配了 WebREPL。这样,基于 Mpfshell 的 PyCharm 插件同样支持无线编程,并可继续使用原有工具功能,如下图所示。
运行程序时响应很快,但需要注意,两种工具使用的连接路径格式并不相同:
WebREPL 的标准路径为 ws://192.168.30.116:8266。
Mpfshell 的路径为 ws:192.168.30.116,1234,其中 1234 为连接密码;该格式可直接携带密码,省去交互式认证步骤。
此后即可像使用有线连接一样操作开发板。如果期间出现问题,可重启开发板;它会在上电后自动联网并启动 WebREPL 服务。
使用电池供电时,无需计算机供电即可完全无线控制。为降低耗电,必要时可把主频降到 80 MHz,否则电池会很快耗尽。
虽然可以通过 REPL 编程控制开发板,但还需要一些网络服务来完善远程使用体验,下面分别介绍。
从以下代码开始:
import ftptiny
ftptiny.FtpTiny().start()
首先使用以下代码
import webdav
webdav.start()
WebDAV 与 FTP 的区别在于它使用 80 端口和 HTTP 协议。
此功能需要路由器提供相应服务支持,例如 OpenWrt(Linux)。
这样可以使用 hostname.lan(或直接使用 hostname)访问开发板,不必输入 IP 地址。
因此,只需为开发板定义名称,无需记忆 IP 地址。
主机名保存在 wifi_cfg.py 文件中,如下图所示。
以图中的 bit3D6D 为例,访问和测试方法如下:
实际使用方法如下:
更换网络环境后,无需修改访问地址中的 IP,只需更新 Wi-Fi 连接配置。
如果路由器不支持 hostname.lan,还可以使用 mDNS 在本地网络中注册域名。与需要服务器统一管理的公共 DNS 不同,设备可主动注册自己的本地域名。
换句话说,可以把 IP 地址映射为自定义名称,例如 hostname.local。
如下所示,mDNS 也需要路由器和计算机提供相应支持。较旧的路由器或操作系统可能不支持该服务。
Windows 需要额外安装 Bonjour Print Services,可 在此下载。
以下代码用于在开发板上注册 mDNS 服务(所有操作均通过网络完成):
try:
import network
mdns = network.mDNS()
mdns.start("bpibit", "MicroPython with mDNS")
_ = mdns.addService('_ftp', '_tcp', 21, "MicroPython",
{"board": "ESP32", "service": "bpibit FTP File transfer", "passive": "True"})
_ = mdns.addService('_telnet', '_tcp', 23, "MicroPython", {"board": "ESP32", "service": "bpibit Telnet REPL"})
_ = mdns.addService('_http', '_tcp', 80, "MicroPython", {"board": "ESP32", "service": "bpibit Web server"})
print("mDNS started")
except Exception as e:
print("mDNS not started")
随后可在计算机上使用 bpibit.local 代替 IP 地址访问开发板,如下图所示。也可修改代码中 mdns.start("bpibit", "MicroPython with mDNS") 的名称参数。
mDNS 还会公布设备提供的服务。下图是在手机端查看到的结果,可与 MicroPython 代码中的 mdns.addService 参数对照。
图中可以看到注册时提供的 FTP 和 HTTP 等服务信息。
WebDAV 主要提供静态文件服务,并不是由 Python 处理后端逻辑的动态 Web 服务。
因此,固件中提供了 MicroWebSrv,可用于构建 Python 动态网站。
后续将通过一个简单示例,建立类似 PHP 应用的动态 Web 服务。
本节只介绍了无线编程的特点,具体用法将在后续章节逐步展开。这里重点说明无线编程的基本概念和配套功能,同时也应了解它的限制。