Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/skaarj1989/mwebsockets
WebSockets for microcontrollers
https://github.com/skaarj1989/mwebsockets
arduino arduino-uno arduino-zero arm-cortex client cpp11 enc28j60 esp32 esp8266 ethernet-shield mega2560 nucleo platformio rfc6455 samd21 server stm32 w5100 w5500 websockets
Last synced: about 1 month ago
JSON representation
WebSockets for microcontrollers
- Host: GitHub
- URL: https://github.com/skaarj1989/mwebsockets
- Owner: skaarj1989
- License: mit
- Created: 2017-12-24T20:02:21.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2024-06-06T16:25:24.000Z (8 months ago)
- Last Synced: 2024-12-19T20:08:25.806Z (about 1 month ago)
- Topics: arduino, arduino-uno, arduino-zero, arm-cortex, client, cpp11, enc28j60, esp32, esp8266, ethernet-shield, mega2560, nucleo, platformio, rfc6455, samd21, server, stm32, w5100, w5500, websockets
- Language: C++
- Homepage: https://skaarj1989.github.io/mWebSockets/autobahn-testsuite/servers/
- Size: 6.1 MB
- Stars: 108
- Watchers: 7
- Forks: 23
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# μWebSockets
[![arduino-library-badge](https://www.ardu-badge.com/badge/mWebSockets.svg?)](https://www.ardu-badge.com/mWebSockets)
[![Build Status](https://travis-ci.org/skaarj1989/mWebSockets.svg?branch=master)](https://travis-ci.org/skaarj1989/mWebSockets)
[![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/skaarj1989/mWebSockets)](https://www.codefactor.io/repository/github/skaarj1989/mwebsockets/overview/master)
![GitHub](https://img.shields.io/github/license/skaarj1989/mWebSockets.svg)Simple to use implementation of WebSockets for microcontrollers.
**List of supported IDEs:**
- [Arduino](https://www.arduino.cc/en/Main/Software)
- Visual Studio Code with [Platformio](https://platformio.org/)
- Microsoft Visual Studio with [Visual Micro](https://www.visualmicro.com/)**List of supported MCUs:**
- ATmega328P
- ATmega2560
- Renesas RA4M1 (ARM Cortex-M4)
- SAMD21 (ARM Cortex-M0+)
- STM32 (ARM Cortex-M)
- ESP8266
- ESP32-WROOM-32D**WebSocketServer compatible browsers:**
- Chrome
- Edge
- Firefox
- Opera> The **Autobahn**|Testsuite reports for [server](https://skaarj1989.github.io/mWebSockets/autobahn-testsuite/servers/index.html) and [client](https://skaarj1989.github.io/mWebSockets/autobahn-testsuite/clients/index.html)
Some tests will never pass just because of memory lack in ATmega family.## Table of contents
- [μWebSockets](#μwebsockets)
- [Table of contents](#table-of-contents)
- [Requirements](#requirements)
- [Installation](#installation)
- [config.h](#configh)
- [Physical connection](#physical-connection)
- [Usage examples](#usage-examples)
- [Server](#server)
- [Verify clients](#verify-clients)
- [Subprotocol negotiation](#subprotocol-negotiation)
- [Client](#client)
- [Chat](#chat)
- [Approx memory usage](#approx-memory-usage)
- [Ethernet.h (W5100 and W5500)](#etherneth-w5100-and-w5500)
- [EthernetENC.h (ENC28j60)](#ethernetench-enc28j60)
- [WiFi](#wifi)
- [Known issues](#known-issues)
- [License](#license)## Requirements
- Development board (confirmed working, other boards may or may not work):
- Arduino Uno (ATmega328P)
- Arduino Pro Mini (ATmega328P)
- Arduino Mega2560
- Arduino Uno R4 Minima/WiFi (ARM Cortex-M4)
- Arduino Zero / SAMD21 M0 (ARM Cortex-M0)
- STM Nucleo-64 (ARM Cortex-M)
- WeMos D1 mini (ESP8266)
- NodeMCU v3 (ESP8266)
- ESPDUINO-32 (ESP32-WROOM-32D)
- Ethernet module or shield (confirmed working):
- Arduino Ethernet Shield (W5100)
- Arduino Ethernet Shield 2 (W5500)
- WizNet W5500 module
- ENC28j60
- Libraries:
- [EthernetENC](https://github.com/jandrassy/EthernetENC) if you decide to use ENC28j60## Installation
Use [Arduino Download Manager](https://www.ardu-badge.com/mWebSockets) or follow [this](https://www.arduino.cc/en/Guide/Libraries) guide.
### config.h
Change the following definition if you use a different network controller:
```cpp
...#define NETWORK_CONTROLLER ETHERNET_CONTROLLER_W5X00
``````cpp
ETHERNET_CONTROLLER_W5X00
ETHERNET_CONTROLLER_ENC28J60
NETWORK_CONTROLLER_WIFI
```> `ETHERNET_CONTROLLER_W5X00` stands for the official Arduino Ethernet library.
Uncomment these if you want additional information on the serial monitor:
```cpp
//#define _DEBUG
//#define _DUMP_HANDSHAKE
//#define _DUMP_FRAME_DATA
//#define _DUMP_HEADER
```Increase the following value if you expect big data frames (or decrease for devices with a small amount of memory).
```cpp
constexpr uint16_t kBufferMaxSize{ 256 };
```### Physical connection
If you have a **WeMos D1** in the size of **Arduino Uno** simply attaching a shield does not work. You have to wire the **ICSP** on an **Ethernet Shield** to proper pins.
| Ethernet Shield
(W5100/W5500) | Arduino
Pro Mini | WeMos D1 |
| :--------------------------------: | :-------------------: | :--------: |
| (ICSP) MISO | PIN 12 | D12 / MISO |
| (ICSP) MOSI | PIN 11 | D11 / MOSI |
| (ICSP) SCK | PIN 13 | D13 / SCK |
| (SS) PIN 10 | PIN 10 | D10 / SS || W5500 /
ENC28j60 | Arduino Uno /
Pro Mini | Arduino
Mega2560 |
| :-------------------: | :-------------------------: | :-------------------: |
| MISO | PIN 12 | PIN 50 |
| MOSI | PIN 11 | PIN 51 |
| SCS | PIN 10 | PIN 53 |
| SCLK | PIN 13 | PIN 52 |## Usage examples
### Server
```cpp
#include
using namespace net;WebSocketServer server{3000};
void setup() {
// Ethernet/WiFi initialization goes here ...
// ...server.onConnection([](WebSocket &ws) {
const char message[]{ "Hello from Arduino server!" };
ws.send(WebSocket::DataType::TEXT, message, strlen(message));ws.onClose([](WebSocket &ws, const WebSocket::CloseCode code,
const char *reason, uint16_t length) {
// ...
});
ws.onMessage([](WebSocket &ws, const WebSocket::DataType dataType,
const char *message, uint16_t length) {
// ...
});
});server.begin();
}void loop() {
server.listen();
}
```#### Verify clients
```cpp
// verifyClient callback is called for every header during handshake
// (except for those required by protocol, like "Connection", "Upgrade" etc.)
server.begin([](const IPAddress &ip, const char *header, const char *value) {
// verify ip ...// verify "Origin" header:
if (strcmp_P(header, (PGM_P)F("Origin")) == 0)
if (strcmp_P(value, (PGM_P)F("file://")) == 0) return false;return true;
});
```#### Subprotocol negotiation
```cpp
// If you won't pass callback for `protocolHandler` then server will use the
// first requested subprotocol if any
wss.begin(nullptr, [](const char *protocols) {
// iterate csv protocols and return the one that is supported by your server
// or nullptr to ignore
});// You can check client protocol in other callbacks
wss.onConnection([](WebSocket &ws) {
const auto protocol = ws.getProtocol();
// ...
}
});
```> Node.js server examples [here](https://github.com/skaarj1989/mWebSockets/tree/master/node.js)
### Client
```cpp
#include
using namespace net;WebSocketClient client;
void setup() {
// Ethernet/WiFi initialization goes here ...
// ...client.onOpen([](WebSocket &ws) {
const char message[]{ "Hello from Arduino client!" };
ws.send(WebSocket::DataType::TEXT, message, strlen(message));
});
client.onClose([](WebSocket &ws, const WebSocket::CloseCode code,
const char *reason, uint16_t length) {
// ...
});
client.onMessage([](WebSocket &ws, const WebSocket::DataType dataType,
const char *message, uint16_t length) {
// ...
});client.open("echo.websocket.org", 80);
}void loop() {
client.listen();
}
```### Chat
> Node.js server on Raspberry Pi (/node.js/chat.js)
> Browser client (/node.js/chat-client.htm)
> Arduino Uno client (/examples/chat/chat.ino)
> More examples [here](examples)
## Approx memory usage
> `simple-client.ino` example (without debug output, 128 bytes data buffer)
### Ethernet.h (W5100 and W5500)
| Board | Program space | Dynamic memory |
| :-------------------: | :----------------: | :---------------: |
| Arduino Uno | 24 648 bytes (76%) | 829 bytes (40%) |
| Arduino Mega2560 | 25 640 bytes (10%) | 857 bytes (10%) |
| Arduino Pro Mini | 24 648 bytes (80%) | 829 bytes (40%) |
| Arduino Zero | 30 596 bytes (11%) | 3 056 bytes (9%) |
| Arduino Uno R4 Minima | 63 860 bytes (24%) | 3 620 bytes (11%) |### EthernetENC.h (ENC28j60)
| Board | Program space | Dynamic memory |
| :--------------: | :-----------------: | :---------------: |
| Arduino Uno | 31 062 bytes (96%) | 1 406 bytes (68%) |
| Arduino Mega2560 | 32 074 bytes (12%) | 1 406 bytes (17%) |
| Arduino Pro Mini | 31 062 bytes (101%) | 1 406 bytes (68%) |
| Arduino Zero | 36 796 bytes (14%) | 3 684 bytes (11%) |### WiFi
| Board | Program space | Dynamic memory |
| :-----------------: | :-----------------: | :----------------: |
| Generic ESP8266 | 286 328 bytes (29%) | 27 356 bytes (33%) |
| WeMos D1 mini | 286 328 bytes (27%) | 27 356 bytes (33%) |
| NodeMCU | 286 328 bytes (27%) | 27 356 bytes (33%) |
| Arduino Uno R4 WiFi | 57 596 bytes (21%) | 4 492 bytes (13%) |## Known issues
...
## License
- This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details
- [arduino-base64](https://github.com/adamvr/arduino-base64) licensed under licensed under MIT License
- [arduinolibs](https://github.com/rweather/arduinolibs) licensed under the MIT
- [utf8_check](https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c) licensed under the MIT