用Arduino使用esp8266的Wi-Fi TCP透传和POST请求用过Arduino的朋友,用esp8266的时候,会比较倾向于使用纯ArduinoIDE的esp8266单个板子的开发,毕竟简单,而且库文件的用法比较熟悉,但是这种也会出现很多问题,比如有些引脚不够用,有些库还没完全移植到esp8266的Arduino版上,甚至性能不够用的情况。
这时候最好的方案就是让esp8266只做Wi-Fi的事情,Arduino板子来做其他的收集数据,运算之类的事情,相得益彰,相辅相成。
使用透传一般需要用AT指令来控制esp8266,AT指令第一次用会不理解,会了之后会觉得很简单,稍微有些坑,我也被卡住了挺久。
相关的文档资料可以在乐鑫官网下载到http://espressif.com/zh-hans/products/hardware/esp8266ex/resources
这篇帖子就说一下连接服务器并发送post请求的例子。
#include <SoftwareSerial.h>
|
|
SoftwareSerial mySerial(13, 12); // RX, TX 通过软串口连接esp8266
|
|
void setup() {
|
|
// Open serial communications and wait for port to open:
|
|
Serial.begin(115200);
|
|
while (!Serial) {
|
|
; // wait for serial port to connect. Needed for native USB port only
|
|
}
|
|
mySerial.begin(115200);
|
|
mySerial.println(“AT+RST”); // 初始化重启一次esp8266
|
|
delay(1500);
|
|
echo();
|
|
mySerial.println(“AT”);
|
|
echo();
|
|
delay(500);
|
|
mySerial.println(“AT+CWMODE=3″); // 设置Wi-Fi模式
|
|
echo();
|
|
mySerial.println(“AT+CWJAP=\”WiFiSSID\”,\”password\”"); // 连接Wi-Fi
|
|
echo();
|
|
delay(10000);
|
|
}
|
|
void loop() {
|
|
if (mySerial.available()) {
|
|
Serial.write(mySerial.read());
|
|
}
|
|
if (Serial.available()) {
|
|
mySerial.write(Serial.read());
|
|
}
|
|
post();
|
|
}
|
|
void echo(){
|
|
delay(50);
|
|
while (mySerial.available()) {
|
|
Serial.write(mySerial.read());
|
|
}
|
|
}
|
|
void post(){
|
|
String temp = “POST data”;
|
|
mySerial.println(“AT+CIPMODE=1″);
|
|
echo();
|
|
mySerial.println(“AT+CIPSTART=\”TCP\”,\”webserver.com\”,80″); // 连接服务器的80端口
|
|
delay(1000);
|
|
echo();
|
|
mySerial.println(“AT+CIPSEND”); // 进入TCP透传模式,接下来发送的所有消息都会发送给服务器
|
|
echo();
|
|
mySerial.print(“POST /update.php?params=sth”); // 开始发送post请求
|
|
mySerial.print(” HTTP/1.1\r\nHost: webserver.com\r\nUser-Agent: arduino-ethernet\r\nConnection:close\r\nContent-Length:”); // post请求的报文格式
|
|
mySerial.print(temp.length()); // 需要计算post请求的数据长度
|
|
mySerial.print(“\r\n\r\n”);
|
|
mySerial.println(temp); // 结束post请求
|
|
delay(3000);
|
|
echo();
|
|
mySerial.print(“+++”); // 退出tcp透传模式,用println会出错
|
|
delay(2000);
|
|
}
|