研究过嵌入式方面的人都应该了解 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发送数据
成功之后,在串口助手中可以发现如下信息
(注意一定要先选中下面的 发送新行!)
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