This post shows how to use HTTPClient parse JSON data in the ARMmbed platform.
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 accessing data in JSON format. However, JSON parser is too big for the low-end device as like an ARMmbed platform which has limited-resource. This post shows how to use HTTPClient parse JSON data in the 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
2. 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
- Excute json_server
- 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());
Demo. HTTPClient with JSON parser
- Network config.
- Confirm Received JSON data
- Print-out the passing data
Packet Capture
- TCP-Connection
- Target board sends GET Form to simple python JSON server
- simple python JSON server sends JSON data to Target board
Bitbucket
https://www.hackster.io/embeddist/wizwiki-w7500eco-httpclient-with-json-parser-f96641
COMMENTS