ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ESP32开发(3)红外学习 网页 文件 多串口

2022-04-06 06:05:02  阅读:164  来源: 互联网

标签:网页 buffer ESP32 串口 server 按键 action return else


http://4490.replace.favo.gengnie.com/

 

 

 

https://item.taobao.com/item.htm?spm=a1z09.2.0.0.50122e8dJH3bCJ&id=547198899364&_u=51qf7bf5dd52

 

 

 

 

 

 

下载和上传文件程序

有三种方法下载

1、用g0口接地。

2、下载时,一直按boot健。

3、同时按rst健与boot

 

 

 

 

 

 上传程序

 

上传文件

 

 

程序串口

 

NodeMCU-32S 开发板左右各19个引脚,共38个,下图中1Z实验室为大家对NodeMCU-32S的各个引脚进行了详细的标注。

https://www.cnblogs.com/gooutlook/p/11028641.html

 

 

 

链接:https://pan.baidu.com/s/1fjk0qiudRPKPxB-7SqFSAQ?pwd=fdn4
提取码:fdn4
--来自百度网盘超级会员V4的分享

代码

//#include <SoftwareSerial.h>
//SoftwareSerial portOne(9, 10);// rx  tx

#define portOne Serial2  

#include "FS.h"
#include "SPIFFS.h"

#include <WiFi.h>
#include <WebServer.h>
WebServer server (80);  

//连接或者要辐射的wifi信息
//String wifiName = ("ESPWIFI_"+(String)ESP.getChipId());  // 2 设置WIFI名称 
//String wifiName = "love";  // 2 设置WIFI名称 
//String password ="love123456"; // 需要连接的wifi热点密码  

const char *wifiName ="love";  // 2 设置WIFI名称 
const char *password ="love123456"; // 需要连接的wifi热点密码 

//登录账号密码
String LoginName="admin";
String LoginPwd="admin";

//工作模式
String work_mode="STA";// AP 自己辐射wifi  STA 链接wifi
//本机ip 会自动修改
String LocaIP="192.168.1.1";//跳转使用

int CanPost=1;//记录本次请求是否处理完毕

/** 
 *  网页系统API
 * 根据文件后缀获取html协议的返回内容类型 
 */  
 
String getContentType(String filename){  
 
  if(server.hasArg("download")) return "application/octet-stream";  
 
  else if(filename.endsWith(".htm")) return "text/html";  
 
  else if(filename.endsWith(".html")) return "text/html";  
 
  else if(filename.endsWith(".css")) return "text/css";  
 
  else if(filename.endsWith(".js")) return "application/javascript";  
 
  else if(filename.endsWith(".png")) return "image/png";
 
  else if(filename.endsWith(".gif")) return "image/gif";
 
  else if(filename.endsWith(".jpg")) return "image/jpeg";
 
  else if(filename.endsWith(".ico")) return "image/x-icon";  
 
  else if(filename.endsWith(".xml")) return "text/xml";  
 
  else if(filename.endsWith(".pdf")) return "application/x-pdf";  
 
  else if(filename.endsWith(".zip")) return "application/x-zip";  
 
  else if(filename.endsWith(".gz")) return "application/x-gzip";  
 
  return "text/plain";  
 
}  
 
/* NotFound处理 
 * 用于处理没有注册的请求地址  
 */  
 
void handleNotFound() {  
 
  String path = server.uri();  
 
  Serial.print("load url:");  
 
  Serial.println(path);  
 
  String contentType = getContentType(path);  
 
  String pathWithGz = path + ".gz";  
 
  if(SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)){  
 
    if(SPIFFS.exists(pathWithGz))  
 
      path += ".gz";  
 
    File file = SPIFFS.open(path, "r");  
 
    size_t sent = server.streamFile(file, contentType);  
 
    file.close();  
 
    return;  
 
  }  
 
  String message = "File Not Found\n\n";  
 
  message += "URI: ";  
 
  message += server.uri();  
 
  message += "\nMethod: ";  
 
  message += ( server.method() == HTTP_GET ) ? "GET" : "POST";  
 
  message += "\nArguments: ";  
 
  message += server.args();  
 
  message += "\n";  
 
  for ( uint8_t i = 0; i < server.args(); i++ ) {  
 
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";  
 
  }  
 
  server.send ( 404, "text/plain", message );  
 
}  

/* 引脚更改处理 
 * 访问地址为htp://192.162.xxx.xxx/  返回主页面
 */  

 
