ニコニコ新検索βAPIからデータを取得して有機ELに表示する。

Dependencies:   EthernetInterface GraphicOLED mbed-rtos mbed picojson

main.cpp

Committer:
mia_0032
Date:
2014-11-29
Revision:
0:bea495dbc532

File content as of revision 0:bea495dbc532:

#include "mbed.h"
#include "rtos.h"
#include "EthernetInterface.h"
#include "GraphicOLED.h"
#include "picojson.h"
#include <string>

// debug
DigitalOut led1(LED1, 0);
DigitalOut led2(LED2, 0);
DigitalOut led3(LED3, 0);
DigitalOut led4(LED4, 0);
Serial pc(USBTX, USBRX);

GraphicOLED oled(p24, p26, p27, p28, p21, p22);

// ethernet
DigitalIn lnk(P1_25);
DigitalIn spd(P1_26);
DigitalOut speed(p29);
DigitalOut link(p30);

void flip(void const *args) {
    speed = !spd;
    link = !lnk;
}

const string API_HOST = "api.search.nicovideo.jp";
const int API_PORT = 80;
const string API_PATH = "/api/";

const string SEARCH_TAG = "mbed";

int main() {
    // ethernet led
    RtosTimer flipper(flip, osTimerPeriodic, NULL);
    flipper.start(50);

    Thread::wait(2000);
    oled.cls();
    oled.printf("Hello world!\r\n");

    EthernetInterface eth;
    eth.init();
    eth.connect();
    
    oled.cls();
    oled.printf("IP Address is %s\r\n", eth.getIPAddress());
    
    TCPSocketConnection sock;
    sock.connect(API_HOST.c_str(), API_PORT);
    
    char post_data[256];
    sprintf(post_data, "{\"query\":\"%s\",\"service\":[\"video\"],\"search\":[\"tags\"],\"join\":[\"cmsid\",\"title\",\"start_time\"],\"from\":0,\"size\":1,\"sort_by\":\"start_time\",\"issuer\":\"apiguide\",\"reason\":\"ma10\"}", SEARCH_TAG.c_str());
    pc.printf("POST Data:\r\n%s\r\nLength:%d\r\n", post_data, strlen(post_data));
    
    char http_cmd[1024];
    sprintf(http_cmd, "POST %s HTTP/1.1\r\nHost: %s:%d\r\nAccept: */*\r\nContent-Length: %d\r\nContent-Type: application/json\r\n\r\n%s\r\n\r\n", API_PATH.c_str(), API_HOST.c_str(), API_PORT, strlen(post_data), post_data);
    pc.printf("Request:\r\n%s\r\n", http_cmd);
    sock.send_all(http_cmd, sizeof(http_cmd)-1);
    
    char buffer[4048];
    int ret;
    ret = sock.receive(buffer, sizeof(buffer)-1);
    buffer[ret] = '\0';
    pc.printf("Received %d chars from server:\n%s\n", ret, buffer);
      
    sock.close();
    eth.disconnect();
    
    oled.cls();
    oled.printf("connection closed.\r\n\r\n");
    
    string response(buffer);
    string response_body;
    response_body = response.substr((int)response.find("\r\n\r\n") + 1);
    pc.printf("---------------------------\r\n");
    pc.printf(response_body.c_str());
    pc.printf("---------------------------\r\n");
    
    for(int i=0; i<3;i++){
        response_body = response_body.substr((int)response_body.find("\n{") + 1);
    }
    
    int start_pos = (int)response_body.find("[") + 1;
    int end_pos = (int)response_body.find("]");
    response_body = response_body.substr(start_pos, end_pos - start_pos);
    pc.printf("---------------------------\r\n");
    pc.printf(response_body.c_str());
    pc.printf("---------------------------\r\n");
    
    picojson::value v;

    const char *json = response_body.c_str();
    string err = picojson::parse(v, json, json + strlen(json));
    pc.printf("--> error %s\r\n", err.c_str());

    pc.printf("--> values %s\r\n", v.get("title").get<string>().c_str());
    oled.cls();
    oled.printf(v.get("title").get<string>().c_str());
    
    while(1) {
        led1 = !led1;
        Thread::wait(1000);
    }
}