• ESP8266

    面向物联网应用的
    高性价比、高度集成的 Wi-Fi MCU

ESP8266

SDK 和演示

找到 19 个结果
  • 收起全部
  • 展开全部
标题 Body 平台 版本 发布日期升序排列 下载
ESP8266 RTOS SDK

点击右侧下载按钮获取详细的更新历史信息并下载新版 SDK。

RTOS SDK Latest 2021年04月08日
ESP8266 NONOS SDK
NON-OS SDK Latest 2020年06月03日
ESP8266 RTOS SDK (IDF Style)

ESP8266 RTOS SDK in ESP-IDF style.

RTOS SDK V3.1.1 2020年03月24日
ESP8266 NONOS SDK V3.0.0

支持将 iRAM 用作内存,可多出约 17 KB 的内存空间。

NON-OS SDK V3.0.0 2018年08月24日
ESP8266 NONOS SDK V2.2.1

ESP8266 non-OS SDK V2.2.1

NON-OS SDK V2.2.1 2018年06月08日
ESP8266 NONOS SDK V2.1.0 20170505

ESP8266 Non-OS SDK V2.1.0

NON-OS SDK V2.1.0 2017年05月05日
ESP8266 RTOS SDK V1.5.0

增加以下功能:

1. SPI Flash 擦除保护机制(boot.bin 和正在运行的 user.bin 不能被擦除);
2. memleak debug 功能;
3. SNTP 相关接口;
4. vendor IE 支持;
5. seak 函数 wifi_set_backup_mac(用于设置用户 MAC);
6. mbedTLS 支持;
7. 新增 user_rf_cal_sector_set,用户程序必须实现此接口;

更新以下功能:

1. 更新 SmartConfig 到 v2.5.4;
2. 更新 open freedom 以支持发送 beacon 包;
3. 更新 libphy.a 到 1055 版本;
4. 更新二级 bootloader 到 v1.6;
5. 更新 esp_init_data_default.bin;
6. 优化 socket 机制;
7. 优化休眠策略。

修正以下问题:

1. PWM 的问题;
2. lwIP 问题;
3. SPI overlap 问题;
4. DNS 在部分路由上的问题;
5. os_timer_arm 最大值的问题;
6. 外部复位后,小概率存在 RF 不工作的问题;
7. 华为 x4 不能连接 Soft-AP 的问题;
8. libpp.a 中一处导致系统 assert 的问题;
9. scan done callback 中设置模式从 STA 到 Soft-AP 导致 crash 的问题;
10. wifi_station_get_connect_status 在密码错误时获取的状态不对的问题;
11. 主动断开时,disconnect event 进入两次的问题;
12. 修改 SPI Flash 擦写流程,擦写前判断是否写保护,如是,则清除写保护状态;
13. 部分情况下,RF_Init_data 系统参数区可能被破坏的问题;
14. 频繁上下电情况下,导致系统参数区被破坏的问题;
15. 其它 bug。
RTOS SDK V1.5.0 2016年11月11日
ESP8266 NONOS SDK V2.0.0 20160810

ESP8266_NONOS_SDK_V2.0.0_16_08_10 发布说明:

1. 更改部分源文件的 license 为 espressif MIT;

2. libphy.a 更新至 1055,解决 Light-sleep 有时电流偏大的问题;

3. AT+ 更新至 1.3.0:

3.1. 新增 Light-sleep 唤醒命令,AT+WAKEUPGDIO;

3.2. 修正 AT+CWDHCPS IP 池分配异常问题;

3.3. 在 examples 目录下新增 at_sdio 示例。

4. 修正调用 cur、def 接口时可能存在的系统状态错误;

5. 修正 Deep-sleep 之前未关闭 SPI 导致 Deep-sleep 时电流过大问题;

6. 修正调用 wifi_set_phy_mode 后从 AP 切到 Station 模式时可能出现的 crash;

7. 更新二级 boot 到 v1.6:

7.1. 支持 AT + SDIO 的需求;

7.2. 支持通过 GPIO 控制进入测试模式。

8. 增加对其他 2 线转 4 线 SPI Flash 的支持;

9. 修正 TCP 握手重传时引起的 Exception;

10. 修正 ESP-NOW 问题;

11. 新增 ESP-PAIR(Simple-Pair)功能,具体 API 请参考手册;

12. wpa2-enterprise time 函数导出由用户设置,及 time check disable 由用户设置;

13. wpa2-enterprise 新增 PEAP/TTLS 支持,具体 API 请参考手册;

14. 在 examples 目录下新增 mqtt 示例;

15. 其他问题的修正;

16. 修正部分情况下,RF_Init_data 系统参数区可能被破坏的问题。新增 user_rf_cal_sector_set,用户程序必须实现此接口,详细参见文档 “2C-ESP8266__SDK__API Guide”。 (1.5.4.1中解决)

17. 修正外部复位后,小概率存在 rf 不工作的问题。(1.5.4.1中解决)

18. 新增AT针对SDIO的支持。(1.5.4.1中加入)

19. 修正espconn中一处潜在问题。(1.5.4.1中解决)

ESP8266_NONOS_SDK 注意事项:

1. esp_init_data.bin 至少需要烧录一次到 flash;

2. 建议整个系统需要做初始化设置时,或需要重新进行 RF_CAL 时,烧录 blank.bin 到 RF_CAL 参数区 (由 user_rf_cal_sector_set 设置),并烧录 esp_init_data.bin 到 flash。

AT 注意事项:

1. 从版本 ESP8266_NONOS_SDK_V1.5.0 起,AT 固件所需空间增大,无法再使用 4Mbit (512KB) Flash,请使用 8Mbit (1MB) 或以上容量 flash;

2. 我司优化了 AT 固件的升级流程,AT 固件发布后,会等一段时间,待客户反馈稳定后,才上传到 Espressif Cloud 以供下载更新。因此,如果使用 ESP8266_NONOS_SDK_V1.5.0 及之后版本的 AT 固件暂时无法从 Espressif Cloud 升级。

NON-OS SDK V2.0.0 2016年08月10日
ESP8266 NONOS SDK V2.0.0 patch 20160809

ESP8266_NONOS_SDK_V2.0.0_patch 发布说明

本 patch 基于 ESP8266_NONOS_SDK_V2.0.0,使用时将压缩包中 .a 文件覆盖 SDK/lib 目录下对应文件。

有如下更新:

1. 修正在某些情况下连接较慢问题。

2. 提供使能频偏自动校准接口:void system_phy_freq_trace_enable(bool enable);频偏自动校准功能默认为关闭,如客户需要打开该功能,需要在 user_rf_pre_init() 里调用该函数,参数为 true。

注意:

客户需要确认使用场景中的环境温度超出了所用晶振的正常工作温度范围,才需要开启此功能。一般情况下,使用场景环境温度小于 80 度不建议开启。

NON-OS SDK V2.0.0 2016年08月08日
ESP8266 NONOS SDK MBEDTLS 20160718

特性

1. 支持TLS1.0,TLS1.1,TLS1.2,不支持SSL3.0
2. TLS 缓存范围2048~8192
3. 支持AES128,AES256加密算法,CBC模式
4. 支持SHA1,SHA256,SHA384,SHA512哈希算法
5. 支持RSA512,RSA1024,RSA2048秘钥算法
6. 支持PEM,DER格式证书
7. 支持单向认证,双向认证
8. 支持三级证书链解析
9. 不支持使用root证书验证三级证书链

使用

1. 如ESP8266_NONOS_SDK版本低于2.0.0,请将ESP8266_NONOS_SDK_EMBEDTLS目录下的include、ld、lib文件夹拷贝到SDK根目录进行覆盖;高版本的,只需拷贝lib目录
2. 如用户之前已采用libssl.a,则可修改用户工程目录下的Makefile,将“-lssl”修改为"-lmbedtls",用户代码不需做任何修改
3. mbedtls_demo示例包含了mbedtls源码、espconn_secure_xxxx接口具体实现,以及一个简单示例。
3.1 将mbedtls_demo整个文件夹拷贝到SDK根目录
3.2.进入mbedtls_demo目录,执行命令 ./make_lib.sh mbedtls ,会自动编译mbedtls源码生成libmbedtls.a,并拷贝该库到SDK/lib目录
3.3.通过 ./gen_misc.sh 可生成该demo的测试固件
NON-OS SDK MBEDTLS 2016年07月17日
ESP8266 RTOS SDK v1.3.3 Patch_20160704

本 patch 基于 ESP8266_RTOS_SDK_V1.3.0(68c9e7b4),已包含 1.3.1(095c975c), 1.3.2(86e315aa) 的改动,使用时将压缩包中 .a 文件覆盖 SDK/lib 目录下对应文件。

更新:

1. 修正softap模式下,部分station离开可能导致的问题。(1.3.1中解决)
2. 修正部分情况下,RF_Init_data 系统参数区可能被破坏的问题。新增 user_rf_cal_sector_set,用户程序必须实现此接口,详细参见文档 “2C-ESP8266__SDK__API Guide”。 (1.3.2中解决)
3. 修正外部复位后,小概率存在 rf 不工作的问题。(1.3.3中解决)
4. 修改esp_init_data_default.bin的112字节,0x03->0x00,默认关闭频偏自动校正。(1.3.3中解决)
注意:基于更新1的示例代码可参考压缩包中的user_main.c。

ESP8266_RTOS_SDK 注意事项:

1. esp_init_data.bin 至少需要烧录一次到 flash。
2. 建议整个系统需要做初始化设置时,或需要重新进行 RF_CAL 时,烧录 blank.bin 到 RF_CAL 参数区 (由 user_rf_cal_sector_set 设置),并烧录 esp_init_data.bin 到 flash。
RTOS SDK V1.3.3 2016年07月04日
ESP8266 RTOS SDK v1.4.2 Patch_20160704

本 patch 基于 ESP8266_RTOS_SDK_V1.4.0,已包含 1.4.1 的改动,使用时将压缩包中 .a 文件覆盖 SDK/lib 目录下对应文件。

更新:

