Sming - Open Source framework for high efficiency native ESP8266 development
C++ HTML C Arduino Processing Makefile Other
Latest commit 4e20be5 Feb 17, 2017 @slaff slaff committed on GitHub Do makefile reload only once. (#964)
Prevent full build when only spiffy compilation is required.


Sming - Open Source framework for high efficiency WiFi SoC ESP8266 native development with C++ language.

ESP8266 C++ development framework

Gitter (chat) Donate Download Build


  • Fast & user friendly development
  • Work with GPIO in Arduino style
  • High effective in performance and memory usage (this is native firmware!)
  • Compatible with standard Arduino libraries - use any popular hardware in few lines of code
  • rBoot OTA firmware updating
  • Built-in file system: spiffs
  • Built-in powerful network and wireless modules
  • Built-in JSON library: ArduinoJson
  • HTTP, AJAX, WebSockets support
  • MQTT protocol based on libemqtt
  • Networking based on LWIP stack
  • Simple and powerful hardware API wrappers
  • Crash handlers for analyzing/handling system restarts due to fatal errors or WDT resets.
  • SSL support based on axTLS 2.1+ with Lwirax.
  • Out of the box support for HTTP, MQTT and Websocket client connections over SSL.
  • Out of the box support for OTA over HTTPS.
  • SNI and Maximum Fragment Length SSL support.
  • Optional alternative PWM support based on Stefan Bruens PWM
  • Optional custom heap allocation based on Umm Malloc
  • Based on Espressif NONOS SDK. Tested with versions 1.4, 1.5 and 2.0.


OS/SDK Linux Mac OS X Windows FreeBSD-current
UDK (v1.5) n/a n/a Build status n/a
esp-alt-sdk (v1.4, v1.5) ☀️ ☀️ ☀️ ☀️
esp-open-sdk (v1.4, v1.5, v2.0) ☀️ ☀️ n/a n/a

OS = Operating System SDK = Software Development Kit n/a = The selected SDK is not available on that OS

Latest Stable Release

Getting started

Additional needed software

  • Spiffy : Source included in Sming repository
  • ESPtool2 esptool2

Optional features

  • Custom LWIP:(default:ON) By default we are using custom compiled LWIP stack instead of the binary one provided from Espressif. This is increasing the free memory and decreasing the space on the flash. All espconn_* functions are turned off by default. If your application requires the use of some of the espconn_* functions then add the ENABLE_ESPCONN=1 directive. See from the Basic_SmartConfig application for examples. If you would like to use the binary LWIP then you should turn off the custom LWIP compilation by providing ENABLE_CUSTOM_LWIP=0.
  • SSL:(default:off) The SSL support is not built-in by default to conserve resources. If you want to enable it then take a look at the Readme in the Basic_Ssl samples.
  • Custom PWM:(default:off) If you want to use the open PWM implementation then compile your application with ENABLE_CUSTOM_PWM=1. There is no need to recompile the Sming library.
  • Custom serial baud rate: (default:off) The default serial baud rate is 115200. If you want to change it to a higher baud rate you can recompile Sming and your application changing the COM_SPEED_SERIAL directive. For example COM_SPEED_SERIAL=921600
  • Custom Heap Allocation:(default:off) If your application is experiencing heap fragmentation then you can try the Umm Malloc heap allocation. To enable it compile Sming with ENABLE_CUSTOM_HEAP=1. In order to use it in your sample/application make sure to compile the sample with ENABLE_CUSTOM_HEAP=1. Avoid enabling your custom heap allocation AND -mforce-l32 compiler flag.
  • Debug information log level and format: There are four debug levels: debug=3, info=2, warn=1, error=0. Using DEBUG_VERBOSE_LEVEL you can set the desired level (0-3). For example DEBUG_VERBOSE_LEVEL=2 will show only info messages and above. Another make directive is DEBUG_PRINT_FILENAME_AND_LINE=1 which enables printing the filename and line number of every degub line. This will require extra space on flash. Note: You can compile the Sming library with a set of debug directives and your project with another settings, this way you can control debugging sepparately for sming and your application code.

You can find more information about compilation and flashing process by reading forum discussion thread.


More information at Wiki Examples page.

Simple GPIO input/output

#define LED_PIN 2 // GPIO2
digitalWrite(LED_PIN, HIGH);

Connect to WiFi and start Serial communication

Serial.println("Hello Sming! Let's do smart things.");

WifiStation.config("LOCAL-NETWORK", "123456789087"); // Put you SSID and Password here

Read DHT22 sensor

#include <Libraries/DHT/DHT.h> // This is just popular Arduino library!

#define WORK_PIN 0 // GPIO0

void init()

  float h = dht.readHumidity();
  float t = dht.readTemperature();

HTTP client

HttpClient thingSpeak;
thingSpeak.downloadString("" + String(sensorValue), onDataSent);

void onDataSent(HttpClient& client, bool successful)
  if (successful)

OTA application update based on rBoot

void OtaUpdate() {

    uint8 slot;
    rboot_config bootconf;


    // need a clean object, otherwise if run before and failed will not run again
    if (otaUpdater) delete otaUpdater;
    otaUpdater = new rBootHttpUpdate();

    // select rom slot to flash
    bootconf = rboot_get_config();
    slot = bootconf.current_rom;
    if (slot == 0) slot = 1; else slot = 0;

    // flash rom to position indicated in the rBoot config rom table
    otaUpdater->addItem(bootconf.roms[slot], ROM_0_URL);

    // and/or set a callback (called on failure or success without switching requested)

    // start update

Embedded HTTP WebServer

server.addPath("/", onIndex);
server.addPath("/hello", onHello);

Serial.println("=== WEB SERVER STARTED ===");


void onIndex(HttpRequest &request, HttpResponse &response)
  TemplateFileStream *tmpl = new TemplateFileStream("index.html");
  auto &vars = tmpl->variables();
  vars["counter"] = String(counter);
  vars["IP"] = WifiStation.getIP().toString();
  vars["MAC"] = WifiStation.getMAC();

void onFile(HttpRequest &request, HttpResponse &response)
  String file = request.getPath();
  if (file[0] == '/')
    file = file.substring(1);

  response.setCache(86400, true);


A complete documentation can be created by running the command below. This requires doxygen to be installed on your system.

make docs

The newly generated documentation will be located under Sming/docs/api