ITADN
tinygo-org/espradio
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

espradio

PkgGoDev Build

TinyGo 包,用于 Espressif ESP32xx 微控制器的无线通信。

目前支持以下处理器上的 WiFi:

  • esp32 双核 XTensa LX6 MCU。
  • [esp32c3 单核 32 位 RISC-V MCU
  • [esp32s3 双核 XTensa LX7 MCU。

Bluetooth 现已在 esp32c3 上得到支持。其他处理器即将推出。有关更多信息,请参阅 TinyGo bluetooth 包。

功能

  • WiFi 站点 (STA) 和软 AP 模式
  • WiFi 扫描
  • ESP-NOW 点对点消息传递,无需接入点或 TCP/IP
  • 使用 TinyGo netdev/netlink 接口的 Go 标准库 net 支持
  • 纯 Go TCP/IP 协议栈,支持 DHCP、DNS 和 NTP(使用 lneto
  • TCP 和 UDP Berkeley 套接字 API
  • 原始以太网帧发送/接收
  • MQTT 客户端支持(使用 natiu-mqtt
  • ESP32-C3 的 QEMU 模拟目标
  • 无堆 HTTP/1.1 服务器,每个请求不分配任何内存(使用 httphi)。请参阅 http-hellowebserver 示例。
  • net/http 可用性,用于 HTTP/2 支持及与其他项目的兼容性。注意:我们强烈建议对于长时间运行的程序使用 httphi 而不是 net/http。请参阅 examples README

使用 HTTP hello 示例入门

我们可以使用 espradio 以及轻量级 httphi 库,在 Seeed Studio XIAO-ESP32C3 上启动一个基本的 HTTP 网络服务器,使用以下代码。请参阅 示例中的所有代码

func main() {
	link := &link.Esplink{}
	netdev.UseNetdev(link)

	println("Connecting to WiFi...")
	failIfErr("connect", link.NetConnect(&nl.ConnectParams{
		Ssid:       ssid,
		Passphrase: password,
	}))

	println("Connected to WiFi.")
	var http httphi.MuxSlice
	http.Handle("/", func(exch *httphi.Exchange) {
		exch.RespondString(200, "application/json", `{"message":"hello"}`)
	})
	var router httphi.Router
	cfg := httphi.DefaultRouterConfig(4, 2048, http.MaxPathValues())
	failIfErr("configuring Router", router.Configure(&http, cfg))
	err := link.ListenAndServe(&router, port)
	failIfErr("Esplink.ListenAndServe", err)
}

使用 TinyGo 将您的程序上传到 ESP32,方法如下。在后续步骤中,您需要修改以下命令:

  • 设置您的 wifi SSID 和密码
  • 根据您的 Xiao 型号设置正确的 target!TinyGo 无法区分 S3 或 C3:
    • C3 使用 -target xiao-esp32c3
    • S3 使用 -target xiao-esp32s3
$ tinygo flash -target xiao-esp32x3 -ldflags="-X main.ssid=yourssid -X main.password=yourpassword" -size short -monitor ./examples/http-hello
   code    data     bss |   flash     ram
 860073   33552  345392 |  893625  378944
Connecting to /dev/ttyACM0...
Connected.      
Detected chip: ESP32-S3
...

如果一切顺利且您的 ESP32 已连接到路由器,您应该会看到它打印出您的 ESP32 的地址,如下所示:HTTP server listening on http://192.168.1.241:80

现在,您可以使用 curl 进行测试,或者直接在浏览器中访问打印出的地址来访问 ESP32!

$ curl -w "\n" http://192.168.1.241/
{"message":"hello"}

工作原理

espradio 使用 Espressif 提供的二进制文件,并通过 TinyGo 内置的 CGo 支持直接调用它们。这使得它们能够快速利用经过充分测试的现有二进制文件进行底层无线电通信。

在此基础上,espradio 随后使用 lneto 包,这是一个纯 Go 实现的第 2 层网络协议栈。

有关更多详细信息,请参阅架构图

示例

examples 目录包含示例以及描述每个示例及其预期输出示例的 README。

架构

flowchart TD
    A["User Application"]
    B["espradio/netlink"]
    C["espradio Stack"]
    D["espradio NetDev"]
    E["CGo Bridge"]
    F["Espressif Binary Blobs"]
    G["ESP32 Radio Hardware"]

    A --Go net/http, httphi or lneto API--> B --Esplink netdev interface--> C --lneto TCP/IP + DHCP/DNS/NTP--> D --EthernetDevice send/recv--> E --radio.c / lib.c / isr.c--> F --WiFi + PHY libs--> G
  • User Application - 你的代码,使用 Go net/http、heapless httphi 路由器,或直接使用 lneto API。
  • espradio/netlink - 实现了 TinyGo netdev/netlink 接口,使 Go 标准库 net 包能够工作。
  • espradio Stack - 封装了 lneto 纯 Go TCP/IP 协议栈,支持 DHCP、DNS 和 NTP。
  • espradio NetDev - L2 以太网设备,负责向无线电发送和接收原始帧。
  • CGo Bridge - C 垫片代码,用于在 Go 和 Espressif 二进制库之间进行转换。
  • Espressif Binary Blobs - 由 Espressif 提供的预编译 WiFi 和 PHY 库。
  • ESP32 Radio Hardware - 片上 2.4 GHz 无线电外设。

更新 esp-wifi-sys

此包使用 esp-wifi-sys 包中的文件,然后将所需的文件复制到 blobs 目录中。

要将这些依赖项更新到最新版本,请运行 make update 命令。这将更新子模块,然后复制所需的文件。然后运行 make patch-esp32s3 以修补 LLD 链接器的 blob。请注意,这可能会破坏现有功能,需要对 TinyGo 链接器文件或其他部分进行修改。

调试

  • netlinkdebug: 启用 netlink 操作打印(webserver 示例)
  • pcapdebug: 启用所有发送和接收包的日志记录(所有示例)
tinygo flash -target=xiao-esp32c3 -tags=netlinkdebug,pcapdebug ./examples/webserver