Driver for the ESP8266 WiFi module using ATParser library. Espressif Firmware.

Dependencies:   ATParser

Dependents:   ESP8266Interface

Fork of ESP8266 by NetworkSocketAPI

Note

This library assumes your ESP8266 is running the Espressif Firmware. For instructions on how to update your ESP8266 to use the correct firmware see the Firmware Update Wiki Page.

Committer:
geky
Date:
Fri Apr 15 23:57:17 2016 +0000
Revision:
23:eb00dd185c7f
Parent:
21:1a9b555962b5
Move to teams/components

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 17:8b541b19f391 1 /* ESP8266 Example
Christopher Haster 17:8b541b19f391 2 * Copyright (c) 2015 ARM Limited
Christopher Haster 17:8b541b19f391 3 *
Christopher Haster 17:8b541b19f391 4 * Licensed under the Apache License, Version 2.0 (the "License");
Christopher Haster 17:8b541b19f391 5 * you may not use this file except in compliance with the License.
Christopher Haster 17:8b541b19f391 6 * You may obtain a copy of the License at
Christopher Haster 17:8b541b19f391 7 *
Christopher Haster 17:8b541b19f391 8 * http://www.apache.org/licenses/LICENSE-2.0
Christopher Haster 17:8b541b19f391 9 *
Christopher Haster 17:8b541b19f391 10 * Unless required by applicable law or agreed to in writing, software
Christopher Haster 17:8b541b19f391 11 * distributed under the License is distributed on an "AS IS" BASIS,
Christopher Haster 17:8b541b19f391 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Christopher Haster 17:8b541b19f391 13 * See the License for the specific language governing permissions and
Christopher Haster 17:8b541b19f391 14 * limitations under the License.
Christopher Haster 17:8b541b19f391 15 */
Christopher Haster 17:8b541b19f391 16
Christopher Haster 17:8b541b19f391 17 #include "ESP8266.h"
Christopher Haster 17:8b541b19f391 18
Christopher Haster 18:11f2f6bd2e97 19 ESP8266::ESP8266(PinName tx, PinName rx, bool debug)
Christopher Haster 18:11f2f6bd2e97 20 : _serial(tx, rx, 1024), _parser(_serial)
Christopher Haster 17:8b541b19f391 21 {
Christopher Haster 18:11f2f6bd2e97 22 _serial.baud(115200);
Christopher Haster 18:11f2f6bd2e97 23 _parser.debugOn(debug);
Christopher Haster 17:8b541b19f391 24 }
Christopher Haster 17:8b541b19f391 25
Christopher Haster 18:11f2f6bd2e97 26 bool ESP8266::startup(int mode)
Christopher Haster 17:8b541b19f391 27 {
Christopher Haster 17:8b541b19f391 28 //only 3 valid modes
Christopher Haster 17:8b541b19f391 29 if(mode < 1 || mode > 3) {
Christopher Haster 17:8b541b19f391 30 return false;
Christopher Haster 17:8b541b19f391 31 }
Christopher Haster 17:8b541b19f391 32
Christopher Haster 18:11f2f6bd2e97 33 return reset()
Christopher Haster 18:11f2f6bd2e97 34 && _parser.send("AT+CWMODE=%d", mode)
Christopher Haster 18:11f2f6bd2e97 35 && _parser.recv("OK")
Christopher Haster 18:11f2f6bd2e97 36 && _parser.send("AT+CIPMUX=1")
Christopher Haster 18:11f2f6bd2e97 37 && _parser.recv("OK");
Christopher Haster 17:8b541b19f391 38 }
Christopher Haster 17:8b541b19f391 39
Christopher Haster 18:11f2f6bd2e97 40 bool ESP8266::reset(void)
Christopher Haster 17:8b541b19f391 41 {
Christopher Haster 20:32e5a5a328e0 42 for (int i = 0; i < 2; i++) {
Christopher Haster 20:32e5a5a328e0 43 if (_parser.send("AT+RST")
Christopher Haster 20:32e5a5a328e0 44 && _parser.recv("OK\r\nready")) {
Christopher Haster 20:32e5a5a328e0 45 return true;
Christopher Haster 20:32e5a5a328e0 46 }
Christopher Haster 20:32e5a5a328e0 47 }
Christopher Haster 20:32e5a5a328e0 48
Christopher Haster 20:32e5a5a328e0 49 return false;
Christopher Haster 17:8b541b19f391 50 }
Christopher Haster 17:8b541b19f391 51
Christopher Haster 18:11f2f6bd2e97 52 bool ESP8266::dhcp(bool enabled, int mode)
Christopher Haster 17:8b541b19f391 53 {
Christopher Haster 17:8b541b19f391 54 //only 3 valid modes
Christopher Haster 17:8b541b19f391 55 if(mode < 0 || mode > 2) {
Christopher Haster 17:8b541b19f391 56 return false;
Christopher Haster 17:8b541b19f391 57 }
Christopher Haster 18:11f2f6bd2e97 58
Christopher Haster 18:11f2f6bd2e97 59 return _parser.send("AT+CWDHCP=%d,%d", enabled?1:0, mode)
Christopher Haster 18:11f2f6bd2e97 60 && _parser.recv("OK");
Christopher Haster 17:8b541b19f391 61 }
Christopher Haster 17:8b541b19f391 62
Christopher Haster 17:8b541b19f391 63 bool ESP8266::connect(const char *ap, const char *passPhrase)
Christopher Haster 17:8b541b19f391 64 {
Christopher Haster 18:11f2f6bd2e97 65 return _parser.send("AT+CWJAP=\"%s\",\"%s\"", ap, passPhrase)
Christopher Haster 18:11f2f6bd2e97 66 && _parser.recv("OK");
Christopher Haster 17:8b541b19f391 67 }
Christopher Haster 17:8b541b19f391 68
Christopher Haster 17:8b541b19f391 69 bool ESP8266::disconnect(void)
Christopher Haster 17:8b541b19f391 70 {
Christopher Haster 18:11f2f6bd2e97 71 return _parser.send("AT+CWQAP") && _parser.recv("OK");
Christopher Haster 17:8b541b19f391 72 }
Christopher Haster 17:8b541b19f391 73
Christopher Haster 18:11f2f6bd2e97 74 const char *ESP8266::getIPAddress(void)
Christopher Haster 17:8b541b19f391 75 {
Christopher Haster 18:11f2f6bd2e97 76 if (!(_parser.send("AT+CIFSR")
Christopher Haster 18:11f2f6bd2e97 77 && _parser.recv("+CIFSR:STAIP,\"%[^\"]\"", _ip_buffer)
Christopher Haster 18:11f2f6bd2e97 78 && _parser.recv("OK"))) {
Christopher Haster 18:11f2f6bd2e97 79 return 0;
Christopher Haster 18:11f2f6bd2e97 80 }
Christopher Haster 18:11f2f6bd2e97 81
Christopher Haster 18:11f2f6bd2e97 82 return _ip_buffer;
Christopher Haster 18:11f2f6bd2e97 83 }
Christopher Haster 18:11f2f6bd2e97 84
Christopher Haster 18:11f2f6bd2e97 85 const char *ESP8266::getMACAddress(void)
Christopher Haster 18:11f2f6bd2e97 86 {
Christopher Haster 18:11f2f6bd2e97 87 if (!(_parser.send("AT+CIFSR")
Christopher Haster 18:11f2f6bd2e97 88 && _parser.recv("+CIFSR:STAMAC,\"%[^\"]\"", _mac_buffer)
Christopher Haster 18:11f2f6bd2e97 89 && _parser.recv("OK"))) {
Christopher Haster 18:11f2f6bd2e97 90 return 0;
Christopher Haster 18:11f2f6bd2e97 91 }
Christopher Haster 18:11f2f6bd2e97 92
Christopher Haster 18:11f2f6bd2e97 93 return _mac_buffer;
Christopher Haster 17:8b541b19f391 94 }
Christopher Haster 17:8b541b19f391 95
Christopher Haster 17:8b541b19f391 96 bool ESP8266::isConnected(void)
Christopher Haster 17:8b541b19f391 97 {
Christopher Haster 18:11f2f6bd2e97 98 return getIPAddress() != 0;
Christopher Haster 17:8b541b19f391 99 }
Christopher Haster 17:8b541b19f391 100
Christopher Haster 18:11f2f6bd2e97 101 bool ESP8266::open(const char *type, int id, const char* addr, int port)
Christopher Haster 17:8b541b19f391 102 {
Christopher Haster 17:8b541b19f391 103 //IDs only 0-4
Christopher Haster 17:8b541b19f391 104 if(id > 4) {
Christopher Haster 17:8b541b19f391 105 return false;
Christopher Haster 17:8b541b19f391 106 }
Christopher Haster 17:8b541b19f391 107
Christopher Haster 18:11f2f6bd2e97 108 return _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d", id, type, addr, port)
Christopher Haster 18:11f2f6bd2e97 109 && _parser.recv("OK");
Christopher Haster 17:8b541b19f391 110 }
Christopher Haster 17:8b541b19f391 111
Christopher Haster 18:11f2f6bd2e97 112 bool ESP8266::send(int id, const void *data, uint32_t amount)
Christopher Haster 17:8b541b19f391 113 {
Christopher Haster 18:11f2f6bd2e97 114 //May take a second try if device is busy
Christopher Haster 18:11f2f6bd2e97 115 for (unsigned i = 0; i < 2; i++) {
Christopher Haster 18:11f2f6bd2e97 116 if (_parser.send("AT+CIPSEND=%d,%d", id, amount)
Christopher Haster 18:11f2f6bd2e97 117 && _parser.recv(">")
Christopher Haster 18:11f2f6bd2e97 118 && _parser.write((char*)data, (int)amount) >= 0) {
Christopher Haster 18:11f2f6bd2e97 119 return true;
Christopher Haster 18:11f2f6bd2e97 120 }
Christopher Haster 18:11f2f6bd2e97 121 }
Christopher Haster 17:8b541b19f391 122
Christopher Haster 18:11f2f6bd2e97 123 return false;
Christopher Haster 17:8b541b19f391 124 }
Christopher Haster 17:8b541b19f391 125
Christopher Haster 18:11f2f6bd2e97 126 int32_t ESP8266::recv(int id, void *data, uint32_t amount)
Christopher Haster 17:8b541b19f391 127 {
Christopher Haster 18:11f2f6bd2e97 128 uint32_t recv_amount;
Christopher Haster 18:11f2f6bd2e97 129 int recv_id;
Christopher Haster 18:11f2f6bd2e97 130
Christopher Haster 18:11f2f6bd2e97 131 if (!(_parser.recv("+IPD,%d,%d:", &recv_id, &recv_amount)
Christopher Haster 18:11f2f6bd2e97 132 && recv_id == id
Christopher Haster 18:11f2f6bd2e97 133 && recv_amount <= amount
Christopher Haster 18:11f2f6bd2e97 134 && _parser.read((char*)data, recv_amount)
Christopher Haster 18:11f2f6bd2e97 135 && _parser.recv("OK"))) {
Christopher Haster 18:11f2f6bd2e97 136 return -1;
Christopher Haster 17:8b541b19f391 137 }
Christopher Haster 18:11f2f6bd2e97 138
Christopher Haster 18:11f2f6bd2e97 139 return recv_amount;
Christopher Haster 17:8b541b19f391 140 }
Christopher Haster 17:8b541b19f391 141
Christopher Haster 17:8b541b19f391 142 bool ESP8266::close(int id)
Christopher Haster 17:8b541b19f391 143 {
geky 21:1a9b555962b5 144 //May take a second try if device is busy
geky 21:1a9b555962b5 145 for (unsigned i = 0; i < 2; i++) {
geky 21:1a9b555962b5 146 if (_parser.send("AT+CIPCLOSE=%d", id)
geky 21:1a9b555962b5 147 && _parser.recv("OK")) {
geky 21:1a9b555962b5 148 return true;
geky 21:1a9b555962b5 149 }
Christopher Haster 17:8b541b19f391 150 }
Christopher Haster 17:8b541b19f391 151
geky 21:1a9b555962b5 152 return false;
Christopher Haster 17:8b541b19f391 153 }
Christopher Haster 17:8b541b19f391 154
Christopher Haster 17:8b541b19f391 155 void ESP8266::setTimeout(uint32_t timeout_ms)
Christopher Haster 17:8b541b19f391 156 {
Christopher Haster 18:11f2f6bd2e97 157 _parser.setTimeout(timeout_ms);
Christopher Haster 18:11f2f6bd2e97 158 }
Christopher Haster 18:11f2f6bd2e97 159
Christopher Haster 18:11f2f6bd2e97 160 bool ESP8266::readable()
Christopher Haster 18:11f2f6bd2e97 161 {
Christopher Haster 18:11f2f6bd2e97 162 return _serial.readable();
Christopher Haster 18:11f2f6bd2e97 163 }
Christopher Haster 18:11f2f6bd2e97 164
Christopher Haster 18:11f2f6bd2e97 165 bool ESP8266::writeable()
Christopher Haster 18:11f2f6bd2e97 166 {
Christopher Haster 18:11f2f6bd2e97 167 return _serial.writeable();
Christopher Haster 18:11f2f6bd2e97 168 }
Christopher Haster 18:11f2f6bd2e97 169