使用esp8266 wifi芯片和DFRduino开发板(Arduino也可以),向自己的服务器发送请求(尽可能详细的说明)

研究过嵌入式方面的人都应该了解 esp8266 wifi芯片,前段时间接触一个小竞赛,需要一块传输数据给服务器的模块,毫不犹豫选择了esp8266,可能是自己孤陋寡闻吧...  进入正题

1. 开发环境

  Arduino    编写芯片程序需要

  eclipse      编写服务端程序

  花生壳        内网穿透(不是一定要有的)

2. 硬件连线图


(图片源自网络)


(wifi芯片,AT指令通用的,只是连线不同罢了)


2. 首先在Arduino 开发环境,使用软串口的方式 ,使用单片机和esp8266发送数据 ,代码如下

#include <SoftwareSerial.h>
 SoftwareSerial mySerial(3, 2); // RX, TX
 void setup()  
 {
   Serial.begin(9600);
   while (!Serial) {;}
   Serial.println("hardware serial!");
   mySerial.begin(9600);
   mySerial.println("software seria");

  }

 void loop()
 {
   if (mySerial.available())
     Serial.write(mySerial.read());
   if (Serial.available())
     mySerial.write(Serial.read());

 }

这段代码在Arduino 开发环境编写,电脑通过硬串口与单片机发送数据,单片机使用软串口和 esp8266发送数据

Arduino ide下载官网

成功之后,在串口助手中可以发现如下信息


(注意一定要先选中下面的 发送新行!)


3. 通过 AT 指令,设置 esp 8266的wifi源(也就是 这个芯片借用别人的wifi发送消息,就是蹭wifi)

这里先写上几个我在尝试过程中遇到的bug

       


再输入框里输入  AT+CIOBAUD=9600  回车

有些esp8266芯片的默认波特率可能是 115200 ,这里我们通过这条指令,修改波特率(如图所示)

***********以下命令连接   wifi

注意这些指令也是通过输入框发送给ESP8266的,如图所示

AT+CWMODE=3                   // 设置ap+st混合模式

AT+RST                                 // 重启一下

AT+CWJAP=" SSID "," password "    (这里填写你家的,或者学校的  wifi名字  和 密码)


输入一条指令  AT+CWMODE=3

返回  OK

输入AT+RST

返回 OK

我是由于原来就连接过wifi,所以会显示连接完成,WIFI GOT IP

如果是第一次连接  指令 AT+CWJAP=" SSID "," password " 也要输入


-------------------------------------------------------------------------------


(注意接下来的代码完全也可以通过  输入框  发送  AT 指令  但是  我是出于自动化的考虑,写到了代码里面,也就是说通过

AT 指令也可以发送  GET 网络请求)

4. 前面我们通过软串口程序,设置好了wifi, 现在我们在Arduino 开发环境编写代码让 esp8266发送请求,

#include <SoftwareSerial.h>
SoftwareSerial WIFISerial(3, 2); // RX, TX    //模拟一个软串口
void setup()  {
    Serial.begin(9600);
    while (!Serial) {;}                       //等待串口初始化
    WIFISerial.begin(9600);
    delay(1000);
    WIFISerial.println("AT"); 
    Serial.println("AT");    
    delay(1000);
    WIFISerial.println("AT+CIPMUX=0");     //打开单连接    
    Serial.println("AT+CIPMUX=0");             
    delay(1000);
    WIFISerial.println("AT+CIPSTART=\"TCP\",\"19xr3.imwork.net\",29971");  //  这里填写你的域名(主机ip地址 ,127的那个貌似不行),端口号
    Serial.println("AT+CIPSTART=\"TCP\",\"19xr3.imwork.net\",29971");
    // 接收数据的计算机地址,连接到 TCP 服务器
    delay(3000);
    WIFISerial.println("AT+CIPMODE=1");    //透传模式
    Serial.println("AT+CIPMODE=1");    //透传模式
    delay(1000);
    WIFISerial.println("AT+CIPSEND");    //透传模式
    Serial.println("AT+CIPSEND");    //透传模式
    delay(1000);
   
}

   
void loop(){
 
  while(WIFISerial.available()){
    Serial.write(WIFISerial.read());
  }
//串口打印 软串口读到的每一句话,这里
  Serial.println("I am ready");
  Serial.flush();
  String t = readLine();
  if(t!=""){
     WIFISerial.println("GET http://19xr3.imwork.net/a/r/"+t);   //  发送一个http请求
  }
  delay(2000);   //时隔两秒发送下一个请求

}
String readLine()  
{  
    String str;  
    while (Serial.available()>0)  
    {  
        char temp = Serial.read();  
        if (temp != '\n') {  
          str += char(temp);  
          delay(2);  
        }//delete temp;

        else break;//delete temp;  
    }  
    return str;  
}  

