2015년 10월 29일 목요일

[WIZwiki_W7500ECO] HTTPClient with JSON parser

[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.
IMG_20151029_165139

Preparation materials

  1. Software
  2. Hardware

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
    2015-10-29_16-26-33

  • Test by using curl

      $>curl ip_address:port_number
    

    2015-10-29_16-26-00

Make main.cc

  1. 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");
    
  2. TCP connect to simple python JSON server

     sock.connect("192.168.0.223", 8000); // "destination IP address", destination port number
    
  3. 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");
    
  4. TCP Send Get form

     sock.send_all(http_tx_msg, http_tx_msg_sz-1); // tx_buf, tx_buf_size
    
  5. 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);
         }
    
  6. Do JSON parse
     parse(parser, http_rx_msg);
    
  7. 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

  1. Network config.
  2. Confirm Received JSON data
  3. Print-out the pasing data
    2015-10-29_16-42-55

Packet Capture

  1. TCP-Connection
  2. Target board sends GET Form to simple python JSON server
  3. simple python JSON server sends JSON data to Target board
    2015-10-29_16-22-56