joylink_sample_heater.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <rtthread.h>
  5. #include <arpa/inet.h>
  6. #include <netdev.h>
  7. #include <cJSON.h>
  8. #include <joylink.h>
  9. #include <joylink_log.h>
  10. #include <joylink_dev.h>
  11. #include <joylink_extern.h>
  12. #include <joylink_porting_layer.h>
  13. #define USER_DATA_POWER "Power"
  14. #define USER_DATA_MARK "Mark"
  15. #define USER_DATA_SETTEMPERATURE "SetTemperature"
  16. #define USER_DATA_CURRENTTEMPERATURE "CurrentTemperature"
  17. #define USER_DATA_CURRENTHUMIDITY "CurrentHumidity"
  18. #define USER_DATA_BABYLOCK "BabyLock"
  19. #define USER_DATA_STATE "State"
  20. #define USER_DATA_ERROR "Error"
  21. #define USER_DATA_MODE "Mode"
  22. typedef struct _user_dev_status_t {
  23. int Power;
  24. int Mark;
  25. float SetTemperature;
  26. float CurrentTemperature;
  27. float CurrentHumidity;
  28. int BabyLock;
  29. int State;
  30. int Error;
  31. int Mode;
  32. } user_dev_status_t;
  33. static user_dev_status_t user_dev;
  34. extern struct netdev *netdev_default;
  35. /* Check device network is connected */
  36. int joylink_dev_is_net_ok(void)
  37. {
  38. return (netdev_is_link_up(netdev_default) && (!ip_addr_isany(&(netdev_default->ip_addr)))) ? 1 : 0;
  39. }
  40. /* Get device UUID */
  41. int joylink_dev_get_uuid(char *out)
  42. {
  43. rt_memcpy(out, JOYLINK_SAMPLE_UUID, rt_strlen(JOYLINK_SAMPLE_UUID));
  44. return RT_EOK;
  45. }
  46. /* Get devuce public key */
  47. int joylink_dev_get_public_key(char *out)
  48. {
  49. rt_memcpy(out, JOYLINK_SAMPLE_PUB_KEY, rt_strlen(JOYLINK_SAMPLE_PUB_KEY));
  50. return RT_EOK;
  51. }
  52. /* Get device MAC address */
  53. int joylink_dev_get_user_mac(char *out)
  54. {
  55. int idx = 0;
  56. while(!netdev_is_up(netdev_default))
  57. {
  58. // delay for network interface device
  59. rt_thread_mdelay(500);
  60. }
  61. for (idx = 0; idx < netdev_default->hwaddr_len; idx++)
  62. {
  63. rt_snprintf(out + 2 * idx, 16 - 2 * idx, "%02X", netdev_default->hwaddr[idx]);
  64. }
  65. return RT_EOK;
  66. }
  67. /* Get device pricate key */
  68. int joylink_dev_get_private_key(char *out)
  69. {
  70. rt_memcpy(out, JOYLINK_SAMPLE_PRIVATE_KEY, rt_strlen(JOYLINK_SAMPLE_PRIVATE_KEY));
  71. return RT_EOK;
  72. }
  73. /* Get device usert data */
  74. user_dev_status_t *joylink_dev_user_data_get(void)
  75. {
  76. return (user_dev_status_t *) &user_dev;
  77. }
  78. /* Set device user data information */
  79. int joylink_dev_user_data_set(char *cmd, user_dev_status_t *user_data)
  80. {
  81. rt_memcpy(&user_dev, user_data, sizeof(user_dev_status_t));
  82. return 0;
  83. }
  84. int joylink_heater_set(int argc, char **argv)
  85. {
  86. user_dev_status_t *status = (user_dev_status_t *) &user_dev;
  87. if (argc != 3)
  88. {
  89. rt_kprintf("joylink_heater_set <temperature/humidity> <value> -- set joylink heater device information\n");
  90. rt_kprintf("joylink_heater_set <state/error/mode> <value> -- set joylink heater device status\n");
  91. return -1;
  92. }
  93. if (rt_strcmp(argv[1], "temperature") == 0)
  94. {
  95. status->CurrentTemperature = (float)atoi(argv[2]);
  96. joylink_dev_user_data_set(USER_DATA_CURRENTTEMPERATURE, status);
  97. }
  98. else if (rt_strcmp(argv[1], "humidity") == 0)
  99. {
  100. status->CurrentHumidity = (float)atoi(argv[2]);
  101. joylink_dev_user_data_set(USER_DATA_CURRENTHUMIDITY, status);
  102. }
  103. else if (rt_strcmp(argv[1], "state") == 0)
  104. {
  105. status->State = atoi(argv[2]);
  106. joylink_dev_user_data_set(USER_DATA_STATE, status);
  107. }
  108. else if (rt_strcmp(argv[1], "error") == 0)
  109. {
  110. status->Error = atoi(argv[2]);
  111. joylink_dev_user_data_set(USER_DATA_ERROR, status);
  112. }
  113. else if (rt_strcmp(argv[1], "mode") == 0)
  114. {
  115. status->Mode = atoi(argv[2]);
  116. joylink_dev_user_data_set(USER_DATA_MODE, status);
  117. }
  118. else
  119. {
  120. rt_kprintf("joylink_heater_set <temperature/humidity> <value> -- set joylink heater device information\n");
  121. rt_kprintf("joylink_heater_set <state/error/mode> <value> -- set joylink heater device status\n");
  122. return -1;
  123. }
  124. return 0;
  125. }
  126. #ifdef FINSH_USING_MSH
  127. #include <finsh.h>
  128. MSH_CMD_EXPORT(joylink_heater_set, set joylink heater device information);
  129. #endif /* FINSH_USING_MSH */
  130. /* prase the json device information */
  131. int
  132. joylink_dev_parse_ctrl(const char *pMsg, user_dev_status_t *userDev)
  133. {
  134. cJSON *pSub, *pJson;
  135. cJSON *pStreams;
  136. char tmp_str[64];
  137. int ret = -1;
  138. if (RT_NULL == pMsg || RT_NULL == userDev)
  139. {
  140. goto RET;
  141. }
  142. log_debug("json_org:%s", pMsg);
  143. pJson = cJSON_Parse(pMsg);
  144. if (RT_NULL == pJson)
  145. {
  146. log_error("--->:ERROR: pMsg is NULL\n");
  147. goto RET;
  148. }
  149. pStreams = cJSON_GetObjectItem(pJson, "streams");
  150. if (RT_NULL != pStreams)
  151. {
  152. int iSize = cJSON_GetArraySize(pStreams);
  153. int iCnt;
  154. for (iCnt = 0; iCnt < iSize; iCnt++)
  155. {
  156. pSub = cJSON_GetArrayItem(pStreams, iCnt);
  157. if (RT_NULL == pSub)
  158. {
  159. continue;
  160. }
  161. cJSON *pSId = cJSON_GetObjectItem(pSub, "stream_id");
  162. if (RT_NULL == pSId)
  163. {
  164. break;
  165. }
  166. cJSON *pV = cJSON_GetObjectItem(pSub, "current_value");
  167. if (RT_NULL == pV)
  168. {
  169. continue;
  170. }
  171. if (!strcmp(USER_DATA_POWER, pSId->valuestring))
  172. {
  173. if (pV->type == cJSON_String)
  174. {
  175. memset(tmp_str, 0, sizeof(tmp_str));
  176. strcpy(tmp_str, pV->valuestring);
  177. userDev->Power = atoi(tmp_str);
  178. }
  179. else if (pV->type == cJSON_Number)
  180. {
  181. userDev->Power = pV->valueint;
  182. }
  183. joylink_dev_user_data_set(USER_DATA_POWER, userDev);
  184. }
  185. if (!strcmp(USER_DATA_MARK, pSId->valuestring))
  186. {
  187. if (pV->type == cJSON_String)
  188. {
  189. memset(tmp_str, 0, sizeof(tmp_str));
  190. strcpy(tmp_str, pV->valuestring);
  191. userDev->Mark = atoi(tmp_str);
  192. }
  193. else if (pV->type == cJSON_Number)
  194. {
  195. userDev->Mark = pV->valueint;
  196. }
  197. joylink_dev_user_data_set(USER_DATA_MARK, userDev);
  198. }
  199. if (!strcmp(USER_DATA_SETTEMPERATURE, pSId->valuestring))
  200. {
  201. if (pV->type == cJSON_String)
  202. {
  203. memset(tmp_str, 0, sizeof(tmp_str));
  204. strcpy(tmp_str, pV->valuestring);
  205. userDev->SetTemperature = atof(tmp_str);
  206. }
  207. else if (pV->type == cJSON_Number)
  208. {
  209. userDev->SetTemperature = pV->valuedouble;
  210. }
  211. joylink_dev_user_data_set(USER_DATA_SETTEMPERATURE, userDev);
  212. }
  213. if (!strcmp(USER_DATA_CURRENTTEMPERATURE, pSId->valuestring))
  214. {
  215. if (pV->type == cJSON_String)
  216. {
  217. memset(tmp_str, 0, sizeof(tmp_str));
  218. strcpy(tmp_str, pV->valuestring);
  219. userDev->CurrentTemperature = atof(tmp_str);
  220. }
  221. else if (pV->type == cJSON_Number)
  222. {
  223. userDev->CurrentTemperature = pV->valuedouble;
  224. }
  225. joylink_dev_user_data_set(USER_DATA_CURRENTTEMPERATURE, userDev);
  226. }
  227. if (!strcmp(USER_DATA_CURRENTHUMIDITY, pSId->valuestring))
  228. {
  229. if (pV->type == cJSON_String)
  230. {
  231. memset(tmp_str, 0, sizeof(tmp_str));
  232. strcpy(tmp_str, pV->valuestring);
  233. userDev->CurrentHumidity = atof(tmp_str);
  234. }
  235. else if (pV->type == cJSON_Number)
  236. {
  237. userDev->CurrentHumidity = pV->valuedouble;
  238. }
  239. joylink_dev_user_data_set(USER_DATA_CURRENTHUMIDITY, userDev);
  240. }
  241. if (!strcmp(USER_DATA_BABYLOCK, pSId->valuestring))
  242. {
  243. if (pV->type == cJSON_String)
  244. {
  245. memset(tmp_str, 0, sizeof(tmp_str));
  246. strcpy(tmp_str, pV->valuestring);
  247. userDev->BabyLock = atoi(tmp_str);
  248. }
  249. else if (pV->type == cJSON_Number)
  250. {
  251. userDev->BabyLock = pV->valueint;
  252. }
  253. joylink_dev_user_data_set(USER_DATA_BABYLOCK, userDev);
  254. }
  255. if (!strcmp(USER_DATA_STATE, pSId->valuestring))
  256. {
  257. if (pV->type == cJSON_String)
  258. {
  259. memset(tmp_str, 0, sizeof(tmp_str));
  260. strcpy(tmp_str, pV->valuestring);
  261. userDev->State = atoi(tmp_str);
  262. }
  263. else if (pV->type == cJSON_Number)
  264. {
  265. userDev->State = pV->valueint;
  266. }
  267. joylink_dev_user_data_set(USER_DATA_STATE, userDev);
  268. }
  269. if (!strcmp(USER_DATA_ERROR, pSId->valuestring))
  270. {
  271. if (pV->type == cJSON_String)
  272. {
  273. memset(tmp_str, 0, sizeof(tmp_str));
  274. strcpy(tmp_str, pV->valuestring);
  275. userDev->Error = atoi(tmp_str);
  276. }
  277. else if (pV->type == cJSON_Number)
  278. {
  279. userDev->Error = pV->valueint;
  280. }
  281. joylink_dev_user_data_set(USER_DATA_ERROR, userDev);
  282. }
  283. if (!strcmp(USER_DATA_MODE, pSId->valuestring))
  284. {
  285. if (pV->type == cJSON_String)
  286. {
  287. memset(tmp_str, 0, sizeof(tmp_str));
  288. strcpy(tmp_str, pV->valuestring);
  289. userDev->Mode = atoi(tmp_str);
  290. }
  291. else if (pV->type == cJSON_Number)
  292. {
  293. userDev->Mode = pV->valueint;
  294. }
  295. joylink_dev_user_data_set(USER_DATA_MODE, userDev);
  296. }
  297. char *dout = cJSON_Print(pSub);
  298. if (RT_NULL != dout)
  299. {
  300. log_debug("org streams:%s", dout);
  301. free(dout);
  302. }
  303. }
  304. }
  305. cJSON_Delete(pJson);
  306. RET:
  307. return ret;
  308. }
  309. /* Generate json format data by user device information */
  310. char *
  311. joylink_dev_package_info(const int retCode, user_dev_status_t *userDev)
  312. {
  313. cJSON *root, *arrary;
  314. cJSON *data_Power, *data_Mark;
  315. cJSON *data_SetTemperature, *data_CurrentTemperature, *data_CurrentHumidity;
  316. cJSON *data_BabyLock, *data_State, *data_Error, *data_Mode;
  317. char *out = RT_NULL;
  318. char i2str[64];
  319. if (RT_NULL == userDev)
  320. {
  321. return RT_NULL;
  322. }
  323. root = cJSON_CreateObject();
  324. if (RT_NULL == root)
  325. {
  326. goto RET;
  327. }
  328. arrary = cJSON_CreateArray();
  329. if (RT_NULL == arrary)
  330. {
  331. cJSON_Delete(root);
  332. goto RET;
  333. }
  334. cJSON_AddNumberToObject(root, "code", retCode);
  335. cJSON_AddItemToObject(root, "streams", arrary);
  336. data_Power = cJSON_CreateObject();
  337. cJSON_AddItemToArray(arrary, data_Power);
  338. cJSON_AddStringToObject(data_Power, "stream_id", "Power");
  339. memset(i2str, 0, sizeof(i2str));
  340. sprintf(i2str, "%d", userDev->Power);
  341. cJSON_AddStringToObject(data_Power, "current_value", i2str);
  342. data_Mark = cJSON_CreateObject();
  343. cJSON_AddItemToArray(arrary, data_Mark);
  344. cJSON_AddStringToObject(data_Mark, "stream_id", "Mark");
  345. memset(i2str, 0, sizeof(i2str));
  346. sprintf(i2str, "%d", userDev->Mark);
  347. cJSON_AddStringToObject(data_Mark, "current_value", i2str);
  348. data_SetTemperature = cJSON_CreateObject();
  349. cJSON_AddItemToArray(arrary, data_SetTemperature);
  350. cJSON_AddStringToObject(data_SetTemperature, "stream_id", "SetTemperature");
  351. memset(i2str, 0, sizeof(i2str));
  352. sprintf(i2str, "%f", userDev->SetTemperature);
  353. cJSON_AddStringToObject(data_SetTemperature, "current_value", i2str);
  354. data_CurrentTemperature = cJSON_CreateObject();
  355. cJSON_AddItemToArray(arrary, data_CurrentTemperature);
  356. cJSON_AddStringToObject(data_CurrentTemperature, "stream_id", "CurrentTemperature");
  357. memset(i2str, 0, sizeof(i2str));
  358. sprintf(i2str, "%f", userDev->CurrentTemperature);
  359. cJSON_AddStringToObject(data_CurrentTemperature, "current_value", i2str);
  360. data_CurrentHumidity = cJSON_CreateObject();
  361. cJSON_AddItemToArray(arrary, data_CurrentHumidity);
  362. cJSON_AddStringToObject(data_CurrentHumidity, "stream_id", "CurrentHumidity");
  363. memset(i2str, 0, sizeof(i2str));
  364. sprintf(i2str, "%f", userDev->CurrentHumidity);
  365. cJSON_AddStringToObject(data_CurrentHumidity, "current_value", i2str);
  366. data_BabyLock = cJSON_CreateObject();
  367. cJSON_AddItemToArray(arrary, data_BabyLock);
  368. cJSON_AddStringToObject(data_BabyLock, "stream_id", "BabyLock");
  369. memset(i2str, 0, sizeof(i2str));
  370. sprintf(i2str, "%d", userDev->BabyLock);
  371. cJSON_AddStringToObject(data_BabyLock, "current_value", i2str);
  372. data_State = cJSON_CreateObject();
  373. cJSON_AddItemToArray(arrary, data_State);
  374. cJSON_AddStringToObject(data_State, "stream_id", "State");
  375. memset(i2str, 0, sizeof(i2str));
  376. sprintf(i2str, "%d", userDev->State);
  377. cJSON_AddStringToObject(data_State, "current_value", i2str);
  378. data_Error = cJSON_CreateObject();
  379. cJSON_AddItemToArray(arrary, data_Error);
  380. cJSON_AddStringToObject(data_Error, "stream_id", "Error");
  381. memset(i2str, 0, sizeof(i2str));
  382. sprintf(i2str, "%d", userDev->Error);
  383. cJSON_AddStringToObject(data_Error, "current_value", i2str);
  384. data_Mode = cJSON_CreateObject();
  385. cJSON_AddItemToArray(arrary, data_Mode);
  386. cJSON_AddStringToObject(data_Mode, "stream_id", "Mode");
  387. memset(i2str, 0, sizeof(i2str));
  388. sprintf(i2str, "%d", userDev->Mode);
  389. cJSON_AddStringToObject(data_Mode, "current_value", i2str);
  390. out=cJSON_Print(root);
  391. cJSON_Delete(root);
  392. RET:
  393. return out;
  394. }
  395. /* Get device information */
  396. static char * joylink_dev_modelcode_info(const int retCode, user_dev_status_t *userDev)
  397. {
  398. cJSON *root, *arrary, *element;
  399. char *out = RT_NULL;
  400. char i2str[32];
  401. if (RT_NULL == userDev)
  402. {
  403. return RT_NULL;
  404. }
  405. root = cJSON_CreateObject();
  406. if (RT_NULL == root)
  407. {
  408. goto RET;
  409. }
  410. arrary = cJSON_CreateArray();
  411. if (RT_NULL == arrary)
  412. {
  413. cJSON_Delete(root);
  414. goto RET;
  415. }
  416. cJSON_AddItemToObject(root, "model_codes", arrary);
  417. rt_memset(i2str, 0, sizeof(i2str));
  418. element = cJSON_CreateObject();
  419. cJSON_AddItemToArray(arrary, element);
  420. cJSON_AddStringToObject(element, "feedid", "247828880060773075");
  421. cJSON_AddStringToObject(element, "model_code", "12345678123456781234567812345678");
  422. out = cJSON_Print(root);
  423. cJSON_Delete(root);
  424. RET:
  425. return out;
  426. }
  427. /* device get model_code information data for the JSON format */
  428. int joylink_dev_get_modelcode(char *out_modelcode, int32_t out_max)
  429. {
  430. int len = 0;
  431. char *packet_data = RT_NULL;
  432. if (RT_NULL == out_modelcode || out_max < 0)
  433. {
  434. return 0;
  435. }
  436. packet_data = joylink_dev_modelcode_info(0, &user_dev);
  437. if (RT_NULL != packet_data)
  438. {
  439. len = rt_strlen(packet_data);
  440. log_debug("------>%s:len:%d\n", packet_data, len);
  441. if (len < out_max)
  442. {
  443. rt_memcpy(out_modelcode, packet_data, len);
  444. }
  445. }
  446. if (RT_NULL != packet_data)
  447. {
  448. rt_free(packet_data);
  449. }
  450. return len < out_max ? len : 0;
  451. }
  452. /* device get current device information data for the JSON foramt */
  453. int joylink_dev_get_snap_shot_with_retcode(int32_t ret_code, char *out_snap, int32_t out_max)
  454. {
  455. int len = 0;
  456. char *packet_data = RT_NULL;
  457. if (RT_NULL == out_snap || out_max < 0)
  458. {
  459. return 0;
  460. }
  461. packet_data = joylink_dev_package_info(ret_code, &user_dev);
  462. if (RT_NULL != packet_data)
  463. {
  464. len = rt_strlen(packet_data);
  465. log_debug("------>%s:len:%d\n", packet_data, len);
  466. if (len < out_max)
  467. {
  468. rt_memcpy(out_snap, packet_data, len);
  469. }
  470. }
  471. if (RT_NULL != packet_data)
  472. {
  473. rt_free(packet_data);
  474. }
  475. return len < out_max ? len : 0;
  476. }
  477. E_JLRetCode_t joylink_dev_script_ctrl(const char *src, int src_len, JLContrl_t *ctr, int from_server)
  478. {
  479. E_JLRetCode_t ret = E_RET_ERROR;
  480. time_t tt;
  481. if (RT_NULL == src || RT_NULL == ctr)
  482. {
  483. return E_RET_ERROR;
  484. }
  485. ctr->biz_code = (int)(*((int *)(src + 4)));
  486. ctr->serial = (int)(*((int *)(src +8)));
  487. tt = time(NULL);
  488. log_info("bcode:%d:server:%d:time:%ld", ctr->biz_code, from_server, (long)tt);
  489. if (ctr->biz_code == JL_BZCODE_GET_SNAPSHOT)
  490. {
  491. ret = E_RET_OK;
  492. }
  493. else if (ctr->biz_code == JL_BZCODE_CTRL)
  494. {
  495. joylink_dev_parse_ctrl(src + 12, &user_dev);
  496. return E_RET_OK;
  497. }
  498. else
  499. {
  500. log_error("unKown biz_code:%d", ctr->biz_code);
  501. }
  502. return ret;
  503. }
  504. #ifdef JOYLINK_USING_AUTO_INIT
  505. INIT_APP_EXPORT(joylink_start);
  506. #endif
  507. #ifdef FINSH_USING_MSH
  508. #include <finsh.h>
  509. MSH_CMD_EXPORT(joylink_start, joylink cloud work start);
  510. MSH_CMD_EXPORT(joylink_stop, joylink cloud work stop);
  511. MSH_CMD_EXPORT(joylink_config_reset, joylink wifi configuration reset);
  512. MSH_CMD_EXPORT(joylink_mode_change, joylink network configuration mode change);
  513. #endif /* FINSH_USING_MSH */