wifinina

package
v0.15.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 13, 2021 License: BSD-3-Clause Imports: 8 Imported by: 2

README

WifiNINA Driver

This package provides a driver to use a separate connected WiFi processor ESP32 for TCP/UDP communication.

The way this driver works is by using the SPI interface of your microcontroller to communicate with the WiFi chip using the Arduino SPI command set.

Using the WiFiNINA Driver

For information on how to use this driver, please take a look at the examples located in the examples/wifinina directory.

WiFiNINA Firmware Installation

PLEASE NOTE: New Arduino Nano33 IoT boards already have the WiFiNINA firmware pre-installed, so you should not need to install the firmware yourself.

In order to use this driver, you must have the WiFiNINA firmware installed on the ESP32 chip. If it is already installed, you can just use it. You do not need to build and flash the firmware again.

Building the WifiNINA firmware

We have provided a Dockerfile that can build the needed firmware.

docker build -t wifinina ./wifinina/
docker run -v "$(pwd)/build:/src/build" wifinina

This will put the firmware files into the build directory. Now you can flash them to the ESP32 chip.

Installing esptool to flash WifiNINA firmware

In order to flash the firmware, you need to use Python to install the esptool package.

pip install esptool

Once you have installed esptool you can follow the correct procedure for flashing your board.

Installing on Arduino Nano33 IoT

The Arduino Nano33 IoT board has the WiFiNINA firmware flashed onto the onboard NINA-W102 chip out of the box.

Flashing the firmware is only necessary on the Arduino Nano33 IoT in order to upgrade or if other firmware was installed previously.

If you do want to install the firmware on the Arduino Nano33 IoT board's built-in NINA-W102 chip, you will need to first build the firmware as described above.

To flash this firmware on the Arduino Nano33 IoT you will need to follow the following procedure using the Arduino IDE software:

  • Install Arduino SAMD Boards from the Boards Manager.
  • Install WiFiNINA from the Library Manager.
  • Using the normal Arduino software, load the SerialNINAPassthrough sketch on to the board (in File -> Examples -> WiFiNINA-> Tools).

Now you can flash the WifiNINA firmware using the esptool script:

python esptool.py --chip esp32 --port /dev/ttyACM0 --baud 115200 --before no_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 build/bootloader.bin 0xf000 build/phy_init_data.bin 0x30000 build/nina-fw.bin 0x8000 build/partitions.bin

You only need to do this one time, and then the correct WiFiNINA firmware will be on the NINA chip, and you can just flash the Arduino Nano33 IoT board using TinyGo. We should be able to remove some of these steps in a future release of this software.

Documentation

Overview

Package wifinina implements TCP wireless communication over SPI with an attached separate ESP32 board using the Arduino WiFiNINA protocol.

In order to use this driver, the ESP32 must be flashed with specific firmware from Arduino. For more information: https://github.com/arduino/nina-fw

Index

Constants

