pando_device_register.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "pando_device_register.h"
  2. #include "pando_storage_interface.h"
  3. #include "pando_sys.h"
  4. #include "pando_types.h"
  5. #include "jsonparse.h"
  6. #include "jsontree.h"
  7. #include "pando_json.h"
  8. #include "pando_net_http.h"
  9. #include "platform_miscellaneous_interface.h"
  10. #define MAX_BUF_LEN 256
  11. #define DEVICE_SERIAL_BUF_LEN 16
  12. #define BIG_INT_BUF_LEN 21
  13. #define KEY_BUF_LEN 96
  14. #define MSG_BUF_LEN 32
  15. extern char* g_server_url;
  16. static gateway_callback device_register_callback = NULL;
  17. static char* request = NULL;
  18. static void http_callback_register(char * response)
  19. {
  20. if(request != NULL)
  21. {
  22. pd_free(request);
  23. request = NULL;
  24. }
  25. if(NULL == response)
  26. {
  27. pd_printf("http request failed\n");
  28. if(device_register_callback != NULL)
  29. {
  30. device_register_callback(PANDO_REGISTER_FAIL);
  31. return;
  32. }
  33. }
  34. pd_printf("response=%s\n(end)\n", response);
  35. uint16_t response_len = pd_strlen(response) + 1;
  36. char* register_response = (char*)pd_malloc(response_len);
  37. pd_memset(register_response, 0, response_len);
  38. pd_memcpy(register_response, response, response_len);
  39. struct jsonparse_state json_state;
  40. jsonparse_setup(&json_state, response, pd_strlen(response));
  41. uint8_t code;
  42. char message[MSG_BUF_LEN];
  43. long device_id;
  44. char device_secret[KEY_BUF_LEN];
  45. char device_key[KEY_BUF_LEN];
  46. int type;
  47. while ((type = jsonparse_next(&json_state)) != 0)
  48. {
  49. if (type == JSON_TYPE_PAIR_NAME)
  50. {
  51. if(jsonparse_strcmp_value(&json_state, "code") == 0)
  52. {
  53. jsonparse_next(&json_state);
  54. jsonparse_next(&json_state);
  55. code = jsonparse_get_value_as_int(&json_state);
  56. }
  57. else if(jsonparse_strcmp_value(&json_state, "message") == 0)
  58. {
  59. jsonparse_next(&json_state);
  60. jsonparse_next(&json_state);
  61. jsonparse_copy_value(&json_state, message, MSG_BUF_LEN);
  62. }
  63. else if(jsonparse_strcmp_value(&json_state, "data") == 0)
  64. {
  65. while((type = jsonparse_next(&json_state)) != 0 && json_state.depth > 1)
  66. {
  67. if(type == JSON_TYPE_PAIR_NAME)
  68. {
  69. if(jsonparse_strcmp_value(&json_state, "device_id") == 0)
  70. {
  71. jsonparse_next(&json_state);
  72. jsonparse_next(&json_state);
  73. device_id = jsonparse_get_value_as_long(&json_state);
  74. }
  75. else if(jsonparse_strcmp_value(&json_state, "device_secret") == 0)
  76. {
  77. jsonparse_next(&json_state);
  78. jsonparse_next(&json_state);
  79. jsonparse_copy_value(&json_state, device_secret, KEY_BUF_LEN);
  80. }
  81. else if(jsonparse_strcmp_value(&json_state, "device_key") == 0)
  82. {
  83. jsonparse_next(&json_state);
  84. jsonparse_next(&json_state);
  85. jsonparse_copy_value(&json_state, device_key, KEY_BUF_LEN);
  86. }
  87. }
  88. }
  89. }
  90. }
  91. }
  92. if(register_response != NULL)
  93. {
  94. pd_free(register_response);
  95. }
  96. if(code != 0)
  97. {
  98. pd_printf("device register failed: %s\n", message);
  99. if(device_register_callback != NULL)
  100. {
  101. device_register_callback(PANDO_REGISTER_FAIL);
  102. return;
  103. }
  104. }
  105. pd_printf("device register success, id: %d, secret : %s, key : %s\n",
  106. device_id, device_secret, device_key);
  107. char str_device_id[BIG_INT_BUF_LEN];
  108. pd_sprintf(str_device_id, "%d", device_id);
  109. pd_printf("saving device info to storage...\n");
  110. pando_data_set(DATANAME_DEVICE_ID, str_device_id);
  111. pando_data_set(DATANAME_DEVICE_SECRET, device_secret);
  112. pando_data_set(DATANAME_DEVICE_KEY, device_key);
  113. pd_printf("done...\n");
  114. if(device_register_callback != NULL)
  115. {
  116. device_register_callback(PANDO_REGISTER_OK);
  117. }
  118. }
  119. void pando_device_register(gateway_callback callback)
  120. {
  121. pd_printf("PANDO begin register device...\n");
  122. if(callback != NULL)
  123. {
  124. device_register_callback = callback;
  125. }
  126. char * str_device_id = NULL;
  127. char * str_device_secret = NULL;
  128. char * str_device_key = NULL;
  129. str_device_id = pando_data_get(DATANAME_DEVICE_ID);
  130. str_device_secret = pando_data_get(DATANAME_DEVICE_SECRET);
  131. str_device_key = pando_data_get(DATANAME_DEVICE_KEY);
  132. char str_device_serial[DEVICE_SERIAL_BUF_LEN];
  133. get_device_serial(str_device_serial);
  134. str_device_serial[DEVICE_SERIAL_BUF_LEN - 1] = 0;
  135. pd_printf("device_serial:%s\n", str_device_serial);
  136. // try register device via HTTP
  137. struct jsontree_string json_product_key = JSONTREE_STRING(PRODUCT_KEY);
  138. struct jsontree_string json_device_code = JSONTREE_STRING(str_device_serial);
  139. struct jsontree_int json_device_type = JSONTREE_INT(1);
  140. struct jsontree_string json_device_module = JSONTREE_STRING(PANDO_DEVICE_MODULE);
  141. struct jsontree_string json_version = JSONTREE_STRING(PANDO_SDK_VERSION);
  142. JSONTREE_OBJECT_EXT(device_info,
  143. JSONTREE_PAIR("product_key", &json_product_key),
  144. JSONTREE_PAIR("device_code", &json_device_code),
  145. JSONTREE_PAIR("device_type", &json_device_type),
  146. JSONTREE_PAIR("device_module", &json_device_module),
  147. JSONTREE_PAIR("version", &json_version)
  148. );
  149. request = (char *)pd_malloc(MAX_BUF_LEN);
  150. int ret = pando_json_print((struct jsontree_value*)(&device_info), request, MAX_BUF_LEN);
  151. pd_printf("device register request:::\n%s\n(end)\n", request);
  152. char post_url[128] = "";
  153. pd_sprintf(post_url, "%s/v1/devices/registration", PANDO_API_URL);
  154. net_http_post(post_url, request, http_callback_register);
  155. if(request != NULL)
  156. {
  157. pd_free(request);
  158. request = NULL;
  159. }
  160. }