void handleMain() {  
 
  /* 返回信息给浏览器(状态码,Content-type, 内容) 
 
   * 这里是访问当前设备ip直接返回一个String 
 
   */  
 
  Serial.print("handleMain");  
 
  File file = SPIFFS.open("/index.html", "r");  
 
  size_t sent = server.streamFile(file, "text/html");  
 
  file.close();  
 
  return;  
 
}  


int leran_state=0;

void handle_PinControl_DoMySelf( String action){
  
       if (action=="learn_on"){  //学习模式按键     
          leran_state=1;    
          server.send ( 200, "text/html", "进入学习模式\n 请在在网页按下需要学习的按键后,接收器蓝灯常亮"); return; // 返回数据     
        }
       else if (action=="learn_off"){// 控制模式按键

          leran_state=0;
          uint8_t buffer[1];
          buffer[0] = 0xe2;
                 
          portOne.write(buffer,1);  //退出学习模式
          server.send ( 200, "text/html", ",进入正常模式\n 接收器蓝灯熄灭"); return; // 返回数据  
          
       }
        
       else if (action=="open_on"){// 控制模式按键
               if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x01;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x01;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }

        }
       else if (action=="open_off"){// 控制模式按键
               if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x02;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x02;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }
       else if (action=="cold_on"){// 控制模式按键
               if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x03;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x03;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }
       else if (action=="hot_on"){// 控制模式按键
                if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x04;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x04;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }
       else if (action=="20"){// 控制模式按键
                if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x05;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x05;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }
       else if (action=="24"){// 控制模式按键
                if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x06;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x06;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }
       else if (action=="27"){// 控制模式按键
                 if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x07;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x07;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }
       else if (action=="30"){// 控制模式按键
                if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x08;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x08;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }  

        else if (action=="flysx_on"){// 控制模式按键
                 if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x07;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x07;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }
       else if (action=="flysx_off"){// 控制模式按键
                if (leran_state==0){    
                  uint8_t buffer[2];
                  buffer[0] = 0xe3;
                  buffer[1] = 0x11;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键发送成功"); return; // 返回数据  
               }
               else if (leran_state==1){
                  uint8_t buffer[2];
                  buffer[0] = 0xe0;
                  buffer[1] = 0x11;
                  portOne.write(buffer, 2);
                  server.send ( 200, "text/html", action+"按键处于学习模式,请用空调遥控器按对准接收器,按下对应要学习的按键,等待蓝灯熄灭后学习完毕,按下关闭学习按键退出学习模式"); return; // 返回数据  
                }
        }  
  
  }

  


String REC_comdata="{\"turang\":0,\"light\":0,\"tem\":0,\"AlramMsg\":\"工作中...\"}";
// 控制页面请求函数处理 ESP数据给单片机,由单片机处理后返回数据
///Get_SensorData?action=all&sensor=all
void handle_PinControl() {  

 
  if(CanPost==1) 
  {
    CanPost=0;
  }
  else 
  {
    server.send ( 200, "text/html", REC_comdata);
    return;
  }

  
  if(server.hasArg("action") && server.hasArg("sensor")) { // 请求中是否包含有a的参数  
 
    String action = server.arg("action"); // 获得动作
    String sensor = server.arg("sensor"); // 获得传感器型号
    String ShowMsg =String()+"sensor-"+ sensor+"-action-"+action+";";
    
    Serial.println (ShowMsg); //电脑串口打印 
  
    //根据传感器型号进行控制
     
    //本机处理
    if(sensor=="sensor_airconditin"){
      handle_PinControl_DoMySelf(action);//调用本机函数处理
      
      server.send ( 200, "text/html", "消息本机处理:"+ShowMsg); // 返回数据  
      CanPost=1;
      return;
 
    }//转发单片机处理
    else{  //其他设备控制   
     
       //消息打包生成
       ShowMsg =String()+ sensor+"-"+action+";";
       //转发给单片机处理
       
       portOne.print(ShowMsg);
       
       //等待单片机回应消息
       //String REC_comdata;
       if (portOne.available()){
           //发送端是加了换行符发送的 不加 \n 会导致连续发送两行积累 所以解析段必须去除 \n 字符
           REC_comdata =portOne.readStringUntil(';');   
           //REC_comdata=REC_comdata.replace("\n","");
           Serial.print("Rec_arduino:");Serial.println(REC_comdata);
       }
       server.send ( 200, "text/html", REC_comdata); 
       CanPost=1;
       return; 
      
     
      }
      
  }
  else{
    
      server.send ( 200, "text/html", "action no found");  
  }  
 

 
}  


