modified by ohneta
Dependents: HelloESP8266Interface_mine
Fork of ESP8266Interface by
Diff: ESP8266Interface.cpp
- Revision:
- 18:9fc7976c7b27
- Parent:
- 16:b2f781416464
- Child:
- 19:783c46b13285
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ESP8266Interface.cpp Fri Jul 17 23:15:21 2015 +0000 @@ -0,0 +1,251 @@ +/* ESP8266Interface Example + * Copyright (c) 2015 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ESP8266Interface.h" +#include <string> + +ESP8266Interface::ESP8266Interface(PinName tx, PinName rx) +: serial(tx, rx), atParser(&serial) +{ + serial.baud(115200); + availableID = new int[5]; + for(int i = 0; i<4; i++){ + availableID[i] = -1; + } +} + +ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, const char *ap, const char *pass_phrase, wifi_security_t security, uint32_t timeout_ms) +: serial(tx, rx), atParser(&serial) +{ + +} + +int32_t ESP8266Interface::init(void) +{ + if(!atParser.command("AT","OK")) + return -1; + if(!atParser.command("AT+RST", "OK\r\nready")) + return -1; + if(!atParser.command("AT+CWMODE=3", "OK")) + return -1; + if(!atParser.command("AT+CIPMUX=1", "OK")) + return -1; + return 0; + +} + +int32_t ESP8266Interface::init(const char *ip, const char *mask, const char *gateway) +{ + return -1; +} + +int32_t ESP8266Interface::connect(uint32_t timeout_ms) +{ + return -1; +} + +int32_t ESP8266Interface::connect(const char *ap, const char *pass_phrase, wifi_security_t security, uint32_t timeout_ms) +{ + if(!atParser.command("AT+CWDHCP=2,1","OK")) + return -1; + string connect_command = "AT+CWJAP=\""+(string)ap+"\",\""+(string)pass_phrase+"\""; + atParser.setTimeout(10000); + if(!atParser.command(connect_command.c_str(),"OK")){ + return -1; + } + return 0; +} + +int32_t ESP8266Interface::disconnect(void) const +{ + return -1; +} + +char *ESP8266Interface::getIPAddress(void) +{ + char* ip; + if(!atParser.command("AT+CIFSR", "+CIFSR:%s OK", ip)) + return NULL; + return ip; +} + +char *ESP8266Interface::getGateway(void) const +{ + return 0; +} + +char *ESP8266Interface::getNetworkMask(void) const +{ + return 0; +} + +char *ESP8266Interface::getMACAddress(void) const +{ + return 0; +} + +int32_t ESP8266Interface::isConnected(void) +{ + return (getIPAddress()==NULL) ? -1 : 0; +} + +SocketInterface *ESP8266Interface::allocateSocket(socket_protocol_t socketProtocol) +{ + int id = -1; + uuidCounter += 1; + //Look through the array of available sockets for an unused ID + for(int i=0; i<sizeof(availableID); i++){ + if (availableID[i] == -1){ + id = i; + availableID[i] = uuidCounter; + break; + } + } + if (id == -1){ + return NULL;//tried to allocate more than the maximum 5 sockets + } + ESP8266Socket *socket = new ESP8266Socket(uuidCounter, &atParser, socketProtocol, (uint8_t)id); + return socket; +} + +int ESP8266Interface::deallocateSocket(SocketInterface *socket) +{ + int id = (int)static_cast<ESP8266Socket*>(socket)->getID(); + availableID[id] = -1; + return id; +} + +ESP8266Socket::ESP8266Socket(uint32_t handle, ATParser *atParser, socket_protocol_t type, uint8_t id) +: _handle(handle), atParser(atParser), _id(id) +{ + SocketInterface::_type = type; +} + +const char *ESP8266Socket::getHostByName(const char *name) const +{ + return 0; +} + +void ESP8266Socket::setAddress(const char* addr) +{ + _addr = (char*)addr; +} + +void ESP8266Socket::setPort(uint16_t port) +{ + _port = port; +} + +void ESP8266Socket::setAddressPort(const char* addr, uint16_t port) +{ + _addr = (char*)addr; + _port = port; +} + +const char *ESP8266Socket::getAddress(void) const +{ + return (const char*)_addr; +} + +uint16_t ESP8266Socket::getPort(void) const +{ + return _port; +} + + +int32_t ESP8266Socket::bind(uint16_t port) const +{ + return -1; +} + +int32_t ESP8266Socket::listen(void) const +{ + return -1; +} + +int32_t ESP8266Socket::accept() const +{ + return -1; +} + +int32_t ESP8266Socket::open() +{ + char portstr[5]; + char idstr[2]; + sprintf(idstr,"%d",_id); + sprintf(portstr, "%d", _port); + + string sock_type; + if(_type == SOCK_UDP) + sock_type = "UDP"; + else if(_type == SOCK_TCP) + sock_type = "TCP"; + string start_command = "AT+CIPSTART="+(string)idstr+",\""+sock_type+"\",\""+(string)_addr+"\","+(string)portstr; + if(!atParser->command(start_command.c_str(),"OK")){ + return -1;//opening socket not succesful + } + return 0; + +} + +int32_t ESP8266Socket::send(const void *data, uint32_t amount, uint32_t timeout_ms) +{ + char idstr[2]; + sprintf(idstr,"%d",_id); + char lenstr[5]; + sprintf(lenstr,"%d",(int)amount); + + atParser->setTimeout((int)timeout_ms); + + string send_command = "AT+CIPSEND="+(string)idstr+","+(string)lenstr; + if(!atParser->send(send_command.c_str())){ + return -1; + } + atParser->write((char*)data, (int)amount); + return 0; +} + +uint32_t ESP8266Socket::recv(void *data, uint32_t amount, uint32_t timeout_ms) +{ + atParser->setTimeout((int)timeout_ms); + char idstr[2]; + sprintf(idstr,"%d",_id); + string matching = "+IPD,"+(string)idstr+",%d:"; + int length; + if(!atParser->recv(matching.c_str(),&length)) + return 0; + + if(!atParser->read((char *)data,length)) + return 0; + + return length; +} + +int32_t ESP8266Socket::close() const +{ + char idstr[2]; + sprintf(idstr,"%d",_id); + string close_command = "AT+CIPCLOSE="+(string)idstr; + + if(!atParser->command(close_command.c_str(),"OK")){ + return -1;//opening socket not succesful + } + return 0; +} +uint8_t ESP8266Socket::getID() +{ + return _id; +} \ No newline at end of file