MQTT client test with W5200 ethernet shield

Dependents:   IBMIoTClientEthernetExample_W5200

Fork of W5500Interface by W5500-Ethernet-Interface Makers

Committer:
kaizen
Date:
Fri Sep 26 08:05:41 2014 +0000
Revision:
5:8aefaef88f79
Parent:
0:e11e8793c3ce
Child:
9:dfffa4d6f022
Modified for using MQTT protocol ( IBMIoTClient )

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bongjun 0:e11e8793c3ce 1 #pragma once
Bongjun 0:e11e8793c3ce 2
Bongjun 0:e11e8793c3ce 3 #include "mbed.h"
Bongjun 0:e11e8793c3ce 4 #include "mbed_debug.h"
Bongjun 0:e11e8793c3ce 5
Bongjun 0:e11e8793c3ce 6 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
Bongjun 0:e11e8793c3ce 7
Bongjun 0:e11e8793c3ce 8 #define DEFAULT_WAIT_RESP_TIMEOUT 500
Bongjun 0:e11e8793c3ce 9
Bongjun 0:e11e8793c3ce 10
Bongjun 0:e11e8793c3ce 11 #define MAX_SOCK_NUM 8
Bongjun 0:e11e8793c3ce 12
Bongjun 0:e11e8793c3ce 13 #define MR 0x0000
Bongjun 0:e11e8793c3ce 14 #define GAR 0x0001
Bongjun 0:e11e8793c3ce 15 #define SUBR 0x0005
Bongjun 0:e11e8793c3ce 16 #define SHAR 0x0009
Bongjun 0:e11e8793c3ce 17 #define SIPR 0x000f
kaizen 5:8aefaef88f79 18 #define PHYCFGR 0x002e
Bongjun 0:e11e8793c3ce 19
Bongjun 0:e11e8793c3ce 20 // W5500 socket register
Bongjun 0:e11e8793c3ce 21 #define Sn_MR 0x0000
Bongjun 0:e11e8793c3ce 22 #define Sn_CR 0x0001
Bongjun 0:e11e8793c3ce 23 #define Sn_IR 0x0002
Bongjun 0:e11e8793c3ce 24 #define Sn_SR 0x0003
Bongjun 0:e11e8793c3ce 25 #define Sn_PORT 0x0004
Bongjun 0:e11e8793c3ce 26 #define Sn_DIPR 0x000c
Bongjun 0:e11e8793c3ce 27 #define Sn_DPORT 0x0010
Bongjun 0:e11e8793c3ce 28 #define Sn_RXBUF_SIZE 0x001e
Bongjun 0:e11e8793c3ce 29 #define Sn_TXBUF_SIZE 0x001f
Bongjun 0:e11e8793c3ce 30 #define Sn_TX_FSR 0x0020
Bongjun 0:e11e8793c3ce 31 #define Sn_TX_WR 0x0024
Bongjun 0:e11e8793c3ce 32 #define Sn_RX_RSR 0x0026
Bongjun 0:e11e8793c3ce 33 #define Sn_RX_RD 0x0028
Bongjun 0:e11e8793c3ce 34
Bongjun 0:e11e8793c3ce 35 class WIZnet_Chip {
Bongjun 0:e11e8793c3ce 36 public:
kaizen 5:8aefaef88f79 37
kaizen 5:8aefaef88f79 38 enum Protocol { CLOSED = 0, TCP = 1, UDP = 2,};
kaizen 5:8aefaef88f79 39 enum Command { OPEN = 0x01, LISTEN = 0x02, CONNECT = 0x04, DISCON = 0x08, CLOSE = 0x10, SEND = 0x20, \
kaizen 5:8aefaef88f79 40 SEND_MAC = 0x21, SEND_KEEP = 0x22, RECV = 0x40, };
kaizen 5:8aefaef88f79 41 enum Interrupt { INT_CON = 0x01, INT_DISCON = 0x02, INT_RECV = 0x04, INT_TIMEOUT = 0x08, INT_SEND_OK = 0x10,};
kaizen 5:8aefaef88f79 42
kaizen 5:8aefaef88f79 43 enum Status { SOCK_CLOSED = 0x00, SOCK_INIT = 0x13, SOCK_LISTEN = 0x14, SOCK_SYNSENT = 0x15, SOCK_ESTABLISHED = 0x17, \
kaizen 5:8aefaef88f79 44 SOCK_CLOSE_WAIT = 0x1c, SOCK_UDP = 0x22, };
kaizen 5:8aefaef88f79 45
Bongjun 0:e11e8793c3ce 46 /*
Bongjun 0:e11e8793c3ce 47 * Constructor
Bongjun 0:e11e8793c3ce 48 *
Bongjun 0:e11e8793c3ce 49 * @param spi spi class
Bongjun 0:e11e8793c3ce 50 * @param cs cs of the W5500
Bongjun 0:e11e8793c3ce 51 * @param reset reset pin of the W5500
Bongjun 0:e11e8793c3ce 52 */
Bongjun 0:e11e8793c3ce 53 WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset);
Bongjun 0:e11e8793c3ce 54 WIZnet_Chip(SPI* spi, PinName cs, PinName reset);
Bongjun 0:e11e8793c3ce 55
Bongjun 0:e11e8793c3ce 56 /*
Bongjun 0:e11e8793c3ce 57 * Set MAC Address to W5500
Bongjun 0:e11e8793c3ce 58 *
Bongjun 0:e11e8793c3ce 59 * @return true if connected, false otherwise
Bongjun 0:e11e8793c3ce 60 */
Bongjun 0:e11e8793c3ce 61 bool setmac();
Bongjun 0:e11e8793c3ce 62
Bongjun 0:e11e8793c3ce 63 /*
Bongjun 0:e11e8793c3ce 64 * Set Network Informations (SrcIP, Netmask, Gataway)
Bongjun 0:e11e8793c3ce 65 *
Bongjun 0:e11e8793c3ce 66 * @return true if connected, false otherwise
Bongjun 0:e11e8793c3ce 67 */
Bongjun 0:e11e8793c3ce 68 bool setip();
Bongjun 0:e11e8793c3ce 69
Bongjun 0:e11e8793c3ce 70 /*
kaizen 5:8aefaef88f79 71 * Get Link Status
kaizen 5:8aefaef88f79 72 *
kaizen 5:8aefaef88f79 73 * @return true if Link up, false Link down
kaizen 5:8aefaef88f79 74 */
kaizen 5:8aefaef88f79 75 bool linkstatus();
kaizen 5:8aefaef88f79 76
kaizen 5:8aefaef88f79 77 /*
Bongjun 0:e11e8793c3ce 78 * Disconnect the connection
Bongjun 0:e11e8793c3ce 79 *
Bongjun 0:e11e8793c3ce 80 * @ returns true
Bongjun 0:e11e8793c3ce 81 */
Bongjun 0:e11e8793c3ce 82 bool disconnect();
Bongjun 0:e11e8793c3ce 83
Bongjun 0:e11e8793c3ce 84 /*
Bongjun 0:e11e8793c3ce 85 * Open a tcp connection with the specified host on the specified port
Bongjun 0:e11e8793c3ce 86 *
Bongjun 0:e11e8793c3ce 87 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)
Bongjun 0:e11e8793c3ce 88 * @param port port
Bongjun 0:e11e8793c3ce 89 * @ returns true if successful
Bongjun 0:e11e8793c3ce 90 */
Bongjun 0:e11e8793c3ce 91 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);
Bongjun 0:e11e8793c3ce 92
Bongjun 0:e11e8793c3ce 93 /*
Bongjun 0:e11e8793c3ce 94 * Set the protocol (UDP or TCP)
Bongjun 0:e11e8793c3ce 95 *
Bongjun 0:e11e8793c3ce 96 * @param p protocol
Bongjun 0:e11e8793c3ce 97 * @ returns true if successful
Bongjun 0:e11e8793c3ce 98 */
Bongjun 0:e11e8793c3ce 99 bool setProtocol(int socket, Protocol p);
Bongjun 0:e11e8793c3ce 100
Bongjun 0:e11e8793c3ce 101 /*
Bongjun 0:e11e8793c3ce 102 * Reset the W5500
Bongjun 0:e11e8793c3ce 103 */
Bongjun 0:e11e8793c3ce 104 void reset();
Bongjun 0:e11e8793c3ce 105
Bongjun 0:e11e8793c3ce 106 int wait_readable(int socket, int wait_time_ms, int req_size = 0);
Bongjun 0:e11e8793c3ce 107
Bongjun 0:e11e8793c3ce 108 int wait_writeable(int socket, int wait_time_ms, int req_size = 0);
Bongjun 0:e11e8793c3ce 109
Bongjun 0:e11e8793c3ce 110 /*
Bongjun 0:e11e8793c3ce 111 * Check if a tcp link is active
Bongjun 0:e11e8793c3ce 112 *
Bongjun 0:e11e8793c3ce 113 * @returns true if successful
Bongjun 0:e11e8793c3ce 114 */
Bongjun 0:e11e8793c3ce 115 bool is_connected(int socket);
Bongjun 0:e11e8793c3ce 116
Bongjun 0:e11e8793c3ce 117 /*
Bongjun 0:e11e8793c3ce 118 * Close a tcp connection
Bongjun 0:e11e8793c3ce 119 *
Bongjun 0:e11e8793c3ce 120 * @ returns true if successful
Bongjun 0:e11e8793c3ce 121 */
Bongjun 0:e11e8793c3ce 122 bool close(int socket);
Bongjun 0:e11e8793c3ce 123
Bongjun 0:e11e8793c3ce 124 /*
Bongjun 0:e11e8793c3ce 125 * @param str string to be sent
Bongjun 0:e11e8793c3ce 126 * @param len string length
Bongjun 0:e11e8793c3ce 127 */
Bongjun 0:e11e8793c3ce 128 int send(int socket, const char * str, int len);
Bongjun 0:e11e8793c3ce 129
Bongjun 0:e11e8793c3ce 130 int recv(int socket, char* buf, int len);
Bongjun 0:e11e8793c3ce 131
Bongjun 0:e11e8793c3ce 132 /*
Bongjun 0:e11e8793c3ce 133 * Return true if the module is using dhcp
Bongjun 0:e11e8793c3ce 134 *
Bongjun 0:e11e8793c3ce 135 * @returns true if the module is using dhcp
Bongjun 0:e11e8793c3ce 136 */
Bongjun 0:e11e8793c3ce 137 bool isDHCP() {
Bongjun 0:e11e8793c3ce 138 return dhcp;
Bongjun 0:e11e8793c3ce 139 }
Bongjun 0:e11e8793c3ce 140
Bongjun 0:e11e8793c3ce 141 bool gethostbyname(const char* host, uint32_t* ip);
Bongjun 0:e11e8793c3ce 142
Bongjun 0:e11e8793c3ce 143 static WIZnet_Chip * getInstance() {
Bongjun 0:e11e8793c3ce 144 return inst;
Bongjun 0:e11e8793c3ce 145 };
Bongjun 0:e11e8793c3ce 146
Bongjun 0:e11e8793c3ce 147 int new_socket();
Bongjun 0:e11e8793c3ce 148 uint16_t new_port();
Bongjun 0:e11e8793c3ce 149 void scmd(int socket, Command cmd);
Bongjun 0:e11e8793c3ce 150
Bongjun 0:e11e8793c3ce 151 template<typename T>
Bongjun 0:e11e8793c3ce 152 void sreg(int socket, uint16_t addr, T data) {
Bongjun 0:e11e8793c3ce 153 reg_wr<T>(addr, (0x0C + (socket << 5)), data);
Bongjun 0:e11e8793c3ce 154 }
Bongjun 0:e11e8793c3ce 155
Bongjun 0:e11e8793c3ce 156 template<typename T>
Bongjun 0:e11e8793c3ce 157 T sreg(int socket, uint16_t addr) {
Bongjun 0:e11e8793c3ce 158 return reg_rd<T>(addr, (0x08 + (socket << 5)));
Bongjun 0:e11e8793c3ce 159 }
Bongjun 0:e11e8793c3ce 160
Bongjun 0:e11e8793c3ce 161 template<typename T>
Bongjun 0:e11e8793c3ce 162 void reg_wr(uint16_t addr, T data) {
Bongjun 0:e11e8793c3ce 163 return reg_wr(addr, 0x04, data);
Bongjun 0:e11e8793c3ce 164 }
Bongjun 0:e11e8793c3ce 165
Bongjun 0:e11e8793c3ce 166 template<typename T>
Bongjun 0:e11e8793c3ce 167 void reg_wr(uint16_t addr, uint8_t cb, T data) {
Bongjun 0:e11e8793c3ce 168 uint8_t buf[sizeof(T)];
Bongjun 0:e11e8793c3ce 169 *reinterpret_cast<T*>(buf) = data;
Bongjun 0:e11e8793c3ce 170 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian
Bongjun 0:e11e8793c3ce 171 uint8_t t = buf[i];
Bongjun 0:e11e8793c3ce 172 buf[i] = buf[sizeof(buf)-1-i];
Bongjun 0:e11e8793c3ce 173 buf[sizeof(buf)-1-i] = t;
Bongjun 0:e11e8793c3ce 174 }
Bongjun 0:e11e8793c3ce 175 spi_write(addr, cb, buf, sizeof(buf));
Bongjun 0:e11e8793c3ce 176 }
Bongjun 0:e11e8793c3ce 177
Bongjun 0:e11e8793c3ce 178 template<typename T>
Bongjun 0:e11e8793c3ce 179 T reg_rd(uint16_t addr) {
Bongjun 0:e11e8793c3ce 180 return reg_rd<T>(addr, 0x00);
Bongjun 0:e11e8793c3ce 181 }
Bongjun 0:e11e8793c3ce 182
Bongjun 0:e11e8793c3ce 183 template<typename T>
Bongjun 0:e11e8793c3ce 184 T reg_rd(uint16_t addr, uint8_t cb) {
Bongjun 0:e11e8793c3ce 185 uint8_t buf[sizeof(T)];
Bongjun 0:e11e8793c3ce 186 spi_read(addr, cb, buf, sizeof(buf));
Bongjun 0:e11e8793c3ce 187 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian
Bongjun 0:e11e8793c3ce 188 uint8_t t = buf[i];
Bongjun 0:e11e8793c3ce 189 buf[i] = buf[sizeof(buf)-1-i];
Bongjun 0:e11e8793c3ce 190 buf[sizeof(buf)-1-i] = t;
Bongjun 0:e11e8793c3ce 191 }
Bongjun 0:e11e8793c3ce 192 return *reinterpret_cast<T*>(buf);
Bongjun 0:e11e8793c3ce 193 }
Bongjun 0:e11e8793c3ce 194
Bongjun 0:e11e8793c3ce 195 void reg_rd_mac(uint16_t addr, uint8_t* data) {
Bongjun 0:e11e8793c3ce 196 spi_read(addr, 0x00, data, 6);
Bongjun 0:e11e8793c3ce 197 }
Bongjun 0:e11e8793c3ce 198
Bongjun 0:e11e8793c3ce 199 void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) {
Bongjun 0:e11e8793c3ce 200 uint8_t buf[4];
Bongjun 0:e11e8793c3ce 201 char* p = (char*)ip;
Bongjun 0:e11e8793c3ce 202 for(int i = 0; i < 4; i++) {
Bongjun 0:e11e8793c3ce 203 buf[i] = atoi(p);
Bongjun 0:e11e8793c3ce 204 p = strchr(p, '.');
Bongjun 0:e11e8793c3ce 205 if (p == NULL) {
Bongjun 0:e11e8793c3ce 206 break;
Bongjun 0:e11e8793c3ce 207 }
Bongjun 0:e11e8793c3ce 208 p++;
Bongjun 0:e11e8793c3ce 209 }
Bongjun 0:e11e8793c3ce 210 spi_write(addr, cb, buf, sizeof(buf));
Bongjun 0:e11e8793c3ce 211 }
Bongjun 0:e11e8793c3ce 212
Bongjun 0:e11e8793c3ce 213 void sreg_ip(int socket, uint16_t addr, const char* ip) {
Bongjun 0:e11e8793c3ce 214 reg_wr_ip(addr, (0x0C + (socket << 5)), ip);
Bongjun 0:e11e8793c3ce 215 }
Bongjun 0:e11e8793c3ce 216
Bongjun 0:e11e8793c3ce 217 protected:
Bongjun 0:e11e8793c3ce 218 uint8_t mac[6];
Bongjun 0:e11e8793c3ce 219 uint32_t ip;
Bongjun 0:e11e8793c3ce 220 uint32_t netmask;
Bongjun 0:e11e8793c3ce 221 uint32_t gateway;
Bongjun 0:e11e8793c3ce 222 uint32_t dnsaddr;
Bongjun 0:e11e8793c3ce 223 bool dhcp;
Bongjun 0:e11e8793c3ce 224
Bongjun 0:e11e8793c3ce 225 static WIZnet_Chip* inst;
Bongjun 0:e11e8793c3ce 226
Bongjun 0:e11e8793c3ce 227 void reg_wr_mac(uint16_t addr, uint8_t* data) {
Bongjun 0:e11e8793c3ce 228 spi_write(addr, 0x04, data, 6);
Bongjun 0:e11e8793c3ce 229 }
Bongjun 0:e11e8793c3ce 230
Bongjun 0:e11e8793c3ce 231 void spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len);
Bongjun 0:e11e8793c3ce 232 void spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len);
Bongjun 0:e11e8793c3ce 233 SPI* spi;
Bongjun 0:e11e8793c3ce 234 DigitalOut cs;
Bongjun 0:e11e8793c3ce 235 DigitalOut reset_pin;
Bongjun 0:e11e8793c3ce 236 };
Bongjun 0:e11e8793c3ce 237
Bongjun 0:e11e8793c3ce 238 extern uint32_t str_to_ip(const char* str);
Bongjun 0:e11e8793c3ce 239 extern void printfBytes(char* str, uint8_t* buf, int len);
Bongjun 0:e11e8793c3ce 240 extern void printHex(uint8_t* buf, int len);
Bongjun 0:e11e8793c3ce 241 extern void debug_hex(uint8_t* buf, int len);