//用来跳转页面
String GoUrl(String urlName){
  String ALLHtml=String("")+
    "<HTML>"+
    "<HEAD>"+
      "<meta HTTP-EQUIV=\'REFRESH\' content=\'0; url="+urlName+"\'/>"+
      "<TITLE>Success</TITLE>"+
    "</HEAD>"+
    "<BODY>"+
      "Success"+
    "</BODY>"+
  "</HTML>";
  return ALLHtml;
  
  }
 
void handle_Login(){
   
   
   if(server.hasArg("config")) { // 请求中是否包含有a的参数  
 
        String config = server.arg("config"); // 获得a参数的值  
        String RecLoginName;
        String RecLoginPwd;
        
    if(config == "on") { // a=on  
          if(server.hasArg("name")) { // 请求中是否包含有a的参数  
            RecLoginName = server.arg("name"); // 获得a参数的值
          }
          else{
            String backtxt= "请输入用户名" ;
            server.send ( 200, "text/html", backtxt);
            return;     
            }
           
          if(server.hasArg("pwd")) { // 请求中是否包含有a的参数  
            RecLoginPwd = server.arg("pwd"); // 获得a参数的值   
           }

          if(RecLoginName==LoginName && RecLoginPwd==LoginPwd){                  
            String backtxt= "成功登录! 名称:"+ RecLoginName  +"     密码:"+ RecLoginPwd ;

            Serial.print("handleMain");  
 
            backtxt=GoUrl("http://"+LocaIP+"/index1_control.html");
           
  
            server.send ( 200, "text/html", backtxt);
            return;     
          }
          else{
            String backtxt= "失败登录,账号和密码错误!\n 名称:"+ RecLoginName  +"     密码:"+ RecLoginPwd ;
            server.send ( 200, "text/html", backtxt);
            return;    
            
            }

        
    } 
 
    server.send ( 200, "text/html", "unknown action"); return;  
 
  }  
 
  server.send ( 200, "text/html", "action no found");  
   
  }

//工作模式1 自身建立wifi等待连接
void Int_SetWIfi(String wifiName_,String password_){
  
  //LocaIP="192.168.1.1";
  IPAddress softLocal(192,168,1,1);   // 1 设置内网WIFI IP地址
  IPAddress softGateway(192,168,1,1);
  IPAddress softSubnet(255,255,255,0);
  WiFi.softAPConfig(softLocal, softGateway, softSubnet);
 
  //String wifiName = ("ESPWIFI_"+(String)ESP.getChipId());  // 2 设置WIFI名称
  //const char *softAPName = wifiName_.c_str();
  WiFi.softAP(wifiName, password);      // 3创建wifi  名称 +密码 adminadmin
  
  IPAddress myIP = WiFi.softAPIP();  // 4输出创建的WIFI IP地址
  Serial.print("AP IP address: ");      
  LocaIP=myIP.toString().c_str();
  Serial.println(LocaIP);
  
  Serial.print("softAPName: ");  // 5输出WIFI 名称
  Serial.println(wifiName);

  }

//工作模式2 连接到wifi  获取ip访问
void Int_wificonnect(String wifiName,String password){
  int connectCount = 0;  
  WiFi.begin ( wifiName.c_str(), password.c_str() );  
  while ( WiFi.status() != WL_CONNECTED ) {  
  delay ( 1000 );  
    Serial.print ( "." );  
    if(connectCount > 30) {  
      Serial.println( "Connect fail!" );  
      break;  
    }  
    connectCount += 1;  
  }  
  if(WiFi.status() == WL_CONNECTED) {  
    Serial.println ( "" );  
    Serial.print ( "Connected to " );  
    Serial.println ( wifiName );  
    Serial.print ( "IP address: " ); 
    //Serial.println ( WiFi.localIP() );  
    
    LocaIP=WiFi.localIP().toString().c_str();
    Serial.println ( LocaIP );  
     
    connectCount = 0;  
    }  
  }


 
void setup() {   
 
  // 日常初始化网络  
 
  pinMode(2, OUTPUT);  
 
  Serial.begin ( 9600 );  

  //portOne.begin(9600);//软串口1 单片机之间过高导致解析出错
  
  portOne.begin(115200);//软串口2 红外模块串口通信默认115200

  
  SPIFFS.begin();  
  if(work_mode=="STA"){
  Int_wificonnect(wifiName,password);
  }
  else{
  Int_SetWIfi(wifiName,password);
  }
 
 
  server.on ("/", handleMain); // 绑定‘/’地址到handleMain方法处理  默认返回登陆网页
  server.on ("/login", HTTP_GET, handle_Login); // 处理登陆请求是否正确,然后跳转控制页面
  server.on ("/Control_SensorPin", HTTP_GET, handle_PinControl); //处理控制页面的按键和滑动条请求

  server.onNotFound ( handleNotFound ); // NotFound处理 默认会返回登陆页面
  server.begin();  
 
  Serial.println ( "HTTP server started" );  
 
}  
 
    
 