1. 修正部分情况下,RF_Init_data 系统参数区可能被破坏的问题。新增 user_rf_cal_sector_set,用户程序必须实现此接口,详细参见文档 “2C-ESP8266__SDK__API Guide”。 (1.4.1中解决)
2. 修正外部复位后,小概率存在 rf 不工作的问题。(1.4.2中解决)
3. 修改esp_init_data_default.bin的112字节,0x03->0x00,默认关闭频偏自动校正。(1.4.2中解决)
注意:基于更新1的示例代码可参考压缩包中的user_main.c。

ESP8266_RTOS_SDK 注意事项:

1. esp_init_data.bin 至少需要烧录一次到 flash。
2. 建议整个系统需要做初始化设置时,或需要重新进行 RF_CAL 时,烧录 blank.bin 到 RF_CAL 参数区 (由 user_rf_cal_sector_set 设置),并烧录 esp_init_data.bin 到 flash。
RTOS SDK V1.4.2 2016年07月04日
ESP8266 NONOS SDK V1.5.3.3 Patch_20160704

ESP8266_NONOS_SDK_V1.5.3.3_ Patch 基于 ESP8266_NONOS_SDK_V1.5.3,已包含 ESP8266_NONOS_SDK_V1.5.3.1 和 ESP8266_NONOS_SDK_V1.5.3.2 的改动,使用时将压缩包中 .a 文件覆盖 SDK/lib 目录下对应文件。

更新:

1. 修正 system_adc_read 返回值异常的问题。(1.5.3.1中解决)
2. 修正 light sleep 模式下电流较高的问题。(1.5.3.1中解决) 
3. 修正 igmp 中一处由于连接特殊路由器可能导致的系统重启问题。(1.5.3.1中解决)
4. 修正部分情况下,RF_Init_data 系统参数区可能被破坏的问题。新增 user_rf_cal_sector_set,用户程序必须实现此接口,详细参见文档 “2C-ESP8266__SDK__API Guide”。 (1.5.3.2中解决)
5. 修正外部复位后,小概率存在 rf 不工作的问题。(1.5.3.3中解决)
6. 修改 esp_init_data_default.bin 的 112 字节,0x03->0x00,默认关闭频偏自动校正。(1.5.3.3中解决)
注意:基于更新4的示例代码可参考压缩包中的user_main.c。

ESP8266_NONOS_SDK 注意事项:

1. esp_init_data.bin 至少需要烧录一次到 flash。
2. 建议整个系统需要做初始化设置时,或需要重新进行 RF_CAL 时,烧录 blank.bin 到 RF_CAL 参数区 (由 user_rf_cal_sector_set 设置),并烧录 esp_init_data.bin 到 flash。
NON-OS SDK V1.5.3.3 2016年07月04日
ESP8266 NONOS SDK V1.5.2.1 Patch_20160704

本 patch 基于 ESP8266_NONOS_SDK_V1.5.2,使用时将压缩包中 .a 文件覆盖 SDK/lib 目录下对应文件。

更新:

1. 修正部分情况下,RF_Init_data 系统参数区可能被破坏的问题。新增 user_rf_cal_sector_set,用户程序必须实现此接口,详细参见文档 “2C-ESP8266__SDK__API Guide”。 (1.5.2.1中解决) 
2. 修正外部复位后,小概率存在 rf 不工作的问题。(1.5.2.1中解决)
3. 修改esp_init_data_default.bin的112字节,0x03->0x00,默认关闭频偏自动校正。(1.5.2.1中解决)
注意:基于更新 1 的示例代码可参考压缩包中的 user_main.c。

ESP8266_NONOS_SDK 注意事项:

1. esp_init_data.bin 至少需要烧录一次到 flash。
2. 建议整个系统需要做初始化设置时,或需要重新进行 RF_CAL 时,烧录 blank.bin 到 RF_CAL 参数区 (由 user_rf_cal_sector_set 设置),并烧录 esp_init_data.bin 到 flash。
NON-OS SDK V1.5.2.1 2016年07月04日
ESP8266 NONOS SDK V1.5.4.1 Patch_20160704

本 patch 基于 ESP8266_NONOS_SDK_V1.5.4,使用时将压缩包中 .a 文件覆盖 SDK/lib 目录下对应文件。

更新:

1. 修正部分情况下,RF_Init_data 系统参数区可能被破坏的问题。新增 user_rf_cal_sector_set,用户程序必须实现此接口,详细参见文档 “2C-ESP8266__SDK__API Guide”。 (1.5.4.1中解决)
2. 修正外部复位后,小概率存在 rf 不工作的问题。(1.5.4.1中解决)
3. 修正部分情况下,调用cur、def接口导致的状态错误问题。(1.5.4.1中解决)
4. 新增AT针对SDIO的支持。(1.5.4.1中解决)
5. 修正espconn中一处潜在问题。(1.5.4.1中解决)
6. 修改esp_init_data_default.bin的112字节,0x03->0x00,默认关闭频偏自动校正。(1.5.4.1中解决)
注意:基于更新 1 的示例代码可参考压缩包中的 user_main.c。

ESP8266_NONOS_SDK 注意事项:

1. esp_init_data.bin 至少需要烧录一次到 flash。
2. 建议整个系统需要做初始化设置时,或需要重新进行 RF_CAL 时,烧录 blank.bin 到 RF_CAL 参数区 (由 user_rf_cal_sector_set 设置),并烧录 esp_init_data.bin 到 flash。
NON-OS SDK V1.5.4.1 2016年07月04日
ESP8266 NONOS SDK V1.5.4

更新:

1. 更新 libphy.a 到 972 版本。
2. 更新 libpp.a 到 10.1 版本,解决部分频偏及休眠问题。
3. 优化 IGMP 功能。
4. 优化 DNS 功能。
5. 优化 WPS 功能。
6. 优化 DHCP server 功能。
NON-OS SDK V1.5.4 2016年05月20日
ESP8266 NONOS SDK V1.5.3

Updated:

1. Supported ISSI flash.
2. SmartConfig updated to version 2.5.4, solved the issue that AirKiss may fail in certain cases.
3. AT updated to version 1.00.
4. Added lwip_open_src_template_proj in ESP8266_NONOS_SDK\examples for open source LWIP.
5. Added SPI driver, refer to ESP8266_NONOS_SDK\driver_lib\driver\spi_interface.c.
6. Removed the limitation of freedom sending unencrypted beacon/probe req/probe resp.
NON-OS SDK V1.5.3 2016年04月18日
ESP8266 RTOS SDK v1.4.0

 1. Update boot.bin to v1.5;

 2. Add wifi_station_set/get_hostname API;

 3. Update SmartConfig to version 2.5.3;

 4. Support GPIO wakeup;

 5. Enable IGMP in LWIP;

 6. Add espconn_init in espconn.h;

 7. Update esp_init_data_default.bin;

 8. IROM start address changed to 0x20000.

RTOS SDK V1.4.0 2016年02月26日
ESP8266 IOT Platform

A demo that should be run with ESP8266 RTOS SDK. This is the initial version.

RTOS V1.0 2015年09月18日

APKs

找到 11 个结果
  • 收起全部
  • 展开全部
标题 Body 平台 版本 发布日期升序排列 下载
ESP SoftAP Provisioning for iOS
IOS V2.1.0 2022年10月08日
ESP BLE Provisioning for iOS
IOS V2.1.0 2022年10月08日
ESP SoftAP Provisioning for Android
Android V2.0.13 2022年10月07日
ESP BLE Provisioning for Android
Android V2.0.13 2022年10月07日
ESP-TOUCH for Android

Make device connect to AP

Android V2.0.0 2021年02月08日
ESP-Drone for iOS
IOS V1.0.1 2020年07月20日
ESP-BluFi for iOS

BluFi for iOS

IOS V1.2.0 2020年07月19日
ESP-Drone for Android
Android V0.7.3 2020年07月14日
ESP-TOUCH for iOS

Make device connect to AP

IOS V2.0.0 2020年04月20日
ESP-BluFi for Android

BluFi for Android

Android V1.5.3 2020年03月26日
ESP-MESH for iOS
IOS V1.1.1 2019年12月20日

工具

找到 16 个结果
  • 收起全部
  • 展开全部
标题 Body 平台 版本 发布日期升序排列 下载
ESP 系列芯片 WFA 认证测试指南

本文档介绍 ESP 系列芯片如何通过 WFA 认证,以及快速认证(QuickTrack)方式的指导,方便乐鑫客户在自己的产品上完成 WFA 认证。

Windows PC V1.0 2023年11月16日
ESP 射频测试指南

快速获得适用于 ESP32、ESP32-C3、ESP32-S2、ESP32-S3、ESP32-C6、ESP32-C2、ESP32-H2 和 ESP8266 系列产品的射频测试工具、测试测试、测试指南和认证测试指南。

ZIP V3.6 2023年10月13日
Flash 下载工具
Windows PC V3.9.5 2023年06月12日
手机控制 ESP8266 云端固件空中升级演示指南

本指南主要帮助客户快速、直观地体验物联网云端升级功能。演示基于 ESP8266 物联网平台,使用手机 App 配置 ESP8266 设备连接到乐鑫云服务器,通过无线网络从云端服务器下载新版本的固件到 ESP8266 设备中运行,以此实现固件升级功能。 本指南中的升级演示,基于乐鑫官方提供的开发板 ESP-Launcher。如果客户使用其他 ESP8266 方案的模组,也可以参考同样原理,进行固件升级测试。

ZIP V1.0 2016年10月23日
ESP8266 移植京东 JoyLink2.0 说明

ESP8266 移植了京东微联 JoyLink 协议,为客户提供参考例程 jd_demo。协议规范基于开发者中心提供的 JoyLink 协议文档和 SDK demo。厂家可参考 jd_demo 开发自己的应用程序,快速接入京东微联平台。 京东微联提供的 SDK 是在 Ubuntu 环境下运行的,jd_demo 对其修改了头文件和一些相关的函数,未修改文件结构,所以用户依然可以参考开发者中心提供的说明文档。 本文档介绍了京东智能云后台设置、京东微联 APP 的使用等。

ZIP V1.0 2016年10月11日
ESP8266 FOTA 演示指南

