Nikita Kakurnikov
/
UDPNode
1
main.cpp@4:e584e034f9e1, 2018-07-07 (annotated)
- Committer:
- nikitoslav
- Date:
- Sat Jul 07 10:53:01 2018 +0000
- Revision:
- 4:e584e034f9e1
- Parent:
- 3:24f12bc2b76d
6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nikitoslav | 0:bed9e78dd09c | 1 | #include "mbed.h" |
nikitoslav | 0:bed9e78dd09c | 2 | #include <string> |
nikitoslav | 4:e584e034f9e1 | 3 | #include <sstream> |
nikitoslav | 4:e584e034f9e1 | 4 | #include <vector> |
nikitoslav | 1:60fc2072f184 | 5 | #include "ESP8266.h" |
nikitoslav | 0:bed9e78dd09c | 6 | |
nikitoslav | 3:24f12bc2b76d | 7 | int localOutPort = 49100; |
nikitoslav | 3:24f12bc2b76d | 8 | int localInPort = 49101; |
nikitoslav | 1:60fc2072f184 | 9 | |
nikitoslav | 4:e584e034f9e1 | 10 | char IP[16]; //IP of client app |
nikitoslav | 4:e584e034f9e1 | 11 | bool wasHandshake = false; //was handshake with client or not |
nikitoslav | 4:e584e034f9e1 | 12 | |
nikitoslav | 2:f149c178dd58 | 13 | Serial console(USBTX,USBRX); |
nikitoslav | 2:f149c178dd58 | 14 | ESP8266 wifi(PF_7,PF_6,localOutPort,localInPort); |
nikitoslav | 2:f149c178dd58 | 15 | |
nikitoslav | 1:60fc2072f184 | 16 | const char* ap = "Clapeyron_Industries"; |
nikitoslav | 1:60fc2072f184 | 17 | const char* passPhrase = "06737184"; |
nikitoslav | 1:60fc2072f184 | 18 | |
nikitoslav | 1:60fc2072f184 | 19 | Thread listeningThread; |
nikitoslav | 1:60fc2072f184 | 20 | |
nikitoslav | 1:60fc2072f184 | 21 | void onReceive(void); |
nikitoslav | 4:e584e034f9e1 | 22 | void processReceivedData(string&, char*, int); |
nikitoslav | 4:e584e034f9e1 | 23 | std::vector<std::string> split(const std::string&, char); |
nikitoslav | 0:bed9e78dd09c | 24 | |
nikitoslav | 4:e584e034f9e1 | 25 | //сначала запускается AP, надо подключиться прямо к точке RobotClapeyronAP (пароль passpass123), |
nikitoslav | 4:e584e034f9e1 | 26 | //либо начать общение, либо передать данные о подключении робота к другой AP: имя, пароль |
nikitoslav | 0:bed9e78dd09c | 27 | int main() { |
nikitoslav | 4:e584e034f9e1 | 28 | console.baud(9600); |
nikitoslav | 4:e584e034f9e1 | 29 | if (wifi.startup(3) && wifi.setupAP()) { |
nikitoslav | 4:e584e034f9e1 | 30 | console.printf("AP set up\n"); |
nikitoslav | 1:60fc2072f184 | 31 | console.printf("Your IP is: %s\n",wifi.getIPAddress()); |
nikitoslav | 4:e584e034f9e1 | 32 | } |
nikitoslav | 0:bed9e78dd09c | 33 | else |
nikitoslav | 4:e584e034f9e1 | 34 | console.printf("Can not set up AP\n"); |
nikitoslav | 1:60fc2072f184 | 35 | listeningThread.start(onReceive); |
nikitoslav | 1:60fc2072f184 | 36 | } |
nikitoslav | 1:60fc2072f184 | 37 | |
nikitoslav | 1:60fc2072f184 | 38 | void onReceive(void) { |
nikitoslav | 2:f149c178dd58 | 39 | const int maxSize = 100; |
nikitoslav | 2:f149c178dd58 | 40 | |
nikitoslav | 1:60fc2072f184 | 41 | char buffer[100]; |
nikitoslav | 2:f149c178dd58 | 42 | string buf = ""; |
nikitoslav | 1:60fc2072f184 | 43 | int port; |
nikitoslav | 1:60fc2072f184 | 44 | int bytes; |
nikitoslav | 1:60fc2072f184 | 45 | while(1) { |
nikitoslav | 2:f149c178dd58 | 46 | buf = ""; |
nikitoslav | 2:f149c178dd58 | 47 | bytes = wifi.recv(&buffer,maxSize,IP,&port); |
nikitoslav | 1:60fc2072f184 | 48 | if (bytes != -1) { |
nikitoslav | 1:60fc2072f184 | 49 | console.printf("Bytes received: %d; from %s:%d\n",bytes,IP,port); |
nikitoslav | 2:f149c178dd58 | 50 | for(int i = 0; i < bytes; i++) { |
nikitoslav | 2:f149c178dd58 | 51 | buf += buffer[i]; |
nikitoslav | 2:f149c178dd58 | 52 | } |
nikitoslav | 2:f149c178dd58 | 53 | console.printf("Data: %s\n",buf); |
nikitoslav | 3:24f12bc2b76d | 54 | processReceivedData(buf,IP,port); |
nikitoslav | 1:60fc2072f184 | 55 | } |
nikitoslav | 1:60fc2072f184 | 56 | } |
nikitoslav | 2:f149c178dd58 | 57 | } |
nikitoslav | 2:f149c178dd58 | 58 | |
nikitoslav | 4:e584e034f9e1 | 59 | void processReceivedData(string& data, char* IP, int port) { |
nikitoslav | 4:e584e034f9e1 | 60 | if (port == localOutPort) { //TODO проверка того, что разговариваем с клиентом |
nikitoslav | 4:e584e034f9e1 | 61 | std::vector<std::string> splittedStream = split(data, '?'); |
nikitoslav | 4:e584e034f9e1 | 62 | if (splittedStream.size() > 1) { |
nikitoslav | 4:e584e034f9e1 | 63 | std::vector<std::string> splittedMessage = split(splittedStream[1],'|'); //TODO цикл по splittedStream от второго (1) до предпоследнего (size-2) |
nikitoslav | 4:e584e034f9e1 | 64 | if (splittedMessage.size()>0) |
nikitoslav | 4:e584e034f9e1 | 65 | /*-->*/ if (splittedMessage[0] == "HiRobotClapeyronImAClient") { |
nikitoslav | 4:e584e034f9e1 | 66 | wasHandshake = true; //TODO говорим, что с этим клиентом поздоровались (сейчас вообще как будто один клиент может быть) |
nikitoslav | 4:e584e034f9e1 | 67 | string msg = "?HiClientImARobotClapeyron|hardvers|0.1?"; |
nikitoslav | 4:e584e034f9e1 | 68 | wifi.send(msg.c_str(),msg.length(),IP,localInPort); |
nikitoslav | 4:e584e034f9e1 | 69 | } else if (wasHandshake) //TODO проверка того, что работаем с поздоровавшимся клиентом |
nikitoslav | 4:e584e034f9e1 | 70 | /*-->*/ if ((splittedMessage[0] == "ConnectToTheAP") && (splittedMessage.size() >= 3)) { //TODO проверка формата сообщения не полная, разумеется |
nikitoslav | 4:e584e034f9e1 | 71 | if (wifi.disconnect() && wifi.connect(splittedMessage[1].c_str(),splittedMessage[2].c_str())) { |
nikitoslav | 4:e584e034f9e1 | 72 | string msg = "?ConnectedToTheAP|"+splittedMessage[1]+"|IP|"+wifi.getIPAddress()+"?"; |
nikitoslav | 4:e584e034f9e1 | 73 | console.printf(msg.c_str()); //Debug |
nikitoslav | 4:e584e034f9e1 | 74 | wifi.send(msg.c_str(),msg.length(),IP,localInPort); |
nikitoslav | 4:e584e034f9e1 | 75 | } else { |
nikitoslav | 4:e584e034f9e1 | 76 | string msg = "?CanNotConnectToTheAP|"+splittedMessage[1]+"?"; |
nikitoslav | 4:e584e034f9e1 | 77 | console.printf(msg.c_str()); //Debug |
nikitoslav | 4:e584e034f9e1 | 78 | wifi.send(msg.c_str(),msg.length(),IP,localInPort); |
nikitoslav | 4:e584e034f9e1 | 79 | } /*else |
nikitoslav | 4:e584e034f9e1 | 80 | --> if () {}*/ |
nikitoslav | 4:e584e034f9e1 | 81 | } |
nikitoslav | 4:e584e034f9e1 | 82 | } |
nikitoslav | 3:24f12bc2b76d | 83 | } |
nikitoslav | 4:e584e034f9e1 | 84 | } |
nikitoslav | 4:e584e034f9e1 | 85 | |
nikitoslav | 4:e584e034f9e1 | 86 | std::vector<std::string> split(const std::string &s, char delim) { |
nikitoslav | 4:e584e034f9e1 | 87 | std::stringstream ss(s); |
nikitoslav | 4:e584e034f9e1 | 88 | std::string item; |
nikitoslav | 4:e584e034f9e1 | 89 | std::vector<std::string> elems; |
nikitoslav | 4:e584e034f9e1 | 90 | while (std::getline(ss, item, delim)) { |
nikitoslav | 4:e584e034f9e1 | 91 | elems.push_back(item); |
nikitoslav | 4:e584e034f9e1 | 92 | // elems.push_back(std::move(item)); // if C++11 |
nikitoslav | 4:e584e034f9e1 | 93 | } |
nikitoslav | 4:e584e034f9e1 | 94 | return elems; |
nikitoslav | 0:bed9e78dd09c | 95 | } |