[WIZwiki_W7500ECO] HTTPClient with JSON parser
JSON is easy for machines to parse and generate which is based on a subset of the JavaScript Programming Language. Currently many Web Services allow to access data in JSON format. However, JSON parser is too big for low-end device as like a ARMmbed platform which has limited-resource. This post shows how to use HTTPClient parse Json data in ARMmbed platform.
Preparation materials
- Software
- JSON Parser: MbedJSONValue libs
- Ethernet Networking : WIZnetInterface
- HTTP Server with JSON : Fraka6 Blog - No Free Lunch: The simplest python server example ;)
Hardware
WIZwiki-W7500ECONET: WIZwiki-W7500 + ECO Shield Ethernet
ARMmbed Board: WIZwiki-W7500ECO
Ethernet Shield: ECO Shield Ethernet
Simplest python JSON server on PC
Reference : fraka6.blogsopot.kr: The simplest python server example
Modify Server IP address & port on ron_handler
def run(port=8000): #set port print('http server is starting...') #ip and port of server #server_address = ('127.0.0.1', port) server_address = ('192.168.0.223', port)#set port httpd = HTTPServer(server_address, Handler) print('http server is running...listening on port %s' %port) httpd.serve_forever()
Modify JSON form in do_GET handler
#handle GET command def do_GET(self): if format == 'html': self.send_response(200) self.send_header("Content-type", "text/plain") self.send_header('Content-type','text-html') self.end_headers() self.wfile.write("body") elif format == 'json': #self.request.sendall(json.dumps({'path':self.path})) #self.request.sendall(json.dumps({'pi':3.14})) self.request.sendall(json.dumps({'name':'John snow', 'age': 30, 'gender':'male'})) else: self.request.sendall("%s\t%s" %('path', self.path)) return
Test by using curl
$>curl ip_address:port_number
Make main.cc
Network Configration for WIZwiki-W7500ECO
// Enter a MAC address for your controller below. uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0x02}; printf("initializing Ethernet\r\n"); // initializing MAC address eth.init(mac_addr, "192.168.0.34", "255.255.255.0", "192.168.0.1"); // Check Ethenret Link if(eth.link() == true) printf("- Ethernet PHY Link-Done \r\n"); else printf("- Ethernet PHY Link- Fail\r\n"); // Start Ethernet connecting: Trying to get an IP address using DHCP if (eth.connect()<0) printf("Fail - Ethernet Connecing");
TCP connect to simple python JSON server
sock.connect("192.168.0.223", 8000); // "destination IP address", destination port number
Make Get form in HTTP format
snprintf(http_tx_msg, http_tx_msg_sz, "GET / HTTP/1.1\r\nHost: 192.168.0.223:8000\r\nUser-Agent: WIZwiki-W7500ECO\r\nConection: close\r\n\r\n");
TCP Send Get form
sock.send_all(http_tx_msg, http_tx_msg_sz-1); // tx_buf, tx_buf_size
TCP Recv data in JSON format
while ( (returnCode = sock.receive(http_rx_msg, http_rx_msg_sz-1)) > 0) { http_rx_msg[returnCode] = '\0'; printf("Received %d chars from server:\n\r%s\n", returnCode, http_rx_msg); }
- Do JSON parse
parse(parser, http_rx_msg);
- Output the parsed data
// parsing "string" in string type printf("name =%s\r\n" , parser["name"].get<string>().c_str()); // parsing "age" in integer type printf("age =%d\r\n" , parser["age"].get<int>()); // parsing "gender" in string type printf("gender =%s\r\n" , parser["gender"].get<string>().c_str());