FOTA(Firmware Over-The-Air)功能是指 ESP8266 设备通过 Wi-Fi 无线网络,从服务器下载可运行固件,并重启运行新固件,从而实现设备固件升级的功能。 本演示指南主要作用:帮助客户快速、直观地体验在 PC 端建立服务器,基于 ESP8266 开发板,实现固件升级的功能。 本文档中的升级演示基于 ESP-Launcher 开发板进行。如果客户使用其他 ESP8266 方案的模组,也可以参考同样原理,进行升级功能测试。 在本演示中,ESP8266 初始运行 user1.bin 固件,连接到服务器下载 user2.bin(带升级的固件)到设备 Flash 中。下载完成后,ESP8266 进行升级重启,重新启动后改为运行新下载的 user2.bin,以此实现 ESP8266 设备固件升级的功能。此后,ESP8266 将默认运行 user2.bin,直至再次进行固件升级。再次升级时,将下载 user1.bin。之后,每次更新升级,即重复这一循环下载的过程。

ZIP V1.0 2016年10月11日
TCP/UDP UART 透传测试演示指南

本演示指南主要作用:客户可以快速、直观地体验 ESP8266 物联网平台实现 TCP & UDP吞吐量测试的演示。

ZIP V1.0 2016年10月10日
ALINK 物联方案 SDK 演示指南

本演示指南以 ESP8266 开发板为硬件、支持阿里智能云的 SDK 为软件,介绍了开发板如何连接阿里智能云并且如何使用阿里 APP 进行操作。

ZIP V1.0 2016年09月23日
手机控制 ESP8266 设备 (SoftAP 模式)演示指南

本演示指南主要作用:帮助客户快速、直观地体验物联网 SoftAP 组网功能。演示基于 ESP8266 物联网平台,实现的典型 IoT 产品 SoftAP 组网控制功能。

ZIP V1.0 2016年09月14日
手机控制云端 ESP8266 设备演示指南

本演示指南主要作用:帮助客户快速、直观地体验物联网云控制功能。演示基于 ESP8266 物联网平台,实现典型的 IoT 产品配置到云端,并进行远程云端控制的功能。

ZIP V1.0 2016年09月14日
ESP8266 连接路由获取 IP 耗时测试演示指南

本演示指南主要作用:帮助客户快速、直观地体验物联网本地控制功能。演示基于 ESP8266 物联网平台,实现的典型 IoT 产品局域网内的控制功能,测试 ESP8266 设备接入路由获得 DHCP 分配的 IP 地址所需时间。

ZIP V1.0 2016年09月14日
Wi-Fi 收发包功耗测试演示指南

本演示指南主要作用:帮助客户快速、直观的体验 ESP8266 模块在不同 PHY模式下发包和收包的功耗测试。

ZIP V1.0 2016年09月14日
手机控制本地 ESP8266 设备演示指南

本演示指南主要作用:帮助客户快速、直观地体验物联网本地控制功能。演示基于 ESP8266 物联网平台,实现的典型 IoT 产品局域网内的控制功能。

ZIP V1.0 2016年09月12日
低功耗测试演示指南

本演示指南主要作用:帮助客户快速、直观的体验测试 ESP8266 模块低功耗 Modem-sleep、Light-sleep、Deep-sleep 三种模式下电流值。 本文档中的低功耗测试基于 ESP-Launcher 开发板进行。如果客户使用其他 ESP8266 方案的模组,也可以参考同样原理,进行低功耗测试。

ZIP V1.0 2016年09月12日
Ping 包测试演示指南

本演示指南主要作用:客户可以快速演示 ESP8266 模块作为 AP 和 STATION 两种模式时,用 ping 来测试模块网络的连通性。

ZIP V1.0 2016年09月07日
ESP8266 Add Low-power Cmd

添加降低功耗的指令到 BIN 文件中。

Python V2.0 2016年04月27日

常见技术问题

  • 收起全部
  • 展开全部

应用

为什么云端升级需要2个 “bin” 文件?“user1.bin” 和 “user2.bin” 有什么区别?

user1.bin user2.bin 是 2 个不同的 BIN 文件。生成 user1.bin 和 user2.bin 时,必须使用相同的 Flash 和 boot 设置,以保证 OTA 升级成功。2个 BIN 文件是互补的,运行 user1.bin 的时候,升级是下载 user2.bin;运行 user2.bin 的时候,升级是下载 user1.bin。这样可以保证升级过程中,如果有掉线的情况发生,设备还是可以正常运行。

如何生成 “user1.bin” 和 “user2.bin” ?

编译环境下,执行 gen_misc.sh 分别得到 user1.bin 和 user2.bin。步骤如下:

  1. 使用正确的 Flash 和 boot 配置,编译生成 user1.bin
  2. 执行 make clean,以便清除之前的残余信息。
  3. 使用相同的 Flash 和 boot 配置,编译生成 user2.bin
云端升级失败有哪些原因?

云端升级的详细介绍参考文档《ESP8266 FOTA 云端升级指南》。

  

请先检查以下问题:

  • 确认使用了正确大小的 Flash。
  • 确认是否烧录了 blank.bin 做初始化。
  • 确认 user1.bin 和 user2.bin 下载到了正确的地址。
  • 确认生成 user1.bin 和 user2.bin 使用了相同的 Flash、boot 配置。
如何通过我自己的服务器进行云端升级?

如果通过客户自己的服务器升级,请确认服务器满足下面的要求。

  1. 发送 HEAD 指令到云端服务器,询问待升级的 BIN 文件长度,服务器回复的 HTTP 包头中要求带有 BIN 文件的长度信息。
  2. 根据步骤一查询到的长度,在 ESP8266 模块的 Flash 待升级区域,擦除该指定长度(spi_flash_erase_sector),等待下载。
  3. 发送 GET 指令,从服务器下载 BIN 文件,写入到 Flash 的待升级区域。
如何使用我自己的云服务器进行云端升级?

客户可以使用自己的云服务器,但是要能支持 HTTP 请求,并可以支持设备控制功能。

云端的 API,请见:http://iot.espressif.cn/#/api-zh-cn/

ESP8266 如何和云端服务器进行交互?

可以使用标准 HTTP 协议连接云服务器。比如,ESP8266 使用如下的 HTTP 请求。

      

GET /your-bin-file-path.bin HTTP/1.1
Host: yourdomain.com
Connection: keep-alive Cache-Control: max-age=0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language:
en-US,en;q=0.8,ja;q=0.6,zh-CN;q=0.4,zh-TW;q=0.2

    

注意:HTTP 协议规定请求以“\r\n\r\n”为结束,所以在通讯过程中请不要使用这样的组合。

客户可以通过下面的方法来 debug 服务器:

  

telnet <sitename> <port_number>

   

请事先确认 telnet 在您的 PC 上是可以使用的,或者使用其他的支持 telnet 的终端软件也可以达到同样的目的,比如 TeraTerm。

SmartConfig 配网配不上有哪些原因?

请做以下检查:

  1. APP 版本是否支持 SDK 版本或 SmartConfig 版本。
  2. 手机连接的路由器不能是单 5G 路由(双频路由器除外)。
  3. SmartConfig 过程中不要调用其他 API。
  4. 使用 AT 时,设备没有获得 IP 之前,不要调用 smartconfig_stop

如以上排除,请调用 smartconfig_start 时打开 debug 模式。把连接失败和成功的 log 发给我们技术做支持分析。

SmartConfig 支持的 APP 对应的版本是什么?

调用 smartconfig_start() 接口,会有"SC version: vX.X.X"版本信息打印。这是 ESP-TOUCH 模块的版本号。下面是非 OS 对应的 SmartConfig 版本和 APP 版本。

   

sdk v1.2.0 smartconfig v2.4 app v0.3.4.x
sdk v1.3.0 smartconfig v2.5 app v0.3.4.x
sdk v1.3.0 smartconfig v2.5.1 app v0.3.4.x
sdk v1.4.0 smartconfig v2.5.2 app v0.3.4.x
sdk v1.5.0 smartconfig v2.5.3 app v0.3.4.x
sdk v1.5.4 smartconfig v2.5.4 app v0.3.4.x
ESP8266 支持 HTTP 服务端吗?

支持。ESP8266 在 SoftAP 和 Station 模式下都可以作服务端。

    

  • 在 SoftAP 模式下,ESP8266 的服务端 IP 地址是 192.168.4.1。
  • 如果 Station 模式,服务端的 IP 地址为路由器分配给 ESP8266 的 IP。
  • 如果是基于 SDK 二次开发,那么需使用 espconn 结构体和相关 API。
  • 如果是使用 AT 指令,需使用 AT+CIPSERVER 开启服务端。
如何通过 AT 指令发 HTTP 包?

1. AT 指令配置 SoftAP +Station 模式: AT+CWMODE=3 // set softAP+station mode

2. AT 指令连接路由:AT+CWJAP="SSID","password" // ESP8266 station connect to router

3. 创建 TCP 连接,按照 HTTP 包的格式发送数据,如下图红框标注,请注意,HTTP 包中的换行符 [(0x0d 0x0a) or (CR LF)] 是必须的,不能省去。

   

  

4. 收到 HTTP 包的回复。

    

如何在 AT+ 指令中定义自己的函数?如何在函数之间传递参数?

在 Non-OS SDK 中的 AT 示例 (\ESP8266_NONOS_SDK\examples\at\user\user_main.c) 中有提供如何实现一条自定义的 AT 指令“AT+TEST”。结构体 at_funcationType 用于定义一条指令的四种类型,例如指令名称“AT+TEST”。

    

  • 类型 at_testCmd: 测试指令,对应指令为 AT+TEST=?,AT 示例中注册的实现回调为 at_testCmdTest,测试指令可以设计为返回参数的取值范围;注册为 NULL,则无测试指令。
  • 类型 at_queryCmd: 查询指令,对应指令为 AT+TEST=?,AT 示例中注册的实现回调为 at_queryCmdTest,测试指令可以设计为返回当前值;注册为 NULL,则无测试指令。
  • 类型 at_setupCmd: 设置指令,对应指令格式为 AT+TEST=parameter1,parameter2,……,AT 示例中注册的实现回调为 at_setupCmdTest,设置指令可以设计用于设置参数值;注册为 NULL,则无测试指令。
  • 类型 at_exeCmd: 执行指令,对应指令为 AT+TEST,AT 示例中注册的实现回调为 at_exeCmdTest,执行指令可以设计用于执行某项操作;注册为 NULL,则无测试指令
