0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

网上找不到的源码,ESP32 AP热点 TCPsever 多线程控制开关

李智勇06 来源:李智勇06 作者:李智勇06 2024-06-11 08:02 次阅读

#include //如果是ESP8266 用#include

#include "Ticker.h"

//李智勇编码,采用AP方式做服务端,可以方便控制各种设备,网上此方面的代码放出不多不完整,在此放出, 没有采用网上流行的多个客户端,那样当新的客户端不够用时,处理逻辑太麻烦,一个客户端发过来消息,服务端接收,发送确认消息,等控制指令结束发送断开指令给客户端,当服务端接到新的连接,主动断开上个连接,这样就不会阻塞网络连接。

Ticker ticker_1; //控制一号继电器,用计时器模拟多线程

Ticker ticker_2; //控制二号继电器

#define PIN_R1 23 //输出控制,

#define PIN_R2 22 //输出控制,

// 初始化一个WiFi服务器,端口为****

#define SERVER_PORT ****

#define CLOSE_CONNECT "Off" //发送关闭指令给客户端,让客户端主动断开

int count_OPEN = 0;

int count_R1 = -1; //第一次进入打开

WiFiServer server(SERVER_PORT); //端口号,范围 0-65535

// WiFiAPPSW是AP模式下的WiFi密码

const String WiFiAPPSW = "12345678"; //设置AP模式下模块所发出的WIFI的密码

const String AP_NameString = "lizhiyong_CONTROL";

void setupWiFi() {
WiFi.mode(WIFI_AP);

WiFi.softAP(AP_NameString, WiFiAPPSW);

//自定义IP地址信息

WiFi.softAPConfig(IPAddress(192, ***, ***, ***), IPAddress(192, ***, ***, 1), IPAddress(255, 255, 255, 0));

Serial.println(WiFi.softAPSSID());

Serial.print("IP address: ");

Serial.println(WiFi.softAPIP());

Serial.print("SSID: ");

Serial.println(WiFi.softAPSSID());

server.begin();

}

void setup() {
pinMode(PIN_R1, OUTPUT); *

pinMode(PIN_R2, OUTPUT); *

*

*

Serial.begin(115200);

Serial.println("Begin now!!!");

setupWiFi();

}

WiFiClient serverClient;

void loop() {
//检测服务器端是否有活动的客户端连接

if (server.hasClient()) {
if (serverClient) serverClient.stop();

serverClient = server.available();

// Serial.println("hasClient " + serverClient.remoteIP());

}


//检查客户端的数据

if (serverClient && serverClient.connected()) {
if (serverClient.available()) {
Serial.print("Connected to client remoteIP:");

Serial.println(serverClient.remoteIP());

char data[1024] = { 0 };

// ind用于追踪data数组中已存储的数据量

int ind = 0;

// 接收客户端发送的所有数据

Serial.println("Connected to client !!! ");

while (serverClient.available()) {
data[ind] = serverClient.read(); //读取client端发送的字符,含有换行符

ind++;

}

String str = String(data);

Serial.println(str + String(str.length()));

if (str.indexOf("open") >= 0) { // compareTo equals 接收有回车符等不可见字符容易出错

Serial.println("relay2 open is recive");

ticker_2.attach(0.1, relay2, 0); //二号继电器打开。参数1

serverClient.print("relay2 open OK! "); //在client端回复

} else if (str.indexOf("close") >= 0) {
Serial.println("relay2 close is recive");

ticker_2.attach(0.1, relay2, 1); //参数0关断

serverClient.print("relay2 close OK! "); //在client端回复

} else if (str.indexOf("time") >= 0) { //relay1打开后延时关闭

int time = str.substring(4).toInt(); //substring(4)从第4个数开始一直都末尾

ticker_1.attach(0.1, relay1, time); //继电器 打开,延时time 后关闭,第一次执行没有延时,

Serial.println("relay1 close is recive " + str.substring(4));

serverClient.print("relay1 time OK! "); //在client端回复

} else if (str.indexOf("hand") >= 0) { //relay1手动开关

Serial.println("relay1 hand " + String(count_R1));

if (count_R1 == -1) {
ticker_1.attach(0.1, relay1, -1); //手动打开关闭

Serial.println("relay1 hand open " + String(count_R1));

serverClient.print("relay1 hand open OK! "); //在client端回复

count_R1 = 0;

} else {
ticker_1.attach(0.1, relay1, 0); //-1 关闭指令

Serial.println("relay1 hand close ");

serverClient.print("relay1 hand close OK! "); //在client端回复

count_R1 = -1;

}

} else {
serverClient.print("OK! Got your request. "); //在client端回复

Serial.println("OK! Got your request. ");

}

serverClient.print(CLOSE_CONNECT); //在客户端关闭端回复

}

}

}

void relay1(int action) { //控制继电器1,参数整数型,0表示关,-1表示开,其他数值表示开的延时

Serial.println("relay1 active !!! " + String(action));

if (action == 0) {
digitalWrite(PIN_R1, !digitalRead(PIN_R1)); // turn the LED on (HIGH is the voltage level)

Serial.println("relay1 open PIN_R1 !!! ");

ticker_1.detach();

} else if (action == -1) {
digitalWrite(PIN_R1, !digitalRead(PIN_R1)); // turn the LED off by making the voltage LOW

Serial.println("relay1 close PIN_R1 !!! ");

ticker_1.detach();

} else {
if (count_OPEN == 0) { //第一次 延时开,打开继电器

ticker_1.attach(action, relay1, action); //保证下次进来,并且把时间延长,因为第一次进没有延时

digitalWrite(PIN_R1, !digitalRead(PIN_R1));

Serial.println(String(action) + " relay1 open !!! ");

count_OPEN = 1;

} else { //第二次延时关,关闭继电器

digitalWrite(PIN_R1, !digitalRead(PIN_R1));

count_OPEN = 0;

ticker_1.detach();

Serial.println(String(action) + " relay1 close !!! ");

}

}

}

