uint8_t ESP_GetFirmwareVersionString(uint8_t *fwBuf, size_t fwBufSize) { /* AT+GMR */ uint8_t rxBuf[32]; uint8_t res; const unsigned char *p; res = ESP_SendATCommand("AT+GMR\r\n", rxBuf, sizeof(rxBuf), "\r\n\r\nOK\r\n", ESP_DEFAULT_TIMEOUT_MS, NULL); if (res!=ERR_OK) { if (UTIL1_strtailcmp(rxBuf, "\r\n\r\nOK\r\n")) { res = ERR_OK; } } if (res==ERR_OK) { if (UTIL1_strncmp(rxBuf, "AT+GMR\r\r\n", sizeof("AT+GMR\r\r\n")-1)==0) { /* check for beginning of response */ UTIL1_strCutTail(rxBuf, "\r\n\r\nOK\r\n"); /* cut tailing response */ p = rxBuf+sizeof("AT+GMR\r\r\n")-1; /* skip beginning */ UTIL1_strcpy(fwBuf, fwBufSize, p); /* copy firmware information string */ } else { res = ERR_FAILED; } } if (res!=ERR_OK) { UTIL1_strcpy(fwBuf, fwBufSize, "ERROR"); /* default error */ } return res; }
uint8_t ESP_GetIPAddrString(uint8_t *ipBuf, size_t ipBufSize) { /* AT+CIFSR */ uint8_t rxBuf[32]; uint8_t res; const unsigned char *p; res = ESP_SendATCommand("AT+CIFSR\r\n", rxBuf, sizeof(rxBuf), NULL, ESP_DEFAULT_TIMEOUT_MS, NULL); if (res!=ERR_OK) { if (UTIL1_strtailcmp(rxBuf, "\r\n")) { res = ERR_OK; } } if (res==ERR_OK) { if (UTIL1_strncmp(rxBuf, "AT+CIFSR\r\r\n", sizeof("AT+CIFSR\r\r\n")-1)==0) { /* check for beginning of response */ UTIL1_strCutTail(rxBuf, "\r\n"); /* cut tailing response */ p = rxBuf+sizeof("AT+CIFSR\r\r\n")-1; /* skip beginning */ SkipNewLines(&p); UTIL1_strcpy(ipBuf, ipBufSize, p); /* copy IP information string */ } else { res = ERR_FAILED; } } if (res!=ERR_OK) { UTIL1_strcpy(ipBuf, ipBufSize, "ERROR"); } return res; }
uint8_t ESP_SetServer(bool startIt, uint16_t port, const CLS1_StdIOType *io, uint16_t timeoutMs) { /* AT+CIPSERVER=<en>,<port>, where <en>: 0: stop, 1: start */ uint8_t res; uint8_t cmd[sizeof("AT+CIPSERVER=1,80\r\n\r\nOK\r\n")+sizeof("no change")]; uint8_t rxBuf[sizeof("AT+CIPSERVER=1,80\r\n\r\nOK\r\n")+sizeof("no change")]; UTIL1_strcpy(cmd, sizeof(cmd), "AT+CIPSERVER="); if (startIt) { UTIL1_strcat(cmd, sizeof(cmd), "1,"); } else { UTIL1_strcat(cmd, sizeof(cmd), "0,"); } UTIL1_strcatNum16u(cmd, sizeof(cmd), port); UTIL1_strcat(cmd, sizeof(cmd), "\r\n"); res = ESP_SendATCommand(cmd, rxBuf, sizeof(rxBuf), "OK\r\n", timeoutMs, io); if (res!=ERR_OK) { /* accept "no change" too */ UTIL1_strcpy(cmd, sizeof(cmd), "AT+CIPSERVER="); if (startIt) { UTIL1_strcat(cmd, sizeof(cmd), "1,"); } else { UTIL1_strcat(cmd, sizeof(cmd), "0,"); } UTIL1_strcatNum16u(cmd, sizeof(cmd), port); UTIL1_strcat(cmd, sizeof(cmd), "\r\r\nno change\r\n"); if (UTIL1_strcmp(rxBuf, cmd)==0) { res = ERR_OK; } } return res; }
uint8_t ESP_SelectMode(uint8_t mode) { /* AT+CWMODE=<mode>, where <mode> is 1=Sta, 2=AP or 3=both */ uint8_t txBuf[sizeof("AT+CWMODE=x\r\n")]; uint8_t rxBuf[sizeof("AT+CWMODE=x\r\r\nno change\r\n")]; uint8_t expected[sizeof("AT+CWMODE=x\r\r\nno change\r\n")]; uint8_t res; if (mode<1 || mode>3) { return ERR_RANGE; /* only 1, 2 or 3 */ } UTIL1_strcpy(txBuf, sizeof(txBuf), "AT+CWMODE="); UTIL1_strcatNum16u(txBuf, sizeof(txBuf), mode); UTIL1_strcat(txBuf, sizeof(txBuf), "\r\n"); UTIL1_strcpy(expected, sizeof(expected), "AT+CWMODE="); UTIL1_strcatNum16u(expected, sizeof(expected), mode); UTIL1_strcat(expected, sizeof(expected), "\r\r\n\n"); res = ESP_SendATCommand(txBuf, rxBuf, sizeof(rxBuf), expected, ESP_DEFAULT_TIMEOUT_MS, NULL); if (res!=ERR_OK) { /* answer could be as well "AT+CWMODE=x\r\r\nno change\r\n"!! */ UTIL1_strcpy(txBuf, sizeof(txBuf), "AT+CWMODE="); UTIL1_strcatNum16u(txBuf, sizeof(txBuf), mode); UTIL1_strcat(txBuf, sizeof(txBuf), "\r\n"); UTIL1_strcpy(expected, sizeof(expected), "AT+CWMODE="); UTIL1_strcatNum16u(expected, sizeof(expected), mode); UTIL1_strcat(expected, sizeof(expected), "\r\r\nno change\r\n"); if (UTIL1_strcmp(rxBuf, expected)==0) { res = ERR_OK; } } return res; }
uint8_t ESP_OpenConnection(int8_t ch_id, bool isTCP, const uint8_t *IPAddrStr, uint16_t port, uint16_t msTimeout, const CLS1_StdIOType *io) { /* AT+CIPSTART=4,"TCP","184.106.153.149",80 */ uint8_t txBuf[54]; uint8_t rxBuf[72]; uint8_t expected[72]; UTIL1_strcpy(txBuf, sizeof(txBuf), "AT+CIPSTART="); if (ch_id>=0) { UTIL1_strcatNum16u(txBuf, sizeof(txBuf), ch_id); UTIL1_chcat(txBuf, sizeof(txBuf), ','); } if (isTCP) { UTIL1_strcat(txBuf, sizeof(txBuf), "\"TCP\",\""); } else { UTIL1_strcat(txBuf, sizeof(txBuf), "\"UDP\",\""); } UTIL1_strcat(txBuf, sizeof(txBuf), IPAddrStr); UTIL1_strcat(txBuf, sizeof(txBuf), "\","); UTIL1_strcatNum16u(txBuf, sizeof(txBuf), port); UTIL1_strcpy(expected, sizeof(expected), txBuf); UTIL1_strcat(expected, sizeof(expected), "\r\r\n\r\nOK\r\nLinked\r\n"); UTIL1_strcat(txBuf, sizeof(txBuf), "\r\n"); return ESP_SendATCommand(txBuf, rxBuf, sizeof(rxBuf), expected, msTimeout, io); }
uint8_t ESP_TestAT(void) { /* AT */ uint8_t rxBuf[sizeof("AT\r\r\n\r\nOK\r\n")]; uint8_t res; res = ESP_SendATCommand("AT\r\n", rxBuf, sizeof(rxBuf), "AT\r\r\n\r\nOK\r\n", ESP_DEFAULT_TIMEOUT_MS, NULL); return res; }
uint8_t ESP_CloseConnection(uint8_t channel, const CLS1_StdIOType *io, uint16_t timeoutMs) { /* AT+CIPCLOSE=<channel> */ uint8_t res; uint8_t cmd[64]; UTIL1_strcpy(cmd, sizeof(cmd), "AT+CIPCLOSE="); UTIL1_strcatNum8u(cmd, sizeof(cmd), channel); UTIL1_strcat(cmd, sizeof(cmd), "\r\n"); res = ESP_SendATCommand(cmd, NULL, 0, "Unlink\r\n", timeoutMs, io); return res; }
uint8_t ESP_PrepareMsgSend(int8_t ch_id, size_t msgSize, uint16_t msTimeout, const CLS1_StdIOType *io) { /* AT+CIPSEND=<ch_id>,<size> */ uint8_t cmd[24], rxBuf[48], expected[48]; UTIL1_strcpy(cmd, sizeof(cmd), "AT+CIPSEND="); /* parameters are <ch_id>,<size> */ UTIL1_strcatNum8u(cmd, sizeof(cmd), ch_id); UTIL1_chcat(cmd, sizeof(cmd), ','); UTIL1_strcatNum16u(cmd, sizeof(cmd), msgSize); UTIL1_strcpy(expected, sizeof(expected), cmd); /* we expect the echo of our command */ UTIL1_strcat(expected, sizeof(expected), "\r\r\n> "); /* expect "> " */ UTIL1_strcat(cmd, sizeof(cmd), "\r\n"); return ESP_SendATCommand(cmd, rxBuf, sizeof(rxBuf), expected, msTimeout, io); }
uint8_t ESP_SetNumberOfConnections(uint8_t nof, const CLS1_StdIOType *io, uint16_t timeoutMs) { /* AT+CIPMUX=<nof>, 0: single connection, 1: multiple connections */ uint8_t res; uint8_t cmd[sizeof("AT+CIPMUX=12\r\n")]; uint8_t rxBuf[sizeof("AT+CIPMUX=12\r\n\r\nOK\r\n")+10]; if (nof>1) { /* only 0 and 1 allowed */ if (io!=NULL) { CLS1_SendStr("Wrong number of connection parameter!\r\n", io->stdErr); } return ERR_FAILED; } UTIL1_strcpy(cmd, sizeof(cmd), "AT+CIPMUX="); UTIL1_strcatNum8u(cmd, sizeof(cmd), nof); UTIL1_strcat(cmd, sizeof(cmd), "\r\n"); res = ESP_SendATCommand(cmd, rxBuf, sizeof(rxBuf), "OK\r\n", timeoutMs, io); return res; }
static uint8_t JoinAccessPoint(const uint8_t *ssid, const uint8_t *pwd, CLS1_ConstStdIOType *io) { /* AT+CWJAP="<ssid>","<pwd>" */ uint8_t txBuf[48]; uint8_t rxBuf[64]; uint8_t expected[48]; UTIL1_strcpy(txBuf, sizeof(txBuf), "AT+CWJAP=\""); UTIL1_strcat(txBuf, sizeof(txBuf), ssid); UTIL1_strcat(txBuf, sizeof(txBuf), "\",\""); UTIL1_strcat(txBuf, sizeof(txBuf), pwd); UTIL1_strcat(txBuf, sizeof(txBuf), "\"\r\n"); UTIL1_strcpy(expected, sizeof(expected), "AT+CWJAP=\""); UTIL1_strcat(expected, sizeof(expected), ssid); UTIL1_strcat(expected, sizeof(expected), "\",\""); UTIL1_strcat(expected, sizeof(expected), pwd); UTIL1_strcat(expected, sizeof(expected), "\"\r\r\n\r\nOK\r\n"); return ESP_SendATCommand(txBuf, rxBuf, sizeof(rxBuf), expected, ESP_DEFAULT_TIMEOUT_MS, io); }
uint8_t ESP_GetCIPMUXString(uint8_t *cipmuxBuf, size_t cipmuxBufSize) { /* AT+CIPMUX? */ uint8_t rxBuf[32]; uint8_t res; const unsigned char *p; res = ESP_SendATCommand("AT+CIPMUX?\r\n", rxBuf, sizeof(rxBuf), "\r\n\r\nOK\r\n", ESP_DEFAULT_TIMEOUT_MS, NULL); if (res==ERR_OK) { if (UTIL1_strncmp(rxBuf, "AT+CIPMUX?\r\r\n+CIPMUX:", sizeof("AT+CIPMUX?\r\r\n+CIPMUX:")-1)==0) { /* check for beginning of response */ UTIL1_strCutTail(rxBuf, "\r\n\r\nOK\r\n"); /* cut tailing response */ p = rxBuf+sizeof("AT+CIPMUX?\r\r\n+CIPMUX:")-1; /* skip beginning */ UTIL1_strcpy(cipmuxBuf, cipmuxBufSize, p); /* copy IP information string */ } else { res = ERR_FAILED; } } if (res!=ERR_OK) { UTIL1_strcpy(cipmuxBuf, cipmuxBufSize, "ERROR"); } return res; }
uint8_t ESP_SendStr(const uint8_t *str, CLS1_ConstStdIOType *io) { uint8_t buf[32]; uint8_t rxBuf[48]; uint8_t res; uint16_t timeoutMs; #define RX_TIMEOUT_MS 3000 AS2_TComData ch; UTIL1_strcpy(buf, sizeof(buf), str); UTIL1_strcat(buf, sizeof(buf), "\r\n"); res = ESP_SendATCommand(buf, rxBuf, sizeof(rxBuf), NULL, ESP_DEFAULT_TIMEOUT_MS, io); timeoutMs = 0; while(timeoutMs<RX_TIMEOUT_MS) { WAIT1_WaitOSms(100); timeoutMs += 100; while (AS2_GetCharsInRxBuf()>0) { (void)AS2_RecvChar(&ch); CLS1_SendChar(ch); } } return ERR_OK; }
uint8_t ESP_Restart(const CLS1_StdIOType *io, uint16_t timeoutMs) { /* AT+RST */ uint8_t rxBuf[sizeof("AT+RST\r\r\n\r\nOK\r\n")]; uint8_t res; uint8_t buf[64]; AS2_ClearRxBuf(); /* clear buffer */ res = ESP_SendATCommand("AT+RST\r\n", rxBuf, sizeof(rxBuf), "AT+RST\r\r\n\r\nOK\r\n", ESP_DEFAULT_TIMEOUT_MS, io); if (res==ERR_OK) { for(;;) { ESP_ReadCharsUntil(buf, sizeof(buf), '\n', 1000); if (io!=NULL) { CLS1_SendStr(buf, io->stdOut); } if (UTIL1_strncmp(buf, "ready", sizeof("ready")-1)==0) { /* wait until ready message from module */ break; /* module has restarted */ } } } AS2_ClearRxBuf(); /* clear buffer */ return res; }
uint8_t ESP_Restart(void) { uint8_t rxBuf[sizeof("AT+RST\r\n\r\nOK\r\n")]; //Send("AT+RST\r\n"); /* response is "AT+RST\r\n\r\nOK\r\n" */ return ESP_SendATCommand("AT+RST\r\n", rxBuf, sizeof(rxBuf), "AT+RST\r\n\r\nOK\r\n"); }