在 Linux 中使用 Mongoose 为 ESP8266 开发网络应用程序
在此页
- 谁是谁
- ESP8266
- 猫鼬
- Linux
- 节点MCU
- 连接外部UART-USB转换器
- 验证连接
- 修复“拒绝访问”错误
让我们讨论如何在 Linux 中使用 Mongoose Embedded Web Server 开始为 ESP8266 芯片开发网络应用程序。我将使用 Ubuntu,但所有的东西都可以很容易地适应任何 Linux 发行版。
谁是谁
既然您开始阅读本文,我假设您了解 Linux、ESP8266 和 Mongoose。所以只有一个简短的介绍。
ESP8266
由 Expressif 开发的带有集成 WiFi 的廉价芯片。如果您想深入了解更多细节,请查看官方网站。
猫鼬
Mongoose 是 Cesanta 开发的一个核心小于 40kB 的完整的多协议库。在 Cesanta 站点上查找有关它的模式信息。
Linux
真的吗? 🙂
将 ESP8266 连接到您的计算机
好的,我们首先需要将 ESP8266 芯片连接到您的计算机。您可以通过多种方式做到这一点。
节点单片机
如果你有一个 NodeMCU 模块,带有板载 UART 到 USB 转换器,你所要做的就是通过 USB 将模块连接到计算机。吻!
与外部 UART-USB 转换器连接
如果您的 ESP 模块没有内部 UART-USB 转换器,您需要一个外部转换器。有很多 - 只需用谷歌搜索即可。
选择一个适用于 Linux 的(基本上是大多数)并具有 3.3V 引脚并记住:大多数 UART-USB 转换器都有 3.3V 和 5V 引脚,但您不应将 ESP 连接到 5V 引脚。该设备不耐电压,可能会烧坏您的模块。
现在连接(ESP -> 转换器):
VCC -> 3.3V
接地 -> 接地
RX0 -> TX (不是 RX)
TX0 -> RX
CH_PD -> 3.3V
与 Arduino 连接
如果您没有 UART-USB 转换器,但有带 3.3V 引脚的 Arduino,您可以轻松地使用它来连接 ESP:
- 通过 USB 将 Arduino 连接到计算机
- 将Arduino的RESET连接到它的GND:需要禁用主机处理器,因为我们只需要UART-USB模块
- 连接 ESP(ESP -> Arduino)
- VCC -> 3.3V
- GND -> GND
- RX0 -> RX0 (不是 TX)
- TX0 -> TX
- CH_PD -> 3.3V
验证连接
如果您的连接正常,ESP 应该显示为一个新的 tty 设备。通常,通过 UART-USB 转换器连接的 NodeMCU 和 ESP 显示为 /dev/ttyUSBx(x=0、1、2 等),而 Arduino 的版本显示为 /dev/ttyACMx(x=0、1、2 等)
您可以使用命令 dmesg | grep usb 找到你的设备。
例如,在连接 NodeMCU 之后,您会看到类似这样的内容:
[ 1496.765417] usb 2-3.3: new full-speed USB device number 15 using xhci_hcd
[ 1496.867729] usb 2-3.3: New USB device found, idVendor=10c4, idProduct=ea60
[ 1496.867736] usb 2-3.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1496.867740] usb 2-3.3: Product: CP2102 USB to UART Bridge Controller
[ 1496.867743] usb 2-3.3: Manufacturer: Silicon Labs
[ 1496.867745] usb 2-3.3: SerialNumber: 4202
[ 1497.900384] usbcore: registered new interface driver usbserial
[ 1497.900423] usbcore: registered new interface driver usbserial_generic
[ 1497.900457] usbserial: USB Serial support registered for generic
[ 1497.903897] usbcore: registered new interface driver cp210x
[ 1497.903989] usbserial: USB Serial support registered for cp210x
[ 1497.904382] usb 2-3.3: cp210x converter now attached to ttyUSB0
如您所见,NodeMCU 现在可以作为 /dev/ttyUSB0 使用。
作为最后的检查,使用任何终端连接到新设备;我要用 picocom。这是一个轻量级的终端。在 Ubuntu 中,它可以安装:
sudo apt install picocom
试:
picocom /dev/ttyUSB0 -b 115200
如果一切正常,您应该会在 picocom 输出中看到 \Terminal ready。
修复“拒绝访问”错误
如果 picocom 显示“拒绝访问”,这通常意味着当前用户不是 dialout 组的成员:在 Linux 中,为了访问串行端口,用户必须是该组的成员。
跑步:
sudo usermod -aG docker $USER
命令,注销,重新登录并尝试再次连接 ESP。 \访问被拒绝应该消失了。
建筑猫鼬
从这里下载最新的 Mongoose 版本。
Mongoose 附带了 ESP8266 和 RTOS SDK 的示例。它的教程和示例代码位于此处。
注意:ESP8266 有两个版本的 SDK。第一个是非操作系统,第二个是基于 RTOS 的。在本文中,我将使用后者。要找出它们之间的区别,请谷歌或在官方论坛上阅读此答案。
要构建示例,您有两个选择:
- 使用 docker 和即用型 docker 镜像
- 在您的计算机上安装 SDK 和工具链
使用 Docker
这更简单,我相信更好的方法。 Cesanta 的 docker 镜像包含为 ESP 构建 Mongoose 所需的一切(不仅仅是 Mongoose——任何 ESP 应用程序)。因此,您不需要在本地安装东西,您可以轻松地与朋友和同事分享您的代码,这样他们就可以构建您的固件并获得完全相同的结果。
docker 安装指南可在此处获得。试试看,这真的很简单,您只需要将 docker 存储库添加到您的 Linux 中,然后使用 apt 将其安装为普通程序即可。
安装 docker 后,转到 mongoose/examples/ESP8266_RTOS 文件夹并运行 build.sh
在第一次构建时,docker 将下载所需的图像。这可能需要一段时间,具体取决于您的互联网渠道。但是,在 ./bin 文件夹中完成 build.sh 后,您会发现两个 .bin 文件。
那就是固件。你做到了!
使用本地SDK
如果 docker 对您来说太简单或者出于任何原因您想使用本地安装的工具,您也可以这样做。
这有点难和无聊,但没什么太复杂的。特别是,考虑到 Cesanta 为您构建了一些工具,您不需要从源代码构建它们。
它是这样工作的:
- 从这个 repo 克隆 ESP RTOS SDK。示例 makefile 在 /opt/ESP8266_RTOS_SDK 文件夹中查找它,因此,您可以将克隆的 repo 放入此文件夹或在构建示例之前修改它的路径(见下文)。
- 从这个公用文件夹下载 xtensa-lx106-elf.tar.bz2。
- 解压 xtensa-lx106-elf.tar.bz2 文件。例如,到 /opt 文件夹:
sudo tar -xvf xtensa-lx106-elf.tar.bz2 -C /opt
- 修改您的 PATH 变量,例如,如果您将工具链解压到 /opt 文件夹,请使用以下命令:
export PATH=/opt/xtensa-lx106- elf/bin:路径
(我还建议将此命令添加到您的 .bashrc 或 .profile 文件夹中,以在系统重启后保留更改)
现在运行:
$ export SDK_PATH=/opt/ESP8266_RTOS_SDK # Put your path to SDK here
$ export BIN_PATH=./bin; mkdir ./bin
$ make clean; make BOOT=none APP=0 SPI_SPEED=40 SPI_MODE=dio SPI_SIZE_MAP=0
现在,如果一切安装正确,您将在 ./bin 文件夹中获得固件
你又做到了!
闪烁的 ESP
刷写 ESP8266 的工具有很多。我们将使用 esptool。要使用它,克隆这个 repo 并在你的 PATH 变量中添加 esptool.py 的路径(这是可选的,而且很方便)。
现在,断开 picocom,如果仍然连接(提示:按 Ctrl+A;Ctrl+D 退出)并运行:
esptool.py --port /dev/ttyUSB0 --baud 230400 \
write_flash --flash_mode=dio --flash_size=4m \
0x00000 ${BIN_PATH}/eagle.flash.bin \
0x20000 ${BIN_PATH}/eagle.irom0text.bin \
0x7e000 ${SDK_PATH}/bin/esp_init_data_default.bin重要说明:如果您的模块不是 NodeMCU,则需要在刷写前将 GPIO0 接地(将 GPIO0 接地会将模块切换到闪烁模式)。闪烁后,将 GPIO0 与地断开并重新启动 ESP。
如果没有发生错误,您将看到如下输出:
Connecting...
Erasing flash...
Took 0.58s to erase flash block
Wrote 35840 bytes at 0x00000000 in 1.8 seconds (157.5 kbit/s)...
Erasing flash...
Took 2.02s to erase flash block
Wrote 301056 bytes at 0x00020000 in 15.4 seconds (156.7 kbit/s)...
Erasing flash...
Took 0.11s to erase flash block
Wrote 1024 bytes at 0x0007e000 in 0.1 seconds (163.5 kbit/s)...
Leaving…准备好!现在设备已刷入您的固件。
第一个结果
现在你应该看到一个 \Mongoose WiFi 网络出现。示例设置了一个 AP。使用密码 \Mongoose 连接,然后导航到 http://192.168.4.1/,你会看到一个 \Hello,世界”问候页面。
恭喜!您只需在 ESP8266 上运行 Web 服务器!
下一步
接下来的步骤取决于您。您可以使用所描述的示例作为起点。
查看它的 user_main.c 文件。它设置一个 WiFi 接入点并启动 Web 服务器。您可以轻松地将 AP 模式更改为站模式(并连接到您的 WiFi 网络)并使用 Mongoose API 来实现您想要的任何东西。这是使用 Mongoose 的常见方式,因此,您可以使用另一个 Mongoose 示例来构建您的程序,并在您的 ESP 设备上拥有 http、tcp、udp、mqtt 和更多功能。
使用 Espressif 文档(例如用于发现 Mongoose 功能的文档。
朋克不死!