Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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