void relay2(int level) { //控制继电器2,参数是高低电平,决定吸合

digitalWrite(PIN_R2, level); // turn the LED on (HIGH is the voltage level)

Serial.println("relay2 active !!! " + String(level));

ticker_2.detach(); //都是执行一次,模拟多线程,用delay会阻塞服务器响应

}


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 继电器
    +关注

    关注

    132

    文章

    5361

    浏览量

    149519
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1378

    浏览量

    79239
  • 源码
    +关注

    关注

    8

    文章

    652

    浏览量

    29427
  • ESP32
    +关注

    关注

    18

    文章

    977

    浏览量

    17494
收藏 人收藏

    评论

    相关推荐

    ESP32作为STA时连接不上另一作为APESP32,为什么?

    使用的是ESP32 CSI Toolkit的官方代码,想要实现ESP32分别作为AP 和STA能互连,并且收集CSI。目前遇到的问题是:ESP32作为STA时能连接我自己的手机
    发表于 06-19 06:39

    ESP32热点时,用苹果手机连接模块,为什么在断开时检测不到

    ESP32热点时,如果用安卓手机或者电脑连接模块,在断开连接时,模块能检测到安卓手机/电脑断开了。但是用苹果手机连接模块,在断开时,模块好像经常检测不到苹果手机断开了。是通过
    发表于 06-26 07:29

    ESP32会不会有多线程问题,需要加锁吗?

    ESP32会不会有多线程问题,需要加锁吗
    发表于 07-19 08:05

    ESP32多线程 #硬声创作季

    ESP多线程
    Hello,World!
    发布于 :2022年09月23日 20:47:12

    哪位朋友可以提供一个用LABWINDOWS多线程控制仪器的例子?

    哪位朋友可以提供一个用LABWINDOWS多线程控制仪器的例子?能检测2个以上设备接入断开不崩溃测试过程仪器突发故障能应对,系统不崩溃测量结果可以实时显示
    发表于 10-30 08:45

    请问arduino如何能实现多线程控制

    请教一下,arduino如何能实现多线程控制 ???
    发表于 07-27 23:51

    micropython esp32刷固件adc多线程如何去实现呢

    micropython esp32刷固件adc多线程如何去实现呢?
    发表于 01-25 06:09

    ESP32作为STA时连接不上另一作为APESP32是哪里的问题?

    使用的是ESP32 CSI Toolkit的官方代码,想要实现ESP32分别作为AP 和STA能互连,并且收集CSI。目前遇到的问题是:ESP32作为STA时能连接我自己的手机
    发表于 02-16 08:09

    如何使用std::future/std::promise 和 std::packaged_task来促进esp32上的多线程

    我正在考虑使用 std::future/std::promise 和 std::packaged_task 来促进 esp32 上的多线程。我知道多任务函数之间的抽象分层如下:std::thread
    发表于 03-02 08:44

    基于多线程的雷达数据实时处理系统

    为了解决多普勒天气雷达实时处理系统研发过程中并发线程难以进行控制的问题,设计了一种多线程控制
    发表于 12-01 17:02 18次下载
    基于<b class='flag-5'>多线程</b>的雷达数据实时处理系统

    ESP32驱动1.54寸彩屏的应用

    前段时间,ESP32凭借替代AP6212的完美性,以及驱动各种规格彩屏的全能性等技能,收获到了一大波粉丝。如今,ESP32又上了物联网热点,它对外宣称自己在彩屏应用上又有了新手笔!
    发表于 06-28 11:32 2134次阅读

    四、ESP32单片机wifi的AP与STA模式使用

    ESP32单片机wifi的AP与STA模式使用关于WIFI的AP与STA简介ESP32串口通信ESP32开启
    发表于 11-26 17:51 90次下载
    四、<b class='flag-5'>ESP32</b>单片机wifi的<b class='flag-5'>AP</b>与STA模式使用

    使用MicroPython在Raspberry Pi上通过双核编程的多线程控制LED

    在本教程中,我们将使用 MicroPython在 Raspberry Pi Pico 上通过双核编程的多线程控制两个 LED 。
    的头像 发表于 07-25 17:41 7579次阅读
    使用MicroPython在Raspberry Pi上通过双核编程的<b class='flag-5'>多线程控制</b>LED

    使用ESP32、Python和javascript的远程控制继电器

    电子发烧友网站提供《使用ESP32、Python和javascript的远程控制继电器.zip》资料免费下载
    发表于 11-10 10:27 1次下载
    使用<b class='flag-5'>ESP32</b>、Python和javascript的远<b class='flag-5'>程控制</b>继电器

    使用ESP32连接腾讯云实现远程控制

    上次给大家分享了如何使用ESP32实现蓝牙通信,今天跟大家聊聊如何使用ESP32连接腾讯云实现远程控制。本次实验用到MQTT协议,同样,我用miropython编写程序实现,最终可以通过腾讯连连微信
    的头像 发表于 11-22 09:19 3764次阅读