有一点需要注意的是,就是你的服务器端口(也就是网络调试助手的server)必须先打开然后上传程序之后esp8266才会和服务器进行连接,如果先传程序再打开服务,有可能收不到消息的,或者是要等一会儿才行!这里你的esp8266连上热点之后是作为tcp client存在的,网络调试助手是作为server
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
/*****************网络设置项 *****************/
const char *STAssid ="xxxxxxxxxx"; //需要连接路由器的名称
const char *STApassword="xxxxxxxxxx"; //路由器的密码
const char *host= "192.168.7.40"; //外网服务器ip
const int httpPort = 8888; //外网服务器端口
WiFiClient client; //声明客户端对象
bool is=0; //用来做连接到服务器后,仅发送一次问候语
int led=14; //灯io,D5
void setup() {
Serial.begin(115200);
Serial.println("");
pinMode(14,OUTPUT);
digitalWrite(14,0);
WiFi.mode(WIFI_STA); //设置为STA模式
WiFi.begin(STAssid, STApassword); //配置连接信息,开始连接
//运行自定义函数,在未连接到路由器的过程中,打印输出......,直到连接成功
gotoWifi();
Serial.println("连接路由器成功");
//此时已经连接到路由器,可以开始连接远程服务器
lianjie();
}
void loop() {
/****************检测WiFi连接状态****************/
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
WiFi.begin(STAssid, STApassword);
gotoWifi();
}
else{
if (!client.connected()) { //如果没有连接到服务器
lianjie();
return;
}
else{ //否则,就是连接到服务器
if(is==0){
client.print("hello,server");
is=1;
}
}
}
Tcp_Handler(Read_Tcp()); //读取服务器信息,并处理
}
//读取服务器信息,返回String类型
String Read_Tcp(){
String data = "";
while (client.available() > 0){
data += char(client.read());
delay(2);
}
return data;
}
//处理服务器信息
void Tcp_Handler(String data){
if(data!=""){
Serial.print("收到服务器信息:");
Serial.println(data);
if(data=="open"){
digitalWrite(14,1);
client.print("open led");
}
else if(data=="close"){
digitalWrite(14,0);
client.print("close led");
}
}
}
//连接路由器
void gotoWifi(){
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
//连接服务器
void lianjie() {
Serial.println("开始连接服务器");
client.connect(host, httpPort);
delay(1000);
}