微信中的近场发现中使用的 Product ID 是从哪里来的?

需要建立一个 device ID,比如在客户的微信号下,建立了一个 ID=1234 的设备。通过如下命令

    

curl -q “https://api.weixin.qq.com/cgi-bin/token? 

grant_type=client_credential&appid=wx0f74f861897f84b5&secret=your_We Chatname_32characters_please”

   

//注:目的是得到 access token。("your_WeChatname_32characters_please" 代表客户的微信 API 应用秘钥,申请获得,应该为 32 个字符。)

   

返回:

   

{"access_token":"L2_2V1E98Vk- jTXenXDZjDT0GaudUn_VGTRa7O98hdfT0lTZa2B7nj6YvXN01gssQa3ZraRgjALuCvxd

-SamuPR885KJabaw1EYLA0kns-Yglr4ryolEhHb- QcnWMaNqSEDjACANZY","expires_in":7200}

   

curl -d '{"device_num":"1","device_list":[{"id":"1234","mac":"18fe3497d500","connect_protocol":"4","auth_key":"00000000000000000000000000000000",

"close_strategy":"1","conn_strategy":"1","crypt_method":"0","auth_ver":"0","manu_mac_pos":"-2","ser_mac_pos":"-2"}],

"op_type":"0", "product_id": 5157}' "https://api.weixin.qq.com/device/authorize_device?access_token=L2_2V1E98Vk-jTXenXDZjDT0GaudUn_VGTRa7O98hdfT0lTZa2B7nj6YvXN01gssQa3ZraRgjALuCvxd-SamuPR885KJabaw1EYLA0kns-Yglr4ryolEhHb-QcnWMaNqSEDjACANZY"

     

//注:建立一个 ID=1234 的设备。

    

这样,您只需要使用 AT 指令 AT+CWSTARTDISCOVER=“gh_9e2cff3dfa51”,”1234”,1 即可。(“gh_9e2cff3dfa51” 是您的微信公众号名字。)

ESP8266 如何添加自定义 AT 命令,关于自定义 AT 命令字段长度限制是多少?参数段长度限制是多少?

客户可以基于 ESP8266_NONOS_SDK\examples\at 示例代码,在 ESP8266 自带 AT 命令的基础上,添加客户自定义的 AT 命令。关于自定义 AT 命令,SDK 限制整条 AT 命令数据长度最大 128 字节(含结束符 “\r\n”),不单独限制命令段和参数段。

   

例如:AT+CMDTEST=param1,param2,param3,….paramN\r\n

则:strlen(“AT+CMDTEST=param1,param2,param3,....paramN\r\n”)<=128 Bytes

   

相关 SDK 及参考资料请至乐鑫官网下载:ESP8266 SDK 和 Demo

如果应用使用的是不支持 FOTA 的固件,要将 eagle.irom0.text.bin 下载到哪里?

对于 Non-OS SDK 和 RTOS SDK,固件 BIN 文件的位置取决于合适的链接脚本内容。如果应用中使用的是不支持 FOTA 的固件,则用户代码包含在  eagle.irom0.text.bin 中。该 BIN 文件在 Flash 中的位置是由 SDK/ld 中的链接脚本 eagle.app.v6.ld 决定的。

     

注意:在所有版本 ESP8266 SDK 中, eagle.irom0.text.bin 的默认位置并不都是一样的。用户可以确认在自己的 ESP8266 SDK 版本中,该 BIN 文件在 Flash 中的位置。如下图所示:

    

     

图中标蓝的数字表示 eagle.irom0.text.bin 在 Flash 中的地址。在上图的例子中,该地址为 0x10000。

外设

ADC 的性能参数有几个通道?采样率和有效位数是多少?

通道:1

采样率:

停止 Wi-Fi 的情况下,能达到每秒 100000 次。

Wi-Fi 正常工作的情况下,能达到每秒 1000 次。

有效位数:

内部 ADC 有效位数为 12 位。

uint16 system_adc_read(void)//API 返回值的有效位数是 10 位。

从哪里可以得到 ADC 的寄存器 “bitmap” 信息?

ADC 是和内部 RF 电路高度集成的,所以 bitmap 和寄存器信息没有公开,如有特殊需求请与技术支持联系。

ADC 的精度如何?

ESP8266 连接路由器后,单 STA 模式会进入 modem_sleep,导致芯片内部电流发生变化,参ESP8266 连接路由器后,单 STA 模式会进入 modem_sleep,导致芯片内部电流发生变化,参考值变化,因此 ADC 采集异常。用户如果需要测量的非常准确,可以用 system_adc_fast_read 的函数,但是测量之前需要关闭 RF,Wi-Fi 连接会断开。如果需要测试比较准确,数值相差 1,或 2,可以配置 Wi-Fi 为 non_sleep 模式 wifi_set_sleep_type(NONE_SLEEP_T);建议该用户这样配置。如果对精确性要求不高,可以允许模块进入 sleep 模式,功耗较低。

内部 ADC 的用途是什么?

内部 ADC 可以用于温度检测和粗略地测量外部设备电流。由于 ADC 容易受噪声影响,所以推荐只在低精度的需求时使用。比如熔断机制。

(u8 tx_addr, u8 tx_cmd, u8 tx_rep) 这三个参数是什么意思?

tx_addr 是发送地址;u8 tx_cmd 是发送 cmdu8 tx_rep 是重复发送的次数。

如何使能 UART 流控?
  1. UART 通信时,如需配置 UART 通信的数据格式,请参考 SDK/driver_lib/driver/ 路径下的 uart.c 文件。
  2. UART 通信,如需配置硬件流控。请执行下面两个步骤:

(1) 请在 uart.h 中将下面的宏置 1。

#define UART_HW_RTS 1 //set 1: enable uart hw flow control RTS, PIN MTDO, FOR UART0

#define UART_HW_CTS 1 //set1: enable uart hw flow contrl CTS , PIN MTCK, FOR UART0

    

(2) 配置硬件流控的门限值

截图中红色标注部分为硬件流控的门限值,在 RXFIFO 中字节数大于 110 后,RTS 将会被拉高。

     

如何配置信息打印到 UART1 上?

UART1 只有 Tx 功能,可以在 UART0 用于通讯时,做打印 log 用途。

   

请参考如下代码:

    

void ICACHE_FLASH_ATTR 

uart_init_new(void) 

// Wait for FIFOs to be emptied

    UART_WaitTxFifoEmpty(UART0); 

    UART_WaitTxFifoEmpty(UART1); 

// Configure UART settings

    UART_ConfigTypeDef uart_config; 

    uart_config.baud_rate    = BIT_RATE_74880; 

    uart_config.data_bits     = UART_WordLength_8b; 

    uart_config.parity          = USART_Parity_None; 

    uart_config.stop_bits     = USART_StopBits_1; 

    uart_config.flow_ctrl      = USART_HardwareFlowControl_None; 

    uart_config.UART_RxFlowThresh = 120; 

    uart_config.UART_InverseMask = UART_None_Inverse; 

    UART_ParamConfig(UART0, &uart_config); 

        

    UART_IntrConfTypeDef uart_intr; 

    uart_intr.UART_IntrEnMask = UART_RXFIFO_TOUT_INT_ENA | UART_FRM_ERR_INT_ENA | UART_RXFIFO_FULL_INT_ENA; 

    uart_intr.UART_RX_FifoFullIntrThresh = 100; 

    uart_intr.UART_RX_TimeOutIntrThresh = 2; 

    uart_intr.UART_TX_FifoEmptyIntrThresh = 20; 

    UART_IntrConfig(UART0, &uart_intr); 

// Set UART1 for printing

    UART_SetPrintPort(UART1); 

// Register interrupt handler

    UART_intr_handler_register(uart0_rx_intr_handler); 

    ETS_UART_INTR_ENABLE(); 

}

SDIO 是否支持 SD 卡?

ESP8266 是 SDIO Slave ,不支持 SD 卡。

SDIO 最高速度能支持到多少?

SDIO 时钟能到 50 MHz ,理论最高速度是 200 Mbps 。

使用 PWM 时,发现最开始时有窄波,是什么原因?

这个是精度较高的 PWM 的调节方式,PWM 的精度可以达到 22222 深度。精度的调节主要靠后面的窄波。注意这种方式的 PWM Duty 无法配置为 100%。

为什么上电时会有 LED 灯闪一下的情况?

要看灯的驱动是如何设计的。如是低电平灯亮,并且在上电的时候将 IO 强制拉为低电平,那么在上电的瞬间可能会出现灯闪一下。是因为除了 FLASH 相关的 IO 和 GPIO4 ,GPIO5 ,其他 IO 上电后上拉默认使能。

    

解决方法:

  1. 上电的瞬间,user_init 中将上拉关闭。
  2. 如第一条无效的,需要我们提供相应的 boot.bin。在该 BIN 被搬到 RAM 的过程里,IO 的上拉就会被关闭。这比 user_init 生效要早。
发现 PWM 的变化缓慢,是什么原因?

客户采用了 SDK example/IOT_demo 中的渐变 API。如 light_set_aim light_set_aim_r 这些 API 使用的是渐变方式。不会立即生效,需要渐变的过程。

    

如用户需要 PWM Duty 设置后立即生效,需要调用接口 pwm_set_duty,需要注意调用 pwm_set_duty 后调用 pwm_start 此次设置才能生效。

GPIO 可以直接连 5V 吗?

不可以。GPIO 只能承受 3.6V。需要通过降压电路,否则会造成 GPIO 损坏。

哪里能找到 GPIO 的 register 和 bitmap 信息?

请参考文档《ESP8266 技术参考》。

如何编程 GPIO?

对于 Non-OS SDK,比如需要把 MTDO 配置成输入,同时下降沿触发中断:

void ICACHE_FLASH_ATTR gpio_init(void)
{
//GPIO Alternate Function
      PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15);
      GPIO_DIS_OUTPUT(GPIO_ID_PIN(15));
      //Configure it in input mode.
      ETS_GPIO_INTR_DISABLE();
    //Close the GPIO interrupt
