zoukankan      html  css  js  c++  java
  • ESP8266-01一些内容

    系统有些指令必须特性状态下才可以执行,即先执行一些其它AT指令

    1.设置station模式的IP信息

     AT+CIPSTA="192.168.19.1","192.168.1.1","255.255.0.0"

    设置后,使用AT+CWDHCP=2,1 

    恢复:DHCP方式

    2.启动后服务器

    AT+CIPMUX=1

    AT+CIPSERVER=1,333  --后面是端口

    3.启动UDP广播地址监听

    AT+CIPMUX=1

    AT+CIPSTART=0,"UDP","255.255.255.255",1111,2000,2

    说明:1111任意端口(表示远程),2000为本地端口,

    2(mode参数)表示以最后一次收到数据包IP为目标地址,也就是说如果有多个IP给本设备发送UDP包,那么AT+CIPSEND=0,x回复时数据发给最后一个发消息过来的

     当采用mode=2时使用:AT+CIPSTATUS可以查看最后一发请求过来的的链接情况

    4.启动UDP链接

    AT+CIPSTART=0,"UDP","192.168.88.88",8080,2000,2

    参数2与上面一样,比方192.168.88.11:8111,最后一个给设备发UPD包,那么设备回复时的目标设备就是192.168.88.11:8111了

    5.退出透传模式

    1.发送+++后面不要有回车换行

    2.等一会

    3.发送回车与换行

    4.发送AT&回车换行看命令是否恢复

    6.Arduino下进行测试

    /*
    ESP-01    
    
    VCC       -------- 3.3V
    GND      -------- GND
    CH-PD   -------- 3.3V (加不加10K电阻都可以)
    
    TXD       ------   10  // 软串口的RX
    RXD       -------  11  // 软串口的TX
                    
    
    UNO的代码:
    */
    #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(10, 11); // RX, TX
    
    void setup()  
    {
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }
    
    
      Serial.println("Goodnight moon!");
    
      // set the data rate for the SoftwareSerial port
      mySerial.begin(9600);
      mySerial.println("Hello, world?");
    }
    
    void loop() // run over and over
    {
      if (mySerial.available())
        Serial.write(mySerial.read());
      if (Serial.available())
        mySerial.write(Serial.read());
    }
    View Code

    7.启动后开启UDP透传模式,以及看门狗
    服务端需要按$F...$E的格式封送数据

    #include <avr/wdt.h>  
    #include <SoftwareSerial.h>
    
    SoftwareSerial mySerial(10, 11); // RX, TX
    unsigned long lastSendTime=0;
    unsigned long lastReceiveTime=0;
    String RecCache="";
    
    void setup()  
    {
      pinMode(13,OUTPUT);
      digitalWrite(13,LOW);
      
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }
      
    
      Serial.println("Ready!");
    
      // set the data rate for the SoftwareSerial port
      mySerial.begin(9600);
      
      mySerial.print("+++");
      delay(100);
      mySerial.println("AT");
      
      mySerial.println("AT+RST");
      delayAndRead(3000);
      
      //
      while(!isGotIP()){
        digitalWrite(13,HIGH);
        delay(300);
        digitalWrite(13,LOW);
        cls();
      }
      mySerial.println("AT+CIPSTART="UDP","122.226.151.4",12462,2000,0");
      delayAndRead(100);
      mySerial.println("AT+CIPMODE=1");
      delayAndRead(100);
      mySerial.println("AT+CIPSEND");
      delayAndRead(100);
      
       wdt_enable(WDTO_8S); 
    }
    
    
    
    void loop() // run over and over
    {
      //handle user input cmd
      while (Serial.available()){
        mySerial.write(Serial.read()); 
      }
      
      while(mySerial.available()){
        char c= mySerial.read();
        RecCache=RecCache +(String)c;
      }
      
      int bIndex= RecCache.indexOf("$F");
      if(bIndex>=0){
        int eIndex=RecCache.indexOf("$E",bIndex);
        if(eIndex>=0){
           //Extra Data
           String data=RecCache.substring(bIndex+2,eIndex);
           RecCache=RecCache.substring(eIndex);
           lastReceiveTime=millis();
           
           handleData(data);
        }
      }else{
        RecCache=""; 
      }
      
      if(RecCache.length()>=1024)RecCache="";
      
      //check watchdog
      if((millis()-lastReceiveTime)<30000){
        wdt_reset(); 
      }
      
      //heart beat
      if((millis()-lastSendTime)>=10000){
           mySerial.println(millis());
          lastSendTime=millis(); 
        }
    }
    
    void handleData(String data){
     
      Serial.println(data);
    }
    
    void cls(){
       while(mySerial.available()){
         mySerial.read();
      }
    }
    
    void delayAndRead(int waitTime){
       delay(waitTime);
       while(mySerial.available()){
         Serial.write(mySerial.read()); 
       }
    }
    
    boolean isGotIP(){
      mySerial.println("AT+CIPSTATUS");
      delay(100);
      
     if( mySerial.find("STATUS:2")){
       return true;
     }
     return false;
     
    }
    View Code

     UDP服务端代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace SmartPivot.WinClient
    {
        public partial class Form1 : Form
        {
            private UdpClient udpServer = null;
            private bool isRunning = false;
            private bool Enable = false;
            private SynchronizationContext SyncCtx = null;
    
    
            public Form1()
            {
                InitializeComponent();
                SyncCtx = SynchronizationContext.Current;
                btnSend.Enabled = false;
            }
    
            private void btnSwitch_Click(object sender, EventArgs e)
            {
                try
                {
                    if (isRunning)
                    {
                        btnSend.Enabled = false;
                        _Stop();
                    }
                    else
                    {
    
                        ThreadPool.QueueUserWorkItem(o =>
                        {
                            _Start();
                        }, null);
                        btnSend.Enabled = true;
                    }
                }
                catch (Exception ex)
                {
    
                }
            }
            private void _Stop()
            {
                Enable = false;
    
                if (udpServer != null)
                {
                    try
                    {
                        udpServer.Close();
    
                    }
                    catch { }
                }
                isRunning = false;
                this.Text = "已停止";
            }
            private void _Start()
            {
                if (isRunning) return;
                Enable = true;
                //设置标题
                SyncCtx.Post(o =>
                {
                    this.Text = "运行中";
                }, null);
    
                var ipAddress = IPAddress.Parse(txtIP.Text);
                int port = int.Parse(txtPort.Text);
    
                // udpServer.Client.Bind(new IPEndPoint(ipAddress, port));
                // udpServer.Connect(new IPEndPoint(ipAddress, port));
                udpServer = new UdpClient(new IPEndPoint(ipAddress, port));
                udpServer.AllowNatTraversal(false);
                var remote = new IPEndPoint(0, 0);
                isRunning = true;
    
                while (Enable)
                {
                    try
                    {
                        byte[] receiveData = udpServer.Receive(ref remote);
                        var str = Encoding.ASCII.GetString(receiveData);
                        Console.WriteLine(string.Format("Remote,{0}:{1},[{2}]",
                                                         remote.Address.ToString(),
                                                         remote.Port, DateTime.Now));
                        Console.WriteLine(str);
                        var responseTmp = String.Format("{0},{1},{2}" , remote.ToString(), DateTime.Now.ToString("yyMMddHHmmss"), Guid.NewGuid().ToString());
                        var responseDate = Encoding.ASCII.GetBytes("$F" + responseTmp.Length + ":" + responseTmp +"$E" + Environment.NewLine);
                        udpServer.Send(responseDate, responseDate.Length, remote);
    
                        SyncCtx.Post(o => {
                            txtRIP.Text = remote.Address.ToString();
                            txtRPort.Text = remote.Port.ToString();
                        }, null);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
    
                }
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                var ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ent => ent.AddressFamily == AddressFamily.InterNetwork);
                txtIP.Text = ip == null ? "" : ip.ToString();
                txtPort.Text = "12462";
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                try
                {
                    if (udpServer == null) return;
                    var sendData=Encoding.ASCII.GetBytes(txtSend.Text);
                    var ipAddress = IPAddress.Parse(txtRIP.Text);
                    int port = int.Parse(txtRPort.Text);
                    udpServer.Send(sendData, sendData.Length, new IPEndPoint(ipAddress, port));
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Send Err:" + ex.Message);
                }
            }
        }
    }
    View Code

     8.设置AP名称
    AT+CWSAP="DF21_LSC","12345678",5,3  

    其中5表示通道,3表示WPA2_PSK

    密码需要8位以上

    9.设置波特率

    默认是115200

    mySerial.println("AT+CIOBAUD=9600");

  • 相关阅读:
    zabbix 3.2.2 server端添加客户端主机配置 (四)
    zabbix 3.2.2 server web展示如何显示中文 (三)
    zabbix 3.2.2 agent端(源码包)安装部署 (二)
    zabbix 3.2.2 server端(源码包)安装部署 (一)
    centos执行apt-get提示不存在
    用简单的方法学习ES6
    PHP+MySQL存储数据出现中文乱码的问题
    CentOS 6.0 系统 LAMP(Apache+MySQL+PHP)安装步骤
    mysql查询索引
    线程和进程
  • 原文地址:https://www.cnblogs.com/wdfrog/p/4939576.html
Copyright © 2011-2022 走看看