mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
234 lines
6.0 KiB
Markdown
234 lines
6.0 KiB
Markdown
### Table of Contents
|
|
|
|
- ["net" Package](#net-package)
|
|
- [Using "net" Package](#using-net-package)
|
|
- [Using "net/http" Package](#using-nethttp-package)
|
|
- [Using "crypto/tls" Package](#using-cryptotls-package)
|
|
- [Using Sockets](#using-sockets)
|
|
|
|
## "net" Package
|
|
|
|
TinyGo's "net" package is ported from Go. The port offers a subset of Go's
|
|
"net" package. The subset maintains Go 1 compatiblity guarantee. A Go
|
|
application that uses "net" will most-likey just work on TinyGo if the usage is
|
|
within the subset offered. (There may be external constraints such as limited
|
|
SRAM on some targets that may limit full "net" functionality).
|
|
|
|
Continue below for details on using "net" and "net/http" packages.
|
|
|
|
See src/net/READMD.md in the TinyGo repo for more details on maintaining
|
|
TinyGo's "net" package.
|
|
|
|
## Using "net" Package
|
|
|
|
Ideally, TinyGo's "net" package would be Go's "net" package and applications
|
|
using "net" would just work, as-is. TinyGo's net package is a partial port of
|
|
Go's net package, so some things may not work because they have not been
|
|
ported.
|
|
|
|
There are a few features excluded during the porting process, in particular:
|
|
|
|
- No IPv6 support
|
|
- No DualStack support
|
|
|
|
Run ```go doc -all ./src/net``` in TinyGo repo to see full listing of what has
|
|
been ported. Here is a list of things known to work. You can find examples
|
|
of these at [examples/net](examples/net/).
|
|
|
|
### What is Known to Work
|
|
|
|
(These are all IPv4 only).
|
|
|
|
- TCP client and server
|
|
- UDP client
|
|
- TLS client
|
|
- HTTP client and server
|
|
- HTTPS client
|
|
- NTP client (UDP)
|
|
- MQTT client (paho & natiu)
|
|
- WebSocket client and server
|
|
|
|
Multiple sockets can be opened in a single app. For example, the app could run
|
|
as an http server listen on port :80 and also use NTP to get the current time
|
|
or send something over MQTT. There is a practical limit to the number of
|
|
active sockets per app, around 8 or 10, so don't go crazy.
|
|
|
|
Applications using Go's net package will need a few setup steps to work with
|
|
TinyGo's net package. The steps are required before using "net".
|
|
|
|
### Step 1: Probe to Load Network Driver
|
|
|
|
Call Probe() to load the correct network driver for your target. Probe()
|
|
allows the app to work on multiple targets.
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"tinygo.org/x/drivers/netlink/probe"
|
|
)
|
|
|
|
func main() {
|
|
|
|
// load network driver for target
|
|
link, dev := probe.Probe()
|
|
|
|
...
|
|
}
|
|
```
|
|
|
|
Probe() will load the driver with default configuration for the target. For
|
|
custom configuration, the app can open code Probe() for the target
|
|
requirements.
|
|
|
|
Probe() returns a [Netlinker](netlink/README.md) and a
|
|
[Netdever](netdev/README.md), interfaces implemented by the network driver.
|
|
Next, we'll use the Netlinker interface to connect the target to an IP network.
|
|
|
|
### Step 2: Connect to an IP Network
|
|
|
|
Before the net package is fully functional, we need to connect the target to an
|
|
IP network.
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"tinygo.org/x/drivers/netlink"
|
|
"tinygo.org/x/drivers/netlink/probe"
|
|
)
|
|
|
|
func main() {
|
|
|
|
// load network driver for target
|
|
link, _ := probe.Probe()
|
|
|
|
// Connect target to IP network
|
|
link.NetConnect(&netlink.ConnectParams{
|
|
Ssid: "my SSID",
|
|
Passphrase: "my passphrase",
|
|
})
|
|
|
|
// OK to use "net" from here on
|
|
...
|
|
}
|
|
```
|
|
|
|
Optionally, get notified of IP network connects and disconnects:
|
|
|
|
```go
|
|
link.Notify(func(e netlink.Event) {
|
|
switch e {
|
|
case netlink.EventNetUp: println("Network UP")
|
|
case netlink.EventNetDown: println("Network DOWN")
|
|
})
|
|
```
|
|
|
|
Here is an example of an http server listening on port :8080:
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"tinygo.org/x/drivers/netlink"
|
|
"tinygo.org/x/drivers/netlink/probe"
|
|
)
|
|
|
|
func HelloServer(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
|
|
}
|
|
|
|
func main() {
|
|
|
|
// load network driver for target
|
|
link, _ := probe.Probe()
|
|
|
|
// Connect target to IP network
|
|
link.NetConnect(&netlink.ConnectParams{
|
|
Ssid: "my SSID",
|
|
Passphrase: "my passphrase",
|
|
})
|
|
|
|
// Serve it up
|
|
http.HandleFunc("/", HelloServer)
|
|
http.ListenAndServe(":8080", nil)
|
|
}
|
|
```
|
|
|
|
## Using "net/http" Package
|
|
|
|
TinyGo's net/http package is a partial port of Go's net/http package, providing
|
|
a subset of the full net/http package. There are a few features excluded
|
|
during the porting process, in particular:
|
|
|
|
- No HTTP/2 support
|
|
- No TLS support for HTTP servers (no https servers)
|
|
- HTTP client request can't be reused
|
|
|
|
HTTP client methods (http.Get, http.Head, http.Post, and http.PostForm) are
|
|
functional. Dial clients support both HTTP and HTTPS URLs.
|
|
|
|
HTTP server methods and objects are mostly ported, but for HTTP only; HTTPS
|
|
servers are not supported.
|
|
|
|
HTTP request and response handling code is mostly ported, so most the intricacy
|
|
of parsing and writing headers is handled as in the full net/http package.
|
|
|
|
Run ```go doc -all ./src/net/http``` in TinyGo repo to see full listing.
|
|
|
|
## Using "crypto/tls" Package
|
|
|
|
TinyGo's TLS support (crypto/tls) relies on hardware offload of the TLS
|
|
protocol. This is different from Go's crypto/tls package which handles the TLS
|
|
protocol in software.
|
|
|
|
TinyGo's TLS support is only available for client applications. You can
|
|
http.Get() to an https:// address, but you cannot http.ListenAndServeTLS() an
|
|
https server.
|
|
|
|
The offloading hardware has pre-defined TLS certificates built-in.
|
|
|
|
## Using Sockets
|
|
|
|
The Netdever interface is a BSD socket-like interface so an application can make direct
|
|
socket calls, bypassing the "net" package for the lowest overhead.
|
|
|
|
Here is a simple TCP client application using direct sockets:
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"net" // only need to parse IP address
|
|
|
|
"tinygo.org/x/drivers/netdev"
|
|
"tinygo.org/x/drivers/netlink"
|
|
"tinygo.org/x/drivers/netlink/probe"
|
|
)
|
|
|
|
func main() {
|
|
|
|
// load network driver for target
|
|
link, dev := probe.Probe()
|
|
|
|
// Connect target to IP network
|
|
link.NetConnect(&netlink.ConnectParams{
|
|
Ssid: "my SSID",
|
|
Passphrase: "my passphrase",
|
|
})
|
|
|
|
// omit error handling
|
|
|
|
sock, _ := dev.Socket(netdev.AF_INET, netdev.SOCK_STREAM, netdev.IPPROTO_TCP)
|
|
|
|
dev.Connect(sock, "", net.ParseIP("10.0.0.100"), 8080)
|
|
dev.Send(sock, []bytes("hello"), 0, 0)
|
|
|
|
dev.Close(sock)
|
|
link.NetDisconnect()
|
|
}
|
|
```
|