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
步骤
- 引用
#include <ESP8266WiFi.h>
- 使用
connect(ip,port)
或connect(URL,port)
方法连接到服务器 - 进行读写通讯
#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);
}