/**********************************************************************/
/* 学习例程: 关于esp8266 TCP_Client
学习目的: 了解Client 连接步骤及ESP8266WiFiClient 库相关函数
学习日期: 20200707
第一类方法,连接操作;
第二类方法,发送请求操作;
第三类方法,响应操作;
第四类方法,普通设置;
*/
/**********************************************************************/
//#include <Arduino.h>
#include<ESP8266WiFi.h> //WIFI 头文件
#include <U8g2lib.h> //第三方库
#include <Wire.h> //I2C库头文件
/*
int connect(IPAddress ip, uint16_t port); //创建一个客户端 并进行连接相应IP,端口的服务器 返回连接结果 0:fail 1:success
int connect(const String host, uint16_t port); //创建一个客户端 并进行连接相应域名,端口的服务器 返回连接结果 0:fail 1:success
int connect(const String host, uint16_t port); //创建一个客户端 并进行连接相应域名,端口的服务器 返回连接结果 0:fail 1:success
uint8_t connected(); //判断是否仍在连接服务器 返回连接结果 0:fail 1:success
void stop(); //停止关闭该客户端去连接服务器
uint8_t status(); //检测该客户端状态
size_t write(uint8_t); //发送单个字节 返回发送成功的字节数
size_t write(const uint8_t *buf, size_t size); //发送数组中的几个字节数 返回发送成功的字节数
size_t write_P(PGM_P buf, size_t size);
size_t write(Stream& stream); //发送文件流或数据流中的数据
*/
#define LED D9
long debouncdDelay = 500; //延时间隔
long lastDebounceTime = 0; //最近记录的一次时间
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ D6, /* data=*/ D5, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, pure SW emulated I2C
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ D6, /* data=*/ D5); // ESP32 Thing, HW I2C with pin remapping
//定义 AP 的名称及密码
#define AP_SSID "vivoX20A"
#define AP_PASSWORD "12345678"
// 配置热点的参数信息(IP,网关,子掩码)
//以下三个定义为调试定义
#define DebugBegin(baud_rate) Serial.begin(baud_rate)
#define DebugPrintln(message) Serial.println(message)
#define DebugPrint(message) Serial.print(message)
IPAddress local_IP(192, 168, 4, 22);
IPAddress gateway(192, 168, 4, 9);
IPAddress subnet(255, 255, 255, 0);
const uint16_t port = 1234;
const char * host = "192.168.43.1"; // ip or dns
uint8_t TX_Buffter[10] = {0xAA, 0X55, 0x12, 0x54, 0x85,0x12, 0x54, 0x85,0x0d,0x0a};
WiFiClient client;//创建一个tcp client连接
uint8_t mills_val = 10;
uint8_t Rx_size = 0;
uint8_t RX_buffer[50] = {0};
void setup() {
// put your setup code here, to run once:
pinMode(LED, OUTPUT); //初始化led io
digitalWrite(LED, LOW); //配置io输出为低电平
pinMode(D5, OUTPUT); // SSD1306 SDA
pinMode(D6, OUTPUT); // SSD1306 SCL
digitalWrite(D5, 0);
digitalWrite(D6, 0);
u8g2.begin(); // 显示屏初始化配置
u8g2.enableUTF8Print(); // 使print支持UTF8字集
DebugBegin(115200); //配置串口
DebugPrint("**************************Setting STA*************************" );
DebugPrint("/n");
//第一步 启动STA模式,并连接到wifi网络
WiFi.mode(WIFI_STA);
WiFi.begin(AP_SSID, AP_PASSWORD);
//判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
//笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现
while (WiFi.status() != WL_CONNECTED) {
delay(500);
DebugPrint(".");
DebugPrint(WiFi.status());
}
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_1");
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");
}
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_5x8_tf);
u8g2.setFontDirection(0);
u8g2.drawStr(0, 8, " AP_SSID:");
u8g2.drawStr(50, 8, AP_SSID);
u8g2.drawStr(0, 18, " AP_PSW:");
u8g2.drawStr(50, 18, AP_PASSWORD);
// u8g2.drawStr(50, 48, port);
// u8g2.setFont(u8g2_font_unifont_t_symbols);
// u8g2.drawGlyph(5, 40, 0x2603); /* dec 9731/hex 2603 Snowman */
// u8g2.drawXBM( 0, 0, u8g_logo_width, u8g_logo_height, u8g_logo_bits);
} while ( u8g2.nextPage() );
ESP.wdtEnable(5000); //使能软件看门狗的触发间隔
}
void loop() {
// put your main code here, to run repeatedly:
ESP.wdtFeed(); //喂狗
if (millis() - lastDebounceTime > debouncdDelay)
{
mills_val++;
if (mills_val > 10)
{
mills_val = 0;
if (!client.connected()) //判断tcp client是否处于连接状态,不是就建立连接
{
if (!client.connect(host, port))
{
DebugPrintln("connection fail");
}
else
{
DebugPrintln("connection ok");
}
}
}
lastDebounceTime = millis(); //重新赋值上一次时间
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_5x8_tf);
u8g2.setFontDirection(0);
u8g2.drawStr(0, 8, " AP_SSID:");
u8g2.drawStr(50, 8, AP_SSID);
u8g2.drawStr(0, 18, " AP_PSW:");
u8g2.drawStr(50, 18, AP_PASSWORD);
if (WiFi.status() == WL_CONNECTED)
{
u8g2.drawStr(0, 28, " RSSI:");
u8g2.setCursor(50, 28);
u8g2.print( WiFi.RSSI()); //输出内容
}
else
{
u8g2.clearBuffer();
// ... write something to the buffer
u8g2.drawStr(0, 28, "WL_DISCONNECTED");
u8g2.sendBuffer();
}
} while ( u8g2.nextPage() );
digitalWrite(D9, !digitalRead(D9)); //配置io输出为 读取当前IO口状态的反向值
}
if (client.available())
{
Rx_size = client.available();
client.read(RX_buffer, Rx_size);
Serial.write(RX_buffer, Rx_size);
client.flush();//丢弃已写入客户端但尚未读取的字节
if ((RX_buffer[Rx_size-1] == 0x0A)&& (RX_buffer[Rx_size-2] == 0x0D))
{
client.write(TX_Buffter,10);
}
}
}
Arduino-ESP8266-TCPClient
最新推荐文章于 2024-04-27 11:30:00 发布