PageRenderTime 115ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/API/mercuryapi-1.29.4.34/c/src/samples/untraceable.c

https://bitbucket.org/jrevell_ortus/isa-application-linux-demo
C | 431 lines | 279 code | 65 blank | 87 comment | 37 complexity | c7b9485a2d683720732f000eb0bb1dae MD5 | raw file
  1. /**
  2. * Sample program that to demonstrate the usage of Gen2v2 untraceable.
  3. * @file untraceable.c
  4. */
  5. #include <tm_reader.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stdarg.h>
  9. #include <string.h>
  10. #include <inttypes.h>
  11. #if WIN32
  12. #define snprintf sprintf_s
  13. #endif
  14. /* Enable this to use transportListener */
  15. #ifndef USE_TRANSPORT_LISTENER
  16. #define USE_TRANSPORT_LISTENER 0
  17. #endif
  18. #define usage() {errx(1, "Please provide reader URL, such as:\n"\
  19. "tmr:///com4 or tmr:///com4 --ant 1,2\n"\
  20. "tmr://my-reader.example.com or tmr://my-reader.example.com --ant 1,2\n");}
  21. void errx(int exitval, const char *fmt, ...)
  22. {
  23. va_list ap;
  24. va_start(ap, fmt);
  25. vfprintf(stderr, fmt, ap);
  26. exit(exitval);
  27. }
  28. void checkerr(TMR_Reader* rp, TMR_Status ret, int exitval, const char *msg)
  29. {
  30. if (TMR_SUCCESS != ret)
  31. {
  32. errx(exitval, "Error %s: %s\n", msg, TMR_strerr(rp, ret));
  33. }
  34. }
  35. void serialPrinter(bool tx, uint32_t dataLen, const uint8_t data[],
  36. uint32_t timeout, void *cookie)
  37. {
  38. FILE *out = cookie;
  39. uint32_t i;
  40. fprintf(out, "%s", tx ? "Sending: " : "Received:");
  41. for (i = 0; i < dataLen; i++)
  42. {
  43. if (i > 0 && (i & 15) == 0)
  44. {
  45. fprintf(out, "\n ");
  46. }
  47. fprintf(out, " %02x", data[i]);
  48. }
  49. fprintf(out, "\n");
  50. }
  51. void stringPrinter(bool tx,uint32_t dataLen, const uint8_t data[],uint32_t timeout, void *cookie)
  52. {
  53. FILE *out = cookie;
  54. fprintf(out, "%s", tx ? "Sending: " : "Received:");
  55. fprintf(out, "%s\n", data);
  56. }
  57. void parseAntennaList(uint8_t *antenna, uint8_t *antennaCount, char *args)
  58. {
  59. char *token = NULL;
  60. char *str = ",";
  61. uint8_t i = 0x00;
  62. int scans;
  63. /* get the first token */
  64. if (NULL == args)
  65. {
  66. fprintf(stdout, "Missing argument\n");
  67. usage();
  68. }
  69. token = strtok(args, str);
  70. if (NULL == token)
  71. {
  72. fprintf(stdout, "Missing argument after %s\n", args);
  73. usage();
  74. }
  75. while(NULL != token)
  76. {
  77. scans = sscanf(token, "%"SCNu8, &antenna[i]);
  78. if (1 != scans)
  79. {
  80. fprintf(stdout, "Can't parse '%s' as an 8-bit unsigned integer value\n", token);
  81. usage();
  82. }
  83. i++;
  84. token = strtok(NULL, str);
  85. }
  86. *antennaCount = i;
  87. }
  88. void ReadTags(TMR_Reader* rp)
  89. {
  90. TMR_Status ret;
  91. ret = TMR_read(rp, 500, NULL);
  92. if (TMR_ERROR_TAG_ID_BUFFER_FULL == ret)
  93. {
  94. /* In case of TAG ID Buffer Full, extract the tags present
  95. * in buffer.
  96. */
  97. fprintf(stdout, "reading tags:%s\n", TMR_strerr(rp, ret));
  98. }
  99. else
  100. {
  101. checkerr(rp, ret, 1, "reading tags");
  102. }
  103. while (TMR_SUCCESS == TMR_hasMoreTags(rp))
  104. {
  105. TMR_TagReadData trd;
  106. char epcStr[128];
  107. char timeStr[128];
  108. uint8_t dataBuf[256];
  109. ret = TMR_TRD_init_data(&trd, sizeof(dataBuf)/sizeof(uint8_t), dataBuf);
  110. checkerr(rp, ret, 1, "creating tag read data");
  111. ret = TMR_getNextTag(rp, &trd);
  112. checkerr(rp, ret, 1, "fetching tag");
  113. TMR_bytesToHex(trd.tag.epc, trd.tag.epcByteCount, epcStr);
  114. #ifdef WIN32
  115. {
  116. FILETIME ft, utc;
  117. SYSTEMTIME st;
  118. char* timeEnd;
  119. char* end;
  120. utc.dwHighDateTime = trd.timestampHigh;
  121. utc.dwLowDateTime = trd.timestampLow;
  122. FileTimeToLocalFileTime( &utc, &ft );
  123. FileTimeToSystemTime( &ft, &st );
  124. timeEnd = timeStr + sizeof(timeStr)/sizeof(timeStr[0]);
  125. end = timeStr;
  126. end += sprintf(end, "%d-%d-%d", st.wYear,st.wMonth,st.wDay);
  127. end += sprintf(end, "T%d:%d:%d %d", st.wHour,st.wMinute,st.wSecond, st.wMilliseconds);
  128. end += sprintf(end, ".%06d", trd.dspMicros);
  129. }
  130. #else
  131. {
  132. uint8_t shift;
  133. uint64_t timestamp;
  134. time_t seconds;
  135. int micros;
  136. char* timeEnd;
  137. char* end;
  138. shift = 32;
  139. timestamp = ((uint64_t)trd.timestampHigh<<shift) | trd.timestampLow;
  140. seconds = timestamp / 1000;
  141. micros = (timestamp % 1000) * 1000;
  142. /*
  143. * Timestamp already includes millisecond part of dspMicros,
  144. * so subtract this out before adding in dspMicros again
  145. */
  146. micros -= trd.dspMicros / 1000;
  147. micros += trd.dspMicros;
  148. timeEnd = timeStr + sizeof(timeStr)/sizeof(timeStr[0]);
  149. end = timeStr;
  150. end += strftime(end, timeEnd-end, "%FT%H:%M:%S", localtime(&seconds));
  151. end += snprintf(end, timeEnd-end, ".%06d", micros);
  152. end += strftime(end, timeEnd-end, "%z", localtime(&seconds));
  153. }
  154. #endif
  155. printf("EPC:%s ant:%d count:%d Time:%s\n", epcStr, trd.antenna, trd.readCount, timeStr);
  156. if(0 < trd.data.len)
  157. {
  158. char dataStr[255];
  159. TMR_bytesToHex(trd.data.list, trd.data.len, dataStr);
  160. printf("Raw data(%d): %s\n", trd.data.len, dataStr);
  161. }
  162. }
  163. }
  164. /* performEmbeddedTagOperation() performs following functions:
  165. * a) Set the tagOp to the read plan.
  166. * b) Set the filter to the read plan
  167. * c) set the read plan to the reader.
  168. * d) perform sync read.
  169. * e) process the data if it is there.
  170. *
  171. * @param rp : pointer to the reader object.
  172. * @param plan : pointer to the read plan object
  173. * @param tagOp : pointer to the tag operation object
  174. * @param filter: pointer to the filter object
  175. */
  176. void performEmbeddedTagOperation(TMR_Reader *reader, TMR_ReadPlan *plan, TMR_TagOp *tagOp, TMR_TagFilter *filter)
  177. {
  178. TMR_Status ret;
  179. // Set tagOp to read plan
  180. ret = TMR_RP_set_tagop(plan, tagOp);
  181. checkerr(reader, ret, 1, "setting tagop");
  182. // Set filter to read plan
  183. ret = TMR_RP_set_filter(plan, filter);
  184. checkerr(reader, ret, 1, "setting filter");
  185. // Commit read plan
  186. ret = TMR_paramSet(reader, TMR_PARAM_READ_PLAN, plan);
  187. checkerr(reader, ret, 1, "setting read plan");
  188. ReadTags(reader);
  189. }
  190. int main(int argc, char *argv[])
  191. {
  192. TMR_Reader r, *rp;
  193. TMR_Status ret;
  194. TMR_ReadPlan plan;
  195. TMR_Region region;
  196. uint8_t *antennaList = NULL;
  197. uint8_t buffer[20];
  198. uint8_t i;
  199. uint8_t antennaCount = 0x0;
  200. TMR_String model;
  201. char str[64];
  202. #if USE_TRANSPORT_LISTENER
  203. TMR_TransportListenerBlock tb;
  204. #endif
  205. if (argc < 2)
  206. {
  207. usage();
  208. }
  209. for (i = 2; i < argc; i+=2)
  210. {
  211. if(0x00 == strcmp("--ant", argv[i]))
  212. {
  213. if (NULL != antennaList)
  214. {
  215. fprintf(stdout, "Duplicate argument: --ant specified more than once\n");
  216. usage();
  217. }
  218. parseAntennaList(buffer, &antennaCount, argv[i+1]);
  219. antennaList = buffer;
  220. }
  221. else
  222. {
  223. fprintf(stdout, "Argument %s is not recognized\n", argv[i]);
  224. usage();
  225. }
  226. }
  227. rp = &r;
  228. ret = TMR_create(rp, argv[1]);
  229. checkerr(rp, ret, 1, "creating reader");
  230. #if USE_TRANSPORT_LISTENER
  231. if (TMR_READER_TYPE_SERIAL == rp->readerType)
  232. {
  233. tb.listener = serialPrinter;
  234. }
  235. else
  236. {
  237. tb.listener = stringPrinter;
  238. }
  239. tb.cookie = stdout;
  240. TMR_addTransportListener(rp, &tb);
  241. #endif
  242. ret = TMR_connect(rp);
  243. checkerr(rp, ret, 1, "connecting reader");
  244. region = TMR_REGION_NONE;
  245. ret = TMR_paramGet(rp, TMR_PARAM_REGION_ID, &region);
  246. checkerr(rp, ret, 1, "getting region");
  247. if (TMR_REGION_NONE == region)
  248. {
  249. TMR_RegionList regions;
  250. TMR_Region _regionStore[32];
  251. regions.list = _regionStore;
  252. regions.max = sizeof(_regionStore)/sizeof(_regionStore[0]);
  253. regions.len = 0;
  254. ret = TMR_paramGet(rp, TMR_PARAM_REGION_SUPPORTEDREGIONS, &regions);
  255. checkerr(rp, ret, __LINE__, "getting supported regions");
  256. if (regions.len < 1)
  257. {
  258. checkerr(rp, TMR_ERROR_INVALID_REGION, __LINE__, "Reader doesn't supportany regions");
  259. }
  260. region = regions.list[0];
  261. ret = TMR_paramSet(rp, TMR_PARAM_REGION_ID, &region);
  262. checkerr(rp, ret, 1, "setting region");
  263. }
  264. model.value = str;
  265. model.max = 64;
  266. TMR_paramGet(rp, TMR_PARAM_VERSION_MODEL, &model);
  267. if (((0 == strcmp("Sargas", model.value)) || (0 == strcmp("M6e Micro", model.value)) ||(0 == strcmp("M6e Nano", model.value)))
  268. && (NULL == antennaList))
  269. {
  270. fprintf(stdout, "Module doesn't has antenna detection support please provide antenna list\n");
  271. usage();
  272. }
  273. /**
  274. * for antenna configuration we need two parameters
  275. * 1. antennaCount : specifies the no of antennas should
  276. * be included in the read plan, out of the provided antenna list.
  277. * 2. antennaList : specifies a list of antennas for the read plan.
  278. **/
  279. // initialize the read plan
  280. ret = TMR_RP_init_simple(&plan, antennaCount, antennaList, TMR_TAG_PROTOCOL_GEN2, 1000);
  281. checkerr(rp, ret, 1, "initializing the read plan");
  282. /* Commit read plan */
  283. ret = TMR_paramSet(rp, TMR_PARAM_READ_PLAN, &plan);
  284. checkerr(rp, ret, 1, "setting read plan");
  285. // Read tag epc before performing untraceable action
  286. ReadTags(rp);
  287. {
  288. TMR_TagOp newtagop;
  289. //TMR_TagFilter selectFilter;
  290. TMR_TagOp_GEN2_NXP_Tam1Authentication auth;
  291. TMR_uint8List key;
  292. TMR_uint8List ichallenge;
  293. int EpcLength = 4; //words
  294. bool SendRawData = false;
  295. bool enableEmbeddedTagop = false;
  296. TMR_TagOp_GEN2_NXP_Untraceable untraceable;
  297. //TMR_GEN2_Password accessPassword = 0x00000000;
  298. //uint8_t mask[128];
  299. uint8_t key0[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
  300. //uint8_t key1[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
  301. uint8_t challenge[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xAB, 0xCD };
  302. /* ichallenge Initialization */
  303. ichallenge.list = challenge;
  304. ichallenge.max = ichallenge.len = sizeof(challenge) / sizeof(challenge[0]);
  305. /* mask[0] = 0xE2;
  306. mask[1] = 0xE2;
  307. mask[2] = 0xC0;
  308. mask[3] = 0x6F;
  309. TMR_TF_init_gen2_select(&selectFilter, false, TMR_GEN2_BANK_EPC, 32, 16, mask);*/
  310. // Untraceable with TAM1 with Key0
  311. key.list = key0;
  312. key.max = key.len = sizeof(key0) / sizeof(key0[0]);
  313. ret = TMR_TagOp_init_GEN2_NXP_AES_Tam1authentication(&auth, KEY0,&key,&ichallenge,SendRawData);
  314. checkerr(rp, ret, 1, "initializing Tam1 authentication");
  315. untraceable.auth.tam1Auth = auth;
  316. untraceable.auth.authType = UNTRACEABLE_WITH_AUTHENTICATION;
  317. ret = TMR_TagOp_init_GEN2_NXP_AES_Untraceable(&newtagop,EPC_HIDE,EpcLength,HIDE_NONE,SHOW,NORMAL,&untraceable);
  318. checkerr(rp, ret, 1, "initializing Untraceable");
  319. ret = TMR_executeTagOp(rp, &newtagop, NULL, NULL);
  320. checkerr(rp, ret, 1, "executing Untraceable tagop");
  321. ReadTags(rp);
  322. // Enable embedded tagOp operation by making enableEmbeddedTagop = true
  323. if(enableEmbeddedTagop)
  324. performEmbeddedTagOperation(rp, &plan, &newtagop, NULL);
  325. //Uncomment this to enable untraceable with TAM1 with Key1
  326. /*key.list = key1;
  327. key.max = key.len = sizeof(key1) / sizeof(key1[0]);
  328. EpcLength = 6; //words
  329. ret = TMR_TagOp_init_GEN2_NXP_AES_Tam1authentication(&auth, KEY1,&key,&ichallenge,SendRawData);
  330. checkerr(rp, ret, 1, "initializing Tam1 authentication");
  331. untraceable.auth.tam1Auth = auth;
  332. untraceable.auth.authType = UNTRACEABLE_WITH_AUTHENTICATION;
  333. ret = TMR_TagOp_init_GEN2_NXP_AES_Untraceable(&newtagop,EPC_HIDE,EpcLength,HIDE_NONE,SHOW,NORMAL,&untraceable);
  334. checkerr(rp, ret, 1, "initializing Untraceable");
  335. ret = TMR_executeTagOp(rp, &newtagop, NULL, NULL);
  336. checkerr(rp, ret, 1, "executing Untraceable tagop");
  337. ReadTags(rp);
  338. // Enable embedded tagOp operation by making enableEmbeddedTagop = true
  339. if(enableEmbeddedTagop)
  340. performEmbeddedTagOperation(rp, &plan, &newtagop, NULL);*/
  341. //Uncomment this to enable untraceable with Access
  342. /*EpcLength = 3; //words
  343. untraceable.auth.authType = UNTRACEABLE_WITH_ACCESS;
  344. untraceable.auth.accessPassword = accessPassword;
  345. ret = TMR_TagOp_init_GEN2_NXP_AES_Untraceable(&newtagop,EPC_HIDE,EpcLength,HIDE_NONE,SHOW,NORMAL, &untraceable);
  346. checkerr(rp, ret, 1, "initializing Untraceable");
  347. ret = TMR_executeTagOp(rp, &newtagop, NULL, NULL);
  348. checkerr(rp, ret, 1, "executing Untraceable tagop");
  349. ReadTags(rp);
  350. // Enable embedded tagOp operation by making enableEmbeddedTagop = true
  351. if(enableEmbeddedTagop)
  352. performEmbeddedTagOperation(rp, &plan, &newtagop, NULL);*/
  353. }
  354. TMR_destroy(rp);
  355. return 0;
  356. }