笔记!本文中的示例使用已弃用的 uNabto 平台。我们建议对所有新设计使用 Nabto Edge – 了解有关Nabto Edge 与 uNabto 的一般信息。

由于 ESP8266 对于使用 Nabto Edge 来说资源过于有限,因此我们建议使用 ESP32 而不是 ESP8266。请参阅我们的Nabto Edge ESP32 示例

ESP8266 是一款低成本 WiFi 模块,可以像微控制器一样直接编程。已经在考虑您的下一个物联网项目了吗?

设置ESP8266 Wi-Fi模块详细教程指南【附带源代码】

虽然可用的 Arduino 库可以快速启动,但仍然有一个问题需要克服:如何从家庭网络外部访问 ESP8266,而无需进行令人紧张的路由器和防火墙配置或繁重的云服务?在 ESP8266 上运行 uNabto 服务器,您可以仅使用静态 ID 从任何地方建立快速、安全的点对点连接,无论中间是什么。

您需要什么硬件

Adafruit HUZZAH ESP8266 突破

Adafruit HUZZAH ESP8266 突破

USB 转 TTL 串行电缆

USB 转 TTL 串行电缆

该项目在Adafruit ESP8266 板上进行了测试。它不是最便宜的,但非常适合原型制作。您可以将其放在面包板上,它具有板载 3.3V 稳压器。当然,您也可以使用不同的ESP8266模块。维基百科提供了广泛的可用模块列表

关于 USB 转TTL串行电缆(例如 在此处获取),使用 Adafruit 模块时没有特殊要求。如果您使用不同的模块,请确保电压电平匹配,因为大多数板仅接受 3.3V。

将排针焊接到 ESP8266 板上,并使用 4 根电线将其连接到 USB 转 TTL 适配器:

ESP8266板 - 使用 4 根电线将其连接到 USB 转 TTL 适配器

您需要什么软件

该项目在 Ubuntu 16.04 上进行了测试,但应该可以在Arduino IDE支持的任何操作系统上运行 

我们希望直接对 ESP8266 进行编程,而不是使用该模块可用的任何更高级别的解释器。Adafruit 提供了一个很好的教程,介绍如何相应地设置 Arduino IDE。

如果一切正常,您应该能够编译以下简单的草图并将其上传到您的 ESP8266。这将使板载 LED 每秒闪烁一次。

const int led = BUILTIN_LED;void setup() {  pinMode(led, OUTPUT);}void loop() {  digitalWrite(led, HIGH);  delay(500);  digitalWrite(led, LOW);  delay(500);}

Nabto 平台如何运作

到目前为止,一切都很好。但 Nabto 平台实际上是如何运作的呢?下图给出了简要概述。您的 ESP8266 模块代表运行 uNabto 服务器的设备。一旦连接到互联网,它就会 使用其唯一的 ID在Nabto 基站上识别自己。如果客户端想要连接到 ESP8266,则会向基站发送带有 ID 的连接请求,并建立与设备的直接连接。客户端可以是本机应用程序,也可以使用抽象框架,例如本演示中使用的Heat Control Ionic 入门应用程序。

Nabto 平台如何运作 - Heat Control Ionic 入门应用程序

在console.cloud.nabto.com上获取有关 Nabto Cloud Console 平台和客户端/设备 SDK 的更多信息 

uNabto 平台适配器

uNabto服务器分为两层:

  • 实际的 uNabto 框架 ( uNabto SDK )

  • 框架和本机平台之间的 uNabto Platform Adapter 抽象层

uNabto 平台适配器

因此,我们只需要实现 uNabto 平台适配器,即可将 uNabto 服务器移植到 ESP8266 模块。

实施平台适配器

平台适配器充当通用 uNabto 框架和 Arduino 平台(包括ESP8266 WiFi 库)之间的链接。按照 Nabto 文档( TEN023 Nabto 设备 SDK 指南,第 12 节)中的建议,适配器分为单个文件:

  • unabto_config.h:基本 uNabto 配置

  • unabto_platform_types.h:定义所有必需的 uNabto 类型

  • unabto_platform.h:平台特定的临时函数

  • network_adapter.cpp:网络数据的初始化、关闭、读写功能

  • time_adapter.cpp:时间函数

  • dns_adapter.cpp:DNS解析

  • random_adapter.cpp:随机生成器

  • log.cpp:日志记录

如果您对平台适配器的详细实现方式感兴趣,请查看GitHub 上库的 src 目录中的适配器文件。

使用图书馆

从https://github.com/nabto/unabto-esp8266-sdk获取 Nabto ESP8266 Arduino 库  并按照安装说明进行操作。

示例草图可以在以下位置找到

文件 -> 示例 -> Nabto-ESP8266 -> HeatPump

示例草图包含 Nabto 类,它封装了 Nabto 设置。首先,进行一些设置。其中包括 WiFi SSID 和密码,然后是从console.cloud.nabto.com获取的设备的唯一设备 ID 和预共享密钥

// Enter ssid and password of your WiFi networkconst char* WIFI_SSID = "<SSID>";const char* WIFI_PASSWORD = "<PASSWORD>";// Enter device id and pre-shared key from <a href="https://console.cloud.nabto.com/#/signup">console.cloud.nabto.com</a>const char* DEVICE_ID = "<DEVICE ID>";const char* PRE_SHARED_KEY = "<PRE-SHARED KEY>";