//Register the interrupt function
      ETS_GPIO_INTR_ATTACH(GPIO_INTERRUPT,NULL);

       

      gpio_pin_intr_state_set(GPIO_ID_PIN(15),GPIO_PIN_INTR_NEGEDGE);
      //Falling edge trigger
      ETS_GPIO_INTR_ENABLE() ;
    //Enable the GPIO interrupt
}

    

对于 RTOS SDK,实现相同的功能。

{
     GPIO_ConfigTypeDef gpio_in_cfg;
    //Define GPIO Init Structure
     gpio_in_cfg.GPIO_IntrType = GPIO_PIN_INTR_NEGEDGE;
    //Falling edge trigger
     gpio_in_cfg.GPIO_Mode = GPIO_Mode_Input;
    //Input mode
     gpio_in_cfg.GPIO_Pin = GPIO_Pin_15;
    // Enable GPIO
     gpio_config(&gpio_in_cfg);
    //Initialization function
     GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS,
BIT(GPIO_UART_IN_NUM));
     gpio_intr_handler_register(interrupt_GPIO_UART);
    // Register the interrupt function
     _xt_isr_unmask(1 << ETS_GPIO_INUM);
    //Enable the GPIO interrupt
}

     

注意:Non-OS SDK 和 RTOS SDK 的实现方法稍有不同。

HSPI 每个数据包的大小最大是多少?

数据包每次发送最大 64 字节数据,四字节对齐,在 memory map 上是连续的。数据可以先传输到 LSB 或者 MSB 中,低位组在前或高位组在前,所以缓存是很灵活的。合理的使用 buffer,可以稳定实现 90% 的时钟速度。

对于多设备同时连接到 ESP8266 的情况,HSPI 是如何同时驱动设备的?

与 I2C 接口不同,HSPI 时钟不需要配合最慢的连接设备。HSPI 时钟可以及时的配置为使能的设备。HSPI_CS0 管脚可以自动选择。对于 LCD 类型的设备,需要频繁使用 CS 管脚。如果是连接高速设备,需要使用源端接电阻。

如何使用 64 字节的数据缓存?

使用函数

CLEAR_PERI_REG_MASK(SPI_USER(spiNum), SPI_USR_MISO_HIGHPART );

使能 MISO 的高位传输。

如何配置 (H)SPI 接口?

请参考 Non-OS SDK 下,example/peripheral_test

哪些 API 会保存到 Flash ?

wifi_station_set_auto_connect

wifi_station_ap_number_set

wifi_set_phy_mode

wifi_softap_set_config

wifi_station_set_config

wifi_set_opmode

system_restart_enhance

system_restore

system_upgrade_reboot

系统参数是如何保存的?

SPI Flash 的最后三个扇区被定义为系统参数区,其中前两个扇区用于交替保存系统参数,最后一个扇区用来保存使用前面两个扇区的 flag。这样设计的目的是保证在擦写系统参数区时,即使在擦写任意一个扇区时意外掉电,导致该扇区中数据异常的情况下,也不会导致系统的参数异常。

Flash 任何位置都可以随意读写吗?

读写操作都需要四字节对齐。我们推荐对 block 操作,避免频繁的小数据读写。

可以在所有的 ESP8266 上执行同样的 Flash 读写操作吗?

对应不同的 Flash 大小,有着不同的 Flash map,所以对应不同的固件,Flash map 可能不一样,比如对应 8 Mbit 的 Flash,读写 0x100000 地址就是非法的。

可否提供 Flash 擦写例证?

uint32 sector 是开始的 sector,uint32 cnt 是擦除的 sector 数目。

   

#define FLASH_WRITE_LEN_BYTE (1024*4)

#define FLASH_WRITE_CONTENT (0X10)

void flash_sector_rw_test(uint32 sector,uint32 cnt)

{

      char* w_data=(char*)os_malloc(FLASH_WRITE_LEN_BYTE);

      uint32 flash_operate=0;

      uint32 i=0;

      uint8 status=0;

      os_printf("Test Sector is 0x%x\n",sector);

      if(NULL==w_data){

         os_printf("Memory little\n");

         return;

}

os_memset(w_data,FLASH_WRITE_CONTENT,FLASH_WRITE_LEN_BYTE);

for(i=0;i<cnt;i++){

      if(spi_flash_erase_sector(sector+i)==0)

       {

         os_printf("erase sector0x%x ok\n",sector+i);

      }

      else{

         os_printf("Err:erase sector0x%x err\n",sector+i);

      }

}

for(i=0;i<cnt;i++){

      if(spi_flash_write((sector+i)*(FLASH_WRITE_LEN_BYTE),

(uint32*)w_data,FLASH_WRITE_LEN_BYTE)==0)

      {

         os_printf("write sector 0x%x ok\n",sector+i);

      }

      else{

         os_printf("Err:write sector 0x%x err\n",sector+i);

      }

}

for(i=0;i<cnt;i++){

         os_memset(w_data,0x00,FLASH_WRITE_LEN_BYTE);

      if(spi_flash_read((sector+i)*(FLASH_WRITE_LEN_BYTE), (uint32*)w_data,FLASH_WRITE_LEN_BYTE)==0)

      {

         uint32 j=0;

         for(j=0;j<FLASH_WRITE_LEN_BYTE;j++){

         if(*(w_data+j)!=FLASH_WRITE_CONTENT){

            os_printf("Err Flash read w_data[%d]=0x%x\n",j,w_data[j]);

            //status=1;

         }

         if(*(w_data+j)==FLASH_WRITE_CONTENT&&j==FLASH_WRITE_LEN_BYTE-1)

         {

            os_printf("Sector0x%x Test Ok\n",sector+i);

               }

}

      }

      else {

         os_printf("Err:read sector0x%x err\n",sector+i);

     }

}

os_free(w_data);

w_data=NULL;

}

如何判断 Flash 是否支持 QIO 或 DIO 模式?

判断 Flash 是否支持四线:

  1. QE 在状态寄存器的 BIT(9)。
  2. 写状态寄存器的格式为 01H+StatusReg1+StatusReg2。
  3. 有读 Flash 的如下命令:
    • 若是选择 QIO,必须支持 EBh 命令。
    • 若是选择 QOUT,必须支持 6 Bh 命令。

判断 Flash 是否支持两线:

有读 Flash 的如下命令:

    • 若是选择 DIO,必须支持 BBh 命令。
    • 若是选择 DOUT,必须支持 3 Bh 命令。

特殊的 Flash:ISSI Flash 可以支持 QIO 模式。

为什么透传过程会丢包?

因为没有设置硬件流控。如果需要避免丢包,请设置硬件流控。透传功能使用的是 TCP 协议,每包数据是 1460 (取决于协议栈),只要网络良好,buffer 空间没有被消耗完,就可以不停地传输数据。对于透传,串口接收数据间隔超过约 20 ms,就会认为数据接收结束,将已经接受的数据传输到网络。如果网络不好,就可能会丢弃一些数据,因此,为避免这种情况,可以将串口设置为流控模式。

ESP8266 有几个 UART?

ESP8266 有两个 UART,其中 UARTO 有 TX、RX,可做数据传输;UART1 由于 RX 脚被 SPI-Flash 占用,只能使用 TX,可以做串口调试信息打印。

GPIO 电平状态是怎样的?

除了 XPD_DCDC,GPIO 可以配置上拉。关于 GPIO 的上电 IO 口默认状态为:除了 SDIO 6根线 +GPIO4+GPIO5+GPIO16 上电 IO 默认无上拉,其他的 GPIO 口均有上拉。由于是内部配置上拉,所以如需下拉,需外部加下拉方式或者加一个三级管的反相电路。

    

注意:GPIO 不能到 5V。GPIO4/5 外接 1M 电阻不能上拉到高电平;需 100K 电阻。

   

如何屏蔽上电打印?

U0TXD 默认上电有系列打印,对此敏感应用可通过 UART 的内部引脚交换功能,在初始化的时候,调用 system_uart_swap 函数,将 U0TXD、U0RXD 分别与 U0RTS (MTDO/GPIO15),U0CTS (MTCK/GPIO13) 交换来屏蔽该上电的系统打印。交换后,硬件上的下载管脚还是使用 U0TXD+U0RXD,通信时需要将 MTDO 对应接到 MCU 的 RXD,MTCK 对应接到 MCU 的 TXD。

为什么 ESP8266 上电时会出现乱码?如何修改波特率?

如果使用的是 26 MHz 晶振,ESP8266 UARTO 上电后的波特率是 74880,所以上电时会有乱码。

  

客户可以在 user_main() 里面修改 UART 配置,比如:

void ICACHE_FLASH_ATTR
uart_init(UartBautRate uart0_br, UartBautRate uart1_br)
{
      // rom use 74880 baut_rate, here reinitialize
      UartDev.baut_rate = uart0_br;
      uart_config(UART0);
      UartDev.baut_rate = uart1_br;
      uart_config(UART1);
}

云平台

在乐鑫的云平台上,设备的生命周期是怎样的?
  1. 烧录 master-device-key,出厂。
  2. 到达终端用户,使用 Airkiss/ESP_TOUCH 让设备联网,同时传递随机字符(token,App 产生)作为权限标识,设备上网之后调用 /v1/device/activate,同时把 token 传递给云端。
  3. 终端用户使用 App 并且调用 /v1/device/authorize 接口(使用之前产生的随机 token),获得这个设备的所有权(成为 owner,获得对应的 owner key)。
  4. 终端用户对设备的拥有本质上是对 device key 的拥有,对于每一个设备的控制,是通过对应的 device key 来操作的。
  5. 终端用户使用 /v1/user/devices 列出拥有的设备以及对应的 device key,然后使用对应的 devicekey 做具体的操作。
  6. 终端用户是 owner 的权限下,可以调用 /v1/device/share 接口分享设备给他人,对应的用户使用 /v1/device/authorize 接口得到授权。

硬件

ESP8266 电压电流需求?

ESP8266 的数字部分的电压范围是 1.8V ~ 3.3V。

