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

Dependencies:   EthernetInterface GraphicOLED mbed-rtos mbed picojson

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include "EthernetInterface.h"
00004 #include "GraphicOLED.h"
00005 #include "picojson.h"
00006 #include <string>
00007 
00008 // debug
00009 DigitalOut led1(LED1, 0);
00010 DigitalOut led2(LED2, 0);
00011 DigitalOut led3(LED3, 0);
00012 DigitalOut led4(LED4, 0);
00013 Serial pc(USBTX, USBRX);
00014 
00015 GraphicOLED oled(p24, p26, p27, p28, p21, p22);
00016 
00017 // ethernet
00018 DigitalIn lnk(P1_25);
00019 DigitalIn spd(P1_26);
00020 DigitalOut speed(p29);
00021 DigitalOut link(p30);
00022 
00023 void flip(void const *args) {
00024     speed = !spd;
00025     link = !lnk;
00026 }
00027 
00028 const string API_HOST = "api.search.nicovideo.jp";
00029 const int API_PORT = 80;
00030 const string API_PATH = "/api/";
00031 
00032 const string SEARCH_TAG = "mbed";
00033 
00034 int main() {
00035     // ethernet led
00036     RtosTimer flipper(flip, osTimerPeriodic, NULL);
00037     flipper.start(50);
00038 
00039     Thread::wait(2000);
00040     oled.cls();
00041     oled.printf("Hello world!\r\n");
00042 
00043     EthernetInterface eth;
00044     eth.init();
00045     eth.connect();
00046     
00047     oled.cls();
00048     oled.printf("IP Address is %s\r\n", eth.getIPAddress());
00049     
00050     TCPSocketConnection sock;
00051     sock.connect(API_HOST.c_str(), API_PORT);
00052     
00053     char post_data[256];
00054     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());
00055     pc.printf("POST Data:\r\n%s\r\nLength:%d\r\n", post_data, strlen(post_data));
00056     
00057     char http_cmd[1024];
00058     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);
00059     pc.printf("Request:\r\n%s\r\n", http_cmd);
00060     sock.send_all(http_cmd, sizeof(http_cmd)-1);
00061     
00062     char buffer[4048];
00063     int ret;
00064     ret = sock.receive(buffer, sizeof(buffer)-1);
00065     buffer[ret] = '\0';
00066     pc.printf("Received %d chars from server:\n%s\n", ret, buffer);
00067       
00068     sock.close();
00069     eth.disconnect();
00070     
00071     oled.cls();
00072     oled.printf("connection closed.\r\n\r\n");
00073     
00074     string response(buffer);
00075     string response_body;
00076     response_body = response.substr((int)response.find("\r\n\r\n") + 1);
00077     pc.printf("---------------------------\r\n");
00078     pc.printf(response_body.c_str());
00079     pc.printf("---------------------------\r\n");
00080     
00081     for(int i=0; i<3;i++){
00082         response_body = response_body.substr((int)response_body.find("\n{") + 1);
00083     }
00084     
00085     int start_pos = (int)response_body.find("[") + 1;
00086     int end_pos = (int)response_body.find("]");
00087     response_body = response_body.substr(start_pos, end_pos - start_pos);
00088     pc.printf("---------------------------\r\n");
00089     pc.printf(response_body.c_str());
00090     pc.printf("---------------------------\r\n");
00091     
00092     picojson::value v;
00093 
00094     const char *json = response_body.c_str();
00095     string err = picojson::parse(v, json, json + strlen(json));
00096     pc.printf("--> error %s\r\n", err.c_str());
00097 
00098     pc.printf("--> values %s\r\n", v.get("title").get<string>().c_str());
00099     oled.cls();
00100     oled.printf(v.get("title").get<string>().c_str());
00101     
00102     while(1) {
00103         led1 = !led1;
00104         Thread::wait(1000);
00105     }
00106 }