#include "ESP8266/ESP8266.h"
#define WAITE_TIME 1000
uint8_t YH_ESP8266_RxBuff[YH_ESP8266_BufMaxLen];
uint16_t YH_ESP8266_RxLen = 0;
uint8_t YH_ESP8266MODE = 0;
void YH_ESP8266_delay_1Ms(void)
{
uint16_t i,j;
for(i=1000;i>0;i--)
for(j=7;j>0;j--);
}
uint8_t YH_ESP8266_App_SetAP(char *name, char *pass)
{
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_SetMode(2)) return 1;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_SetAPIP("192.168.5.1")) return 2;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_SetAP(name,pass)) return 3;
return 0;
}
uint8_t YH_ESP8266_App_ConAP(char *name, char *pass)
{
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_SetMode(1)) return 1;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_OpenDHCP()) return 2;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_ConAP(name,pass)) return 3;
return 0;
}
uint8_t YH_ESP8266_App_CreatUDP(char *serip, char *serport, char *loport)
{
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_CreatUDP(serip, serport, loport)) return 1;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_EnterTrans()) return 2;
YH_ESP8266MODE = 0;
return 0;
}
uint8_t YH_ESP8266_App_CreatTCPClient(char *serip, char *serport)
{
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_CloseMoreCon()) return 1;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_CreatTCPClient(serip, serport)) return 1;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_EnterTrans()) return 2;
YH_ESP8266MODE = 0;
return 0;
}
uint8_t YH_ESP8266_App_CreatTCPServer(char *port)
{
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_OpenMoreCon()) return 1;
YH_ESP8266_delay_1Ms();
if(YH_ESP8266_CreatTCPServer(port)) return 2;
YH_ESP8266MODE = 1;
return 0;
}
void _ClearBuf(uint8_t *buff)
{
int i;
for(i=0;i<YH_ESP8266_BufMaxLen;i++)
{
buff[i] = 0;
}
}
//YH_ESP8266发送命令
//输入:无
//返回:0.成功 其他.失败
uint8_t _YH_ESP8266_CommandSend(char *command , char *res , uint16_t timeout_ms)
{
uint16_t addri = 0;
YH_ESP8266_RxLen = 0;
YH_ESP8266_USART_GetData(YH_ESP8266_RxBuff);
_ClearBuf(YH_ESP8266_RxBuff);
YH_ESP8266_USART_SendString(command);
while(timeout_ms--)
{
addri = YH_ESP8266_USART_GetData(&YH_ESP8266_RxBuff[YH_ESP8266_RxLen]);
if(addri>0) {
YH_ESP8266_RxLen += addri;
if(strstr((char*)YH_ESP8266_RxBuff,res) != NULL) return 0;
}
YH_ESP8266_delay_1Ms();
}
return 2;
}
//初始化YH_ESP8266
//输入:YH_ESP8266波特率
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_Init(uint32_t bound)
{
char cmdbuf[50] = {0};
if(bound == 9600) strcat(cmdbuf,"AT+UART=9600,8,1,0,0\r\n");
else if(bound == 115200) strcat(cmdbuf,"AT+UART=115200,8,1,0,0\r\n");
else return 1;
YH_ESP8266_USART_SetBaud(9600);
if(_YH_ESP8266_CommandSend(cmdbuf,"OK", WAITE_TIME) == 0) {
if(_YH_ESP8266_CommandSend("ATE0\r\n","OK", WAITE_TIME) == 0) return 0;
}
YH_ESP8266_USART_SetBaud(115200);
if(_YH_ESP8266_CommandSend(cmdbuf,"OK", WAITE_TIME) == 0) {
if(_YH_ESP8266_CommandSend("ATE0\r\n","OK", WAITE_TIME) == 0) return 0;
}
return 2;
}
//软件重启YH_ESP8266
//输入:无
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_Rst(void)
{
if(_YH_ESP8266_CommandSend("AT+RST\r\n","OK", WAITE_TIME) == 0) return 0;
else return 1;
}
//获取YH_ESP8266模式
//输入:无
//返回:0.失败 1.Station模式 2.ap模式 3.ap|sta模式
uint8_t YH_ESP8266_GetMode(void)
{
if(_YH_ESP8266_CommandSend("AT+CWMODE?\r\n","OK", WAITE_TIME) == 0) {
if(strstr((char*)YH_ESP8266_RxBuff,"+CWMODE:1") != NULL) return 1;
else if(strstr((char*)YH_ESP8266_RxBuff,"+CWMODE:2") != NULL) return 2;
else if(strstr((char*)YH_ESP8266_RxBuff,"+CWMODE:3") != NULL) return 3;
else return 0;
}
else return 0;
}
//更改YH_ESP8266模式
//输入:1.Station模式 2.ap模式 3.AP|Station模式
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_SetMode(uint8_t mode)
{
char cmdbuf[50] = {0};
if(mode == 1) strcat(cmdbuf,"AT+CWMODE=1\r\n");
else if(mode == 2) strcat(cmdbuf,"AT+CWMODE=2\r\n");
else if(mode == 3) strcat(cmdbuf,"AT+CWMODE=3\r\n");
else return 1;
if(_YH_ESP8266_CommandSend(cmdbuf,"OK", WAITE_TIME) == 0) return 0;
else return 2;
}
//可用AP扫描
//输入:可用AP缓存结构体数组
//返回:0.失败 其他.AP个数 (最大支持搜索10个AP)
uint8_t YH_ESP8266_SearchAP(_YH_ESP8266_AvailableAP *availableAP)
{
int i,j=0,m=0;
char lsbuf[5];
if(_YH_ESP8266_CommandSend("AT+CWLAP\r\n","OK", 10000) == 0) {
for(i=0;i<YH_ESP8266_RxLen;i++) {
if(YH_ESP8266_RxBuff[i] == '+'){
i+=8;
if(i >= YH_ESP8266_RxLen) return 0;
availableAP[j].key = YH_ESP8266_RxBuff[i]-'0';
i+=3;
if(i >= YH_ESP8266_RxLen) return 0;
m=0;
for(;YH_ESP8266_RxBuff[i]!='"' && m<30 && i<YH_ESP8266_RxLen;i++) {
availableAP[j].name[m++] = YH_ESP8266_RxBuff[i];
}
i+=2;
if(i >= YH_ESP8266_RxLen) return 0;
m=0;
for(;YH_ESP8266_RxBuff[i]!=',' && m<5 && i<YH_ESP8266_RxLen;i++) {
lsbuf[m++] = YH_ESP8266_RxBuff[i];
}
lsbuf[m] = 0;
availableAP[j].intensity = atoi(lsbuf);
j++;
if(j==10) break;
}
}
return j;
}
else return 0;
}
//查询YH_ESP8266路由器连接信息
//输入:AP名称地址
//返回:0.无连接 1.有连接 其他.失败
uint8_t YH_ESP8266_GetConInfor(char *apname)
{
int i,m=0;
if(_YH_ESP8266_CommandSend("AT+CWJAP?\r\n","OK", WAITE_TIME) == 0) {
for(i=0;i<YH_ESP8266_RxLen;i++) {
if(YH_ESP8266_RxBuff[i] == '+'){
i+=8;
if(i >= YH_ESP8266_RxLen) return 3;
m=0;
for(;YH_ESP8266_RxBuff[i]!='"' && m<30 && i<YH_ESP8266_RxLen;i++) {
apname[m++] = YH_ESP8266_RxBuff[i];
}
return 1;
}
}
return 0;
}
else return 2;
}
//YH_ESP8266开启DHCP
//输入:无
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_OpenDHCP(void)
{
if(_YH_ESP8266_CommandSend("AT+CWDHCP_DEF=1,1\r\n","OK", WAITE_TIME) == 0) return 0;
else return 1;
}
//YH_ESP8266关闭DHCP
//输入:无
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_CloseDHCP(void)
{
if(_YH_ESP8266_CommandSend("AT+CWDHCP_DEF=1,0\r\n","OK", WAITE_TIME) == 0) return 0;
else return 1;
}
//YH_ESP8266连接路由器
//输入:AP名称 和 密码
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_ConAP(char *name,char *pass)
{
char cmdbuf[100] = {0};
cmdbuf[0] = 0;
strcat(cmdbuf,"AT+CWJAP_DEF=\"");
strcat(cmdbuf,name);
strcat(cmdbuf,"\",\"");
strcat(cmdbuf,pass);
strcat(cmdbuf,"\"\r\n");
if(_YH_ESP8266_CommandSend(cmdbuf,"OK", 10000) == 0) return 0;
else return 1;
}
//YH_ESP8266断开路由器
//输入:无
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_DisconAP(void)
{
if(_YH_ESP8266_CommandSend("AT+CWQAP\r\n","OK", 10000) == 0) return 0;
else return 1;
}
//IP信息查询
//输入:IP信息结构体地址
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_GetIP(_YH_ESP8266_IPInfor *IPInfor)
{
int i,j=0,m=0;
if(_YH_ESP8266_CommandSend("AT+CIPSTA?\r\n","OK", WAITE_TIME) == 0) {
for(i=0;i<YH_ESP8266_RxLen;i++) {
if(YH_ESP8266_RxBuff[i] == '+'){
for(;i<YH_ESP8266_RxLen;i++) {
if(YH_ESP8266_RxBuff[i] == ':') {
i++;
break;
}
}
if(YH_ESP8266_RxBuff[i] == 'i') {
i+=2;
j=1;
}
else if(YH_ESP8266_RxBuff[i] == 'g') {
i+=7;
j=2;
}
else if(YH_ESP8266_RxBuff[i] == 'n') {
i+=7;
j=3;
}
else return 1;
if(YH_ESP8266_RxBuff[i] != ':') return 2;
i+=2;
if(i >= YH_ESP8266_RxLen) return 3;
m=0;
for(;YH_ESP8266_RxBuff[i]!='"' && m<16 && i<YH_ESP8266_RxLen;i++) {
if(j==1) {
IPInfor->ip[m++] = YH_ESP8266_RxBuff[i];
}
else if(j==2) {
IPInfor->gateway[m++] = YH_ESP8266_RxBuff[i];
}
else if(j==3) {
IPInfor->netmask[m++] = YH_ESP8266_RxBuff[i];
}
}
if(j==1) IPInfor->ip[m] = 0;
if(j==2) IPInfor->gateway[m] = 0;
if(j==3) IPInfor->netmask[m] = 0;
}
}
return 0;
}
else return 4;
}
//设置IP信息
//输入:IP信息结构体地址
//返回:0.成功 其他.失败
uint8_t YH_ESP8266_SetIP(_YH_ESP8266_IPInfor IPInfo