介绍 请注意, 在编写本文时, esp32 (英文)上没有正式支持 picoweb, 因此本帖提供了一种解决方法来安装它并使其正常工作。
测试是使用 DFRobot 的 esp-wroom-32 设备集成在 Firebettle esp32 板中进行的。本教程中显示的图片来自 esp32 上的测试。
引言 更新:使用upip可以轻松完成库的安装。只需导入upip,并(在连接到WiFi网络之后)执行以下命令即可:
[mw_shl_code=applescript,true] import upip upip.install('picoweb')[/mw_shl_code]
该命令将会安装Picoweb模块以及所有依赖项。因此,您可以忽略“解决软件依赖项问题”和“安装Picoweb”部分,相关内容仅供参考。 非常感谢Siva Kumar指出这一点。他写了一篇很好的有关Picoweb的文章。 连接WiFi 为了完成本教程,必须先将ESP32连接上WiFi,以便其安装所需要的库并运行HTTP Web server网络服务器。 既然我们使用的是uPyCraft,那么就可以使用以下代码编写一段脚本在ESP32上运行,从而自动连接上WiFi。请注意,您需要修改前两个变量,以使其与您的WiFi网络证书相匹配。
[mw_shl_code=applescript,true] import network
def connect():
ssid = "yourNetworkName"
password = "yourNetworkPassword"
station = network.WLAN(network.STA_IF)
if station.isconnected() == True:
print("Already connected")
return
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
pass
print("Connection successful")
print(station.ifconfig())[/mw_shl_code]
上传该文件之后,您只需导入模块并调用其connect(连接)函数,就可以自动连接到WiFi。 请注意,导入模块的名称对应于文件中使用的名称。举例来说,我在代码中将其命名为wifiConnect。本教程使用的uPyCraft版本是v0.22,因此并不需要在文件末尾使用后缀.py,因为IDE会自动添加。但是在更新的版本中,可能会有所不同,因此就需要添加.py后缀。
[mw_shl_code=applescript,true] import wifiConnect
wifiConnect.connect()[/mw_shl_code]
如果您找不到上传的文件,请导入os模块并运行listdir方法。这样会为您显示出文件系统上的已上传文件。
[mw_shl_code=applescript,true] import os
os.listdir()[/mw_shl_code]
连接成功后,MicroPython命令行上就会输出IP地址列表,如图1所示。您最好将它们保存起来,因为我们后面还会用到。
图1 - 成功连接到WiFi后所输出的IP地址。
解决依赖项问题 Deprecated(过时内容):在引言结尾部分提供了一种更简单的Picoweb及其依赖项安装方法。 要在ESP32上使用Picoweb,必须先解决依赖项问题,因为MicroPython默认安装时缺少了一些模块。
[mw_shl_code=applescript,true] import upip
upip.install('micropython-uasyncio')
upip.install('micropython-pkg_resources')[/mw_shl_code]
请注意,安装过程会持续一段时间。安装完成后,在文件系统中就会出现一个叫做lib的新文件夹。您可以使用以下命令对此进行确认:
[mw_shl_code=applescript,true] import os
os.listdir()[/mw_shl_code]
正确的安装结果如图2所示,其中显示了新创建的库文件夹。
图2 - MicroPython模块的新库文件夹。
使用os模块的chdir方法可以查看库里的文件内容,但是我们暂时只需要导入两个模块来验证安装是否成功即可。
[mw_shl_code=applescript,true] import uasyncio
import pkg_resources[/mw_shl_code]
在执行上述2条命令时,如果没有出现错误,那就说明安装成功。 尽管可以在测试期间手动安装(使用与下文所述Picoweb安装相同的方法),但是因为ESP32会出现内存不足错误,所以我仍然无法使用模板功能。所以,本教程将不再考虑utemplate。
安装Picoweb Deprecated(过时内容):在引言结尾部分提供了一种更简单的Picoweb及其依赖项安装方法。 因此,为了保持文件夹的结构,我们先在ESP32 MicroPython文件系统上新建一个叫做picoweb的文件夹,如下所示。
[mw_shl_code=applescript,true] import os
os.mkdir("picoweb")
os.listdir()
[/mw_shl_code]
执行完最后一行代码后,文件系统列表中就会出现新建的文件夹。 接下来,同时上传仓库内picoweb文件夹下的__init__.py和utils.py文件。如前文所述,当前版本的uPyCraft会在缺少文件名后缀时自动添加,因此您在保存文件时加不加.py后缀都没有关系。 使用图3高亮显示的相关菜单项(保存文件和上传文件),可以对utils.py文件进行上传。请注意在弹出对话框中保留原来的文件名。
图3 - 上传utils.py文件示例。
__init__.py文件的上传过程会持续一段时间,具体时长视文件大小而定。如果在文件上传结束后控制台显示存储器错误,直接忽略即可,不必过虑。 上传完成后,您可以重复os.listdir()命令以确认文件确实上传到了文件系统中。 最后,使用下述命令将我们的文件移动到picoweb文件夹。先要确认已经使用前面的命令导入了os模块。最后的命令会确认文件已不在根文件夹内,而是已经复制到了picoweb文件夹。
[mw_shl_code=applescript,true]
os.rename('__init__.py', 'picoweb/__init__.py')
os.rename('utils.py', 'picoweb/utils.py')
os.listdir()
[/mw_shl_code]
接下来就可以导入Picoweb了(不会出现任何错误)。
[mw_shl_code=applescript,true] import picoweb[/mw_shl_code]
Hello World代码
当然,我们首先就要导入刚刚安装的Picoweb模块。
[mw_shl_code=applescript,true] import picoweb[/mw_shl_code]
[mw_shl_code=applescript,true] app = picoweb.WebApp(__name__)[/mw_shl_code]
[mw_shl_code=applescript,true] @app.route("/")
def index(req, resp):
(...)[/mw_shl_code]
该函数会接收上述数据流写入器对象(该对象在索引函数中接收)作为输入参数。 默认状态代码是200,默认内容类型是文本/html,但是我们可以将这些数值作为参数进行传递。在此,我们暂且不会传递任何额外的数值,仅使用默认设置。 最后,使用数据流写入器的awrite方法发送剩余部分内容。我们将发送一条简单的hello world消息。
[mw_shl_code=applescript,true]
yield from picoweb.start_response(resp)
yield from resp.awrite("Hello world from picoweb running on the ESP32")[/mw_shl_code]
如果我们不发送端口参数,则其默认值为8081。若不指定主机,则默认为127.0.0.1。此处我们不指定端口,使用默认值8081。 当然,我们要使用之前连接到WiFi网络时所获取的IP地址(参见上一节)。我们会把这个IP地址作为主机参数中的一个字符串进行传递。 请注意,有多个IP地址被打印了出来。尽管具体情况取决于路由器,但是我们应该使用以192开头而且结尾不是254的IP地址。因此,在本例中,我们将使用192.168.1.87,当然您的地址很可能不是这个样子。有一点非常重要,这是一个本地IP地址,因此在没有路由器端口转发的情况下,您无法从外网访问到服务器。 此外,我们还要把run(运行)方法的debug(调试)参数设置为True(是),这样就能将更多的信息打印到控制台上。 包含函数调用的完整代码如下所示。
[mw_shl_code=applescript,true] import picoweb
app = picoweb.WebApp(__name__)
@app.route("/")
def index(req, resp):
yield from picoweb.start_response(resp)
yield from resp.awrite("Hello world from picoweb running on the ESP32")
app.run(debug=True, host = "192.168.1.87")
[/mw_shl_code]
测试代码 为了测试代码,只需将脚本上传到ESP32开发板上运行即可。我使用的是uPyCraft,所以一切易如反掌。 上传代码后,它就会在uPyCraft上自动执行。如果您使用其他方法上传代码,可能就需要将其作为一个模块导入并手动执行脚本。 脚本执行时,MicroPython串行控制台上会显示一条消息,表示服务器正在运行(如图4所示)。
图4 - 运行Picoweb hello world示例。
要测试ESP32正在对请求进行回应,您只需复制控制台上显示的http地址(其中包含了您的ESP32地址)即可。在uPyCraft上,您需要选择想要复制的文本,然后右键点击,选择复制。切记,使用ctrl+c命令并不能实现复制功能,相反还会使服务器停止运行。 接着,如图5所示,打开一个网页浏览器,将http地址粘贴进去。您将看到我们之前定义的hello world消息。只有在电脑与ESP32处于相同网络时,才能得到上述结果。 如果您想从WiFi网络外部访问ESP32服务器,就需要对路由器进行端口转发。这是一个高级功能(视具体路由器型号而定),超出了本文的范畴。
图5 - Picoweb程序的输出结果。
他写了很多有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击 : ESP32教程汇总贴
|