uechopost.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /******************************************************************
  2. *
  3. * uEcho for C
  4. *
  5. * Copyright (C) Satoshi Konno 2015
  6. *
  7. * This is licensed under BSD-style license, see file COPYING.
  8. *
  9. ******************************************************************/
  10. #include <stdio.h>
  11. #include <uecho/uecho.h>
  12. #include <unistd.h>
  13. const int UECHOPOST_MAX_RESPONSE_MTIME = 5000;
  14. const int UECHOPOST_RESPONSE_RETRY_COUNT = 100;
  15. void usage()
  16. {
  17. printf("Usage : uechopost [options] <address> <obj> <esv> <property (epc, pdc, edt) ...>\n");
  18. printf(" -v : Enable verbose output\n");
  19. printf(" -h : Print this message\n");
  20. printf(" -d : Enable debug output\n");
  21. }
  22. void uechopost_print_messages(uEchoController* ctrl, uEchoMessage* msg)
  23. {
  24. uEchoProperty* prop;
  25. size_t opc, n;
  26. opc = uecho_message_getopc(msg);
  27. printf("%s %2X %2X %04X %06X %06X %02X %ld ",
  28. uecho_message_getsourceaddress(msg),
  29. uecho_message_getehd1(msg),
  30. uecho_message_getehd2(msg),
  31. uecho_message_gettid(msg),
  32. uecho_message_getsourceobjectcode(msg),
  33. uecho_message_getdestinationobjectcode(msg),
  34. uecho_message_getesv(msg),
  35. opc);
  36. for (n = 0; n < opc; n++) {
  37. prop = uecho_message_getproperty(msg, n);
  38. printf("%02X(%ld)", uecho_property_getcode(prop), uecho_property_getdatasize(prop));
  39. }
  40. printf("\n");
  41. }
  42. void uechopost_print_objectresponse(uEchoController* ctrl, uEchoMessage* msg)
  43. {
  44. uEchoProperty* prop;
  45. int opc, n, prop_data_size, np;
  46. byte* prop_data;
  47. opc = uecho_message_getopc(msg);
  48. printf("%s %06X %02X ",
  49. uecho_message_getsourceaddress(msg),
  50. uecho_message_getsourceobjectcode(msg),
  51. uecho_message_getesv(msg));
  52. for (n = 0; n < opc; n++) {
  53. prop = uecho_message_getproperty(msg, n);
  54. prop_data_size = uecho_property_getdatasize(prop);
  55. if (prop_data_size == 0) {
  56. printf("%02X%02X ", uecho_property_getcode(prop), prop_data_size);
  57. continue;
  58. }
  59. prop_data = uecho_property_getdata(prop);
  60. printf("%02X%02X", uecho_property_getcode(prop), prop_data_size);
  61. for (np = 0; np < prop_data_size; np++) {
  62. printf("%02X", prop_data[np]);
  63. }
  64. printf(" ");
  65. }
  66. printf("\n");
  67. }
  68. void uechopost_controlpoint_listener(uEchoController* ctrl, uEchoMessage* msg)
  69. {
  70. uechopost_print_messages(ctrl, msg);
  71. }
  72. int main(int argc, char* argv[])
  73. {
  74. bool verbose_mode;
  75. bool debug_mode;
  76. uEchoController* ctrl;
  77. uEchoNode* dst_node;
  78. char* dst_node_addr;
  79. uEchoObjectCode dst_obj_code;
  80. uEchoObject* dst_obj;
  81. uEchoMessage *msg, *res_msg;
  82. int esv;
  83. char *edata, *edt;
  84. size_t edt_size;
  85. int epc, pdc, edt_byte;
  86. int n;
  87. byte* prop_data;
  88. bool is_response_required;
  89. int c;
  90. // Parse options
  91. verbose_mode = false;
  92. debug_mode = false;
  93. while ((c = getopt(argc, argv, "vhd")) != -1) {
  94. switch (c) {
  95. case 'v': {
  96. verbose_mode = true;
  97. } break;
  98. case 'd': {
  99. debug_mode = true;
  100. } break;
  101. case 'h': {
  102. usage();
  103. return EXIT_SUCCESS;
  104. }
  105. default: {
  106. usage();
  107. return EXIT_FAILURE;
  108. }
  109. }
  110. }
  111. argc -= optind;
  112. argv += optind;
  113. if (argc < 4) {
  114. usage();
  115. return EXIT_FAILURE;
  116. }
  117. // Debug mode
  118. if (debug_mode) {
  119. uecho_log_setlevel(UECHO_LOG_DEBUG);
  120. }
  121. // Start controller
  122. ctrl = uecho_controller_new();
  123. if (!ctrl)
  124. return EXIT_FAILURE;
  125. if (verbose_mode) {
  126. uecho_controller_setmessagelistener(ctrl, uechopost_controlpoint_listener);
  127. }
  128. // Start controller and search objects
  129. if (!uecho_controller_start(ctrl))
  130. return EXIT_FAILURE;
  131. uecho_controller_search(ctrl);
  132. // Find destination node
  133. dst_node_addr = argv[0];
  134. dst_node = NULL;
  135. for (n = 0; n < UECHOPOST_RESPONSE_RETRY_COUNT; n++) {
  136. uecho_sleep(UECHOPOST_MAX_RESPONSE_MTIME / UECHOPOST_RESPONSE_RETRY_COUNT);
  137. dst_node = uecho_controller_getnodebyaddress(ctrl, dst_node_addr);
  138. if (dst_node)
  139. break;
  140. }
  141. if (!dst_node) {
  142. printf("Node (%s) is not found\n", dst_node_addr);
  143. uecho_controller_delete(ctrl);
  144. return EXIT_FAILURE;
  145. }
  146. // Find destination object
  147. sscanf(argv[1], "%x", &dst_obj_code);
  148. dst_obj = uecho_node_getobjectbycode(dst_node, dst_obj_code);
  149. if (!dst_node) {
  150. printf("Node (%s) doesn't has the specified object (%06X)\n", dst_node_addr, dst_obj_code);
  151. uecho_controller_delete(ctrl);
  152. return EXIT_FAILURE;
  153. }
  154. // Create Message
  155. msg = uecho_message_new();
  156. sscanf(argv[2], "%x", &esv);
  157. uecho_message_setesv(msg, esv);
  158. uecho_message_setdestinationobjectcode(msg, uecho_object_getcode(dst_obj));
  159. #if defined(DEBUG)
  160. printf("%s %06X %01X\n", dst_node_addr, dst_obj_code, esv);
  161. #endif
  162. edata = edt = argv[3];
  163. edt_size = strlen(argv[3]);
  164. while ((edt - edata + (2 + 2)) <= edt_size) {
  165. sscanf(edt, "%02x%02x", &epc, &pdc);
  166. edt += (2 + 2);
  167. #if defined(DEBUG)
  168. printf("[%02X] = %02X ", epc, pdc);
  169. #endif
  170. if (pdc == 0) {
  171. uecho_message_setproperty(msg, epc, NULL, 0);
  172. continue;
  173. }
  174. if (edt_size < (edt - edata + (pdc * 2)))
  175. break;
  176. prop_data = (byte*)malloc(pdc);
  177. for (n = 0; n < pdc; n++) {
  178. sscanf(edt, "%02x", &edt_byte);
  179. #if defined(DEBUG)
  180. printf("%02X", edt_byte);
  181. #endif
  182. prop_data[n] = edt_byte & 0xFF;
  183. edt += 2;
  184. }
  185. uecho_message_setproperty(msg, epc, prop_data, pdc);
  186. free(prop_data);
  187. }
  188. #if defined(DEBUG)
  189. printf("\n");
  190. #endif
  191. // Send message
  192. is_response_required = uecho_message_isresponserequired(msg);
  193. if (is_response_required) {
  194. res_msg = uecho_message_new();
  195. if (uecho_controller_postmessage(ctrl, dst_node, msg, res_msg)) {
  196. uechopost_print_objectresponse(ctrl, res_msg);
  197. }
  198. uecho_message_delete(res_msg);
  199. }
  200. else {
  201. uecho_controller_sendmessage(ctrl, dst_node, msg);
  202. }
  203. uecho_message_delete(msg);
  204. // Stop controller
  205. uecho_controller_stop(ctrl);
  206. uecho_controller_delete(ctrl);
  207. return EXIT_SUCCESS;
  208. }