logapacts2.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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. typedef struct logapackts_header_t
  11. {
  12. uint8_t mac[6];
  13. uint8_t body_nb;
  14. uint8_t index;
  15. uint8_t status;
  16. uint16_t event;
  17. time_t timestamp;
  18. } __attribute__((packed)) logapackts_header_t;
  19. typedef struct logapackts_t
  20. {
  21. uint8_t start;
  22. struct logapackts_header_t header;
  23. uint8_t body[256];
  24. uint8_t chs;
  25. uint8_t end;
  26. } __attribute__((packed)) logapackts_t;
  27. typedef struct logapackts_reply_t
  28. {
  29. uint8_t start;
  30. uint8_t ack;
  31. time_t timestamp;
  32. uint8_t index;
  33. uint8_t chs;
  34. uint8_t end;
  35. } __attribute__((packed)) logapackts_reply_t;
  36. typedef struct logapackts_index_t
  37. {
  38. uint8_t mac[6];
  39. uint8_t index;
  40. struct logapackts_index_t * next;
  41. } logapackts_index_t;
  42. struct logapackts_index_t * indexes;
  43. uint16_t byteSwap16(uint16_t value)
  44. {
  45. uint16_t swapped;
  46. swapped = (((0x00FF) & (value >> 8)) |
  47. ((0xFF00) & (value << 8)));
  48. return swapped;
  49. }
  50. uint32_t byteSwap32(uint32_t value)
  51. {
  52. uint32_t swapped;
  53. swapped = (((0x000000FF) & (value >> 24)) |
  54. ((0x0000FF00) & (value >> 8)) |
  55. ((0x00FF0000) & (value << 8)) |
  56. ((0xFF000000) & (value << 24)));
  57. return swapped;
  58. }
  59. uint64_t byteSwap64(uint64_t value)
  60. {
  61. uint64_t swapped;
  62. swapped = (((0x00000000000000FFULL) & (value >> 56)) |
  63. ((0x000000000000FF00ULL) & (value >> 40)) |
  64. ((0x0000000000FF0000ULL) & (value >> 24)) |
  65. ((0x00000000FF000000ULL) & (value >> 8)) |
  66. ((0x000000FF00000000ULL) & (value << 8)) |
  67. ((0x0000FF0000000000ULL) & (value << 24)) |
  68. ((0x00FF000000000000ULL) & (value << 40)) |
  69. ((0xFF00000000000000ULL) & (value << 56)));
  70. return swapped;
  71. }
  72. uint8_t calcChs(unsigned char * data, unsigned int len)
  73. {
  74. uint8_t res;
  75. unsigned int i;
  76. res = 0;
  77. for(i = 0;i < len; i++)
  78. {
  79. res += data[i];
  80. }
  81. res = ~res;
  82. return res;
  83. }
  84. unsigned int deescape(unsigned char * data, unsigned int len)
  85. {
  86. unsigned int i, dest;
  87. for (dest = 0, i = 0; i < len; i++)
  88. {
  89. if (data[i] == 0x09)
  90. data[++i] -= 0x20;
  91. data[dest++] = data[i];
  92. }
  93. return dest;
  94. }
  95. unsigned int escape(unsigned char * data, unsigned int len)
  96. {
  97. unsigned int i, dest;
  98. unsigned char temp[sizeof(logapackts_reply_t)];
  99. memcpy(temp, data, len);
  100. for (dest = 0, i = 0; i < len; i++)
  101. {
  102. if ((temp[i] == 0x02) || (temp[i] == 0x03) || (temp[i] == 0x09))
  103. {
  104. data[dest++] = 0x09;
  105. data[dest++] = temp[i] + 0x20;
  106. }
  107. else
  108. data[dest++] = temp[i];
  109. // printf("z %d %X\n", dest - 1, data[dest - 1]);
  110. }
  111. return dest;
  112. }
  113. struct logapackts_t logapackts;
  114. struct logapackts_index_t * indexNew(uint8_t * mac, uint8_t index_no)
  115. {
  116. struct logapackts_index_t * new_index;
  117. new_index = malloc(sizeof(struct logapackts_index_t));
  118. if (new_index == NULL)
  119. return NULL;
  120. memcpy(new_index->mac, mac, 6);
  121. new_index->index = index_no;
  122. new_index->next = NULL;
  123. return new_index;
  124. }
  125. int indexScan(uint8_t * mac, uint8_t index_no)
  126. {
  127. struct logapackts_index_t * index_scan, * index_prev;
  128. index_scan = indexes;
  129. index_prev = NULL;
  130. while (index_scan != NULL)
  131. {
  132. if (memcmp(mac, index_scan->mac, 6) == 0)
  133. {
  134. if (index_scan->index == index_no)
  135. return 1;
  136. else
  137. {
  138. index_scan->index = index_no;
  139. return 0;
  140. }
  141. }
  142. index_prev = index_scan;
  143. index_scan = index_scan->next;
  144. }
  145. index_scan = indexNew(mac, index_no);
  146. if (indexes == NULL)
  147. indexes = index_scan;
  148. else
  149. index_prev->next = index_scan;
  150. return 0;
  151. }
  152. int init(void * param)
  153. {
  154. indexes = NULL;
  155. return 0;
  156. }
  157. void (* feederLog)(int priority, const char * fmt, ...);
  158. int setLog(void * func)
  159. {
  160. feederLog = func;
  161. return 0;
  162. }
  163. unsigned int reply(unsigned char * data)
  164. {
  165. struct logapackts_reply_t * logapackts_reply;
  166. unsigned int len;
  167. logapackts_reply = (struct logapackts_reply_t *)data;
  168. logapackts_reply->start = 0x02;
  169. logapackts_reply->ack = 0x06;
  170. logapackts_reply->timestamp = byteSwap32(time(NULL));
  171. logapackts_reply->index = logapackts.header.index;
  172. logapackts_reply->chs = calcChs((unsigned char *)logapackts_reply + 1, sizeof(logapackts_reply_t) - 3);
  173. logapackts_reply->end = 0x03;
  174. len = escape(data + 1, sizeof(logapackts_reply_t) - 2);
  175. data[len + 2 - 1] = 0x03; //again end sign because of escaping, crap
  176. feederLog(LOG_DEBUG, "Logapacts2: replying\n");
  177. return len + 2;
  178. }
  179. unsigned int parse(unsigned char * data, unsigned int length)
  180. {
  181. length = deescape(data + 1, length - 2);
  182. memcpy(&logapackts.header, data + sizeof(unsigned char), sizeof(logapackts_header_t));
  183. memcpy(logapackts.body, data + sizeof(unsigned char) + sizeof(logapackts_header_t), logapackts.header.body_nb);
  184. return length;
  185. }
  186. unsigned int process(unsigned char * data, unsigned int length, unsigned long long int * id, time_t * tm, unsigned int * status, unsigned char * result, unsigned int * pbb_status, unsigned int * data_type)
  187. {
  188. int i;
  189. struct tm * t;
  190. uint16_t * events;
  191. uint16_t type;
  192. /*
  193. data[17] = 255;
  194. for (i = 0; i < length; i++)
  195. printf("%0X, ", data[i]);
  196. printf("\n");
  197. */
  198. /*
  199. length = deescape(data + 1, length - 2);
  200. memcpy(&logapackts.header, data + sizeof(unsigned char), sizeof(logapackts_header_t));
  201. memcpy(logapackts.body, data + sizeof(unsigned char) + sizeof(logapackts_header_t), logapackts.header.body_nb);
  202. */
  203. parse(data, length);
  204. *id = 0;
  205. for (i = 0;i < 6; i++)
  206. ((unsigned char *)(id))[i] = logapackts.header.mac[5 - i];
  207. *tm = byteSwap32(logapackts.header.timestamp);
  208. *status = 0;
  209. *pbb_status = logapackts.header.status;
  210. type = byteSwap16(logapackts.header.event);
  211. feederLog(LOG_DEBUG, "Logapacts2: packet from ");
  212. for (i = 0; i < 6;i++)
  213. feederLog(LOG_DEBUG, "%02X ", logapackts.header.mac[i]);
  214. feederLog(LOG_DEBUG, " , type %05d\n", type);
  215. t = gmtime(tm);
  216. feederLog(LOG_DEBUG, "Logapacts2: %llu, on %04d-%02d-%02d %02d:%02d:%02d\n",
  217. *id, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
  218. events = (uint16_t *)logapackts.body;
  219. /*
  220. for (i = 0; i < 32; i++)
  221. printf("%0X, ", byteSwap16(events[i]));
  222. printf("\n");
  223. events[0] = 0;
  224. */
  225. result[0] = 0;
  226. for (i = 0; i < 31; i++)
  227. sprintf(result + strlen(result), "'NULL',");
  228. if (type == 5000)
  229. {
  230. result[0] = 0;
  231. for (i = 0; i < 16; i++)
  232. sprintf(result + strlen(result), "'%d',", byteSwap16(events[i]));
  233. for (i = 0; i < 15; i++)
  234. sprintf(result + strlen(result), "'NULL',");
  235. }
  236. if (type == 4000)
  237. {
  238. result[0] = 0;
  239. for (i = 0; i < 16; i++)
  240. sprintf(result + strlen(result), "'NULL',");
  241. for (i = 0; i < 15; i++)
  242. sprintf(result + strlen(result), "'%d',", byteSwap16(events[i]));
  243. }
  244. if (type == 1501)
  245. {
  246. result[0] = 0;
  247. sprintf(result + strlen(result), "'%d',", byteSwap16(events[0]));
  248. for (i = 0; i < 15; i++)
  249. sprintf(result + strlen(result), "'NULL',");
  250. for (i = 0; i < 15; i++)
  251. sprintf(result + strlen(result), "'NULL',");
  252. *data_type = LOGAPACTS_ID;
  253. }
  254. sprintf(result + strlen(result), "'%d',", logapackts.header.index);
  255. result[strlen(result) - 1] = 0; //remove last ','
  256. feederLog(LOG_DEBUG, "Logapacts2: decoded values %s\n", result);
  257. if (indexScan(logapackts.header.mac, logapackts.header.index))
  258. {
  259. feederLog(LOG_DEBUG, "Logapacts2: same index %d, omitting packet \n", logapackts.header.index);
  260. return 0;
  261. }
  262. return 32;
  263. }
  264. unsigned int processId(unsigned char * data, unsigned int length, unsigned int * id_code, unsigned char * name, unsigned char * group)
  265. {
  266. uint16_t type;
  267. type = byteSwap16(logapackts.header.event);
  268. feederLog(LOG_DEBUG, "Logapacts2: decoded type %05d\n", type);
  269. if (type == 1501)
  270. // if (1)
  271. {
  272. *id_code = 1501;
  273. strncpy(name, logapackts.body, logapackts.header.body_nb);
  274. // sprintf(name, "testovaci jmeno");
  275. group[0] = 0;
  276. // sprintf(group, "testovaci grupa");
  277. feederLog(LOG_DEBUG, "Logapacts2: decoded id name %s, group %s\n", name, group);
  278. return 1;
  279. }
  280. else
  281. return 0;
  282. }