1

Dependencies:   ATParser

Dependents:   UDPNode

Committer:
nikitoslav
Date:
Wed Jun 27 07:17:17 2018 +0000
Revision:
1:af8bf1171171
Parent:
0:eb6507dc4669
Child:
2:3518f7c570de
2

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 0:eb6507dc4669 19 ESP8266::ESP8266(PinName tx, PinName rx, bool debug)
nikitoslav 1:af8bf1171171 20 : _serial(tx, rx, 1024), _parser(_serial), localOutPort(3001), localInPort(3002) {
nikitoslav 0:eb6507dc4669 21 _serial.baud(115200);
nikitoslav 0:eb6507dc4669 22 _parser.debugOn(debug);
nikitoslav 0:eb6507dc4669 23 }
nikitoslav 0:eb6507dc4669 24
nikitoslav 0:eb6507dc4669 25 bool ESP8266::startup(int mode) {
nikitoslav 0:eb6507dc4669 26 if(mode < 1 || mode > 3) {
nikitoslav 0:eb6507dc4669 27 return false;
nikitoslav 0:eb6507dc4669 28 }
nikitoslav 0:eb6507dc4669 29
nikitoslav 0:eb6507dc4669 30 return reset()
nikitoslav 0:eb6507dc4669 31 && _parser.send("AT+CWMODE_CUR=%d", mode)
nikitoslav 0:eb6507dc4669 32 && _parser.recv("OK")
nikitoslav 0:eb6507dc4669 33 && _parser.send("AT+CIPMUX=1")
nikitoslav 0:eb6507dc4669 34 && _parser.recv("OK")
nikitoslav 0:eb6507dc4669 35 && _parser.send("AT+CIPDINFO=1")
nikitoslav 0:eb6507dc4669 36 && _parser.recv("OK");
nikitoslav 0:eb6507dc4669 37 }
nikitoslav 0:eb6507dc4669 38
nikitoslav 0:eb6507dc4669 39 bool ESP8266::reset(void) {
nikitoslav 0:eb6507dc4669 40 for (int i = 0; i < 2; i++) {
nikitoslav 0:eb6507dc4669 41 if (_parser.send("AT+RST")
nikitoslav 0:eb6507dc4669 42 && _parser.recv("OK\r\nready")) {
nikitoslav 0:eb6507dc4669 43 return true;
nikitoslav 0:eb6507dc4669 44 }
nikitoslav 0:eb6507dc4669 45 }
nikitoslav 0:eb6507dc4669 46
nikitoslav 0:eb6507dc4669 47 return false;
nikitoslav 0:eb6507dc4669 48 }
nikitoslav 0:eb6507dc4669 49
nikitoslav 0:eb6507dc4669 50 bool ESP8266::connect(const char *ap, const char *passPhrase) {
nikitoslav 0:eb6507dc4669 51 return _parser.send("AT+CWJAP_CUR=\"%s\",\"%s\"", ap, passPhrase)
nikitoslav 1:af8bf1171171 52 && _parser.recv("OK")
nikitoslav 1:af8bf1171171 53 && open(1,localOutPort)
nikitoslav 1:af8bf1171171 54 && open(2,localInPort);
nikitoslav 0:eb6507dc4669 55 }
nikitoslav 0:eb6507dc4669 56
nikitoslav 0:eb6507dc4669 57 bool ESP8266::disconnect(void) {
nikitoslav 0:eb6507dc4669 58 return _parser.send("AT+CWQAP") && _parser.recv("OK");
nikitoslav 0:eb6507dc4669 59 }
nikitoslav 0:eb6507dc4669 60
nikitoslav 0:eb6507dc4669 61 char* ESP8266::getIPAddress(void) {
nikitoslav 0:eb6507dc4669 62 if (!(_parser.send("AT+CIFSR")
nikitoslav 0:eb6507dc4669 63 && _parser.recv("+CIFSR:STAIP,\"%[^\"]\"", _ip_buffer)
nikitoslav 0:eb6507dc4669 64 && _parser.recv("OK"))) {
nikitoslav 0:eb6507dc4669 65 return 0;
nikitoslav 0:eb6507dc4669 66 }
nikitoslav 0:eb6507dc4669 67
nikitoslav 0:eb6507dc4669 68 return _ip_buffer;
nikitoslav 0:eb6507dc4669 69 }
nikitoslav 0:eb6507dc4669 70
nikitoslav 0:eb6507dc4669 71 const char* ESP8266::getMACAddress(void) {
nikitoslav 0:eb6507dc4669 72 if (!(_parser.send("AT+CIFSR")
nikitoslav 0:eb6507dc4669 73 && _parser.recv("+CIFSR:STAMAC,\"%[^\"]\"", _mac_buffer)
nikitoslav 0:eb6507dc4669 74 && _parser.recv("OK"))) {
nikitoslav 0:eb6507dc4669 75 return 0;
nikitoslav 0:eb6507dc4669 76 }
nikitoslav 0:eb6507dc4669 77
nikitoslav 0:eb6507dc4669 78 return _mac_buffer;
nikitoslav 0:eb6507dc4669 79 }
nikitoslav 0:eb6507dc4669 80
nikitoslav 0:eb6507dc4669 81 bool ESP8266::isConnected(void) {
nikitoslav 0:eb6507dc4669 82 return getIPAddress() != 0;
nikitoslav 0:eb6507dc4669 83 }
nikitoslav 0:eb6507dc4669 84
nikitoslav 0:eb6507dc4669 85 bool ESP8266::open(int linkId, int localPort) {
nikitoslav 0:eb6507dc4669 86 return _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d,%d,%d", linkId, "UDP","192.168.0.0",49000, localPort, 2)
nikitoslav 0:eb6507dc4669 87 && _parser.recv("OK");
nikitoslav 0:eb6507dc4669 88 }
nikitoslav 0:eb6507dc4669 89
nikitoslav 1:af8bf1171171 90 bool ESP8266::send(const void* data, uint32_t amount, const char* addr, int port) {
nikitoslav 0:eb6507dc4669 91 //May take a second try if device is busy
nikitoslav 0:eb6507dc4669 92 for (unsigned i = 0; i < 2; i++) {
nikitoslav 1:af8bf1171171 93 if (_parser.send("AT+CIPSEND=%d,%d,\"%s\",%d", 1, amount, addr, port)
nikitoslav 0:eb6507dc4669 94 && _parser.recv(">")
nikitoslav 0:eb6507dc4669 95 && (_parser.write((char*)data, (int)amount) >= 0)
nikitoslav 0:eb6507dc4669 96 && _parser.recv("SEND OK")) {
nikitoslav 0:eb6507dc4669 97 return true;
nikitoslav 0:eb6507dc4669 98 }
nikitoslav 0:eb6507dc4669 99 }
nikitoslav 0:eb6507dc4669 100
nikitoslav 0:eb6507dc4669 101 return false;
nikitoslav 0:eb6507dc4669 102 }
nikitoslav 0:eb6507dc4669 103
nikitoslav 0:eb6507dc4669 104 int32_t ESP8266::recv(void *data, uint32_t amount, char* IP, int* port) {
nikitoslav 0:eb6507dc4669 105 uint32_t linkId;
nikitoslav 0:eb6507dc4669 106 uint32_t recv_amount;
nikitoslav 0:eb6507dc4669 107
nikitoslav 0:eb6507dc4669 108 if (!(_parser.recv("+IPD,%d,%d,%[^\,],%d:", &linkId, &recv_amount, IP, port)
nikitoslav 0:eb6507dc4669 109 && recv_amount <= amount
nikitoslav 0:eb6507dc4669 110 && _parser.read((char*)data, recv_amount))) {
nikitoslav 0:eb6507dc4669 111 return -1;
nikitoslav 0:eb6507dc4669 112 }
nikitoslav 0:eb6507dc4669 113
nikitoslav 0:eb6507dc4669 114 return recv_amount;
nikitoslav 0:eb6507dc4669 115 }
nikitoslav 0:eb6507dc4669 116
nikitoslav 0:eb6507dc4669 117 bool ESP8266::close(int id) {
nikitoslav 0:eb6507dc4669 118 //May take a second try if device is busy
nikitoslav 0:eb6507dc4669 119 for (unsigned i = 0; i < 2; i++) {
nikitoslav 0:eb6507dc4669 120 if (_parser.send("AT+CIPCLOSE=%d", id)
nikitoslav 0:eb6507dc4669 121 && _parser.recv("OK")) {
nikitoslav 0:eb6507dc4669 122 return true;
nikitoslav 0:eb6507dc4669 123 }
nikitoslav 0:eb6507dc4669 124 }
nikitoslav 0:eb6507dc4669 125
nikitoslav 0:eb6507dc4669 126 return false;
nikitoslav 0:eb6507dc4669 127 }
nikitoslav 0:eb6507dc4669 128
nikitoslav 0:eb6507dc4669 129 void ESP8266::setTimeout(uint32_t timeout_ms) {
nikitoslav 0:eb6507dc4669 130 _parser.setTimeout(timeout_ms);
nikitoslav 0:eb6507dc4669 131 }
nikitoslav 0:eb6507dc4669 132
nikitoslav 0:eb6507dc4669 133 bool ESP8266::readable() {
nikitoslav 0:eb6507dc4669 134 return _serial.readable();
nikitoslav 0:eb6507dc4669 135 }
nikitoslav 0:eb6507dc4669 136
nikitoslav 0:eb6507dc4669 137 bool ESP8266::writeable() {
nikitoslav 0:eb6507dc4669 138 return _serial.writeable();
nikitoslav 0:eb6507dc4669 139 }
nikitoslav 0:eb6507dc4669 140