注意: 以上代码 让wifi芯片发送http请求 ,使用 get 方法,文章最后面给了使用post 方法发送数据的代码。

以上代码需要注意的是

        1.  域名可以使用 本机地址,

(这是程序烧写之后,打开串口助手,等待你发送数据)

        2.  readline  函数  里面的  delay (2) 不可以缺少

        3.  注意  代码下划线的使用

        4. AT 指令可以在网上找到讲解,这里不多说

        5. 如果没有域名   拿主机 ip 地址也可以  命令行  输入 ipconfig,用 ipv4 地址替换代码中的域名

        但是要注意!!!!   我代码中有下划线的地方一个不能少,之前因为这个吃了好多亏

   WIFISerial.println("AT+CIPSTART=\"TCP\",\"19xr3.imwork.net\",29971");
这个不能少!

         

     WIFISerial.println("GET http://19xr3.imwork.net/a/r/"+t);   //  发送一个http请求  

        这里  a/r/  这个下划线一定要有  ,  a 和 r 只是服务器的路径罢了。



5.  服务端  我是使用eclipse+ jfinal 编写的代码


本质就是  把地址后面的参数输出到控制台 程序使用普通的 jsp+servlet 也可以实现

http://www.baidu.com/parameter_and_value

启动服务器,然后打开串口助手


前面几行是程序的输出信息,然后不断出现  I am ready  可以发送数据了  在下面输入 任意字符串

在服务端会有显示,如图。


除此之外,你们看我的服务器代码 有一段 renderText("This is restore method ")

这句话在串口助手中也可以找到


这里我们发送信息的方式是  通过地址的参数发送信息,也就类似与  访问  http://www.baidu.com/hello

我们也可以使用post 发送信息


代码仅供参考

#include <ArduinoJson.h>

#include <SoftwareSerial.h>
SoftwareSerial WIFISerial(3, 2); // RX, TX    //模拟一个软串口
void setup()  {
    Serial.begin(9600);
    while (!Serial) {;}  
    WIFISerial.begin(9600);
    delay(1000);
    WIFISerial.println("AT"); 
    Serial.println("AT");    
    delay(1000);
    WIFISerial.println("AT+CIPMUX=0");     //打开单连接    
    Serial.println("AT+CIPMUX=0");             
    delay(1000);
    WIFISerial.println("AT+CIPSTART=\"TCP\",\"19xr3.imwork.net\",29971");
    Serial.println("AT+CIPSTART=\"TCP\",\"19xr3.imwork.net\",29971");
    // 接收数据的计算机地址,连接到 TCP 服务器
    delay(3000);
    WIFISerial.println("AT+CIPMODE=1");    //透传模式
    Serial.println("AT+CIPMODE=1");    //透传模式
    delay(1000);
    WIFISerial.println("AT+CIPSEND");    //透传模式
    Serial.println("AT+CIPSEND");    //透传模式
    delay(1000);

}

void loop(){
  while(WIFISerial.available()){
    Serial.write(WIFISerial.read());
  }
  Serial.println("I am ready");
  Serial.flush();
  String t = readLine();
  if(t!=""){
      String data = (String)"{\"heartbeat\":\"" + t+"\"}";  
      int length = data.length();  
        
      String postRequest =(String)("POST ") + "/ HTTP/1.1\r\n" +  
          "Content-Type: application/json;charset=utf-8\r\n" +  
          "Host: " +"http://19xr3.imwork.net:29971/a/r/"+ ":" + 29971 + "\r\n" +            
          "Content-Length: " + length + "\r\n" +  
          "Connection: Keep Alive\r\n\r\n" +  
          data+"\r\n";  
     WIFISerial.print(postRequest);
  }
  delay(2000);
}