setup函数用于初始化LED引脚、串口模块以及连接WiFi。在第 91 行中,您可以看到 Nabto 模块是如何初始化的。打印 Nabto 版本后,我们的热泵演示已初始化。

void setup() {// Initialize SerialSerial.begin(115200);// Wait 2s for button press to do factory reset    pinMode(0, INPUT_PULLUP);    bool factory_reset = false;while(millis() < 2000) {if(digitalRead(0) == LOW) {Serial.println("FACTORY RESET");        factory_reset = true;break;      }    }// Initialize built-in led    pinMode(LED_PIN, OUTPUT);    analogWrite(LED_PIN, PWMRANGE);// Initialize WiFiWiFi.begin(WIFI_SSID, WIFI_PASSWORD);Serial.print("Connecting to WiFi..");while (WiFi.status() != WL_CONNECTED) {Serial.print(".");        delay(500);    }Serial.println("done");// Initialize NabtoSerial.println("Init Nabto...");Nabto.begin(DEVICE_ID, PRE_SHARED_KEY);// Print Nabto version    char versionString[10];Nabto.version(versionString);Serial.print("Nabto v");Serial.print(versionString);Serial.println(" running");// Initialize demo application    demo_init(factory_reset);    demo_application_set_device_name("ESP8266");    demo_application_set_device_product("ACME 9002 Heatpump");    demo_application_set_device_icon_("img/chip-small.png");}

循环函数中唯一需要做的就是调用Nabto类的tick()方法。这会触发框架检查新的 UDP 数据包并发送响应。刻度之间的时间应约为 10 毫秒。这是通过硬延迟来实现的,但您也可以利用这段时间来做与应用程序相关的事情。例如,我们用它来更新 LED 的亮度,并在演示应用程序 tik 函数中模拟室温。

void loop() {    Nabto.tick();    demo_application_tick();    delay(10);}

从客户端接收到的 Nabto 消息的实际处理是在 application_event(..) 函数中实现的。处理程序使用与客户端共享的接口定义。

pplication_event_result application_event(application_request* request,                                           unabto_query_request* query_request,                                           unabto_query_response* query_response) {//NABTO_LOG_INFO(("Nabto application_event: %u", request->queryId));//debug_dump_acl();// handle requests as defined in interface definition shared with// client - for the default demo, see// https://github.com/nabto/ionic-starter-nabto/blob/master/www/nabto/unabto_queries.xml    application_event_result res;    switch (request->queryId) {    case 10000:// get_public_device_info.jsonif (!Nabto.write_string(query_response, device_name_)) return AER_REQ_RSP_TOO_LARGE;if (!Nabto.write_string(query_response, device_product_)) return AER_REQ_RSP_TOO_LARGE;if (!Nabto.write_string(query_response, device_icon_)) return AER_REQ_RSP_TOO_LARGE;if (!unabto_query_write_uint8(query_response, fp_acl_is_pair_allowed(request))) return AER_REQ_RSP_TOO_LARGE;if (!unabto_query_write_uint8(query_response, fp_acl_is_user_paired(request))) return AER_REQ_RSP_TOO_LARGE;if (!unabto_query_write_uint8(query_response, fp_acl_is_user_owner(request))) return AER_REQ_RSP_TOO_LARGE;return AER_REQ_RESPONSE_READY;    case 10010:// set_device_info.jsonif (!fp_acl_is_request_allowed(request, REQUIRES_OWNER)) return AER_REQ_NO_ACCESS;        res = Nabto.copy_string(query_request, device_name_, sizeof(device_name_));if (res != AER_REQ_RESPONSE_READY) return res;if (!Nabto.write_string(query_response, device_name_)) return AER_REQ_RSP_TOO_LARGE;return AER_REQ_RESPONSE_READY;    case 11000:// get_users.jsonreturn fp_acl_ae_users_get(request, query_request, query_response); // implied admin priv check// [...]    }}

测试您的设备

编译 HeatPump 草图并将其上传到 ESP8266 后,它会建立与您的 WiFi 网络的连接并启动 uNabto 服务器。在串行监视器中,您应该看到以下打印输出:

Connecting to WiFi........doneInit Nabto...Device id: 'n7j4qebq.hyr7o.trial.nabto.net'Program Release 123.456Application event framework using SYNC modelSECURE ATTACH: 1, DATA: 1NONCE_SIZE: 32, CLEAR_TEXT: 0Nabto was successfully initializedNabto v123.456 runningSECURE ATTACH: 1, DATA: 1NONCE_SIZE: 32, CLEAR_TEXT: 0State change from IDLE to WAIT_DNSResolving dns: esp8266test1.demo.nab.toState change from WAIT_DNS to WAIT_BSState change from WAIT_BS to WAIT_GSP########    U_INVITE with LARGE nonce sent, version: - URL: -State change from WAIT_GSP to ATTACHED

现在,使用Heat Control Ionic 入门应用程序连接到您的设备,并查看 LED 根据目标热量改变其亮度。

 

物联网项目 - 最好的物联网公司 - 设置ESP8266 Wi-Fi模块详细教程指南【附带源代码】