ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用
1. 前言
在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识。并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式:
- Station模式,也叫站点模式;
- Soft-Access Point模式,也叫Soft-AP模式,可以理解为WiFi热点模式;
- 以上两种的集合模式,Station 兼Soft-Access Point,也是Mesh NetWork的实现基础;
任何基于ESP8266的WiFi功能开发,都是基于上面其中一种工作模式来进行开发。所以,它们是我们WiFi基础学习的重点。
本篇章将讲解Station模式。
2. 回顾Station模式 —— 我想连上谁
Station模式又叫做站点工作模式,类似于无线终端,有图有真相:
Station模式又叫做站点工作模式,类似于无线终端,有图有真相:
处于Station模式下的ESP8266,可以连接到AP。通过Station(简称为“STA”)模式,ESP8266作为客户端连接到路由的wifi信号。 以下黑色字体内容摘录于博主自建qq群里面在arduino 联网.pdf文件,博主觉得讲得挺生动,故分享给大家:
- 首先AP发出信标帧(beacon),意思就是我在这里,谁来泡我啊,移动工作站也会发出探(probe)帧,意思是有谁我可以泡啊,每隔一定时间发出一次。(后面会讲到Scan功能)。
- 所以,根据这一点,可以产生很多有价值的应用。比如你的带WiFi功能的手机,即使在不连接wifi的情况下,只要打开WiFi功能,就可以被路由器截获这帧信息,路由器收集之后,你的信息就会被一个审计的东西发到服务器上,你手机号xxx上线时间xxx下线时间xxx都浏览了哪些网页,WiFi建立连接过程都一目了然,你的位置也全都暴露了,这就叫WiFi探针。具体流程如下所示:
- STA --------> Probe Request ----------> AP
- STA <-------- Probe Response <---------- AP,这个是由wifi返回的应答帧;
接下来是身份验证过程,可以使用诸如WEP、WEP2、WPA等加密方式应用到认证请求上: - STA --------> Authentication Request ----------> AP
认证请求中包含认证Auth类型,OpenSystem,sharedKey等信息,路由器返回认证结果: - STA <-------- Authentication Response <---------- AP
连接请求: - STA --------> Association Request ----------> AP
请求与AP建立关联,从而可以进行数据交互;
认证通过连接请求OK返回。 - STA <-------- Association Response <---------- AP
通过这个连接过程分析,也证明了我们经常听到的一句话,不要轻易连接不明WiFi热点,各种盗取信息层出不穷。
同时,学过网络的同学都知道,每台设备都会有个一个IP地址,用来在整个网络环境下的唯一标识。
而处于Station模式下的ESP8266,可以使用DHCP Client的方式,由上级路由分配的ip,或者设置成静态ip。
如果是采用DHCP分配的方式,获取的ip是动态的,在一些需要知道设备ip才能通信的场合下,就需要通过其他手段来获取ip(一种思路是通过访问webserver去获取模块信息);
如果是采用设置静态ip的方式,那么就有一个要求前提,要求连接AP设置的网段和静态的要一致,在不能固定AP网段的情况下,这种方式不可取。
Station模式下的WiFi模块,有几个特点,以便用来管理WiFi连接:
- 当最近使用的可接入点连接断开,但后面重新可用,那么ESP8266会自动去重新连接它(名词解析,最近使用的可接入点,就是ESP8266 最后连接的WiFi热点);
- 第一点说到的情况,对于ESP8266模块重新启动也一样适用;
- 这两点实现的原理就是:ESP8266会把最近使用的可接入点的校验信息(ssid账号和psw密码)会存到flash 存储中。使用保存在flash中的校验信息,ESP8266就可以重新连接到最近使用的可接入点,尽管你再次改变代码烧写进去,只要你不改变WiFi原来的工作模式和校验信息(说简单点就是,如果你烧写代码不擦除所有flash空间并且设置了自动连接,那么在仍然是station模式下就会自动连接wifi热点,不过在这里,博主建议大家在begin之前先调用 WiFi.disconnect(),可以避免一些奇怪的连接问题)。
3. ESP8266WiFiSTA库
有了前面的理论基础,那么我们开始详解一下ESP8266 station模式的专用库——ESP8266WiFiSTA库,大家使用的时候不需要
#include <ESP8266WiFiSTA.h>
只需要引入
#include<ESP8266WiFi.h>
至于原因,敬请回顾 ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库。
首先,对于STA类库的描述,可以拆分为四个部分:
- 第一部分方法,和一个接入点(Access Point,wifi热点)建立连接;
- 第二部分方法,管理第一部分方法建立的连接;
- 第三部分方法,提供一些关于这个连接的信息,包括MAC地址、IP地址等;
- 第四部分方法,提供一些备用方法去连接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig);
讲解之前,先浏览一下博主整理的百度脑图,以便有个整体认识:
3.1 第一部分方法——建立连接
3.1.1 begin —— 建立连接
建立连接,ESP8266模块切换工作模式为Station模式。
会用到以下方法:
class ESP8266WiFiSTAClass {
// ----------------------------------------------------------------------------------------------
// ---------------------------------------- STA function ----------------------------------------
// ----------------------------------------------------------------------------------------------
.......
public:
wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
wl_status_t begin();
.......
};
下面是函数详解:
/**
* 切换工作模式到STA模式,并自动连接到最近接入的wifi热点
* @param void
* @return void
* @note 调用这个方法就会切换到STA模式,并且连接到最近使用的接入点(会从flash中读取之前存储的配置信息)
* 如果没有配置信息,那么这个方法基本上没有什么用。
*/
wl_status_t begin()
/**
* 切换工作模式到STA模式,并根据connect属性来判断是否连接wifi
* @param ssid wifi热点名字
* @param password wifi热点密码
* @param channel wifi热点的通道号,用特定通信通信,可选参数
* @param bssid wifi热点的mac地址,可选参数
* @param connect boolean参数,默认等于true,当设置为false,不会去连接wifi热点,会建立module保存上面参数
* @return wl_status_t wifi状态
* @note 调用这个方法就会切换到STA模式。
* 如果connect等于true,会连接到ssid的wifi热点。
* 如果connect等于false,不会连接到ssid的wifi热点,会建立module保存上面参数。
*/
wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true
注意点:
- 如果ESP8266模块之前处于AP模式,那么当你调用begin()有可能进入到STA+softAP模式;
- 当你发现一些操作异常,那么你就检测一下当前处于什么模式(WiFi.mode());
3.1.2 config —— 配置IP地址
/**
* 禁止DHCP client,设置station 模式下的IP配置
* @param local_ip station固定的ip地址
* @param gateway 网关
* @param subnet 子网掩码
* @param dns1,dns2 可选参数定义域名服务器(dns)的ip地址,这些域名服务器
* 维护一个域名目录(如www.google.co.uk),并将它们翻译成ip地址
* @return boolean值,如果配置成功,返回true;
* 如果配置没成功(模块没处于station或者station+soft AP模式),返回false;
*/
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
注意点:
- 有着固定IP配置地址的station,通常会更快连接上网络,原因是通过DHCP client获得IP配置这一步被跳过了。如果你把三个参数(local_ip, gateway and subnet)设置为0.0.0.0,那么它会重新启动DHCP,这时你需要重新连接wifi以拿到最新的IP。
3.2 第二部分方法——管理连接
3.2.1 reconnect —— 重新连接网络
函数讲解:
/**
* 断开连接并且重新连接station到同一个AP
* @param void
* @return false or true
* 返回false,意味着ESP8266不处于STA模式或者说Station在此之前没有连接到一个可接入点。
* 返回true,意味着已经成功重新启动连接,但是用户仍应该去检测网络连接状态指导WL_CONNECTED。
*/
bool reconnect()
案例使用:
/**
* 使用案例
*/
WiFi.reconnect();
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
3.2.2 disconnect —— 断开网络连接
函数讲解:
/**
* 断开wifi连接,设置当前配置SSID和pwd为null
* @param wifioff 可选参数,设置为true,那么就会关闭Station模式
* @return false or true 返回wl_status_t状态
*/
bool disconnect(bool wifioff = false);
注意点:
- 调用该函数将会清掉之前最近一个连接点信息(wifi热点信息)。查看函数源码:
/**
* Disconnect from the network
* @param wifioff
* @return one value of wl_status_t enum
*/
bool ESP8266WiFiSTAClass::disconnect(bool wifioff) {
bool ret;
struct station_config conf;
/**以下两步为清除最近连接点信息*/
*conf.ssid = 0;
*conf.password = 0;
ETS_UART_INTR_DISABLE();
if(WiFi._persistent) {
wifi_station_set_config(&conf);
} else {
wifi_station_set_config_current(&conf);
}
ret = wifi_station_disconnect();
ETS_UART_INTR_ENABLE();
if(wifioff) {
WiFi.enableSTA(false);
}
return ret;
}
- 对于STA模式下如果出现WiFi账号密码正确的前提下仍然连接不上WiFi热点,可以尝试在begin方法之前调用该方法。当然,博主建议在begin之前都尽量调用该方法。
3.2.3 isConnected —— 是否连接上网络
函数讲解:
/**
* 判断STA模式下是否连接上AP
* @return 如果STA连接上AP,那么就返回true
*/
bool isConnected();
3.2.4 setAutoConnect —— 设置是否自动连接到最近接入点
函数讲解:
/**
* 当电源启动后,设置ESP8266在STA模式下是否自动连接flash中存储的AP
* @param autoConnect bool 默认是自动连接
* @return 返回保存状态 true or false
*/
bool setAutoConnect(bool autoConnect);
3.2.5 getAutoConnect —— 判断是否设置了自动连接
函数讲解:
/**
* 检测ESP8266 station模式下是否启动自动连接
* @return 返回自动连接状态 true or false
*/
bool getAutoConnect();
3.2.6 setAutoReconnect —— 设置是否自动重新连接到最近接入点
函数讲解:
/**
* 设置当断开连接的时候是否自动重连
* @param autoConnect bool
* @return 返回保存状态 true or false
*/
bool setAutoReconnect(bool autoReconnect);
注意点:
- 如果在网络已经断开了之后才去设置setAutoReconnect(true),这是无效的
3.2.7 waitForConnectResult —— 等待网络连接结果
函数讲解:
/**
* 等待直到ESP8266连接AP返回结果
* @return uint8_t 连接结果
* 1.WL_CONNECTED 成功连接
* 2.WL_NO_SSID_AVAIL 匹配SSID失败(账号错误)
* 3.WL_CONNECT_FAILED psw错误
* 4.WL_IDLE_STATUS 当wi-fi正在不同的状态中变化
* 5.WL_DISCONNECTED 这个模块没有配置STA模式
*/
uint8_t waitForConnectResult();
3.3 第三部分方法——连接信息
提供一些关于这个连接的信息,包括MAC地址、IP地址等;
3.3.1 macAddress —— 获取mac地址
获取mac地址有2个函数,请看函数讲解:
/**
* 获取ESP station下的Mac地址
* @param mac uint8_t数组的指针,数组长度为Mac地址的长度,这里为6
* @return 返回uint8_t数组的指针
*/
uint8_t * macAddress(uint8_t* mac);
/**
* 获取ESP station下的Mac地址
* @return 返回String的Mac地址
*/
String macAddress();
应用实例:
//实例代码1 这只是部分代码 不能直接使用
if (WiFi.status() == WL_CONNECTED)
{
uint8_t macAddr[6];
WiFi.macAddress(macAddr);
Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
//Connected, mac address: 5C:CF:7F:08:11:17
}
//实例代码2 这只是部分代码 不能直接使用
if (WiFi.status() == WL_CONNECTED)
{
Serial.printf("Connected, mac address: %s\n", WiFi.macAddress().c_str());
////Connected, mac address: 5C:CF:7F:08:11:17
}
3.3.2 localIP —— 获取IP地址
函数讲解:
/**
* 返回ESP8266 STA模式下的IP地址
* @return IP地址
*/
IPAddress localIP();
应用实例:
//实例代码 这只是部分代码 不能直接使用
if (WiFi.status() == WL_CONNECTED)
{
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
//Connected, IP address: 192.168.1.10
}
3.3.3 subnetMask —— 获取IP地址
函数讲解:
/**
* 获取子网掩码的地址
* @return 返回子网掩码的IP地址
*/
IPAddress subnetMask();
应用实例:
//实例代码 这只是部分代码 不能直接使用
Serial.print("Subnet mask: ");
Serial.println(WiFi.subnetMask());
//Subnet mask: 255.255.255.0
3.3.4 gatewayIP —— 获取网关地址
函数讲解:
/**
* 获取网关IP地址
* @return 返回网关IP地址
*/
IPAddress gatewayIP();
应用实例:
//实例代码 这只是部分代码 不能直接使用
Serial.printf("Gataway IP: %s\n", WiFi.gatewayIP().toString().c_str());
//Gataway IP: 192.168.1.9
3.3.5 dnsIP —— 获取dns地址
函数讲解:
/**
* 获取DNS ip地址
* @param dns_no dns序列号
* @return 返回DNS服务的IP地址
*/
IPAddress dnsIP(uint8_t dns_no = 0);
应用实例:
/实例代码 这只是部分代码 不能直接使用
Serial.print("DNS #1, #2 IP: ");
WiFi.dnsIP().printTo(Serial);
Serial.print(", ");
WiFi.dnsIP(1).printTo(Serial);
Serial.println();
//DNS #1, #2 IP: 62.179.1.60, 62.179.1.61
3.3.6 hostname —— 获取host名字
函数讲解:
/**
* 获取ESP8266 station DHCP的主机名
* @return 主机名
*/
String hostname();
3.3.7 hostname(name) —— 设置host名字
设置host名字,有3个可用函数,请看函数讲解:
/**
* 设置ESP8266 station DHCP的主机名
* @param aHostname 最大长度:32
* @return ok
*/
bool hostname(char* aHostname);
bool hostname(const char* aHostname);
bool hostname(String aHostname);
应用实例:
//实例代码 这只是部分代码 不能直接使用
Serial.printf("Default hostname: %s\n", WiFi.hostname().c_str());
WiFi.hostname("Station_Tester_02");
Serial.printf("New hostname: %s\n", WiFi.hostname().c_str());
//Default hostname: ESP_081117
//New hostname: Station_Tester_02
3.3.8 status —— 获取当前wifi连接状态
函数讲解:
/**
* 返回wifi的连接状态
* @return 返回wl_status_t中定义的其中一值,wl_status_t在 wl_definitions.h中定义
*/
wl_status_t status();
3.3.9 SSID —— 获取wifi网络的名字
函数讲解:
/**
* 返回当前通信网络的SSID
* @return SSID
*/
String SSID() const;
应用实例:
//实例代码 这只是部分代码 不能直接使用
Serial.printf("SSID: %s\n", WiFi.SSID().c_str());
//SSID: sensor-net
3.3.10 psk —— 获取wifi网络密码
函数讲解:
/**
* 返回当前通信网络的密码
* @return psk
*/
String psk() const;
3.3.11 BSSIDstr —— 获取wifi网络macaddress
函数讲解:
/**
* 返回当前通信网络的mac地址
* @return bssid uint8_t *
*/
uint8_t * BSSID();
String BSSIDstr();
应用实例:
//实例代码 这只是部分代码 不能直接使用
Serial.printf("BSSID: %s\n", WiFi.BSSIDstr().c_str());
//BSSID: 00:1A:70E:C1:68
3.3.12 RSSI —— 获取wifi网络的信号强度
函数讲解:
/**
* Return the current network RSSI.返回当前通信网络的信号强度,单位是dBm
* @return RSSI value
*/
int32_t RSSI();
应用实例:
//实例代码 这只是部分代码 不能直接使用
Serial.printf("RSSI: %d dBm\n", WiFi.RSSI());
//RSSI: -68 dBm
3.4 第四部分方法——智能配置
第四部分方法,提供一些备用远程配置方法去连接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig);
bool beginWPSConfig(void);
/**
* 启动 SmartConfig
*/
bool beginSmartConfig();
/**
* 停止 SmartConfig
*/
bool stopSmartConfig();
/**
* 查找SmartConfig状态来决定是否停止配置
* @return smartConfig Done
*/
bool smartConfigDone();
这部分不是本篇的重点,暂时忽略,后续章节会详细讲解。
4. 实例操作
上面博主讲了一堆方法理论的知识,下面我们开始讲解操作实例,博主尽量都在代码中注释,直接看代码就好。
4.1 应用实例1
statin模式下,创建一个连接到可接入点(wifi热点),并且打印IP地址。
源码:
/**
* Demo1:
* statin模式下,创建一个连接到可接入点(wifi热点),并且打印IP地址
* @author 单片机菜鸟
* @date 2019/09/02
*/
#include <ESP8266WiFi.h>
#define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字
#define AP_PSW "6206908you11011010"//这里改成你的wifi密码
//以下三个定义为调试定义
#define DebugBegin(baud_rate) Serial.begin(baud_rate)
#define DebugPrintln(message) Serial.println(message)
#define DebugPrint(message) Serial.print(message)
void setup(){
//设置串口波特率,以便打印信息
DebugBegin(115200);
//延时2s 为了演示效果
delay(2000);
DebugPrintln("Setup start");
//启动STA模式,并连接到wifi网络
WiFi.begin(AP_SSID, AP_PSW);
DebugPrint(String("Connecting to ")+AP_SSID);
//判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
//笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现
while (WiFi.status() != WL_CONNECTED){
delay(500);
DebugPrint(".");
}
DebugPrintln("");
DebugPrint("Connected, IP address: ");
//输出station IP地址,这里的IP地址由DHCP分配
DebugPrintln(WiFi.localIP());
DebugPrintln("Setup End");
}
void loop() {
}
操作结果:
4.2 应用实例2
statin模式下,配置IP地址,网关地址,子网掩码,并且打印IP地址。
源码:
/**
* Demo2:
* statin模式下,配置IP地址,网关地址,子网掩码,并且打印IP地址
* @author 单片机菜鸟
* @date 2019/09/02
*/
#include <ESP8266WiFi.h>
#define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字
#define AP_PSW "6206908you11011010"//这里改成你的wifi密码
//以下三个定义为调试定义
#define DebugBegin(baud_rate) Serial.begin(baud_rate)
#define DebugPrintln(message) Serial.println(message)
#define DebugPrint(message) Serial.print(message)
IPAddress staticIP(192,168,1,22);//固定IP地址
IPAddress gateway(192,168,1,9);//网关地址
IPAddress subnet(255,255,255,0);//子网掩码地址
void setup(){
//设置串口波特率,以便打印信息
DebugBegin(115200);
//延时2s 为了演示效果
delay(2000);
DebugPrintln("Setup start");
//启动STA模式,并连接到wifi网络
WiFi.begin(AP_SSID, AP_PSW);
DebugPrint(String("Connecting to ")+AP_SSID);
//配置网络
WiFi.config(staticIP,gateway,subnet);
//判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
//笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现
while (WiFi.status() != WL_CONNECTED){
delay(500);
DebugPrint(".");
}
DebugPrintln("");
DebugPrint("Connected, IP address: ");
//输出station IP地址,这里的IP地址理论上就是上面配置的
DebugPrintln(WiFi.localIP());
DebugPrintln("Setup End");
}
void loop() {
}
操作结果:
4.3 应用实例3
statin模式下,创建一个连接到可接入点(wifi热点),并且打印station信息。
源码:
/**
* Demo3:
* statin模式下,创建一个连接到可接入点(wifi热点),并且打印station信息
* @author 单片机菜鸟
* @date 2019/09/02
*/
#include <ESP8266WiFi.h>
#define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字
#define AP_PSW "6206908you11011010" //这里改成你的wifi密码
//以下三个定义为调试定义
#define DebugBegin(baud_rate) Serial.begin(baud_rate)
#define DebugPrintln(message) Serial.println(message)
#define DebugPrint(message) Serial.print(message)
void setup(){
//设置串口波特率,以便打印信息
DebugBegin(115200);
//延时2s 为了演示效果
delay(2000);
DebugPrintln("Setup start");
//启动STA模式,并连接到wifi网络
WiFi.begin(AP_SSID, AP_PSW);
//设置自动连接
WiFi.setAutoConnect(true);
//设置自动重连
WiFi.setAutoReconnect(true);
DebugPrint(String("Connecting to ")+AP_SSID);
//判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
//笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现
while (WiFi.status() != WL_CONNECTED){
delay(500);
DebugPrint(".");
}
DebugPrintln("");
DebugPrintln("rint Network Info:");
if (WiFi.status() == WL_CONNECTED){
//输出mac地址
DebugPrintln(String("Connected, mac address: ")+WiFi.macAddress().c_str());
//输出station IP地址,这里的IP地址由DHCP分配
DebugPrintln(String("Connected, IP address: ")+WiFi.localIP().toString());
//输出子网掩码地址
DebugPrintln(String("Subnet mask: ")+WiFi.subnetMask().toString());
//输出网关 IP地址
DebugPrintln(String("Gataway IP: ")+WiFi.gatewayIP().toString());
//输出hostname
DebugPrintln(String("Default hostname: ")+WiFi.hostname());
//设置新的hostname
WiFi.hostname("Station_host_博哥");
DebugPrintln(String("New hostname: ")+WiFi.hostname());
//输出SSID
DebugPrintln(String("SSID: ")+WiFi.SSID());
//输出psk
DebugPrintln(String("psk: ")+WiFi.psk());
//输出BSSID
DebugPrintln(String("BSSID: ")+WiFi.BSSIDstr());
//输出RSSI
DebugPrintln(String("RSSI: ") + WiFi.RSSI() + " dBm");
}
DebugPrintln("Setup End");
}
void loop() {
}
操作结果:
注意点:
- 方法里面都是使用WiFi.xxxx,那么这个WiFi是什么鬼呢?楼主翻阅了源码,给大家找到了它的定义地方:
ESP8266WiFi.cpp文件的最后一行。
ESP8266WiFiClass WiFi;
- 如果发现打印出来的信息不是期望的信息,可以尝试在方法后面加上toString,比如:
//举个例子
WiFi.SSID() 改成 WiFi.SSID().toString()
5. 总结
本节主要是基于ESP8266WiFiSTA库来讲解Station模式下的函数使用,并且给大家提供了三个实例,至于更多例子我就不继续举例,只能说引导大家入门使用。
ESP8266开发之旅 网络篇④ Station——ESP8266WiFiSTA库的使用的更多相关文章
- ESP8266开发之旅 网络篇⑨ HttpClient——ESP8266HTTPClient库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑪ WebServer——ESP8266WebServer库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑫ 域名服务——ESP8266mDNS库
1. 前言 前面的博文中,无论是作为client端还是server端,它们之间的通信都是通过具体的IP地址来寻址.通过IP地址来寻址,本身就是一个弊端,用户怎么会去记住这些魔法数字呢?那么有没 ...
- ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
1. 前言 在前面的篇章中,博主给大家讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让大家有个初步认识.并且,博主一直重点强调 ESP8266 WiFi模块有三种工作模式: St ...
- ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库
1. 前言 在前面的博文中,博主介绍到ESP8266WiFi库是包含了很多功能的一个超级库.ESP8266WiFi库不仅仅局限于 ESP8266WiFi.h 和 ESP8266WiFi.cpp ...
- ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑧ SmartConfig——一键配网
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- ESP8266开发之旅 网络篇⑩ UDP服务
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
随机推荐
- Nginx缓存原理及机制
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 上篇文章介绍了Nginx一个较为重要的知识点:Nginx实现接口限流.本篇文章将介绍Nginx另一个重要知识点 ...
- Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
为了让我们第一时间知道程序的运行状态,Asp.Net Core 添加了默认的日志输出服务.这看起来并没有什么问题,对于开发人员也相当友好,但如果不了解日志输出的细节,也有可能因为错误的日志级别配置 ...
- fslove - Matlab求解多元多次方程组
fslove - Matlab求解多元多次方程组 简介: 之前看到网上的一些资料良莠不齐,各种转载之类的,根本无法解决实际问题,所以我打算把自己的学到的总结一下,以实例出发讲解fsolve. 示例如下 ...
- mongodb 获取自增数
mongodb db.getCollection('user').findAndModify({update:{$inc:{'level':1}},query:{"name":&q ...
- Spring Boot2 系列教程(九)Spring Boot 整合 Thymeleaf
虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在做前后端不分的开发,而在前后端不分的开发中,我们就会需要后端页面模板(实际上,即使前后端分离,也会在一些场景下需要使用页面模板, ...
- 【THE LAST TIME】彻底吃透 JavaScript 执行机制
前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...
- Regex分组与Pattern正则表达式对象
1.正则规则: 1.String regex = "[1-9]" 表示单个字符的取值范围是 1~9,注意是单个字符的取值范围 2 ...
- Build step 'Invoke top-level Maven targets' marked build as failure Finished解决
最近用法 jenkins部署maven项目时候,突然出现Build step 'Invoke top-level Maven targets' marked build as failure Fini ...
- Ajax async属性
async: 默认是true:异步,false:同步. 其他属性扩展: 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数, ...
- Angular template ng-template/container/content
1. ng-template 形式:<ng-template>...</ng-template> 默认ng-template中的内容会隐藏; 可通过[ngIf]来控制内容显示隐 ...