View Source
const (
	MaxSockets  = 4
	MaxNetworks = 10
	MaxAttempts = 10

	MaxLengthSSID   = 32
	MaxLengthWPAKey = 63
	MaxLengthWEPKey = 13

	WlFailure = -1
	WlSuccess = 1

	StatusNoShield       ConnectionStatus = 255
	StatusIdle           ConnectionStatus = 0
	StatusNoSSIDAvail    ConnectionStatus = 1
	StatusScanCompleted  ConnectionStatus = 2
	StatusConnected      ConnectionStatus = 3
	StatusConnectFailed  ConnectionStatus = 4
	StatusConnectionLost ConnectionStatus = 5
	StatusDisconnected   ConnectionStatus = 6

	EncTypeTKIP EncryptionType = 2
	EncTypeCCMP EncryptionType = 4
	EncTypeWEP  EncryptionType = 5
	EncTypeNone EncryptionType = 7
	EncTypeAuto EncryptionType = 8

	TCPStateClosed      = 0
	TCPStateListen      = 1
	TCPStateSynSent     = 2
	TCPStateSynRcvd     = 3
	TCPStateEstablished = 4
	TCPStateFinWait1    = 5
	TCPStateFinWait2    = 6
	TCPStateCloseWait   = 7
	TCPStateClosing     = 8
	TCPStateLastACK     = 9
	TCPStateTimeWait    = 10

	CmdStart = 0xE0
	CmdEnd   = 0xEE
	CmdErr   = 0xEF

	CmdSetNet          = 0x10
	CmdSetPassphrase   = 0x11
	CmdSetKey          = 0x12
	CmdSetIPConfig     = 0x14
	CmdSetDNSConfig    = 0x15
	CmdSetHostname     = 0x16
	CmdSetPowerMode    = 0x17
	CmdSetAPNet        = 0x18
	CmdSetAPPassphrase = 0x19
	CmdSetDebug        = 0x1A
	CmdGetTemperature  = 0x1B
	CmdGetReasonCode   = 0x1F

	CmdGetConnStatus     = 0x20
	CmdGetIPAddr         = 0x21
	CmdGetMACAddr        = 0x22
	CmdGetCurrSSID       = 0x23
	CmdGetCurrBSSID      = 0x24
	CmdGetCurrRSSI       = 0x25
	CmdGetCurrEncrType   = 0x26
	CmdScanNetworks      = 0x27
	CmdStartServerTCP    = 0x28
	CmdGetStateTCP       = 0x29
	CmdDataSentTCP       = 0x2A
	CmdAvailDataTCP      = 0x2B
	CmdGetDataTCP        = 0x2C
	CmdStartClientTCP    = 0x2D
	CmdStopClientTCP     = 0x2E
	CmdGetClientStateTCP = 0x2F
	CmdDisconnect        = 0x30
	CmdGetIdxRSSI        = 0x32
	CmdGetIdxEncrType    = 0x33
	CmdReqHostByName     = 0x34
	CmdGetHostByName     = 0x35
	CmdStartScanNetworks = 0x36
	CmdGetFwVersion      = 0x37
	CmdSendDataUDP       = 0x39
	CmdGetRemoteData     = 0x3A
	CmdGetTime           = 0x3B
	CmdGetIdxBSSID       = 0x3C
	CmdGetIdxChannel     = 0x3D
	CmdPing              = 0x3E
	CmdGetSocket         = 0x3F

	// All command with DATA_FLAG 0x40 send a 16bit Len
	CmdSendDataTCP   = 0x44
	CmdGetDatabufTCP = 0x45
	CmdInsertDataBuf = 0x46

	// regular format commands
	CmdSetPinMode      = 0x50
	CmdSetDigitalWrite = 0x51
	CmdSetAnalogWrite  = 0x52

	ErrTimeoutChipReady  Error = 0x01
	ErrTimeoutChipSelect Error = 0x02
	ErrCheckStartCmd     Error = 0x03
	ErrWaitRsp           Error = 0x04
	ErrUnexpectedLength  Error = 0xE0
	ErrNoParamsReturned  Error = 0xE1
	ErrIncorrectSentinel Error = 0xE2
	ErrIncorrectReply    Error = 0xE3
	ErrCmdErrorReceived  Error = 0xEF
	ErrNotImplemented    Error = 0xF0
	ErrUnknownHost       Error = 0xF1
	ErrSocketAlreadySet  Error = 0xF2
	ErrConnectionTimeout Error = 0xF3
	ErrNoData            Error = 0xF4
	ErrDataNotWritten    Error = 0xF5
	ErrCheckDataError    Error = 0xF6
	ErrBufferTooSmall    Error = 0xF7
	ErrNoSocketAvail     Error = 0xFF

	NoSocketAvail uint8 = 0xFF
)
View Source
const (
	ProtoModeTCP = iota
	ProtoModeUDP
	ProtoModeTLS
	ProtoModeMul
)
View Source
const (
	ReadBufferSize = 128
)

Variables

View Source
var ErrBufferFull = errors.New("buffer is full")

Functions

func PrintBuffer added in v0.15.3

func PrintBuffer(ninabuf *Buffer, w io.Writer) error

Types

type Buffer added in v0.15.3

type Buffer struct {
	// contains filtered or unexported fields
}

Buffer wraps a byte slice that is allocated for creating and/or parsing wifinina command/reply messages (which have the same format as each other). It is NOT safe for concurrent use.

