WIZ820io(W5200) network interface、EthernetNetIf compatible.
example
#include "WIZ820ioNetIf.h" #include "HTTPClient.h" #include "HTTPServer.h" #if defined(TARGET_KL25Z) WIZ820ioNetIf eth(PTD2,PTD3,PTD1,PTD0,PTD5); #endif HTTPClient http; HTTPStream stream; void callback(HTTPResult r){ printf("callback %d %s\n", r, HTTPClient::ResultStr(r)); } int main() { int err = eth.setup(); if (err < 0) { printf("setup error %d\n", err); exit(-1); } HTTPServer svr; svr.addHandler<SimpleHandler>("/"); svr.bind(80); const char* uri = "http://va009039-mbed.appspot.com/kl25z/"; http.get(uri, &stream, callback); uint8_t buf[256]; int total = 0; stream.readNext(buf, sizeof(buf)); while(1) { if(stream.readable()) { int len = stream.readLen(); total += len; printf("%d %d\n", total, len); stream.readNext(buf, sizeof(buf)); } Net::poll(); } }
MyNetTcpSocket.cpp@1:22b9052d864d, 2013-03-24 (annotated)
- Committer:
- va009039
- Date:
- Sun Mar 24 11:25:31 2013 +0000
- Revision:
- 1:22b9052d864d
- Parent:
- 0:bdeec5f86894
WIZ820io(W8200) ethernet interface, EthernetNetIf compatible.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 1:22b9052d864d | 1 | // MyNetTcpSocket.cpp 2013/3/24 |
va009039 | 0:bdeec5f86894 | 2 | #include "mbed.h" |
va009039 | 1:22b9052d864d | 3 | #include "w5200.h" |
va009039 | 0:bdeec5f86894 | 4 | #include "MyNetTcpSocket.h" |
va009039 | 0:bdeec5f86894 | 5 | //#define DEBUG |
va009039 | 1:22b9052d864d | 6 | //#define DEBUG_LISTEN |
va009039 | 1:22b9052d864d | 7 | #include "w5200debug.h" |
va009039 | 0:bdeec5f86894 | 8 | |
va009039 | 0:bdeec5f86894 | 9 | #define USE_NO_DELAYED_ACK 1 |
va009039 | 0:bdeec5f86894 | 10 | |
va009039 | 0:bdeec5f86894 | 11 | int w5200_new_socket() |
va009039 | 0:bdeec5f86894 | 12 | { |
va009039 | 0:bdeec5f86894 | 13 | for(int i = 0; i < MAX_SOCK_NUM; i++) { |
va009039 | 1:22b9052d864d | 14 | if (W5200.readSnMR(i) == SnMR::CLOSE) { // 0x00 |
va009039 | 1:22b9052d864d | 15 | if (W5200.readSnSR(i) != SnSR::LISTEN) { // 0x14 |
va009039 | 0:bdeec5f86894 | 16 | return i; |
va009039 | 0:bdeec5f86894 | 17 | } |
va009039 | 0:bdeec5f86894 | 18 | } |
va009039 | 0:bdeec5f86894 | 19 | } |
va009039 | 0:bdeec5f86894 | 20 | return -1; // not found |
va009039 | 0:bdeec5f86894 | 21 | } |
va009039 | 0:bdeec5f86894 | 22 | |
va009039 | 0:bdeec5f86894 | 23 | MyNetTcpSocket::MyNetTcpSocket(int socket) : NetTcpSocket(),_socket(socket),wait_accept(false) { |
va009039 | 1:22b9052d864d | 24 | DBG("socket: %d\n", socket); |
va009039 | 0:bdeec5f86894 | 25 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 26 | _socket = w5200_new_socket(); |
va009039 | 0:bdeec5f86894 | 27 | } |
va009039 | 1:22b9052d864d | 28 | DBG("%p socket: %d\n", this, _socket); |
va009039 | 0:bdeec5f86894 | 29 | if (_socket != (-1)) { |
va009039 | 0:bdeec5f86894 | 30 | uint8_t Sn_MR = SnMR::TCP; // set TCP mode |
va009039 | 0:bdeec5f86894 | 31 | #if USE_NO_DELAYED_ACK |
va009039 | 0:bdeec5f86894 | 32 | Sn_MR |= SnMR::ND; |
va009039 | 0:bdeec5f86894 | 33 | #endif |
va009039 | 1:22b9052d864d | 34 | W5200.writeSnMR(_socket, Sn_MR); |
va009039 | 0:bdeec5f86894 | 35 | } |
va009039 | 0:bdeec5f86894 | 36 | } |
va009039 | 0:bdeec5f86894 | 37 | |
va009039 | 0:bdeec5f86894 | 38 | MyNetTcpSocket::~MyNetTcpSocket() { |
va009039 | 1:22b9052d864d | 39 | DBG("socket=%d\n", _socket); |
va009039 | 0:bdeec5f86894 | 40 | close(); |
va009039 | 0:bdeec5f86894 | 41 | if (_socket != (-1)) { |
va009039 | 1:22b9052d864d | 42 | W5200.writeSnMR(_socket, SnMR::CLOSE); |
va009039 | 0:bdeec5f86894 | 43 | } |
va009039 | 0:bdeec5f86894 | 44 | } |
va009039 | 0:bdeec5f86894 | 45 | |
va009039 | 0:bdeec5f86894 | 46 | NetTcpSocketErr MyNetTcpSocket::bind(const Host& me) { |
va009039 | 0:bdeec5f86894 | 47 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 48 | return NETTCPSOCKET_MEM; |
va009039 | 0:bdeec5f86894 | 49 | } |
va009039 | 0:bdeec5f86894 | 50 | int port = me.getPort(); |
va009039 | 1:22b9052d864d | 51 | W5200.writeSnPORT(_socket, port); |
va009039 | 0:bdeec5f86894 | 52 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 53 | } |
va009039 | 0:bdeec5f86894 | 54 | |
va009039 | 0:bdeec5f86894 | 55 | NetTcpSocketErr MyNetTcpSocket::listen() { |
va009039 | 1:22b9052d864d | 56 | DBG("%p\n", this); |
va009039 | 0:bdeec5f86894 | 57 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 58 | return NETTCPSOCKET_MEM; |
va009039 | 0:bdeec5f86894 | 59 | } |
va009039 | 1:22b9052d864d | 60 | W5200.execCmdSn(_socket, Sock_OPEN); // set OPEN command |
va009039 | 1:22b9052d864d | 61 | W5200.execCmdSn(_socket, Sock_LISTEN); // listen |
va009039 | 1:22b9052d864d | 62 | #ifdef DEBUG_LISTEN |
va009039 | 1:22b9052d864d | 63 | printf("[%s@%d]\n",__PRETTY_FUNCTION__,__LINE__); |
va009039 | 0:bdeec5f86894 | 64 | uint8_t ip[4]; |
va009039 | 1:22b9052d864d | 65 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x", _socket, |
va009039 | 1:22b9052d864d | 66 | W5200.readSnMR(_socket), W5200.readSnIR(_socket), W5200.readSnSR(_socket)); |
va009039 | 1:22b9052d864d | 67 | W5200.getIPAddress(ip); |
va009039 | 1:22b9052d864d | 68 | printf(" SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5200.readSnPORT(_socket)); |
va009039 | 1:22b9052d864d | 69 | #endif //DEBUG_LISTEN |
va009039 | 0:bdeec5f86894 | 70 | wait_accept = true; |
va009039 | 0:bdeec5f86894 | 71 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 72 | } |
va009039 | 0:bdeec5f86894 | 73 | |
va009039 | 0:bdeec5f86894 | 74 | NetTcpSocketErr MyNetTcpSocket::connect(const Host& host) { |
va009039 | 1:22b9052d864d | 75 | DBG("%p host=%p\n", this, host); |
va009039 | 0:bdeec5f86894 | 76 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 77 | return NETTCPSOCKET_MEM; |
va009039 | 0:bdeec5f86894 | 78 | } |
va009039 | 0:bdeec5f86894 | 79 | uint8_t ip[4]; |
va009039 | 0:bdeec5f86894 | 80 | ip[0] = host.getIp()[0]; |
va009039 | 0:bdeec5f86894 | 81 | ip[1] = host.getIp()[1]; |
va009039 | 0:bdeec5f86894 | 82 | ip[2] = host.getIp()[2]; |
va009039 | 0:bdeec5f86894 | 83 | ip[3] = host.getIp()[3]; |
va009039 | 0:bdeec5f86894 | 84 | int port = host.getPort(); |
va009039 | 1:22b9052d864d | 85 | W5200.writeSnDIPR(_socket, ip); |
va009039 | 1:22b9052d864d | 86 | W5200.writeSnDPORT(_socket, port); |
va009039 | 1:22b9052d864d | 87 | if (W5200.readSnPORT(_socket) == 0) { |
va009039 | 1:22b9052d864d | 88 | W5200.writeSnPORT(_socket, 1024 + _socket); |
va009039 | 0:bdeec5f86894 | 89 | } |
va009039 | 1:22b9052d864d | 90 | W5200.execCmdSn(_socket, Sock_OPEN); // set OPEN command |
va009039 | 1:22b9052d864d | 91 | W5200.execCmdSn(_socket, Sock_CONNECT); |
va009039 | 1:22b9052d864d | 92 | #ifdef DEBUG_CONNECT |
va009039 | 0:bdeec5f86894 | 93 | printf("socket:%d SnMR:%02x SnIR:%02x SnSR:%02x\n", _socket, |
va009039 | 1:22b9052d864d | 94 | W5200.readSnMR(_socket), W5200.readSnIR(_socket), W5200.readSnSR(_socket)); |
va009039 | 1:22b9052d864d | 95 | W5200.getIPAddress(ip); |
va009039 | 1:22b9052d864d | 96 | printf("SIPR: %d.%d.%d.%d Sn_PORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5200.readSnPORT(_socket)); |
va009039 | 1:22b9052d864d | 97 | W5200.readSnDIPR(_socket, ip); |
va009039 | 1:22b9052d864d | 98 | printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT:%d\n", ip[0], ip[1], ip[2], ip[3], W5200.readSnDPORT(_socket)); |
va009039 | 1:22b9052d864d | 99 | #endif //DEBUG_CONNECT |
va009039 | 0:bdeec5f86894 | 100 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 101 | } |
va009039 | 0:bdeec5f86894 | 102 | |
va009039 | 0:bdeec5f86894 | 103 | NetTcpSocketErr MyNetTcpSocket::accept(Host* pClient, NetTcpSocket** ppNewNetTcpSocket) { |
va009039 | 1:22b9052d864d | 104 | DBG("%p pClient=%p\n", this, pClient); |
va009039 | 0:bdeec5f86894 | 105 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 106 | return NETTCPSOCKET_MEM; |
va009039 | 0:bdeec5f86894 | 107 | } |
va009039 | 0:bdeec5f86894 | 108 | uint8_t ip[4]; |
va009039 | 1:22b9052d864d | 109 | W5200.readSnDIPR(_socket, ip); |
va009039 | 0:bdeec5f86894 | 110 | pClient->setIp(IpAddr(ip[0],ip[1],ip[2],ip[3])); |
va009039 | 1:22b9052d864d | 111 | int port = W5200.readSnDPORT(_socket); |
va009039 | 0:bdeec5f86894 | 112 | pClient->setPort(port); |
va009039 | 0:bdeec5f86894 | 113 | Host me; |
va009039 | 1:22b9052d864d | 114 | me.setPort(W5200.readSnPORT(_socket)); |
va009039 | 0:bdeec5f86894 | 115 | MyNetTcpSocket* pNewNetTcpSocket = new MyNetTcpSocket(_socket); |
va009039 | 0:bdeec5f86894 | 116 | if (pNewNetTcpSocket == NULL) { |
va009039 | 0:bdeec5f86894 | 117 | return NETTCPSOCKET_EMPTY; |
va009039 | 0:bdeec5f86894 | 118 | } |
va009039 | 0:bdeec5f86894 | 119 | pNewNetTcpSocket->m_refs++; |
va009039 | 0:bdeec5f86894 | 120 | *ppNewNetTcpSocket = pNewNetTcpSocket; |
va009039 | 0:bdeec5f86894 | 121 | _socket = w5200_new_socket(); |
va009039 | 0:bdeec5f86894 | 122 | if (_socket != (-1)) { |
va009039 | 0:bdeec5f86894 | 123 | uint8_t Sn_MR = SnMR::TCP; // set TCP mode |
va009039 | 0:bdeec5f86894 | 124 | #if USE_NO_DELAYED_ACK |
va009039 | 0:bdeec5f86894 | 125 | Sn_MR |= SnMR::ND; |
va009039 | 0:bdeec5f86894 | 126 | #endif |
va009039 | 1:22b9052d864d | 127 | W5200.writeSnMR(_socket, Sn_MR); |
va009039 | 0:bdeec5f86894 | 128 | bind(me); |
va009039 | 0:bdeec5f86894 | 129 | listen(); |
va009039 | 0:bdeec5f86894 | 130 | } |
va009039 | 0:bdeec5f86894 | 131 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 132 | } |
va009039 | 0:bdeec5f86894 | 133 | |
va009039 | 0:bdeec5f86894 | 134 | int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::send(const char* buf, int len) { |
va009039 | 1:22b9052d864d | 135 | DBG_STR((uint8_t*)buf,len); |
va009039 | 0:bdeec5f86894 | 136 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 137 | return NETTCPSOCKET_MEM; |
va009039 | 0:bdeec5f86894 | 138 | } |
va009039 | 0:bdeec5f86894 | 139 | if (len > 0) { |
va009039 | 1:22b9052d864d | 140 | W5200.send_data_processing(_socket, (uint8_t*)buf, len); |
va009039 | 1:22b9052d864d | 141 | W5200.execCmdSn(_socket, Sock_SEND); |
va009039 | 0:bdeec5f86894 | 142 | } |
va009039 | 0:bdeec5f86894 | 143 | return len; |
va009039 | 0:bdeec5f86894 | 144 | } |
va009039 | 0:bdeec5f86894 | 145 | |
va009039 | 0:bdeec5f86894 | 146 | int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::recv(char* buf, int len){ |
va009039 | 0:bdeec5f86894 | 147 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 148 | return NETTCPSOCKET_MEM; |
va009039 | 0:bdeec5f86894 | 149 | } |
va009039 | 1:22b9052d864d | 150 | int size = W5200.getRXReceivedSize(_socket); |
va009039 | 0:bdeec5f86894 | 151 | if (size > len) { |
va009039 | 0:bdeec5f86894 | 152 | size = len; |
va009039 | 0:bdeec5f86894 | 153 | } |
va009039 | 0:bdeec5f86894 | 154 | if (size > 0) { |
va009039 | 1:22b9052d864d | 155 | W5200.recv_data_processing(_socket, (uint8_t*)buf, size); |
va009039 | 1:22b9052d864d | 156 | W5200.execCmdSn(_socket, Sock_RECV); |
va009039 | 0:bdeec5f86894 | 157 | } |
va009039 | 1:22b9052d864d | 158 | DBG_STR((uint8_t*)buf, size); |
va009039 | 0:bdeec5f86894 | 159 | return size; |
va009039 | 0:bdeec5f86894 | 160 | } |
va009039 | 0:bdeec5f86894 | 161 | |
va009039 | 0:bdeec5f86894 | 162 | NetTcpSocketErr MyNetTcpSocket::close() { |
va009039 | 1:22b9052d864d | 163 | DBG("%p m_closed=%d m_refs=%d\n", this, m_closed, m_refs); |
va009039 | 0:bdeec5f86894 | 164 | if(m_closed) { |
va009039 | 0:bdeec5f86894 | 165 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 166 | } |
va009039 | 0:bdeec5f86894 | 167 | m_closed = true; |
va009039 | 0:bdeec5f86894 | 168 | cleanUp(); |
va009039 | 0:bdeec5f86894 | 169 | if (_socket != (-1)) { |
va009039 | 1:22b9052d864d | 170 | W5200.execCmdSn(_socket, Sock_DISCON); |
va009039 | 1:22b9052d864d | 171 | W5200.execCmdSn(_socket, Sock_CLOSE); |
va009039 | 0:bdeec5f86894 | 172 | } |
va009039 | 0:bdeec5f86894 | 173 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 174 | } |
va009039 | 0:bdeec5f86894 | 175 | |
va009039 | 0:bdeec5f86894 | 176 | NetTcpSocketErr MyNetTcpSocket::poll(){ |
va009039 | 0:bdeec5f86894 | 177 | NetTcpSocket::flushEvents(); |
va009039 | 1:22b9052d864d | 178 | #ifdef DEBUG_POLL |
va009039 | 0:bdeec5f86894 | 179 | printf("%p socket:%d\n", this,_socket); |
va009039 | 0:bdeec5f86894 | 180 | if (_socket != (-1)) { |
va009039 | 0:bdeec5f86894 | 181 | printf("SnMR:%02x SnIR:%02x SnSR:%02x\n", |
va009039 | 1:22b9052d864d | 182 | W5200.readSnMR(_socket), W5200.readSnIR(_socket), W5200.readSnSR(_socket)); |
va009039 | 0:bdeec5f86894 | 183 | uint8_t ip[4]; |
va009039 | 1:22b9052d864d | 184 | W5200.readSnDIPR(_socket, ip); |
va009039 | 1:22b9052d864d | 185 | printf("Sn_DIPR: %d.%d.%d.%d Sn_DPORT: %d\n", ip[0], ip[1], ip[2], ip[3], W5200.readSnDPORT(_socket)); |
va009039 | 0:bdeec5f86894 | 186 | printf("Sn_RX_RSR:%5d, Sn_RX_RD:%5d, Sn_RX_WR:%5d\n", |
va009039 | 1:22b9052d864d | 187 | W5200.readSnRX_RSR(_socket), W5200.readSnRX_RD(_socket), W5200.readSnRX_WR(_socket)); |
va009039 | 0:bdeec5f86894 | 188 | printf("Sn_TX_FSR:%5d, Sn_TX_RD:%5d, Sn_TX_WR:%5d\n", |
va009039 | 1:22b9052d864d | 189 | W5200.readSnTX_FSR(_socket), W5200.readSnTX_RD(_socket), W5200.readSnTX_WR(_socket)); |
va009039 | 0:bdeec5f86894 | 190 | } |
va009039 | 0:bdeec5f86894 | 191 | wait_ms(200); |
va009039 | 1:22b9052d864d | 192 | #endif //DEBUG_POLL |
va009039 | 0:bdeec5f86894 | 193 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 194 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 195 | } |
va009039 | 1:22b9052d864d | 196 | uint8_t Sn_SR = W5200.readSnSR(_socket); |
va009039 | 0:bdeec5f86894 | 197 | if (wait_accept) { |
va009039 | 0:bdeec5f86894 | 198 | if (Sn_SR == 0x17) { |
va009039 | 0:bdeec5f86894 | 199 | queueEvent(NETTCPSOCKET_ACCEPT); |
va009039 | 0:bdeec5f86894 | 200 | wait_accept = false; |
va009039 | 0:bdeec5f86894 | 201 | } |
va009039 | 0:bdeec5f86894 | 202 | } |
va009039 | 0:bdeec5f86894 | 203 | if (Sn_SR == 0x1c) { |
va009039 | 0:bdeec5f86894 | 204 | queueEvent(NETTCPSOCKET_CONRST); |
va009039 | 0:bdeec5f86894 | 205 | } |
va009039 | 1:22b9052d864d | 206 | if (W5200.getRXReceivedSize(_socket) > 0) { |
va009039 | 0:bdeec5f86894 | 207 | queueEvent(NETTCPSOCKET_READABLE); |
va009039 | 0:bdeec5f86894 | 208 | } |
va009039 | 0:bdeec5f86894 | 209 | if (Sn_SR == 0x17) { |
va009039 | 0:bdeec5f86894 | 210 | queueEvent(NETTCPSOCKET_CONNECTED); |
va009039 | 1:22b9052d864d | 211 | if (W5200.getTXFreeSize(_socket) > 0) { |
va009039 | 0:bdeec5f86894 | 212 | queueEvent(NETTCPSOCKET_WRITEABLE); |
va009039 | 0:bdeec5f86894 | 213 | } |
va009039 | 0:bdeec5f86894 | 214 | } |
va009039 | 0:bdeec5f86894 | 215 | if (Sn_SR == 0x00) { |
va009039 | 0:bdeec5f86894 | 216 | queueEvent(NETTCPSOCKET_DISCONNECTED); |
va009039 | 0:bdeec5f86894 | 217 | } |
va009039 | 0:bdeec5f86894 | 218 | return NETTCPSOCKET_OK; |
va009039 | 0:bdeec5f86894 | 219 | } |
va009039 | 0:bdeec5f86894 | 220 | |
va009039 | 0:bdeec5f86894 | 221 | void MyNetTcpSocket::cleanUp() //Flush input buffer |
va009039 | 0:bdeec5f86894 | 222 | { |
va009039 | 0:bdeec5f86894 | 223 | if (_socket == (-1)) { |
va009039 | 0:bdeec5f86894 | 224 | return; |
va009039 | 0:bdeec5f86894 | 225 | } |
va009039 | 1:22b9052d864d | 226 | while(W5200.getRXReceivedSize(_socket) > 0) { |
va009039 | 0:bdeec5f86894 | 227 | uint8_t temp[1]; |
va009039 | 1:22b9052d864d | 228 | W5200.recv_data_processing(_socket, temp, 1); |
va009039 | 1:22b9052d864d | 229 | W5200.execCmdSn(_socket, Sock_RECV); |
va009039 | 0:bdeec5f86894 | 230 | } |
va009039 | 0:bdeec5f86894 | 231 | } |