1

Dependencies:   ATParser

Dependents:   UDPNode

Committer:
nikitoslav
Date:
Wed Jun 27 10:33:28 2018 +0000
Revision:
2:3518f7c570de
Parent:
1:af8bf1171171
Child:
3:72756a2b1a87
3

Who changed what in which revision?

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