Javascript is required
ESP-8266 应用

TCP Client

Java TCP 服务

用Java写一个TCP服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Main extends Thread {
    private static final int PORT = 25052;
    private static ServerSocket serverSocket; // 建立服务端口
    public Service(int port) throws  Exception{
        serverSocket = new ServerSocket(port);
        serverSocket.setSoTimeout(100000); // 设置连接超时
        System.out.println("初始化完成...");
    }

    public void run(){
        Socket socket = null;
        try {
            while(true){
                // 获取连接过来的客户端对象 阻塞方式
                socket = serverSocket.accept();
                System.out.println("客户端: "+socket.getInetAddress().getHostAddress());
                // 创建输入流,读取客户端数据
                InputStream inputStream = socket.getInputStream();

                // 持续接收消息
                while(true){
                    // 接收
                    InputStreamReader inRead = new InputStreamReader(inputStream);
                    BufferedReader br = new BufferedReader(inRead);
                    String message = br.readLine();
                    System.out.println("来自客户端数据: "+ message);

                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {// 释放
            try{

                socket.close();
                serverSocket.close();

            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        Service ser = new Service(Service.PORT);
        ser.start();
    }
}

ESP 8266

步骤

  1. 引用#include <ESP8266WiFi.h>
  2. 使用connect(ip,port)connect(URL,port) 方法连接到服务器
  3. 进行读写通讯
#include <ESP8266WiFi.h>

const char* ssid     = "TP-LINK_0A1F";//无线名称
const char* password = "873010963";//无线密码

const char* host = "192.168.1.103";
const int httpPort = 25052;
WiFiClient client; // 声明一个客户端对象与服务器进行连接


void setup() {
    Serial.begin(115200);
    Serial.println();
    
    
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("WiFi 连接成功 ");
    Serial.print("IP: ");
    Serial.println(WiFi.localIP());
}


void loop() {
      Serial.println("> 开始尝试访问服务器");
      if(client.connect(host,httpPort )){ // 尝试访问目标地址
          Serial.println("访问成功");
          client.print("Hi...!"); // 向服务器发送数据
          while(client.connected() || client.available()){
            if(client.available()){ // 如果有数据
              String line = client.readStringUntil('\n');
              Serial.println(line);
            }  
          }
      }else{
        Serial.println("访问失败");
        client.stop(); // 关闭客户端  
      }
      delay(3000);
}

WiFiClient client - 实例客户端

Web Client

#include <ESP8266WiFi.h>

const char* ssid     = "TP-LINK_0A1F";//无线名称
const char* password = "873010963";//无线密码

const char* host = "www.itaolaity.com";
int httpPort = 80;

void setup() {
    Serial.begin(115200);
    Serial.println();
    
    
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("WiFi 连接成功 ");
    Serial.print("IP: ");
    Serial.println(WiFi.localIP());
}


void loop() {
      WiFiClient client; // 声明客户端对象
      
      Serial.println("> 开始尝试访问服务器");
      
      if(client.connect(host,httpPort )){ 
          Serial.println("访问成功");
          
          client.print(String("GET /") + " HTTP/1.1\r\n" +
                     "Host: " + host + "\r\n" +
                     "Connection: close\r\n" +
                     "\r\n");
                     
          while(client.connected() || client.available()){
            if(client.available()){ // 如果有数据
              String line = client.readStringUntil('\n');
              Serial.println(line);
            }  
          }
          client.stop(); 
          
      }else{
        Serial.println("访问失败");
        client.stop(); // 关闭客户端  
        return ;
      }

      delay(5000);
     
}

查阅

文档

https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/client-examples.html

实战

用API查询天气情况

#include <ESP8266WiFi.h>
#include <ArduinoJson.h>  // 6.x

const char* ssid     = "TP-LINK_0A1F";//无线名称
const char* password = "873010963";//无线密码

const char* apiHost = "api.seniverse.com";
const char* APIKey = "aemvfcbro5kyivvx";
const char* city = "nanchang";

const unsigned long TimeOUT = 10000;

struct CityData{
  char city[50];
  char weather[32]; // 天气
  char temperature[20]; // 温度
  char updateTime[32];
};

WiFiClient client;

/*
  初始化
*/
void setup() {
    Serial.begin(115200);
    Serial.println();
    
    
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("WiFi 连接成功 ");
    Serial.print("IP: ");
    Serial.println(WiFi.localIP());
    
    client.setTimeout(TimeOUT);

    // 发送请求
    sendRequest(apiHost, city, APIKey );
}


void loop() {
    
}


/*
  发送请求
  1. 域名
  2. 城市名称
  3. APIKey
*/
bool sendRequest(const char* host, const char* city, const char* key){
    String url = "/v3/weather/now.json?key=";

    url += key;
    url += "&location=";
    url += city;
    url += "&language=";
    url += "zh-Hans";
    
    // 创建TCP连接
    WiFiClient client;
    if(!client.connect(apiHost, 80)){
      Serial.println("请求失败");
      return false;
    } 
    delay(10);
  

    String req =(String)("GET ") + url +" HTTP/1.1\r\n" +  
      "Content-Type: text/html;charset=utf-8\r\n" +  
      "Host: " + apiHost + "\r\n" + 
      "Connection: Keep Alive\r\n\r\n";  

    Serial.println(String("GET ")+ apiHost+url);
    client.print(req); // 发送HTTP请求

    delay(100);
  
    while(client.available()){
      bool skipHeader = client.find("\r\n\r\n"); // 跳过响应的Header头
      if(skipHeader){
          String line = client.readStringUntil('\r');
          Serial.print(line); 
          parseData(line);
      }
    }
    return true;
}

void parseData(String data){
  DynamicJsonDocument  jsonBuffer(2048);
  deserializeJson(jsonBuffer, data);
  JsonObject root = jsonBuffer.as<JsonObject>();
  delay(1000);
  
  String city=        root["results"][0]["location"]["name"];
  String temperature = root["results"][0]["now"]["temperature"];
  String weather =     root["results"][0]["now"]["text"];
  const char* updateTime =  root["results"][0]["last_update"];

  Serial.println();
  Serial.println(city);
  Serial.println(weather);
  Serial.println(temperature);
  Serial.println(updateTime);
}