thermferm/websocket.c

changeset 682
f82be2bd472f
parent 680
8b3c86124a08
child 683
d48733bf1529
equal deleted inserted replaced
681:1f81e52c5abf 682:f82be2bd472f
40 40
41 int my_ws_shutdown = 0; 41 int my_ws_shutdown = 0;
42 int my_ws_state = 0; 42 int my_ws_state = 0;
43 struct lws_context *context; 43 struct lws_context *context;
44 int ws_clients = 0; 44 int ws_clients = 0;
45 long ws_pingno = 0;
45 time_t last_msg = 0; 46 time_t last_msg = 0;
46 pthread_mutex_t ws_mutex; 47 pthread_mutex_t ws_mutex;
47 48
48 49
49 /* 50 /*
278 } 279 }
279 syslog(LOG_NOTICE, "fermenter_ws_receive(%s)", buf); 280 syslog(LOG_NOTICE, "fermenter_ws_receive(%s)", buf);
280 } 281 }
281 282
282 283
284 void pong_ws_receive(char *buf)
285 {
286 struct json_object *val, *jobj;
287
288 jobj = json_tokener_parse(buf);
289 json_object_object_get_ex(jobj, "pong", &val);
290 long ws_pongno = json_object_get_int(val);
291 if (ws_pongno != ws_pingno) {
292 syslog(LOG_NOTICE, "ws: ping/pong error %ld/%ld", ws_pingno, ws_pongno);
293 }
294 }
295
296
283 static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) 297 static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
284 { 298 {
285 struct per_session_data__lws_mirror *pss = (struct per_session_data__lws_mirror *)user; 299 struct per_session_data__lws_mirror *pss = (struct per_session_data__lws_mirror *)user;
286 int n, m; 300 int n, m;
287 char buf[WS_INBUF + 1]; 301 char buf[WS_INBUF + 1];
340 * {"node":"rpi01","group_id":"fermenters","control":"reboot"} 354 * {"node":"rpi01","group_id":"fermenters","control":"reboot"}
341 * {"node":"rpi01","group_id":"fermenters","control":"rebirth"} 355 * {"node":"rpi01","group_id":"fermenters","control":"rebirth"}
342 */ 356 */
343 if (strncmp(buf, (char *)"{\"type\":\"fermenter\",", 20) == 0) { 357 if (strncmp(buf, (char *)"{\"type\":\"fermenter\",", 20) == 0) {
344 fermenter_ws_receive(buf); 358 fermenter_ws_receive(buf);
345 // } else if (strncmp(buf, (char *)"{\"device\":\"co2meters\",", 22) == 0) { 359 } else if (strncmp(buf, (char *)"{\"type\":\"device\",", 17) == 0) {
346 // co2meter_ws_receive(buf); 360
347 // } else if (strncmp(buf, (char *)"{\"device\":\"ispindels\",", 22) == 0) { 361 } else if (strncmp(buf, (char *)"{\"type\":\"global\",", 17) == 0) {
348 // ispindel_ws_receive(buf); 362
349 // } else if (strncmp(buf, (char *)"{\"node\":\"", 9) == 0) { 363 #ifdef USE_SIMULATOR
350 // node_ws_receive(buf); 364 } else if (strncmp(buf, (char *)"{\"type\":\"simulator\",", 20) == 0) {
365
366 #endif
367 } else if (strncmp(buf, (char *)"{\"pong\":", 8) == 0) {
368 pong_ws_receive(buf);
351 } 369 }
352 370
353 break; 371 break;
354 372
355 case LWS_CALLBACK_CLOSED: 373 case LWS_CALLBACK_CLOSED:
378 */ 396 */
379 void ws_broadcast(char *msg) 397 void ws_broadcast(char *msg)
380 { 398 {
381 int len, err; 399 int len, err;
382 400
383 syslog(LOG_NOTICE, "%s", msg);
384 err = pthread_mutex_lock(&ws_mutex); 401 err = pthread_mutex_lock(&ws_mutex);
385 if (err) { 402 if (err) {
386 syslog(LOG_NOTICE, "ws_broadcast pthread_mutex_lock error %d", err); 403 syslog(LOG_NOTICE, "ws_broadcast pthread_mutex_lock error %d", err);
387 } else { 404 } else {
388 405
410 } 427 }
411 428
412 429
413 430
414 /* 431 /*
415 * Called every 5 seconds. 432 * Called every 45 seconds.
416 */ 433 */
417 void ws_check(void) 434 void ws_check(void)
418 { 435 {
419 time_t now = time(NULL); 436 time_t now = time(NULL);
437 char buf[64];
420 438
421 if (((int)now - (int)last_msg) > 45) { 439 if (((int)now - (int)last_msg) > 45) {
422 ws_broadcast((char *)"{\"ping\":1}"); 440 snprintf(buf, 63, "{\"ping\":%ld}", ++ws_pingno);
441 ws_broadcast(buf);
423 } 442 }
424 } 443 }
425 444
426 445
427 446

mercurial