Cmd Struct Message ._______________________________________________________________________. | START CMD | C/R . CMD | N.PARAM | PARAM LEN | PARAM | .. | END CMD | |___________|_____________|_________|___________|________|____|_________| | 8 bit | 1bit . 7bit | 8bit | 8/16* bit | nbytes | .. | 8bit | |___________|_____________|_________|___________|________|____|_________| for most commands, the param len is 1 bytes; for data commands, it is 2

func NewBuffer added in v0.15.3

func NewBuffer(capacity int) *Buffer

NewBuffer constructs a Buffer with the provided capacity. Enough memory to satisfy that capacity is allocated when the Buffer is constructed so that using the Buffer does not result in further allocation or garbage collection.

func (*Buffer) AddByte added in v0.15.3

func (b *Buffer) AddByte(p byte)

AddByte appends a byte parameter to the Buffer.

func (*Buffer) AddData added in v0.15.3

func (b *Buffer) AddData(p []byte)

AddData appends a byte slice as a data parameter to the Buffer.

func (*Buffer) AddString added in v0.15.3

func (b *Buffer) AddString(s string)

AddString appends a string parameter to the Buffer. The string should not be more than 256 bytes.

func (*Buffer) AddUint16 added in v0.15.3

func (b *Buffer) AddUint16(p uint16)

AddUint16 appends a uint16 parameter to the buffer.

func (*Buffer) AddUint32 added in v0.15.3

func (b *Buffer) AddUint32(p uint32)

AddUint32 appends a uint32 parameter to the buffer.

func (*Buffer) Bytes added in v0.15.3

func (b *Buffer) Bytes() []byte

func (*Buffer) Command added in v0.15.3

func (b *Buffer) Command() byte

Command returns the command byte that is set in the buffer

func (*Buffer) EndCmd added in v0.15.3

func (b *Buffer) EndCmd()

EndCmd denotes that the last param has been added to buffer; this will append the CmdEnd byte and adds necessary padding

func (*Buffer) GetBufferParam added in v0.15.3

func (b *Buffer) GetBufferParam(n int, v []byte) (int, error)

func (*Buffer) GetByteParam added in v0.15.3

func (b *Buffer) GetByteParam(n int, v *byte) error

func (*Buffer) GetStringParam added in v0.15.3

func (b *Buffer) GetStringParam(n int, v *string) error

func (*Buffer) GetUint16Param added in v0.15.3

func (b *Buffer) GetUint16Param(n int, v *uint16) error

func (*Buffer) GetUint32Param added in v0.15.3

func (b *Buffer) GetUint32Param(n int, v *uint32) error

func (*Buffer) GetUint64Param added in v0.15.3

func (b *Buffer) GetUint64Param(n int, v *uint64) error

func (*Buffer) IsDataCommand added in v0.15.3

func (b *Buffer) IsDataCommand() bool

IsDataCommand checks if this is a data command that takes buffers as params

func (*Buffer) IsReply added in v0.15.3

func (b *Buffer) IsReply() bool

IsReply returns whether or not the reply flag is set

func (*Buffer) Len added in v0.15.3

func (b *Buffer) Len() int

Len returns the length of the buffer in bytes

func (*Buffer) NumParams added in v0.15.3

func (b *Buffer) NumParams() uint8

NumParams returns the number of parameters that have been set on the command

func (*Buffer) ParamLenSize added in v0.15.3

func (b *Buffer) ParamLenSize() uint8

ParamLenSize returns the number of bytes used in a wifinina message to send the length of a parameter. For most commands, 1; for data commands, can be 2

func (*Buffer) ReadReply added in v0.15.3

func (b *Buffer) ReadReply(r ByteTransferer, checkCmd byte) (err error)

ParseReply switches the buffer from being a request buffer to a reply buffer and attempts to parse the entire reply from the given byte source. If the checkCmd argument is a non-zero value, it will be compared to the command byte in the reply and if they do not match ErrIncorrectReply is returned.

func (*Buffer) StartCmd added in v0.15.3

func (b *Buffer) StartCmd(cmd uint8) *Buffer

