eko.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <stdint.h>
  6. #include <syslog.h>
  7. #include <stdarg.h>
  8. #include "../../status.h"
  9. #include "../../feeder.h"
  10. static uint32_t sensors_id;
  11. static double values_out[32];
  12. static uint32_t sensors_out[32];
  13. static int sensors_len;
  14. void (* feederLog)(int priority, const char * fmt, ...);
  15. int setLog(void * func)
  16. {
  17. feederLog = func;
  18. return 0;
  19. }
  20. int init(void * param)
  21. {
  22. param = param;
  23. return 0;
  24. }
  25. enum states {STATE_OFF = 0, STATE_TAG_START, STATE_TAG_BODY, STATE_TAG_CHILD, STATE_TAG_END};
  26. void stringAppend(char * string, char c)
  27. {
  28. unsigned int len;
  29. len = strlen(string);
  30. string[len] = c;
  31. string[len + 1] = 0;
  32. }
  33. enum idents {TAG_OFF = 0, TAG_NODEID, TAG_SENSOR};
  34. typedef struct type_t
  35. {
  36. char tag[32];
  37. int ident;
  38. int type_AA;
  39. int type_BBB;
  40. } type_t;
  41. struct type_t types[] =
  42. {
  43. {"internalTemp", 0, TYPE_THERMOMETER, 1},
  44. {"batteryV", 0, TYPE_VOLTAGE, 1},
  45. {"solarV", 0, TYPE_VOLTAGE, 2},
  46. {"humidity", 0, TYPE_HUMIDITY, 1},
  47. {"dewPoint", 0, TYPE_DEW_POINT, 1},
  48. {"temperature", 0, TYPE_THERMOMETER, 2},
  49. {"soilMoisture", 0, TYPE_HUMIDITY, 2},
  50. {"soilTemperature", 0, TYPE_THERMOMETER, 3},
  51. {"parent_rssi", 0, TYPE_LINK, 1},
  52. {"parent", 0, TYPE_LINK, 2},
  53. {"forwarded", 0, TYPE_LINK, 3},
  54. {"dropped", 0, TYPE_LINK, 4},
  55. {"packetNumber", 0, TYPE_LINK, 5},
  56. {"", TAG_OFF, 0, 0}
  57. };
  58. void tagAnalyze(char * tag, char * body)
  59. {
  60. static int type = TAG_OFF;
  61. static int sensor_type;
  62. int i;
  63. // printf("cmp %s %s\n", tag, body);
  64. switch (type)
  65. {
  66. case TAG_OFF:
  67. if ((strcmp(tag, "Name") == 0) && ((strcmp(body, "nodeid") == 0) || (strcmp(body, "nodeId") == 0)))
  68. {
  69. type = TAG_NODEID;
  70. }
  71. for (i = 0; strlen(types[i].tag) > 0; i++)
  72. {
  73. if ((strcmp(tag, "Name") == 0) && (strcmp(body, types[i].tag) == 0))
  74. {
  75. type = TAG_SENSOR;
  76. sensor_type = i;
  77. }
  78. }
  79. /*
  80. if ((strcmp(tag, "Name") == 0) && ((strcmp(body, "internaltemp") == 0) || (strcmp(body, "internalTemp") == 0)))
  81. {
  82. type = TAG_INTERNALTEMP;
  83. }
  84. if ((strcmp(tag, "Name") == 0) && ((strcmp(body, "solarv") == 0) || (strcmp(body, "solarV") == 0)))
  85. {
  86. type = TAG_SOLARV;
  87. }*/
  88. break;
  89. case TAG_NODEID:
  90. if (strcmp(tag, "ConvertedValue") == 0)
  91. {
  92. feederLog(LOG_DEBUG, "eko: nodeid %s\n", body);
  93. sensors_id = atoi(body);
  94. type = TAG_OFF;
  95. }
  96. break;
  97. case TAG_SENSOR:
  98. if (strcmp(tag, "ConvertedValue") == 0)
  99. {
  100. feederLog(LOG_DEBUG, "eko: sensor %s, value %s\n", types[sensor_type].tag, body);
  101. values_out[sensors_len] = atof(body);
  102. sensors_out[sensors_len] = types[sensor_type].type_AA * 10000000 + types[sensor_type].type_BBB * 10000;
  103. sensors_len++;
  104. type = TAG_OFF;
  105. }
  106. break;
  107. /* case TAG_INTERNALTEMP:
  108. if (strcmp(tag, "ConvertedValue") == 0)
  109. {
  110. feederLog(LOG_DEBUG, "eko: internal temperature %s\n", body);
  111. values_out[sensors_len] = atof(body);
  112. sensors_out[sensors_len] = TYPE_THERMOMETER * 10000000 + 1 * 10000;
  113. sensors_len++;
  114. type = TAG_OFF;
  115. }
  116. break;
  117. case TAG_SOLARV:
  118. if (strcmp(tag, "ConvertedValue") == 0)
  119. {
  120. feederLog(LOG_DEBUG, "eko: solar voltage %s\n", body);
  121. values_out[sensors_len] = atof(body);
  122. sensors_out[sensors_len] = TYPE_VOLTAGE * 10000000 + 2 * 10000;
  123. sensors_len++;
  124. type = TAG_OFF;
  125. }
  126. break;
  127. */
  128. }
  129. }
  130. void stateMachine(char c)
  131. {
  132. static int state = STATE_OFF;
  133. static char body[256], tag[256];
  134. if ((c < 0x21))
  135. return;
  136. //printf("%c ", c);
  137. switch (state)
  138. {
  139. case STATE_OFF:
  140. body[0] = tag[0] = 0;
  141. if (c == '<')
  142. {
  143. state = STATE_TAG_START;
  144. }
  145. break;
  146. case STATE_TAG_BODY:
  147. if (c == '<')
  148. {
  149. state = STATE_TAG_CHILD;
  150. // feederLog(LOG_DEBUG, "eko: body %s, tag %s\n", body, tag);
  151. tagAnalyze(tag, body);
  152. body[0] = 0;
  153. tag[0] = 0;
  154. }
  155. else
  156. stringAppend(body, c);
  157. break;
  158. case STATE_TAG_CHILD:
  159. if (c == '/')
  160. {
  161. state = STATE_TAG_END;
  162. break;
  163. }
  164. else
  165. state = STATE_TAG_START;
  166. case STATE_TAG_START:
  167. if (c == '>')
  168. {
  169. state = STATE_TAG_BODY;
  170. // feederLog(LOG_DEBUG, "eko: tag %s\n", tag);
  171. }
  172. else
  173. {
  174. if (c == '/')
  175. {
  176. state = STATE_TAG_END;
  177. }
  178. else
  179. stringAppend(tag, c);
  180. }
  181. break;
  182. case STATE_TAG_END:
  183. if (c == '>')
  184. state = STATE_OFF;
  185. break;
  186. default:
  187. state = STATE_OFF;
  188. break;
  189. }
  190. }
  191. unsigned int process(int fd, unsigned char * data, unsigned int length, unsigned long long int * id, time_t * tm, double * result_array, uint32_t * sensors, unsigned int * type)
  192. {
  193. unsigned int ret = 0;
  194. unsigned int i;
  195. feederLog(LOG_DEBUG, "eko: processing data\n");
  196. sensors_len = 0;
  197. for (i = 0; i < length;i++)
  198. {
  199. stateMachine(data[i]);
  200. }
  201. *id = sensors_id;
  202. *tm = time(NULL);
  203. *type = VALUES_TYPE_OBS;
  204. memcpy(result_array, values_out, sizeof(double) * sensors_len);
  205. memcpy(sensors, sensors_out, sizeof(uint32_t) * sensors_len);
  206. ret = sensors_len;
  207. return ret;
  208. }
  209. unsigned int reply(unsigned char * data)
  210. {
  211. return 0;
  212. }
  213. int open(int socket)
  214. {
  215. feederLog(LOG_DEBUG, "eko: socket %d opened\n", socket);
  216. return 0;
  217. }
  218. int close(int socket)
  219. {
  220. feederLog(LOG_DEBUG, "eko: socket %d closed\n", socket);
  221. return 0;
  222. }