void loop() {  
 
  /* 循环处理,因为ESP8266的自带的中断已经被系统占用, 
 
   * 只能用过循环的方式来处理网络请求 
 
   */  

  server.handleClient();  
 
}  

  index1_control.html

 

 

 

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!---网页预览小标题----->
    <title>网页配置信息</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
  </head>
  <script src="js/jquery.min.js"></script>
  <script src="js/bootstrap.min.js"></script>


  <body>
    <nav class="navbar navbar-inverse">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
            <!---网页黑色工具栏标题----->
          <a class="navbar-brand" href="#">智能遥控器</a>
        </div>
      </div>
    </nav>
     
    <div class="container">
        <ul class="nav nav-tabs">
          <!---网页白色工具栏小标题----->
           <li role="presentation" class="active"><a href="index.html">主页</a></li>
          <li role="presentation" class="active"><a href="index1_control.html">设备控制</a></li>
          
        </ul>
         
        <div class="starter-template">

         
          
            <h1 style="color:red;">空调按键控制</h1>
            <button onclick='setPinValue("sensor_airconditin","open_on")' >打开空调</button>

            <button onclick='setPinValue("sensor_airconditin","open_off")' >关闭空调</button>  </br> </br>

            <button onclick='setPinValue("sensor_airconditin","cold_on")' >制冷模式</button>

            <button onclick='setPinValue("sensor_airconditin","hot_on")' >制热模式</button>  </br> </br>

            <button onclick='setPinValue("sensor_airconditin","flysx_on")' >上下扫风打开</button>  

            <button onclick='setPinValue("sensor_airconditin","flysx_off")' >上下扫风关闭</button>  </br> </br>

            <button onclick='setPinValue("sensor_airconditin","20")' >20度</button>

            <button onclick='setPinValue("sensor_airconditin","24")' >24度</button> 
            
            <button onclick='setPinValue("sensor_airconditin","27")' >27度</button>

            <button onclick='setPinValue("sensor_airconditin","30")' >30度</button> 


             </br> </br>


            <h1 style="color:red;">学习控制</h1>
            <button onclick='setPinValue("sensor_airconditin","learn_on")' >开始学习</button>
            <button onclick='setPinValue("sensor_airconditin","learn_off")' >关闭学习</button>
           

            <p>按键状态消息: <span id="txtState"></span></p>

            <h1 style="color:red;">学习模式说明</h1>
            <p> 1网页按下“开始学习”按键</p>
            <p> 2在提示语为学习模式前提下,按下要学习的按键,例如按下“打开空调”按键。 可以看到红外模块蓝灯常亮。 </p>
            <p> 3拿着遥控器对准有4个红外头的红外模块,距离5-10cm,不要有其他干扰和红外设备干扰。确保遥控器显示屏显示处于关闭状态下,按一下开关键。  </p>
            <p> 4红外头蓝灯关闭,代表学习成功。自动切回控制模式</p>
              
        </div>
        
         
    </div>



     


    <script type="text/javascript">

    	// 按键发送请求 输入 1传感器名字 2要调整的数值
        function setPinValue(sensor_value,action_value) {
            alert(sensor_value+"按键点击!");
            var xmlhttp;
            if (sensor_value.length==0 && action_value.length==0)
            {
            document.getElementById("txtState").innerHTML="请点击正确按键!";
            return;
            }


             
            if (window.XMLHttpRequest)
            {
            // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
            xmlhttp=new XMLHttpRequest();
            }
            else
            {
            // IE6, IE5 浏览器执行代码
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
             
            xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState==4 && xmlhttp.status==200){
            //alert(xmlhttp.responseText);
            //alert("操作成功");
            document.getElementById("txtState").innerHTML = xmlhttp.responseText;
             }
            }
             
            var requestString = "/Control_SensorPin?action=" + action_value + "&sensor="+sensor_value;
            xmlhttp.open("GET", requestString, true);
            xmlhttp.send(null);
        }
         
       
    </script>
  </body>
</html>

  

标签:网页,buffer,ESP32,串口,server,按键,action,return,else
来源: https://www.cnblogs.com/gooutlook/p/16104782.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有