StartCmd resets the buffer to be a request buffer, adds the StartCmd byte, the command/reply flag, the command byte, and sets the nparams byte to 0.

func (*Buffer) WriteTo added in v0.15.3

func (b *Buffer) WriteTo(w io.Writer) (int, error)

type ByteTransferer added in v0.15.3

type ByteTransferer interface {
	Transfer(b byte) (byte, error)
}

type ConnectionStatus

type ConnectionStatus uint8

func (ConnectionStatus) String

func (c ConnectionStatus) String() string

type Device

type Device struct {
	Transport Transport
	// contains filtered or unexported fields
}

func (*Device) AnalogWrite added in v0.15.3

func (d *Device) AnalogWrite(pin uint8, value uint8) error

AnalogWrite can be used to set the PWM of a GPIO pin on the device; please note that this command does not exist in the Arduino version of nina-fw, it is specific to the Adafruit fork used for their "Airlift" branded boards.

func (*Device) AvailableData added in v0.15.3

func (d *Device) AvailableData(sock uint8) (dataSize uint16, err error)

func (*Device) CheckDataSent

func (d *Device) CheckDataSent(sock uint8) (bool, error)

func (*Device) Configure

func (d *Device) Configure()

func (*Device) DigitalWrite added in v0.15.3

func (d *Device) DigitalWrite(pin uint8, value uint8) error

DigitalWrite can be used to set the state of a GPIO pin on the device; please note that this command does not exist in the Arduino version of nina-fw, it is specific to the Adafruit fork used for their "Airlift" branded boards.

func (*Device) Disconnect

func (d *Device) Disconnect() error

func (*Device) GetClientState

func (d *Device) GetClientState(sock uint8) (uint8, error)

func (*Device) GetConnectionStatus

func (d *Device) GetConnectionStatus() (ConnectionStatus, error)

func (*Device) GetCurrentBSSID

func (d *Device) GetCurrentBSSID() (MACAddress, error)

func (*Device) GetCurrentEncryptionType

func (d *Device) GetCurrentEncryptionType() (EncryptionType, error)

func (*Device) GetCurrentRSSI

func (d *Device) GetCurrentRSSI() (int32, error)

func (*Device) GetCurrentSSID

func (d *Device) GetCurrentSSID() (string, error)

func (*Device) GetDataBuf

func (d *Device) GetDataBuf(sock uint8, buf []byte) (int, error)

func (*Device) GetFwVersion

func (d *Device) GetFwVersion() (string, error)

func (*Device) GetHostByName

func (d *Device) GetHostByName(hostname string) (IPAddress, error)

func (*Device) GetIP

func (d *Device) GetIP() (ip, subnet, gateway IPAddress, err error)

func (*Device) GetMACAddress

func (d *Device) GetMACAddress() (MACAddress, error)

func (*Device) GetNetworkBSSID

func (d *Device) GetNetworkBSSID(idx int) (MACAddress, error)

func (*Device) GetNetworkChannel

func (d *Device) GetNetworkChannel(idx int) (uint8, error)

func (*Device) GetNetworkEncrType

func (d *Device) GetNetworkEncrType(idx int) (EncryptionType, error)

func (*Device) GetNetworkRSSI

func (d *Device) GetNetworkRSSI(idx int) (int32, error)

func (*Device) GetNetworkSSID

func (d *Device) GetNetworkSSID(idx int) string

func (*Device) GetReasonCode

func (d *Device) GetReasonCode() (uint8, error)

func (*Device) GetSocket

func (d *Device) GetSocket() (uint8, error)

func (*Device) GetTemperature

func (d *Device) GetTemperature() (float32, error)

func (*Device) GetTime

func (d *Device) GetTime() (string, error)

func (*Device) InsertDataBuf added in v0.14.1

func (d *Device) InsertDataBuf(buf []byte, sock uint8) (bool, error)

InsertDataBuf adds data to the buffer used for sending UDP data

func (*Device) NewDriver

func (d *Device) NewDriver() net.DeviceDriver

func (*Device) PinMode added in v0.15.3

func (d *Device) PinMode(pin uint8, mode uint8) error