模拟部分的工作电压是 3.0V ~ 3.6V,最低 2.7V。

模拟电源峰值 350 mA。

数字电源峰值 200 mA。

注意:选择的 SPI Flash 工作电压也需要与 GPIO 的电压匹配。

CHIP_EN 还是工作在 3.0 - 3.6V,使用1.8V GPIO 控制时需要注意电平转换。

设计 ESP8266 的供电时,需要注意哪些问题?

请注意如下几点:

  1. 如果是使用 LDO 变压,请确保输入电压和输出电压要足够大。
  2. 电源轨去耦电容器必须接近 ESP8266 摆放,等效电阻要足够低。
  3. ESP8266 不能直连 5V 电压。
  4. 如果是通过 DC-DC 给 ESP8266 供电,必要时要加上 LC 滤波电路。
ESP8266 上电时电流很大,是什么原因?

ESP8266 的 RF 和数字电路具有极高的集成度。上电后,RF 自校准会需要大电流。模拟部分电路最大的极限电路可能达到 500 mA;数字电路部分最大电流 达到 200 mA。一般的操作,平均电流在 100 mA 左右。因此,ESP8266 需要供电能达到 500 mA,能够保证不会有瞬间压降。

可以使用锂电池或者 2 节 AA 纽扣电池直接给 ESP8266 供电吗?

2 节 AA 纽扣电池可以给 ESP8266 供电。锂电池放电时压降比较大,不适合直接给 ESP8266 供电。

ESP8266 的 RF 电路会受温度及电压浮动影响。不推荐不加任何校准的电源直接给 ESP8266 供电。

推荐使用 DC-DC 或者 LDO 给 ESP8266 供电。

SPI Flash 上电时,是否有特殊需求?

SPI Flash 用于存储用户的程序和数据。为了保证兼容性,SPI Flash 的电压应该和 GPIO 的电压相匹配。

上电时序是怎样的,boot 模式是如何选择的?

CHIP_EN 上电时序要求:CHIP_EN 芯片使能管脚,内部无上拉,高电平有效。CHIP_EN 的上电要晚于或同时与系统电源 3.3V 上电。一般 CH_EN 有外接 RC 电路,延时大概在 μs 级即可。CHIP_EN 拉高大概 60 ms 后,设备判断 boot mode {GPIO15, GPIO0, GPIO2},之后 UART 即可通讯。

    

EXT_RSTB:外部复位管脚,内部有上拉,悬空即为高电平。EXT_RSTB 为电平触发,低电平触发芯片复位。如果是外部给 ESP8266EX 的 reset  信号,则最低要求(0.25 VIO,100 μs)。

   

描述 最小值 最大值 单位
t1 VDD33 上升时间 10 2000 μs
t2 EXT_RSTB 上升时间 0 2 ms
t3 EXT_RSTB 电平在 VDD33 电平为高后上升 0.1 - ms
t4 CHIP_EN 上升时间 0 2 ms
t5 CHIP_EN 电平 在 EXT_RSTB 电为高后上升 0.1 - ms
ESP8266 的 RAM 的使用结构是怎么的?

ESP8266 的 RAM 总共 160 KB。

  

IRAM 空间为 64 KB:

前 32 KB 用作 IRAM,用来存放没有加 ICACHE_FLASH_ATTR 的代码,即 .text 段,会通过 ROM code 或二级 boot 从 SPI Flash 中的 BIN 中加载到 IRAM。

后 32 KB 被映射作为 iCache,放在 SPI Flash 中的,加了 ICACHE_FLASH_ATTR 的代码会被从 SPI Flash 自动动态加载到 iCache。

   

DRAM 空间为 96 KB:

对于 Non-OS_SDK,前 80 KB 用来存放 .data/.bss/.rodata/heap,heap 区的大小取决于 .data/.bss/.rodata 的大小;还有 16 KB 给 ROM code 使用。

对于 RTOS_SDK,96 KB 用来存放 .data/.bss/.rodata/heap,heap 区的大小取决于 .data/.bss/.rodata 的大小。

协议

TCP/UDP 的包长是多少?

单包数据,TCP 单包 1460 字节,UDP 单包 1472 字节。

系统

ESP8266 的看门狗有什么作用?

为了提供系统稳定性,以应对多冲突的操作环境,ESP8266 集成了 2 级看门狗机制,包括软件看门狗和硬件看门狗。默认 2 个看门狗都是打开的。

看门狗的超时间隔是多少?触发超时事件会有什么现象?

硬件看门狗中断时间为 0.8*2048 ms ,即 1638.4 ms ,中断后处理时间为 0.8*8192 ms,即 6553.6 ms 。其中中断处理后时间为硬件看门狗中断发生后,需要进行喂狗操作的时间,如果超过该时间,即会触发硬件看门狗复位。因此,在仅有硬件看门狗的情况下,一个程序段如果运行时间超过 6553.6 ms ,即有可能触发硬件看门狗复位,若超过 8192 ms 则一定会触发复位。软件看门狗建立在 MAC timer 以及系统调度之上,中断时间为 1600 ms,中断后处理时间为 1600 ms。因此,在有软件+硬件看门狗的情况下,一个程序段如果运行时间超过 1600 ms,即有可能会触发软件看门狗复位,若超过 3200 ms 则一定会触发复位。

如果我的应用不需要看门狗,如何关闭看门狗?

当时 SDK 仅支持关闭软件看门狗,支持同时喂软硬件看门狗。可以通过如下方式防止执行时间过长的用户程序导致看门狗复位:

  1. 如果一个程序段运行时间在触发软件看门狗和触发硬件看门狗复位之间,则可通过 system_soft_wdt_stop () 的方式关闭软件看门狗,在程序段执行完毕后用 system_soft_wdt_restart () 重新打开软件看门狗。
  2. 可以通过在程序段中添加 system_soft_wdt_feed () 来进行喂软硬件狗操作,防止软硬件看门狗复位。
我要在程序里面引入 10 秒的延迟,怎么做好?

看门狗不支持无限循环。如果客户使用循环做延迟或者进入一个事件太长时间,就会触发硬件看门狗重启。推荐使用 callback 和 timer 的 API 做延迟。

    

如果要轮询事件,推荐使用中断和 timer 的 API 来做。大多数事件都是关联到 callback 上的,所以大多数情况下,轮询都是可以避免的。

对于 Non-OS SDK,memory leak 问题如何 debug?

可通过定于 MEMLEAK_DEBUG 宏启用 memory leak debug 功能,代码中调用 os_malloc, os_zalloc, os_calloc, os_realloc, os_free 可将调用的文件以及调用的对应行数记录在内存管理链表中,在有需要的地方通过调用 system_print_meminfo() 可打印出 heap 区内存分配情况。

    

步骤:

    

1. 修改用户工程目录的 MakeFile,在 CONFIGURATION_DEFINES 后加宏定义:-DMEMLEAK_DEBUG
    如:CONFIGURATION_DEFINES = -DMEMLEAK_DEBUG

2. 在用户代码,如 user_main.c 中,增加如下代码:
  #include "mem.h"
  bool ICACHE_FLASH_ATTR check_memleak_debug_enable (void)
  {
  return MEMLEAK_DEBUG_ENABLE;
  }

3. 在有可能内存泄露的地方调用 system_print_meminfo() ,建议仅在关键代码位置加入此函数进行 debug。

对于 RTOS SDK, memory leak 问题如何 debug ?

暂不支持该功能。可以参考 FreeRTOS 的 debug 方法。

发生“fatal exception”问题如何处理?

可以在 (*.S) 文件中找出对应的地址,添加打印以便定位问题。

Fatal exception (28):
epc1=0x4025bfa6, epc2=0x00000000, epc3=0x00000000,
excvaddr=0x0000000f, depc=0x00000000

  

比如使用的是 user1.bin,那么就在 user1.S 中找到 0x4025bfa6 地址,并查明对应的函数。

   

如果使用的是 flash.binirom0text.bin,可以在 eagle.S 中查找出错的地址。

ESP8266 总共有几个 timer ?

ESP8266 有 2 个 timer。一个硬件的 timer,一个软件的 timer。API os_timer 是 DSR 处理,不能产生中断,但是可以产生任务。任务会按照普通等级排队。硬件 timer 能产生中断和任务,中断能触发任务,任务按照普通等级排队。

使用 timer 中断是否有特定条件?

请参考 SDK 的 API 参考:《ESP8266 Non-OS SDK API 参考》和《ESP8266 RTOS SDK API 参考》(链接为:espressif.com/zh-hans/support/download/documents)。

     

一般情况,使用 Non-OS SDK 时,硬件中断回调里面不要有声明为 ICACHE_FLASH_ATTR 的功能。同时中断回调里不要占用 CPU 太长时间。

如何调整 Tx Power?

system_phy_set_max_tpw” 用于设置 RF Tx Power 最大值,单位:0.25 dBm。目前 Flash download tool 中已开放给客户自行配置并生成 esp_init_data_default.bin。其中关于 Tx Power 的调整如下所示:

    

  • LowPowerEn:同时设置每个模式下的 Tx Power。
  • BackOffEn:同时设置每个模式下 Tx Power 需要减小的值。
  • PowerLimiten:限制 Tx Power 的最大值。
  • 设置确认之后点击 GenInitBin,并替换原先的 esp_init_data_default.bin

   

为什么 ESP8266_Non-OS_SDK 中有的函数前面添加了“ICACHE_FLASH_ATTR”宏?

对于 ESP8266_Non-OS_SDK:

添加了“ICACHE_FLASH_ATTR”宏的函数,将存放在 IROM 中,CPU 仅在调用到它们的时候,将它们读到 cache 中运行;没有添加到ICACHE_FLASH_ATTR”宏的函数,将在一开始上电运行时,就加载到 IRAM 中运行;由于空间有限,我们无法将所有代码都一次性加载到 IRAM 中运行,因此在大部分函数前添加到ICACHE_FLASH_ATTR”宏,放在 IROM 中。

   

请注意,不要再中断处理函数中调用带有ICACHE_FLASH_ATTR”宏的函数,否则可能与 Flash 读写操作冲突。

   

对于 ESP8266_RTOS_SDK:

