Websocket_Sample for MurataTypeYD

Dependencies:   mbed picojson

Committer:
komoritan
Date:
Thu Mar 12 12:14:38 2015 +0000
Revision:
0:14bd24b5a77f
fixed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
komoritan 0:14bd24b5a77f 1 #include "mbed.h"
komoritan 0:14bd24b5a77f 2
komoritan 0:14bd24b5a77f 3 #include "SNIC_WifiInterface.h"
komoritan 0:14bd24b5a77f 4 // KTEC DEL S
komoritan 0:14bd24b5a77f 5 //#include "HTTPClient.h"
komoritan 0:14bd24b5a77f 6 // KTEC DEL E
komoritan 0:14bd24b5a77f 7 #if defined(TARGET_LPC1768)
komoritan 0:14bd24b5a77f 8 #include "PowerControl/EthernetPowerControl.h"
komoritan 0:14bd24b5a77f 9 #endif
komoritan 0:14bd24b5a77f 10 // KTEC ADD S
komoritan 0:14bd24b5a77f 11 #include "Websocket.h"
komoritan 0:14bd24b5a77f 12 #include "Websocket_Function.h"
komoritan 0:14bd24b5a77f 13 // KTEC ADD E
komoritan 0:14bd24b5a77f 14
komoritan 0:14bd24b5a77f 15 #define DEMO_AP_SSID "SSID"
komoritan 0:14bd24b5a77f 16 #define DEMO_AP_SECURITY_TYPE e_SEC_WPA2_AES
komoritan 0:14bd24b5a77f 17 #define DEMO_AP_SECUTIRY_KEY "PASSWORD"
komoritan 0:14bd24b5a77f 18
komoritan 0:14bd24b5a77f 19 C_SNIC_WifiInterface wifi( p9, p10, NC, NC, p30 );
komoritan 0:14bd24b5a77f 20
komoritan 0:14bd24b5a77f 21 #if defined(_DEBUG)
komoritan 0:14bd24b5a77f 22 Serial pc(USBTX, USBRX);
komoritan 0:14bd24b5a77f 23 #endif
komoritan 0:14bd24b5a77f 24
komoritan 0:14bd24b5a77f 25 // KTEC DEL S
komoritan 0:14bd24b5a77f 26 /*
komoritan 0:14bd24b5a77f 27 HTTPClient http;
komoritan 0:14bd24b5a77f 28 char str[512];
komoritan 0:14bd24b5a77f 29 */
komoritan 0:14bd24b5a77f 30 // KTEC DEL E
komoritan 0:14bd24b5a77f 31
komoritan 0:14bd24b5a77f 32 // KTEC ADD S
komoritan 0:14bd24b5a77f 33 // Websocketサーバ設定
komoritan 0:14bd24b5a77f 34 // 送信チャネルと受信チャネルは違うチャンネル名、かつ、ユニークな値を設定してください。
komoritan 0:14bd24b5a77f 35 // 送信チャネル名
komoritan 0:14bd24b5a77f 36 #define WRITE_CHANNEL ""
komoritan 0:14bd24b5a77f 37 // 受信チャネル名
komoritan 0:14bd24b5a77f 38 #define READ_CHANNEL ""
komoritan 0:14bd24b5a77f 39
komoritan 0:14bd24b5a77f 40 Websocket *ws_write = NULL;
komoritan 0:14bd24b5a77f 41 Websocket *ws_read = NULL;
komoritan 0:14bd24b5a77f 42
komoritan 0:14bd24b5a77f 43 Mutex socket_mutex;
komoritan 0:14bd24b5a77f 44 // KTEC ADD E
komoritan 0:14bd24b5a77f 45
komoritan 0:14bd24b5a77f 46 // KTEC ADD S
komoritan 0:14bd24b5a77f 47 // Wifiモジュールに接続
komoritan 0:14bd24b5a77f 48 int wifi_connect()
komoritan 0:14bd24b5a77f 49 {
komoritan 0:14bd24b5a77f 50 int ret = 0;
komoritan 0:14bd24b5a77f 51
komoritan 0:14bd24b5a77f 52 // Initialize Wi-Fi interface
komoritan 0:14bd24b5a77f 53 ret = wifi.init();
komoritan 0:14bd24b5a77f 54 if(ret != 0){
komoritan 0:14bd24b5a77f 55 printf("Wi-Fi initial failed %d\r\n", ret);
komoritan 0:14bd24b5a77f 56 return ret;
komoritan 0:14bd24b5a77f 57 }
komoritan 0:14bd24b5a77f 58 wait(0.5);
komoritan 0:14bd24b5a77f 59
komoritan 0:14bd24b5a77f 60 ret = wifi.disconnect();
komoritan 0:14bd24b5a77f 61 if(ret != 0 )
komoritan 0:14bd24b5a77f 62 {
komoritan 0:14bd24b5a77f 63 printf("on the disconnect state %d\r\n", ret);
komoritan 0:14bd24b5a77f 64 return ret;
komoritan 0:14bd24b5a77f 65 }
komoritan 0:14bd24b5a77f 66 wait(0.3);
komoritan 0:14bd24b5a77f 67
komoritan 0:14bd24b5a77f 68 // Connect to AP
komoritan 0:14bd24b5a77f 69 ret = wifi.connect( DEMO_AP_SSID,strlen(DEMO_AP_SSID),
komoritan 0:14bd24b5a77f 70 DEMO_AP_SECURITY_TYPE,
komoritan 0:14bd24b5a77f 71 DEMO_AP_SECUTIRY_KEY,
komoritan 0:14bd24b5a77f 72 strlen(DEMO_AP_SECUTIRY_KEY));
komoritan 0:14bd24b5a77f 73 if(ret !=0)
komoritan 0:14bd24b5a77f 74 {
komoritan 0:14bd24b5a77f 75 printf("Connect AP is failed %d\r\n", ret);
komoritan 0:14bd24b5a77f 76 return ret;
komoritan 0:14bd24b5a77f 77 }
komoritan 0:14bd24b5a77f 78 wait(0.5);
komoritan 0:14bd24b5a77f 79
komoritan 0:14bd24b5a77f 80 // DHCPでIPアドレスを取得
komoritan 0:14bd24b5a77f 81 int retIp = wifi.setIPConfig(true);
komoritan 0:14bd24b5a77f 82 wait(0.5);
komoritan 0:14bd24b5a77f 83 printf("IP Address is %s\r\n", wifi.getIPAddress());
komoritan 0:14bd24b5a77f 84
komoritan 0:14bd24b5a77f 85 return ret;
komoritan 0:14bd24b5a77f 86 }
komoritan 0:14bd24b5a77f 87
komoritan 0:14bd24b5a77f 88 // Websocketサーバ(mbed2fx)へのデータ送信処理
komoritan 0:14bd24b5a77f 89 void websocket_send(char* writeBuf)
komoritan 0:14bd24b5a77f 90 {
komoritan 0:14bd24b5a77f 91 int ret = 0;
komoritan 0:14bd24b5a77f 92
komoritan 0:14bd24b5a77f 93 // Websocketサーバへデータを送信
komoritan 0:14bd24b5a77f 94 socket_mutex.lock();
komoritan 0:14bd24b5a77f 95 ret = ws_write->send(writeBuf);
komoritan 0:14bd24b5a77f 96 socket_mutex.unlock();
komoritan 0:14bd24b5a77f 97
komoritan 0:14bd24b5a77f 98 // send処理が失敗した場合
komoritan 0:14bd24b5a77f 99 if (ret < 0) {
komoritan 0:14bd24b5a77f 100 printf("main() Websocket send error ret = %d\r\n", ret);
komoritan 0:14bd24b5a77f 101 mbed_die();
komoritan 0:14bd24b5a77f 102 }
komoritan 0:14bd24b5a77f 103 }
komoritan 0:14bd24b5a77f 104
komoritan 0:14bd24b5a77f 105 // FX0からの受信メッセージ監視スレッド
komoritan 0:14bd24b5a77f 106 // サンプルとしてFX0から受信メッセージの取得、LED点灯、消灯処理を行うスレッドを追加しています
komoritan 0:14bd24b5a77f 107 void recv_thread(void const *argument) {
komoritan 0:14bd24b5a77f 108 int ret = 0;
komoritan 0:14bd24b5a77f 109 int loopCnt = 1;
komoritan 0:14bd24b5a77f 110 char *json = "";
komoritan 0:14bd24b5a77f 111 char readBuf[100] = "";
komoritan 0:14bd24b5a77f 112 char writeBuf[100] = "";
komoritan 0:14bd24b5a77f 113
komoritan 0:14bd24b5a77f 114 while (true) {
komoritan 0:14bd24b5a77f 115 // Websocketサーバから受信メッセージを読み込み
komoritan 0:14bd24b5a77f 116 socket_mutex.lock();
komoritan 0:14bd24b5a77f 117 ret = ws_read->read(readBuf);
komoritan 0:14bd24b5a77f 118 socket_mutex.unlock();
komoritan 0:14bd24b5a77f 119
komoritan 0:14bd24b5a77f 120 // 受信メッセージが存在する場合
komoritan 0:14bd24b5a77f 121 if (ret){
komoritan 0:14bd24b5a77f 122 // 受信メッセージ(JSON形式)を解析
komoritan 0:14bd24b5a77f 123 json = &(readBuf[0]);
komoritan 0:14bd24b5a77f 124 picojson::value v;
komoritan 0:14bd24b5a77f 125 string err = picojson::parse(v, json, json + strlen(json));
komoritan 0:14bd24b5a77f 126 if (! err.empty()) {
komoritan 0:14bd24b5a77f 127 printf(" parse error %s\r\n", err.c_str());
komoritan 0:14bd24b5a77f 128 continue;
komoritan 0:14bd24b5a77f 129 }
komoritan 0:14bd24b5a77f 130
komoritan 0:14bd24b5a77f 131 // LED点灯、消灯処理を実行
komoritan 0:14bd24b5a77f 132 if (strcmp(v.get("method").get<string>().c_str(), "setLed") == 0) {
komoritan 0:14bd24b5a77f 133 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());
komoritan 0:14bd24b5a77f 134 // Websocketサーバへ処理結果を送信
komoritan 0:14bd24b5a77f 135 websocket_send(writeBuf);
komoritan 0:14bd24b5a77f 136 } else {
komoritan 0:14bd24b5a77f 137 printf("Not Found Parameter\r\n");
komoritan 0:14bd24b5a77f 138 }
komoritan 0:14bd24b5a77f 139 }
komoritan 0:14bd24b5a77f 140 loopCnt++;
komoritan 0:14bd24b5a77f 141
komoritan 0:14bd24b5a77f 142 // 500ms間隔でループ
komoritan 0:14bd24b5a77f 143 Thread::wait(500);
komoritan 0:14bd24b5a77f 144
komoritan 0:14bd24b5a77f 145 // チャネルを閉じないようにするため、定期的にチャネルにデータを送信する
komoritan 0:14bd24b5a77f 146 if(loopCnt >= 50){
komoritan 0:14bd24b5a77f 147 loopCnt = 0;
komoritan 0:14bd24b5a77f 148 socket_mutex.lock();
komoritan 0:14bd24b5a77f 149 ret = ws_read->send("Keep Websocket Channel");
komoritan 0:14bd24b5a77f 150 socket_mutex.unlock();
komoritan 0:14bd24b5a77f 151 }
komoritan 0:14bd24b5a77f 152 }
komoritan 0:14bd24b5a77f 153 }
komoritan 0:14bd24b5a77f 154
komoritan 0:14bd24b5a77f 155 // KTEC ADD E
komoritan 0:14bd24b5a77f 156
komoritan 0:14bd24b5a77f 157 int main()
komoritan 0:14bd24b5a77f 158 {
komoritan 0:14bd24b5a77f 159 // KTEC ADD S
komoritan 0:14bd24b5a77f 160 int i=1;
komoritan 0:14bd24b5a77f 161 char wsWriteName[256] = "";
komoritan 0:14bd24b5a77f 162 char wsReadName[256] = "";
komoritan 0:14bd24b5a77f 163 char writeBuf[100] = "";
komoritan 0:14bd24b5a77f 164 // KTEC ADD E
komoritan 0:14bd24b5a77f 165
komoritan 0:14bd24b5a77f 166 #if defined(TARGET_LPC1768)
komoritan 0:14bd24b5a77f 167 PHY_PowerDown();
komoritan 0:14bd24b5a77f 168 #endif
komoritan 0:14bd24b5a77f 169
komoritan 0:14bd24b5a77f 170 // WRITE_CHANNEL or READ_CHANNELが空の場合はエラー終了
komoritan 0:14bd24b5a77f 171 if ( "" == WRITE_CHANNEL || "" == READ_CHANNEL ){
komoritan 0:14bd24b5a77f 172 printf("error WRITE_CHANNEL or READ_CHANNEL NULL \r\n");
komoritan 0:14bd24b5a77f 173 mbed_die();
komoritan 0:14bd24b5a77f 174 }
komoritan 0:14bd24b5a77f 175
komoritan 0:14bd24b5a77f 176 // KTEC ADD S
komoritan 0:14bd24b5a77f 177 while (1) {
komoritan 0:14bd24b5a77f 178 printf("--- wifi_connect start(%d). ---\r\n", i);
komoritan 0:14bd24b5a77f 179 if( wifi_connect() == 0)
komoritan 0:14bd24b5a77f 180 {
komoritan 0:14bd24b5a77f 181 break;
komoritan 0:14bd24b5a77f 182 }
komoritan 0:14bd24b5a77f 183
komoritan 0:14bd24b5a77f 184 i++;
komoritan 0:14bd24b5a77f 185 if( i > 10 ) {
komoritan 0:14bd24b5a77f 186 mbed_die();
komoritan 0:14bd24b5a77f 187 }
komoritan 0:14bd24b5a77f 188 wait( i / 2 );
komoritan 0:14bd24b5a77f 189 }
komoritan 0:14bd24b5a77f 190
komoritan 0:14bd24b5a77f 191 printf("wifi_connect end.\r\n");
komoritan 0:14bd24b5a77f 192
komoritan 0:14bd24b5a77f 193 // Websocket生成
komoritan 0:14bd24b5a77f 194 sprintf(wsWriteName, "ws://sockets.mbed.org/ws/%s/wo", WRITE_CHANNEL);
komoritan 0:14bd24b5a77f 195 sprintf(wsReadName, "ws://sockets.mbed.org/ws/%s/ro", READ_CHANNEL);
komoritan 0:14bd24b5a77f 196 ws_write = new Websocket(wsWriteName);
komoritan 0:14bd24b5a77f 197 ws_read = new Websocket(wsReadName);
komoritan 0:14bd24b5a77f 198
komoritan 0:14bd24b5a77f 199 // Websocketに接続
komoritan 0:14bd24b5a77f 200 ws_write->connect();
komoritan 0:14bd24b5a77f 201 ws_read->connect();
komoritan 0:14bd24b5a77f 202
komoritan 0:14bd24b5a77f 203 // 受信メッセージを監視
komoritan 0:14bd24b5a77f 204 Thread thread(recv_thread);
komoritan 0:14bd24b5a77f 205
komoritan 0:14bd24b5a77f 206 while (1) {
komoritan 0:14bd24b5a77f 207 wait(0.5);
komoritan 0:14bd24b5a77f 208 // ジャイロデータを取得
komoritan 0:14bd24b5a77f 209 doGetGyro(writeBuf);
komoritan 0:14bd24b5a77f 210 // ジャイロデータを送信
komoritan 0:14bd24b5a77f 211 websocket_send(writeBuf);
komoritan 0:14bd24b5a77f 212 }
komoritan 0:14bd24b5a77f 213 // KTEC ADD E
komoritan 0:14bd24b5a77f 214
komoritan 0:14bd24b5a77f 215 // KTEC DEL S
komoritan 0:14bd24b5a77f 216 /*
komoritan 0:14bd24b5a77f 217 wifi.init(); //Use DHCP
komoritan 0:14bd24b5a77f 218
komoritan 0:14bd24b5a77f 219 wait(0.5);
komoritan 0:14bd24b5a77f 220 int s = wifi.disconnect();
komoritan 0:14bd24b5a77f 221 if( s != 0 ) {
komoritan 0:14bd24b5a77f 222 return -1;
komoritan 0:14bd24b5a77f 223 }
komoritan 0:14bd24b5a77f 224
komoritan 0:14bd24b5a77f 225 wait(0.3);
komoritan 0:14bd24b5a77f 226 // Connect AP
komoritan 0:14bd24b5a77f 227 wifi.connect( DEMO_AP_SSID
komoritan 0:14bd24b5a77f 228 , strlen(DEMO_AP_SSID)
komoritan 0:14bd24b5a77f 229 , DEMO_AP_SECURITY_TYPE
komoritan 0:14bd24b5a77f 230 , DEMO_AP_SECUTIRY_KEY
komoritan 0:14bd24b5a77f 231 , strlen(DEMO_AP_SECUTIRY_KEY) );
komoritan 0:14bd24b5a77f 232 wait(0.5);
komoritan 0:14bd24b5a77f 233 wifi.setIPConfig( true );
komoritan 0:14bd24b5a77f 234 wait(0.5);
komoritan 0:14bd24b5a77f 235 printf("IP Address is %s\n", wifi.getIPAddress());
komoritan 0:14bd24b5a77f 236
komoritan 0:14bd24b5a77f 237 //GET data
komoritan 0:14bd24b5a77f 238 printf("\nTrying to fetch page...\n");
komoritan 0:14bd24b5a77f 239 int ret = http.get("http://developer.mbed.org/media/uploads/donatien/hello.txt", str, 128);
komoritan 0:14bd24b5a77f 240 if (!ret)
komoritan 0:14bd24b5a77f 241 {
komoritan 0:14bd24b5a77f 242 printf("Page fetched successfully - read %d characters\n", strlen(str));
komoritan 0:14bd24b5a77f 243 printf("Result: %s\n", str);
komoritan 0:14bd24b5a77f 244 }
komoritan 0:14bd24b5a77f 245 else
komoritan 0:14bd24b5a77f 246 {
komoritan 0:14bd24b5a77f 247 printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
komoritan 0:14bd24b5a77f 248 }
komoritan 0:14bd24b5a77f 249
komoritan 0:14bd24b5a77f 250 //POST data
komoritan 0:14bd24b5a77f 251 HTTPMap map;
komoritan 0:14bd24b5a77f 252 HTTPText inText(str, 512);
komoritan 0:14bd24b5a77f 253 map.put("Hello", "World");
komoritan 0:14bd24b5a77f 254 map.put("test", "1234");
komoritan 0:14bd24b5a77f 255 printf("\nTrying to post data...\n");
komoritan 0:14bd24b5a77f 256 ret = http.post("http://httpbin.org/post", map, &inText);
komoritan 0:14bd24b5a77f 257 if (!ret)
komoritan 0:14bd24b5a77f 258 {
komoritan 0:14bd24b5a77f 259 printf("Executed POST successfully - read %d characters\n", strlen(str));
komoritan 0:14bd24b5a77f 260 printf("Result: %s\n", str);
komoritan 0:14bd24b5a77f 261 }
komoritan 0:14bd24b5a77f 262 else
komoritan 0:14bd24b5a77f 263 {
komoritan 0:14bd24b5a77f 264 printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
komoritan 0:14bd24b5a77f 265 }
komoritan 0:14bd24b5a77f 266
komoritan 0:14bd24b5a77f 267 //PUT data
komoritan 0:14bd24b5a77f 268 strcpy(str, "This is a PUT test!");
komoritan 0:14bd24b5a77f 269 HTTPText outText(str);
komoritan 0:14bd24b5a77f 270 //HTTPText inText(str, 512);
komoritan 0:14bd24b5a77f 271 printf("\nTrying to put resource...\n");
komoritan 0:14bd24b5a77f 272 ret = http.put("http://httpbin.org/put", outText, &inText);
komoritan 0:14bd24b5a77f 273 if (!ret)
komoritan 0:14bd24b5a77f 274 {
komoritan 0:14bd24b5a77f 275 printf("Executed PUT successfully - read %d characters\n", strlen(str));
komoritan 0:14bd24b5a77f 276 printf("Result: %s\n", str);
komoritan 0:14bd24b5a77f 277 }
komoritan 0:14bd24b5a77f 278 else
komoritan 0:14bd24b5a77f 279 {
komoritan 0:14bd24b5a77f 280 printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
komoritan 0:14bd24b5a77f 281 }
komoritan 0:14bd24b5a77f 282
komoritan 0:14bd24b5a77f 283 //DELETE data
komoritan 0:14bd24b5a77f 284 //HTTPText inText(str, 512);
komoritan 0:14bd24b5a77f 285 printf("\nTrying to delete resource...\n");
komoritan 0:14bd24b5a77f 286 ret = http.del("http://httpbin.org/delete", &inText);
komoritan 0:14bd24b5a77f 287 if (!ret)
komoritan 0:14bd24b5a77f 288 {
komoritan 0:14bd24b5a77f 289 printf("Executed DELETE successfully - read %d characters\n", strlen(str));
komoritan 0:14bd24b5a77f 290 printf("Result: %s\n", str);
komoritan 0:14bd24b5a77f 291 }
komoritan 0:14bd24b5a77f 292 else
komoritan 0:14bd24b5a77f 293 {
komoritan 0:14bd24b5a77f 294 printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode());
komoritan 0:14bd24b5a77f 295 }
komoritan 0:14bd24b5a77f 296
komoritan 0:14bd24b5a77f 297 wifi.disconnect();
komoritan 0:14bd24b5a77f 298
komoritan 0:14bd24b5a77f 299 while(1) {
komoritan 0:14bd24b5a77f 300 }
komoritan 0:14bd24b5a77f 301 */
komoritan 0:14bd24b5a77f 302 // KTEC DEL E
komoritan 0:14bd24b5a77f 303 }