PinMode can be used to set the mode of a GPIO pin on the device; please note that this command does not exist in the Arduino version of nina-fw, it is specific to the Adafruit fork used for their "Airlift" branded boards.

func (*Device) Ping

func (d *Device) Ping(ip IPAddress, ttl uint8) int16

func (*Device) ScanNetworks

func (d *Device) ScanNetworks() (int, error)

func (*Device) SendData

func (d *Device) SendData(buf []byte, sock uint8) (uint16, error)

func (*Device) SendUDPData added in v0.14.1

func (d *Device) SendUDPData(sock uint8) (bool, error)

SendUDPData sends the data previously added to the UDP buffer

func (*Device) SetDNS

func (d *Device) SetDNS(which uint8, dns1 uint32, dns2 uint32) error

func (*Device) SetDebug

func (d *Device) SetDebug(on bool) error

func (*Device) SetHostname

func (d *Device) SetHostname(hostname string) error

func (*Device) SetKey

func (d *Device) SetKey(ssid string, index uint8, key string) error

func (*Device) SetNetwork

func (d *Device) SetNetwork(ssid string) error

func (*Device) SetNetworkForAP

func (d *Device) SetNetworkForAP(ssid string) error

func (*Device) SetPassphrase

func (d *Device) SetPassphrase(ssid string, passphrase string) error

func (*Device) SetPassphraseForAP

func (d *Device) SetPassphraseForAP(ssid string, passphrase string) error

func (*Device) SetPowerMode

func (d *Device) SetPowerMode(mode uint8) error

func (*Device) StartClient

func (d *Device) StartClient(addr uint32, port uint16, sock uint8, mode uint8) error

func (*Device) StartScanNetworks

func (d *Device) StartScanNetworks() (uint8, error)

func (*Device) StartServer added in v0.14.1

func (d *Device) StartServer(port uint16, sock uint8, mode uint8) error

func (*Device) StopClient

func (d *Device) StopClient(sock uint8) error

type Driver

type Driver struct {
	// contains filtered or unexported fields
}

func (*Driver) ConnectSSLSocket

func (drv *Driver) ConnectSSLSocket(addr, portStr string) error

func (*Driver) ConnectTCPSocket

func (drv *Driver) ConnectTCPSocket(addr, portStr string) error

func (*Driver) ConnectUDPSocket

func (drv *Driver) ConnectUDPSocket(addr, portStr, lportStr string) (err error)

func (*Driver) DisconnectSocket

func (drv *Driver) DisconnectSocket() error

func (*Driver) GetDNS

func (drv *Driver) GetDNS(domain string) (string, error)

func (*Driver) IsConnected

func (drv *Driver) IsConnected() (bool, error)

func (*Driver) IsSocketDataAvailable

func (drv *Driver) IsSocketDataAvailable() bool

IsSocketDataAvailable returns of there is socket data available

func (*Driver) ReadSocket

func (drv *Driver) ReadSocket(b []byte) (n int, err error)

func (*Driver) Response

func (drv *Driver) Response(timeout int) ([]byte, error)

func (*Driver) StartSocketSend

func (drv *Driver) StartSocketSend(size int) error

func (*Driver) Write

func (drv *Driver) Write(b []byte) (n int, err error)

type EncryptionType

type EncryptionType uint8

func (EncryptionType) String

func (e EncryptionType) String() string

type Error

type Error uint8

func (Error) Error

func (err Error) Error() string

type IPAddress

type IPAddress string // TODO: does WiFiNINA support ipv6???

func ParseIPv4

func ParseIPv4(s string) (IPAddress, error)

func (IPAddress) AsUint32

func (addr IPAddress) AsUint32() uint32

func (IPAddress) String

func (addr IPAddress) String() string

type MACAddress

type MACAddress uint64

func (MACAddress) String

func (addr MACAddress) String() string

type Transport added in v0.15.3

type Transport interface {
	Configure()

	SetGPIO0(level bool)
	SetReset(level bool)
	SetCS(level bool)

	GetACK(level bool, timeout time.Duration) bool

	Transfer(b byte) (byte, error)
	Tx(w []byte, r []byte) error
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL