Websocket_Sample for MurataTypeYD

Dependencies:   mbed picojson

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 #include "SNIC_WifiInterface.h"
00004 // KTEC DEL S
00005 //#include "HTTPClient.h"
00006 // KTEC DEL E
00007 #if defined(TARGET_LPC1768)
00008 #include "PowerControl/EthernetPowerControl.h"
00009 #endif
00010 // KTEC ADD S
00011 #include "Websocket.h"
00012 #include "Websocket_Function.h"
00013 // KTEC ADD E
00014 
00015 #define DEMO_AP_SSID                  "SSID"
00016 #define DEMO_AP_SECURITY_TYPE         e_SEC_WPA2_AES
00017 #define DEMO_AP_SECUTIRY_KEY          "PASSWORD"
00018 
00019 C_SNIC_WifiInterface     wifi( p9, p10, NC, NC, p30 );
00020 
00021 #if defined(_DEBUG)
00022 Serial pc(USBTX, USBRX);
00023 #endif
00024 
00025 // KTEC DEL S
00026 /*
00027 HTTPClient http;
00028 char str[512];
00029 */
00030 // KTEC DEL E
00031 
00032 // KTEC ADD S
00033 // Websocketサーバ設定
00034 // 送信チャネルと受信チャネルは違うチャンネル名、かつ、ユニークな値を設定してください。
00035 // 送信チャネル名
00036 #define WRITE_CHANNEL ""
00037 // 受信チャネル名
00038 #define READ_CHANNEL ""
00039 
00040 Websocket *ws_write = NULL;
00041 Websocket *ws_read = NULL;
00042 
00043 Mutex socket_mutex; 
00044 // KTEC ADD E
00045 
00046 // KTEC ADD S
00047 // Wifiモジュールに接続
00048 int wifi_connect()
00049 {
00050     int ret = 0;
00051     
00052     // Initialize Wi-Fi interface
00053     ret = wifi.init();
00054     if(ret != 0){
00055         printf("Wi-Fi initial failed %d\r\n", ret);
00056         return ret;
00057     }
00058     wait(0.5);
00059 
00060     ret = wifi.disconnect();
00061     if(ret != 0 )
00062     {
00063         printf("on the disconnect state %d\r\n", ret);
00064         return ret;
00065     } 
00066     wait(0.3);
00067 
00068     // Connect to AP
00069     ret = wifi.connect( DEMO_AP_SSID,strlen(DEMO_AP_SSID), 
00070                           DEMO_AP_SECURITY_TYPE, 
00071                           DEMO_AP_SECUTIRY_KEY, 
00072                           strlen(DEMO_AP_SECUTIRY_KEY));
00073     if(ret !=0)
00074     {
00075         printf("Connect AP is failed %d\r\n", ret);
00076         return ret;
00077     }
00078     wait(0.5);
00079     
00080     // DHCPでIPアドレスを取得
00081     int retIp = wifi.setIPConfig(true);
00082     wait(0.5);
00083     printf("IP Address is %s\r\n", wifi.getIPAddress());
00084 
00085     return ret;
00086 }
00087 
00088 // Websocketサーバ(mbed2fx)へのデータ送信処理
00089 void websocket_send(char* writeBuf)
00090 {
00091     int ret = 0;
00092 
00093     // Websocketサーバへデータを送信
00094     socket_mutex.lock();
00095     ret = ws_write->send(writeBuf);
00096     socket_mutex.unlock();
00097 
00098     // send処理が失敗した場合
00099     if (ret < 0) {
00100         printf("main() Websocket send error ret = %d\r\n", ret);
00101         mbed_die();
00102     }
00103 }
00104 
00105 // FX0からの受信メッセージ監視スレッド
00106 // サンプルとしてFX0から受信メッセージの取得、LED点灯、消灯処理を行うスレッドを追加しています
00107 void recv_thread(void const *argument) {
00108     int ret = 0;
00109     int loopCnt = 1;
00110     char *json = "";
00111     char readBuf[100] = "";
00112     char writeBuf[100] = "";
00113 
00114     while (true) {
00115         // Websocketサーバから受信メッセージを読み込み
00116         socket_mutex.lock();
00117         ret = ws_read->read(readBuf);
00118         socket_mutex.unlock();
00119 
00120         // 受信メッセージが存在する場合
00121         if (ret){
00122             // 受信メッセージ(JSON形式)を解析
00123             json = &(readBuf[0]);
00124             picojson::value v;
00125             string err = picojson::parse(v, json, json + strlen(json));
00126             if (! err.empty()) {
00127                 printf(" parse error %s\r\n", err.c_str());
00128                 continue;
00129             }
00130        
00131             // LED点灯、消灯処理を実行
00132             if (strcmp(v.get("method").get<string>().c_str(), "setLed") == 0) {
00133                 doSetLed(writeBuf, v.get("led1").get<string>().c_str(), v.get("led2").get<string>().c_str(), v.get("led3").get<string>().c_str(), v.get("led4").get<string>().c_str());
00134                 // Websocketサーバへ処理結果を送信
00135                 websocket_send(writeBuf);
00136             } else {
00137                 printf("Not Found Parameter\r\n");
00138             }
00139         }
00140         loopCnt++;
00141 
00142         // 500ms間隔でループ
00143         Thread::wait(500);
00144         
00145         // チャネルを閉じないようにするため、定期的にチャネルにデータを送信する
00146         if(loopCnt >= 50){
00147             loopCnt = 0;
00148             socket_mutex.lock();
00149             ret = ws_read->send("Keep Websocket Channel");
00150             socket_mutex.unlock();
00151         }
00152     }
00153 }
00154 
00155 // KTEC ADD E
00156 
00157 int main() 
00158 {
00159 // KTEC ADD S
00160     int i=1;
00161     char wsWriteName[256] = "";
00162     char wsReadName[256] = "";
00163     char writeBuf[100] = "";
00164 // KTEC ADD E
00165 
00166 #if defined(TARGET_LPC1768)
00167     PHY_PowerDown();
00168 #endif
00169 
00170     // WRITE_CHANNEL or READ_CHANNELが空の場合はエラー終了
00171     if ( "" == WRITE_CHANNEL || "" == READ_CHANNEL ){
00172         printf("error WRITE_CHANNEL or READ_CHANNEL NULL \r\n");
00173         mbed_die();
00174     }
00175 
00176 // KTEC ADD S
00177     while (1) {
00178         printf("--- wifi_connect start(%d). ---\r\n", i);
00179         if( wifi_connect() == 0) 
00180         {
00181             break;
00182         }
00183         
00184         i++;
00185         if( i > 10 ) {
00186             mbed_die();
00187         }
00188         wait( i / 2 );
00189     }
00190 
00191     printf("wifi_connect end.\r\n");
00192 
00193     // Websocket生成
00194     sprintf(wsWriteName, "ws://sockets.mbed.org/ws/%s/wo", WRITE_CHANNEL);
00195     sprintf(wsReadName, "ws://sockets.mbed.org/ws/%s/ro", READ_CHANNEL);
00196     ws_write = new Websocket(wsWriteName);
00197     ws_read = new Websocket(wsReadName);
00198     
00199     // Websocketに接続
00200     ws_write->connect();
00201     ws_read->connect();
00202 
00203     // 受信メッセージを監視
00204     Thread thread(recv_thread);
00205 
00206     while (1) {
00207         wait(0.5);
00208         // ジャイロデータを取得
00209         doGetGyro(writeBuf);
00210         // ジャイロデータを送信
00211         websocket_send(writeBuf);              
00212     }
00213 // KTEC ADD E
00214 
00215 // KTEC DEL S
00216 /*
00217     wifi.init(); //Use DHCP
00218 
00219     wait(0.5);
00220     int s = wifi.disconnect();
00221     if( s != 0 ) {
00222         return -1;
00223     }
00224     
00225     wait(0.3);
00226     // Connect AP
00227     wifi.connect( DEMO_AP_SSID
00228                         , strlen(DEMO_AP_SSID)
00229                         , DEMO_AP_SECURITY_TYPE
00230                         , DEMO_AP_SECUTIRY_KEY
00231                         , strlen(DEMO_AP_SECUTIRY_KEY) );
00232     wait(0.5);
00233     wifi.setIPConfig( true );    
00234     wait(0.5);    
00235     printf("IP Address is %s\n", wifi.getIPAddress());
00236     
00237     //GET data
00238     printf("\nTrying to fetch page...\n");
00239     int ret = http.get("http://developer.mbed.org/media/uploads/donatien/hello.txt", str, 128);
00240     if (!ret)
00241     {
00242       printf("Page fetched successfully - read %d characters\n", strlen(str));
00243       printf("Result: %s\n", str);
00244     }
00245     else
00246     {
00247       printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
00248     }
00249     
00250     //POST data
00251     HTTPMap map;
00252     HTTPText inText(str, 512);
00253     map.put("Hello", "World");
00254     map.put("test", "1234");
00255     printf("\nTrying to post data...\n");
00256     ret = http.post("http://httpbin.org/post", map, &inText);
00257     if (!ret)
00258     {
00259       printf("Executed POST successfully - read %d characters\n", strlen(str));
00260       printf("Result: %s\n", str);
00261     }
00262     else
00263     {
00264       printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
00265     }
00266     
00267     //PUT data
00268     strcpy(str, "This is a PUT test!");
00269     HTTPText outText(str);
00270     //HTTPText inText(str, 512);
00271     printf("\nTrying to put resource...\n");
00272     ret = http.put("http://httpbin.org/put", outText, &inText);
00273     if (!ret)
00274     {
00275       printf("Executed PUT successfully - read %d characters\n", strlen(str));
00276       printf("Result: %s\n", str);
00277     }
00278     else
00279     {
00280       printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
00281     }
00282     
00283     //DELETE data
00284     //HTTPText inText(str, 512);
00285     printf("\nTrying to delete resource...\n");
00286     ret = http.del("http://httpbin.org/delete", &inText);
00287     if (!ret)
00288     {
00289       printf("Executed DELETE successfully - read %d characters\n", strlen(str));
00290       printf("Result: %s\n", str);
00291     }
00292     else
00293     {
00294       printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
00295     }
00296     
00297     wifi.disconnect();  
00298 
00299     while(1) {
00300     }
00301 */
00302 // KTEC DEL E
00303 }