This demonstrates the process of communicating through ethernet to a SEL-2431 Voltage Regulator Control Panel using SEL Fast Message. Basic device commands and data cna be requested and displayed over a connected serial port. This is a basic version and full testing and documentation has yet to be completed.
Dependencies: BufferedSerial analogAverager voltageRegulator netStatReg analogMinMax CounterMinMax
main.cpp@0:03ab7f7596e2, 2019-09-11 (annotated)
- Committer:
- masterkookus
- Date:
- Wed Sep 11 11:40:34 2019 +0000
- Revision:
- 0:03ab7f7596e2
- Child:
- 1:a57cbebba3fd
Telnet Initiate and Basic Webpage
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masterkookus | 0:03ab7f7596e2 | 1 | #if !FEATURE_LWIP |
masterkookus | 0:03ab7f7596e2 | 2 | #error [NOT_SUPPORTED] LWIP not supported for this target |
masterkookus | 0:03ab7f7596e2 | 3 | #endif |
masterkookus | 0:03ab7f7596e2 | 4 | |
masterkookus | 0:03ab7f7596e2 | 5 | #include "mbed.h" |
masterkookus | 0:03ab7f7596e2 | 6 | #include "EthernetInterface.h" |
masterkookus | 0:03ab7f7596e2 | 7 | #include "TCPServer.h" |
masterkookus | 0:03ab7f7596e2 | 8 | #include "TCPSocket.h" |
masterkookus | 0:03ab7f7596e2 | 9 | #include "BufferedSerial.h" |
masterkookus | 0:03ab7f7596e2 | 10 | |
masterkookus | 0:03ab7f7596e2 | 11 | #define HTTP_STATUS_LINE "HTTP/1.0 200 OK" |
masterkookus | 0:03ab7f7596e2 | 12 | #define HTTP_HEADER_FIELDS "Content-Type: text/html; charset=utf-8" |
masterkookus | 0:03ab7f7596e2 | 13 | #define HTTP_MESSAGE_BODY "" \ |
masterkookus | 0:03ab7f7596e2 | 14 | "<html>" "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 15 | " <body style=\"display:flex;text-align:center\">" "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 16 | " <div style=\"margin:auto\">" "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 17 | " <h1>Hello World</h1>" "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 18 | " <p>It works !</p>" "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 19 | " </div>" "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 20 | " </body>" "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 21 | "</html>" |
masterkookus | 0:03ab7f7596e2 | 22 | |
masterkookus | 0:03ab7f7596e2 | 23 | #define HTTP_RESPONSE HTTP_STATUS_LINE "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 24 | HTTP_HEADER_FIELDS "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 25 | "\r\n" \ |
masterkookus | 0:03ab7f7596e2 | 26 | HTTP_MESSAGE_BODY "\r\n" |
masterkookus | 0:03ab7f7596e2 | 27 | |
masterkookus | 0:03ab7f7596e2 | 28 | static const char* mbedIp = "10.150.1.241"; //IP |
masterkookus | 0:03ab7f7596e2 | 29 | static const char* mbedMask = "255.255.255.0"; // Mask |
masterkookus | 0:03ab7f7596e2 | 30 | static const char* mbedGateway = "10.150.1.245"; //Gateway |
masterkookus | 0:03ab7f7596e2 | 31 | |
masterkookus | 0:03ab7f7596e2 | 32 | Ticker nettimer[2]; |
masterkookus | 0:03ab7f7596e2 | 33 | |
masterkookus | 0:03ab7f7596e2 | 34 | struct netsys |
masterkookus | 0:03ab7f7596e2 | 35 | { |
masterkookus | 0:03ab7f7596e2 | 36 | TCPServer srv; |
masterkookus | 0:03ab7f7596e2 | 37 | TCPSocket clt_sock; |
masterkookus | 0:03ab7f7596e2 | 38 | SocketAddress clt_addr; |
masterkookus | 0:03ab7f7596e2 | 39 | int tcpport; |
masterkookus | 0:03ab7f7596e2 | 40 | bool isactive; |
masterkookus | 0:03ab7f7596e2 | 41 | bool closeconnection; |
masterkookus | 0:03ab7f7596e2 | 42 | int sockalivetime; |
masterkookus | 0:03ab7f7596e2 | 43 | } net1,http1; |
masterkookus | 0:03ab7f7596e2 | 44 | |
masterkookus | 0:03ab7f7596e2 | 45 | BufferedSerial sport0(PD_5, PD_6, 256, 4); // UART2 |
masterkookus | 0:03ab7f7596e2 | 46 | |
masterkookus | 0:03ab7f7596e2 | 47 | Thread conchkthread[2]; |
masterkookus | 0:03ab7f7596e2 | 48 | Thread rxtxdatathread[2]; |
masterkookus | 0:03ab7f7596e2 | 49 | |
masterkookus | 0:03ab7f7596e2 | 50 | void nettimeout(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 51 | { |
masterkookus | 0:03ab7f7596e2 | 52 | if (net2->isactive==true) |
masterkookus | 0:03ab7f7596e2 | 53 | { |
masterkookus | 0:03ab7f7596e2 | 54 | if (net2->sockalivetime==30) |
masterkookus | 0:03ab7f7596e2 | 55 | { |
masterkookus | 0:03ab7f7596e2 | 56 | net2->closeconnection=true; |
masterkookus | 0:03ab7f7596e2 | 57 | net2->sockalivetime=0; |
masterkookus | 0:03ab7f7596e2 | 58 | } |
masterkookus | 0:03ab7f7596e2 | 59 | else |
masterkookus | 0:03ab7f7596e2 | 60 | { |
masterkookus | 0:03ab7f7596e2 | 61 | net2->sockalivetime++; |
masterkookus | 0:03ab7f7596e2 | 62 | } |
masterkookus | 0:03ab7f7596e2 | 63 | } |
masterkookus | 0:03ab7f7596e2 | 64 | } |
masterkookus | 0:03ab7f7596e2 | 65 | |
masterkookus | 0:03ab7f7596e2 | 66 | void datanrx(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 67 | { |
masterkookus | 0:03ab7f7596e2 | 68 | char rxbuf[256]; |
masterkookus | 0:03ab7f7596e2 | 69 | int rxlen=0; |
masterkookus | 0:03ab7f7596e2 | 70 | while (1) |
masterkookus | 0:03ab7f7596e2 | 71 | { |
masterkookus | 0:03ab7f7596e2 | 72 | while (net2->isactive) |
masterkookus | 0:03ab7f7596e2 | 73 | { |
masterkookus | 0:03ab7f7596e2 | 74 | rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf)); |
masterkookus | 0:03ab7f7596e2 | 75 | net2->sockalivetime=0; |
masterkookus | 0:03ab7f7596e2 | 76 | sport0.write(rxbuf,rxlen); |
masterkookus | 0:03ab7f7596e2 | 77 | } |
masterkookus | 0:03ab7f7596e2 | 78 | } |
masterkookus | 0:03ab7f7596e2 | 79 | } |
masterkookus | 0:03ab7f7596e2 | 80 | |
masterkookus | 0:03ab7f7596e2 | 81 | void datasrx(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 82 | { |
masterkookus | 0:03ab7f7596e2 | 83 | char rxbuf[256]; |
masterkookus | 0:03ab7f7596e2 | 84 | int rxlen=0; |
masterkookus | 0:03ab7f7596e2 | 85 | int rxc; |
masterkookus | 0:03ab7f7596e2 | 86 | while (1) |
masterkookus | 0:03ab7f7596e2 | 87 | { |
masterkookus | 0:03ab7f7596e2 | 88 | while (net2->isactive) |
masterkookus | 0:03ab7f7596e2 | 89 | { |
masterkookus | 0:03ab7f7596e2 | 90 | rxlen=sport0.readable(); |
masterkookus | 0:03ab7f7596e2 | 91 | if (rxlen>0) |
masterkookus | 0:03ab7f7596e2 | 92 | { |
masterkookus | 0:03ab7f7596e2 | 93 | for (rxc = 0;rxc<rxlen;rxc++) |
masterkookus | 0:03ab7f7596e2 | 94 | { |
masterkookus | 0:03ab7f7596e2 | 95 | rxbuf[rxc] = sport0.getc(); |
masterkookus | 0:03ab7f7596e2 | 96 | } |
masterkookus | 0:03ab7f7596e2 | 97 | net2->sockalivetime=0; |
masterkookus | 0:03ab7f7596e2 | 98 | net2->clt_sock.send(rxbuf, rxlen); |
masterkookus | 0:03ab7f7596e2 | 99 | } |
masterkookus | 0:03ab7f7596e2 | 100 | } |
masterkookus | 0:03ab7f7596e2 | 101 | } |
masterkookus | 0:03ab7f7596e2 | 102 | } |
masterkookus | 0:03ab7f7596e2 | 103 | |
masterkookus | 0:03ab7f7596e2 | 104 | void conchk(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 105 | { |
masterkookus | 0:03ab7f7596e2 | 106 | TCPServer *server=&(net2->srv); |
masterkookus | 0:03ab7f7596e2 | 107 | TCPSocket *client_socket=&(net2->clt_sock); |
masterkookus | 0:03ab7f7596e2 | 108 | SocketAddress *client_address=&(net2->clt_addr); |
masterkookus | 0:03ab7f7596e2 | 109 | |
masterkookus | 0:03ab7f7596e2 | 110 | while(1) |
masterkookus | 0:03ab7f7596e2 | 111 | { |
masterkookus | 0:03ab7f7596e2 | 112 | if (server->accept(client_socket, client_address) < 0) |
masterkookus | 0:03ab7f7596e2 | 113 | { |
masterkookus | 0:03ab7f7596e2 | 114 | printf("Connection Failed.\r\n"); |
masterkookus | 0:03ab7f7596e2 | 115 | return; |
masterkookus | 0:03ab7f7596e2 | 116 | } |
masterkookus | 0:03ab7f7596e2 | 117 | printf("Server Port %d\r\n", net2->tcpport); |
masterkookus | 0:03ab7f7596e2 | 118 | if (net2->tcpport==80) |
masterkookus | 0:03ab7f7596e2 | 119 | { |
masterkookus | 0:03ab7f7596e2 | 120 | printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port()); |
masterkookus | 0:03ab7f7596e2 | 121 | client_socket->send(HTTP_RESPONSE, strlen(HTTP_RESPONSE)); |
masterkookus | 0:03ab7f7596e2 | 122 | client_socket->close(); |
masterkookus | 0:03ab7f7596e2 | 123 | } |
masterkookus | 0:03ab7f7596e2 | 124 | else |
masterkookus | 0:03ab7f7596e2 | 125 | { |
masterkookus | 0:03ab7f7596e2 | 126 | printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port()); |
masterkookus | 0:03ab7f7596e2 | 127 | net2->isactive=true; |
masterkookus | 0:03ab7f7596e2 | 128 | client_socket->send("Hello", strlen("Hello")); |
masterkookus | 0:03ab7f7596e2 | 129 | } |
masterkookus | 0:03ab7f7596e2 | 130 | } |
masterkookus | 0:03ab7f7596e2 | 131 | } |
masterkookus | 0:03ab7f7596e2 | 132 | |
masterkookus | 0:03ab7f7596e2 | 133 | int main() |
masterkookus | 0:03ab7f7596e2 | 134 | { |
masterkookus | 0:03ab7f7596e2 | 135 | printf("Basic HTTP server example\r\n"); |
masterkookus | 0:03ab7f7596e2 | 136 | |
masterkookus | 0:03ab7f7596e2 | 137 | EthernetInterface eth; |
masterkookus | 0:03ab7f7596e2 | 138 | eth.set_network(mbedIp,mbedMask,mbedGateway); //Use these parameters for static IP |
masterkookus | 0:03ab7f7596e2 | 139 | eth.connect(); |
masterkookus | 0:03ab7f7596e2 | 140 | |
masterkookus | 0:03ab7f7596e2 | 141 | printf("The target IP address is '%s'\r\n", eth.get_ip_address()); |
masterkookus | 0:03ab7f7596e2 | 142 | |
masterkookus | 0:03ab7f7596e2 | 143 | /* Open the server on ethernet stack */ |
masterkookus | 0:03ab7f7596e2 | 144 | net1.srv.open(ð); |
masterkookus | 0:03ab7f7596e2 | 145 | net1.isactive=false; |
masterkookus | 0:03ab7f7596e2 | 146 | net1.closeconnection=false; |
masterkookus | 0:03ab7f7596e2 | 147 | http1.srv.open(ð); |
masterkookus | 0:03ab7f7596e2 | 148 | |
masterkookus | 0:03ab7f7596e2 | 149 | /* Bind the HTTP port (TCP 80) to the server */ |
masterkookus | 0:03ab7f7596e2 | 150 | http1.tcpport=80; |
masterkookus | 0:03ab7f7596e2 | 151 | http1.srv.bind(http1.tcpport); |
masterkookus | 0:03ab7f7596e2 | 152 | |
masterkookus | 0:03ab7f7596e2 | 153 | /* Bind port 23000 to the server */ |
masterkookus | 0:03ab7f7596e2 | 154 | net1.tcpport=23; |
masterkookus | 0:03ab7f7596e2 | 155 | net1.srv.bind(net1.tcpport); |
masterkookus | 0:03ab7f7596e2 | 156 | |
masterkookus | 0:03ab7f7596e2 | 157 | /* Can handle 5 simultaneous connections */ |
masterkookus | 0:03ab7f7596e2 | 158 | net1.srv.listen(1); |
masterkookus | 0:03ab7f7596e2 | 159 | http1.srv.listen(5); |
masterkookus | 0:03ab7f7596e2 | 160 | |
masterkookus | 0:03ab7f7596e2 | 161 | sport0.baud(9600); |
masterkookus | 0:03ab7f7596e2 | 162 | |
masterkookus | 0:03ab7f7596e2 | 163 | conchkthread[0].start(callback(conchk,&net1)); |
masterkookus | 0:03ab7f7596e2 | 164 | nettimer[0].attach(callback(nettimeout,&net1),1); |
masterkookus | 0:03ab7f7596e2 | 165 | rxtxdatathread[0].start(callback(datanrx,&net1)); |
masterkookus | 0:03ab7f7596e2 | 166 | rxtxdatathread[1].start(callback(datasrx,&net1)); |
masterkookus | 0:03ab7f7596e2 | 167 | |
masterkookus | 0:03ab7f7596e2 | 168 | conchkthread[1].start(callback(conchk,&http1)); |
masterkookus | 0:03ab7f7596e2 | 169 | |
masterkookus | 0:03ab7f7596e2 | 170 | while (true) { |
masterkookus | 0:03ab7f7596e2 | 171 | while (net1.isactive) |
masterkookus | 0:03ab7f7596e2 | 172 | { |
masterkookus | 0:03ab7f7596e2 | 173 | if (net1.closeconnection==true) |
masterkookus | 0:03ab7f7596e2 | 174 | { |
masterkookus | 0:03ab7f7596e2 | 175 | net1.clt_sock.send("Connection Timeout", strlen("Connection Timeout")); |
masterkookus | 0:03ab7f7596e2 | 176 | net1.isactive=false; |
masterkookus | 0:03ab7f7596e2 | 177 | net1.clt_sock.close(); |
masterkookus | 0:03ab7f7596e2 | 178 | net1.closeconnection=false; |
masterkookus | 0:03ab7f7596e2 | 179 | } |
masterkookus | 0:03ab7f7596e2 | 180 | |
masterkookus | 0:03ab7f7596e2 | 181 | } |
masterkookus | 0:03ab7f7596e2 | 182 | } |
masterkookus | 0:03ab7f7596e2 | 183 | } |