Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

FreeFareTag.cpp 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //
  2. // Created by robin on 6/19/16.
  3. //
  4. #include "FreeFareTag.h"
  5. FreeFareTag::FreeFareTag(FreefareTag tag)
  6. : _tag(tag)
  7. {
  8. _type = freefare_get_tag_type(tag);
  9. _uid = freefare_get_tag_uid(tag);
  10. }
  11. FreeFareTag::~FreeFareTag()
  12. {
  13. freefare_free_tag(_tag);
  14. }
  15. const freefare_tag *FreeFareTag::getTag() const
  16. {
  17. return _tag;
  18. }
  19. freefare_tag_type FreeFareTag::getType() const
  20. {
  21. return _type;
  22. }
  23. const std::string &FreeFareTag::getUid() const
  24. {
  25. return _uid;
  26. }
  27. ResultBool FreeFareTag::authenticate(int sector, std::string key, int keyType)
  28. {
  29. if (mifare_classic_connect(_tag) != 0) {
  30. return ResultBool::error("Failed to connect to MIFARE tag");
  31. }
  32. MifareClassicBlockNumber block = mifare_classic_sector_last_block((MifareClassicBlockNumber)sector);
  33. if (mifare_classic_authenticate(_tag, block, (const unsigned char*)key.c_str(), (MifareClassicKeyType)keyType) != 0) {
  34. return ResultBool::error("Failed to authenticate to MIFARE tag");
  35. }
  36. mifare_classic_disconnect(_tag);
  37. return ResultBool::ok(true);
  38. }
  39. ResultString FreeFareTag::readSector(int sector, std::string key, int keyType)
  40. {
  41. if (mifare_classic_connect(_tag) != 0) {
  42. return ResultString::error("Failed to connect to MIFARE tag");
  43. }
  44. MifareClassicBlockNumber firstBlock = mifare_classic_sector_first_block((MifareClassicBlockNumber)sector);
  45. MifareClassicBlockNumber lastBlock = mifare_classic_sector_last_block((MifareClassicBlockNumber)sector);
  46. std::string allData;
  47. for (MifareClassicBlockNumber block = firstBlock; block <= lastBlock; ++block) {
  48. if (mifare_classic_authenticate(_tag, block, (const unsigned char *) key.c_str(),
  49. (MifareClassicKeyType) keyType) != 0) {
  50. return ResultString::error("Failed to authenticate to MIFARE tag");
  51. }
  52. MifareClassicBlock data;
  53. if (mifare_classic_read(_tag, block, &data)) {
  54. return ResultString::error("Failed to read MIFARE tag data");
  55. }
  56. allData += std::string((const char*)data, sizeof(data));
  57. }
  58. mifare_classic_disconnect(_tag);
  59. return ResultString::ok(allData);
  60. }
  61. ResultString FreeFareTag::readBlock(int sector, int block, std::string key, int keyType)
  62. {
  63. if (mifare_classic_connect(_tag) != 0) {
  64. return ResultString::error("Failed to connect to MIFARE tag");
  65. }
  66. block = mifare_classic_sector_last_block((MifareClassicBlockNumber)sector) + block;
  67. if (mifare_classic_authenticate(_tag, (MifareClassicBlockNumber)block, (const unsigned char*)key.c_str(),
  68. (MifareClassicKeyType)keyType) != 0) {
  69. return ResultString::error("Failed to authenticate to MIFARE tag");
  70. }
  71. MifareClassicBlock data;
  72. if (mifare_classic_read(_tag, (MifareClassicBlockNumber)block, &data)) {
  73. return ResultString::error("Failed to read MIFARE tag data");
  74. }
  75. mifare_classic_disconnect(_tag);
  76. return ResultString::ok(std::string((const char*)data, sizeof(data)));
  77. }