函数默认存放在 IROM 中,无须再添加ICACHE_FLASH_ATTR”宏。中断处理函数也可以定义在 IROM 中。如果开发者需要将一些频繁调用的函数定义在 IRAM 中,在函数前添加“IRAM_ATTR”宏即可。

为什么编译 Non-OS SDK 时会发生 IRAM_ATTR 错误?

如果需要在 IRAM 中执行功能,就不需要加“ICACHE_FLASH_ATTR”的宏,那么该功能就是放在 IRAM 中执行。

为什么编译的时候会发生“irom0_0_seg”错误?

它表示代码量太大,IROM 区域存放不下了。

我们可以在 SDK_v0.9.5 (及之后)的软件版本中,尝试如下步骤,解决这个问题:

   

1. 使用默认设置,编译生成 eagle.flash.bin eagle.irom0text.bin

(1) 如果 size of eagle.flash.bin + size of eagle.irom0text.bin >= 236KBytes

很抱歉,您的代码量太大了,只能换大些的 Flash。

(2) 如果 size of eagle.flash.bin + size of eagle.irom0text.bin < 236KBytes

请继续步骤 2。

   

2. 在路径 SDK/ld 下修改文件“eagle.app.v6.new.512.app1.ld"

irom0_0_seg:           org = 0x40201010, len = 0x2B000

根据步骤 1 中编译的“eagle.irom0text.bin”大小,改写上述 len 的值。

示例:如果“eagle.irom0text.bin”大小为 179 KB,则可修改配置如下:

irom0_0_seg:           org = 0x40201010, len = 0x2D000

   

3. 重新编译 user1.bin 选择 boot_v.1.2+。

  

补充说明:

代码中,

    • 函数前未加  ICACHE_FLASH_ATTR 的,编译到 IRAM 中,最大 32 KB;
    • 函数前加了 ICACHE_FLASH_ATTR 的,编译到 IROM 中;

因为 RAM 的空间有限,因此做了这两个部分的区分:

    • IRAM 中的代码,会在上电初始就完整加载到 RAM 中;
    • IROM 中的代码是用到的时候才从 Flash 加载到 cache 中执行。
ESP8266 有 main 吗?

ESP8266 没有 main,程序入口为 user_init

操作指针有什么需要注意的?

内存必须 4 字节对齐读取,指针做转换时间请确保为 4 字节对齐,否则转换失败,不能正常使用。例如,请勿直接指针转换 float temp = *((float*)data);而是使用 os_memcpy (memcpy) 实现。 

RTOS SDK 和 Non-OS SDK 有何区别?

主要差异点如下:

   

Non-OS SDK

Non-OS SDK 主要使用定时器和回调函数的方式实现各个功能事件的嵌套,达到特定条件下触发特定功能函数的目的。Non-OS SDK 使用espconn 接口实现网络操作,用户需要按照 espconn 接口的使用规则进行软件开发。

    

RTOS SDK

  1. RTOS 版本 SDK  使用 freeRTOS 系统,引入 OS 多任务处理的机制,用户可以使用 freeRTOS 的标准接口实现资源管理、循环操作、任务内延时、任务间信息传递和同步等面向任务流程的设计方式。具体接口使用方法参考  freeRTOS 官方网站的使用说明或者 USING THE FREERTOS REAL TIME KERNEL -  A Practical Guide 这本书中的介绍。
  2. RTOS 版本 SDK 的网络操作接口是标准 lwIP API,同时提供了 BSD Socket API 接口的封装实现,用户可以直接按照 socket API 的使用方式来开发软件应用,也可以直接编译运行其他平台的标准 Socket 应用,有效降低平台切换的学习成本。
  3. RTOS 版本 SDK 引入了 cJSON 库,使用该库函数可以更加方便的实现对 JSON 数据包的解析。
  4. RTOS 版本兼容 Non-OS SDK 中的 Wi-Fi 接口、SmartConfig 接口、Sniffer 相关接口、系统接口、定时器接口、FOTA 接口和外围驱动接口,不支持 AT 实现。
哪些接口需要在 user_init 中调用,否则容易出现问题,或者不生效?
  1. wifi_set_ip_infowifi_set_macaddr 仅在 user_init 中调用生效,其他地方调用不生效。
  2. system_timer_reinit 建议在 user_init 中调用,否则调用后,需要重新 arme 所有 timer。
  3. wifi_station_set_config 如果在 user_init 中调用,底层会自动连接对应路由,不需要再调用 wifi_station_connect 来进行连接。否则,需要调用 wifi_station_connect 进行连接。
  4. wifi_station_set_auto_connect 设置上电启动时是否自动连接已记录的路由;例如,关闭自动连接功能,如果在 user_init 中调用,则当前这次上电就不会自动连接路由,如果在其他位置调用,则下次上电启动不会自动连接路由。
Light-sleep 如何通过 GPIO 或网络事件唤醒?

在 Light-sleep 模式下,CPU 在暂停状态下不会响应来自外围硬件接口的信号与中断,因此需要配置通过外部 GPIO 信号将 ESP8266 唤醒,唤醒过程小于 3 ms。

    

wifi_station_disconnect();

wifi_set_opmode(NULL_MODE); // set WiFi mode to null mode

wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);

wifi_fpm_open();
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);

gpio_pin_wakeup_enable(13, GPIO_PIN_INTR_LOLEVEL);//建议低电平唤醒

wifi_fpm_set_wakeup_cb(ssc_fpm_wakup_call);

wifi_fpm_do_sleep(FPM_SLEEP_MAX_TIME);

ESP8266 FRC1 的 hw_timer 如何使用?

1. 模型:

   

    

(1) FRC1 的参考时钟为 80M,分频系数可以配置为 1 分频,16 分频,256 分频,不同的分频影响每个 tick 的时长。

  

(2) FRC1 为递减型 timer,当 COUNT_VALUE 的值减到 0 后会触发中断。每一个 tick,COUNT_VALUE 的值都减 1。

   

(3) FRC1 可以配置为自动填装模式和非自动填装模式。

自动填装模式:当发生中断后,COUNT_VALUE 会自动取 FRC1_LOAD_VALUE 的值,放到本身,做自减操作。

非自动填装模式:当发生中断后,COUNT_VALUE 会切到最大值 0x7fffff 开始计。

    

(4) FRC1 的终端可以配置为 FRC1 中断源和 NMI 中断源。

NMI 中断被称为 CPU 不可屏蔽中断。NMI 中断在 ESP8266 对应 LEVEL3 的中断,其他中断对应 LEVEL1 的中断,NMI 中断可以打断任意比其优先级低的中断。

   

2. 关于 SDK HW_TIMER 的注意事项

SDK 中 hw_timer 的分频系数为 16,每个 tick 的时长为 0.2 μs。hw_timer_arm 函数配置的系数单位为 μs,最大值为 1677000 μs。

如何优化 ESP8266 应用的内存使用?

通过以下四种方法可以优化 ESP8266 应用的内存使用,减少应用的内存占用空间。

   

1. 将字符串放到 Flash 中:

(1) 有些字符串可以放在 Flash 中,特别是长字符串,例如 HTML 请求和响应模板。

比如,一个字符串原来是用 define 定义的:

#define test_string    "hello world”

现在可以定义成如下:

static const char test_string[] ICACHE_RODATA_ATTR = "hello world";

    

(2) 当用 ICACHE_RODATA_ATTR 定义字符串常量时,需要对数据内容进行四字节对齐读取。由于 Flash 中的数据需要四字节对其读取,所以定义一个宏获取对齐后的字符串长度:

#define GET_ALIGN_STRING_LEN(str)    ((strlen(str) + 3) & ~3)

使用字符串时,动态分配一个新的数组对象,读写 Flash 中的数据。然后用 os_memcpy API 来复制数据内容:

unsigned int str_len = GET_ALIGN_STRING_LEN(test_string);

char *tmp_string = (char *)os_malloc(str_len);

os_memcpy(tmp_string, test_string, str_len);

    

(3) 在用户的应用代码里使用 tmp_string 进行操作,而不使用 test_string。此方法除了减少应用的 RAM 占用空间,也能解决由于对 Flash 中的数据进行非对齐读取时,在应用中引起的 exception。

…….

   

(4) 当用户代码中,无需再使用通过以上方法读取的数据,需要释放之前分配的内存空间

os_free(tmp_string);

注意:如果不释放之前分配的内存空间,重复分配内存将会减少核心功能所需的内存,导致 API 出现功能异常或失败。

   

2. 把 const 数据放到 Flash:

(1) uint32 类型的数组可以直接放到 Flash,比如:

const uint32 array[4] ICACHE_RODATA_ATTR = {0x11111111, 0x22222222, 0x33333333, 0x44444444};

可以直接使用 array[0]。

    

(2) 对于 uint8 和 uint16 类型的数组,要注意读取数据的时候要四字节对齐,

比如:

const uint8 array[7] ICACHE_RODATA_ATTR = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

   

(3) 如果需要按字节读取 char 数组当中的元素,可从软件上进行处理,先按四字节读取,然后再按偏移取当中的一个字节。如果直接读取 array[0],会导致 crash。

   

(4) 对于数据结构,通常做法是分配比用户需要读取的结构更大的内存,从 Flash 四字节读取数据到内存。如同方法 1,在代码中依然使用对象指针。修改代码操作内存中的数据结构,而不是读取数组。

    

3. 将调试字符串放到 Flash 中:

现在默认的 printf 打印的字符串都还是放在 RAM 区,占用部分内存。如果用户无需频繁打印日志文件,或者调试字符串太长,可以使用优化的 os_printf 把打印的字符串放到 Flash 而不是 RAM 中。

   

4. 避免使用全局数组变量:

全局数组变量会在应用的整个生存期中占用不必要的内存。为减少全局数组变量的使用,乐鑫提供了动态内存分配 API。在基于事件的编程中,请使用 os_malloc 和 os_free 来动态分配所需的内存空间。但注意,我们不建议过于频繁地分配和释放大小不等的内存空间。

如何让 ESP8266 上电后快速连接 AP?