String readLine()  
{  
    String str;  
    while (Serial.available()>0)  
    {  
        char temp = Serial.read();  
        if (temp != '\n') {  
          str += char(temp);  
          delay(2);  
        }//delete temp;

        else break;//delete temp;  
    }  
    return str;  
}  



感谢以下博客文章

https://www.sogou.com/link?url=DSOYnZeCC_q8-9mlKJZvMq8q7oefb5diMlByC-y2GDUl8OT6rYpPtg

http://www.windworkshop.cn/?p=1217

http://www.21ic.com/evm/evaluate/MCU/201712/747645_2.htm

https://www.cnblogs.com/ticktack/p/8043344.html

https://www.cnblogs.com/niejunchan/p/5738628.html


  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
fre内网穿透只能穿透http协议,且页面大小限制在1496B以内(MTU,包含header头部) 包含函数如下: begin(char*,char*,char*,uint16,String,String);//设定参数信息,第一个参数是wifi名称,第二个参数是wifi密码,第三个参数是服务器地址,第四个参数是服务器端口,都五个参数是自定义域名密码,第六个参数是域名(多个域名以英文逗号分割) on(String,void);//页面以及回调函数,第一个参数是页面路径,第二个参数是回调函数 header(String,String);//设定header头部信息 sendfile();//发送默认的SPIFFS文件 sendfile(String);//发送指定的SPIFFS文件 send(int,string,string);//发送string,第一个参数是响应代码一般是200,第二个参数是页面类型,第三个参数是需要发送的文本 send(int,string,uint8_t*,size_t);//发送uint8_t数组文件,第一个参数是响应代码一般是200,第二个参数是页面类型,第三个参数是需要发送的uint8_t数组文件,第四个参数是uint8_t数组文件的大小 send(int,string,char*,size_t);//发送char数组文件,第一个参数是响应代码一般是200,第二个参数是页面类型,第三个参数是需要发送的char数组文件,第四个参数是char数组文件的大小 Authenticate(String, String);//判断Auth鉴权信息,第一个参数是用户名,第二个参数是密码 requestAuthentication();//向页面返回鉴权需求,使页面弹出Auth鉴权登录信息 getheader(String);//返回header指定头部信息参数值 arg(String);//返回GET请求参数值
下面是一个简单的示例代码,演示如何使用ESP8266开发板Arduino Uno之间的串口通信。 ESP8266开发板代码: ```c++ #include <SoftwareSerial.h> // 设置ESP8266的串口通信引脚 SoftwareSerial espSerial(2, 3); void setup() { // 打开串口调试 Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // 打开ESP8266串口通信 espSerial.begin(9600); // 等待ESP8266启动 delay(1000); // 向ESP8266发送AT指令 espSerial.println("AT"); delay(1000); // 检查是否收到“OK”响应 if (espSerial.find("OK")) { Serial.println("ESP8266 initialized."); } else { Serial.println("Error initializing ESP8266."); } } void loop() { // 读取来自Arduino的数据 if (Serial.available()) { String data = Serial.readStringUntil('\n'); Serial.print("Sending to ESP8266: "); Serial.println(data); // 发送数据到ESP8266 espSerial.println(data); } // 读取来自ESP8266的数据 if (espSerial.available()) { String data = espSerial.readStringUntil('\n'); Serial.print("Received from ESP8266: "); Serial.println(data); } } ``` Arduino Uno代码: ```c++ void setup() { // 打开串口调试 Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } } void loop() { // 读取来自ESP8266的数据 if (Serial.available()) { String data = Serial.readStringUntil('\n'); Serial.print("Received from ESP8266: "); Serial.println(data); // 发送数据到ESP8266 Serial.print("Sending to ESP8266: "); Serial.println(data); } } ``` 在这个示例中,我们使用SoftwareSerial库在ESP8266开发板上模拟一个串口通信引脚。在ESP8266setup()函数中,我们初始化了两个串口通信引脚,分别用于与Arduino Uno和ESP8266之间的通信。我们发送了AT指令来检查ESP8266是否已经启动,并从Arduino Uno读取数据并将其发送到ESP8266,反之亦然。在Arduino Uno的loop()函数中,我们只是简单地读取来自ESP8266的数据并将其发送回去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值