ESP8266 与某个 AP 连接后,会将该 AP 的信道信息存储在 RTC memory 中。

  

    • 当软件复位 ESP8266,或 ESP8266 从 Deep-sleep 模式中唤醒之后,ESP8266 会从 RTC memory 中读取 AP 的信道信息,并尝试连接该信道中的 AP。
    • 但如果上电启动或硬件复位 ESP8266,RTC memory 会被清空。因此,ESP8266 会扫描所有的信道,这会占用一些时间。

   

用户上电启动或硬件复位 ESP8266 时,可通过以下方式存储 AP 的信道信息,以避免 ESP8266 重新扫描所有信道寻找上次连接的 AP。这将有助于减少 ESP8266 启动后的连接时间。   

    1. 在 ESP8266 与 AP 连接后,调用函数 wifi_get_channel 来读取当前 AP 的信道信息,然后将该信息存储到 SPI Flash 中。在写入 AP 的信道信息之前,请确保该信道信息有效。
    2. ESP8266 上电或硬件复位时,用户固件将从 Flash 中读取之前存储的信道信息。通过调用函数 WRITE_PERI_REG(0x600011f4, 1 << 16 | channel) 将该 AP 的信道信息写入 RTC memory 中。之后便可以从 RTC memory 获取信道信息,加快 ESP8266 与 AP 的连接。
    3. 使能自动连接功能后,ESP8266 会从 RTC memory 中读取 AP 的信道信息,并尝试连接该信道中的 AP。

   

只有信道信息会被存储在 RTC memory 中。当调用函数 wifi_station_set_config 时,配置的其它信息(比如 SSID 和密码)已存储在 Flash 中。

    

注意:如果应用要求 ESP8266 频繁上电或硬件复位,建议客户使用片外 RTC memory 来备份信道信息。由于 Flash 内存的写入周期有限,不建议对 Flash 内存频繁地写入。

为什么 ESP8266 进入启动模式 (2, 7) 并触发看门狗复位?

请确保 ESP8266 启动时,strapping 管脚处于所需的电平。如果外部连接的外设使 strapping 管脚进入到错误的电平,ESP8266 可能进入错误的操作模式。在无有效程序的情况下,看门狗计时器将复位芯片。

      

因此在设计实践中,建议仅将 strapping 管脚用于连接高阻态外部输入器件,这样便不会在上电时强制 strapping 管脚为高/低电平。

ESP8266 上电时打印的 boot 模式信息代表什么?如何改变 boot 模式?

ESP8266 上电时会判断 boot strapping 管脚的状态,并决定 boot 模式。例如,ESP8266 上电时打印的 boot 模式信息如下:

    

ets Jan 8 2013,rst cause:1, boot mode:(3,2)

    

其中打印的 boot mode 的第一位数字(3)代表当前的 boot 模式。

   

Boot 模式由 strapping 管脚的 3 位值 [GPIO15,GPIO0,GPIO2] 共同决定。如下表所示:

        

Strapping 管脚的 3 位值 [GPIO15,GPIO0,GPIO2] Boot 模式
7 / [1,1,1] SDIO HighSpeed V2 IO 
6 / [1,1,0] SDIO LowSpeed V1 IO
5 / [1,0,1] SDIO HighSpeed V1 IO
4 / [1,0,0] SDIO LowSpeed V2 IO
3 / [0,1,1] Flash Boot
2 / [0,1,0] Jump Boot
1 / [0,0,1] UART Boot
0 / [0,0,0] Remapping

工具

测试和生产时如何烧录 Flash?

测试时,通过 UART 转 USB 芯片,使用乐鑫提供的 Flash 下载工具进行烧录,具体方法参见文档《ESP8266 SDK 入门指南》。

   

下载工具:http://espressif.com/zh-hans/support/download/other-tools

下载方法:http://espressif.com/zh-hans/support/download/documents

    

生产时,使用 UART 接口烧录 Flash 不方便,使用厂商提供的下载工具可以加快这一过程。用户可以使用乐鑫的 Flash 下载工具把 BIN 文件合成一个完整的固件,通过 Flash 厂商提供的下载器,下载到 Flash 里面,再贴片到模组或产品上。

    

注:Flash mode,Flash speed,Flash size 选项要在 combine 前选好,再执行 combine 键,即可得到 target.bin

Wi-Fi

设备开启 SoftAP + Station 模式下,连接的路由是 192.168.4.X 网段时,为什么会失败?

ESP8266 SoftAP 默认 IP 地址是 192.168.4.1。

ESP8266 如果要连接 192.168.4.X 的路由时,不能分辨是要连接自己本身的 SoftAp 还是外部路由,所以会造成错误。

路由配置是正确的,但是发生找不到路由,连接失败,为什么?

如果 SSID 和密码配置是正确的,可能的原因有 2 个。

  1. 推荐使用英文字符,不要使用中文。
  2. 需要注意 bssid_set 的设置,如果不需要指定路由的 MAC 地址,那么需配置 stationConf.bssid_set = 0
ESP8266 SoftAP + Station 模式下网络断开或丢包的情况?

虽然 ESP8266 支持 SoftAP + Station 共存模式,但是 ESP8266 实际只有一个硬件信道。因此在 SoftAP + Station 模式时,ESP8266 SoftAP 会动态调整信道值与 ESP8266 Station 一致。这个限制会导致 ESP8266 SoftAP + Station 模式时一些行为上的不便,用户请注意。例如:

   

情况一

  1. 如果 ESP8266 Station 连接到一个路由 (假设路由信道号为 6);
  2. 通过接口 wifi_softap_set_config 设置 ESP8266 SoftAP;
  3. 若设置值合法有效,该 API 将返回 true ,但信道号仍然会自动调节成与 ESP8266 Station 接口一致,在这个例子里也就是信道号为 6。

   

情况二

  1. 调用接口 wifi_softap_set_config 设置 ESP8266 SoftAP (例如信道号为 5);
  2. 其他 Station 连接到 ESP8266 SoftAP;
  3. 将 ESP8266 Station 连接到路由( 假设路由信道号为 6) ;
  4. ESP8266 SoftAP 将自动调整信道号与 ESP8266 Station 一致(信道 6);
  5. 由于信道改变,之前连接到 ESP8266 SoftAP 的 Station 的 Wi-Fi 连接断开。

     

情况三

  1. 其他 Station 与 ESP8266 SoftAP 建立连接;
  2. 如果 ESP8266 Station 一直尝试扫描或连接某路由,可能导致 ESP8266 SoftAP 端的连接断开,或者 UDP 丢包,ping 丢包等情况。 

   

因为 ESP8266 Station 会遍历各个信道查找目标路由,意味着 ESP8266 其实在不停切换信道,ESP8266 SoftAP 的信道也因此在不停更改。这可能导致 ESP8266 SoftAP 端的原有连接断开,或者 UDP 丢包,ping 丢包等情况。

    

这种情况,用户可以通过设置定时器,超时后调用 wifi_station_disconnect 停止 ESP8266 Station 不断连接路由的尝试;或者在初始配置时,调用 wifi_station_set_reconnect_policy wifi_station_set_auto_connect 禁止 ESP8266 Station 尝试重连路由。

Wi-Fi 信道是什么?可以自行选择信道吗?

信道指的是 Wi-Fi 使用的指定频段中特定频率的波段。不同国家地区使用的信道数目是不同的。您可以参考《ESP8266 Wi-Fi 信道选择指南》。

如何配置 ESP8266,以便连接到无线路由器?

有关配置连接无线路由器,一般有以下几种方式:

  1. SmartConfig 一键配置方式,设备在 sniffer 模式扫描特征包的方式。
  2. 设备开启 SoftAP,手机连接 SoftAP 后建立稳定的 TCP/UDP 连接后,发送 SSID 和密码。
  3. WPS 配置方式,此方式需要设备中增加按键;或连接到设备的 SoftAP 后使用手机软件控制开启 WPS。
调用 wifi_softap_set_config() 时,函数返回成功,但为何无法修改 ESP8266 的 SoftAP SSID 和密码?

使用函数 wifi_softap_set_config() 时,如果 API 从回调函数内部调用,ESP8266 SoftAP 的配置有时候会修改失败。例如,当应用程序试图在 SoftAP 事件的回调函数内,从 SoftAP 模式切换到 Station 模式时,可能出现这种情况。

      

为确保 wifi_softap_set_config() 所做的修改立即生效,请使用 system_os_task() API 创建一个更改 SoftAP 设置的任务。在调用任何 SoftAP API 之前,请确保 ESP8266 已成功切换到 SoftAP 模式。例如:

     

LOCAL void ICACHE_FLASH_ATTR


some_callback_function (void)


{
 

unsigned char res;
  

os_event_t *testQueue;

  

   

res = wifi_set_opmode_current (0x02);  // 确保 ESP8266 处于 SoftAP 模式。
  

os_printf ("\r\nSet op mode returned: %d", res);

  

   

testQueue = (os_event_t *)os_malloc(sizeof(os_event_t)*4);
  

system_os_task (set_ap_config, USER_TASK_PRIO_1, testQueue, 4);



   

ap_server_setup (AP_PORT);                     // 继续设置服务器等。


}

void set_ap_config (os_event_t *e)


{
   

struct softap_config ap;

  

   

wifi_softap_get_config(&ap);                  // 先获得之前的设置。 

    

os_memset(ap.ssid, 0, 32);
   

os_memset(ap.password, 0, 64);
   

       

os_memcpy(ap.ssid, "SSIDhere", 8);
   

os_memcpy(ap.password, "PASSWDhere", 10);
   
  

     

ap.authmode = AUTH_WPA2_PSK;
   

ap.ssid_len = 0;                              // 或者 SSID 的实际长度。  

ap.max_connection = 1;                        // 允许接入 Station 的最大数量。 

wifi_softap_set_config (&ap);                 // 更新 ESP8266 SoftAP 设置。

}

 

AT

找到 2 个结果
  • 收起全部
  • 展开全部
标题 Body 平台 版本 发布日期升序排列 下载
ESP8266 IDF AT Bin
Bin Latest 2020年07月29日
ESP8266 Qcloud IoT AT

基于 ESP8266 的腾讯云 IoT AT 指令集。

Bin Latest 2019年08月19日