Ver código fonte

begin read data

develop
Robin Thoni 8 anos atrás
pai
commit
429920adbc
2 arquivos alterados com 70 adições e 0 exclusões
  1. 62
    0
      src/DataAccess/FreeFareTag.cpp
  2. 8
    0
      src/DataAccess/FreeFareTag.h

+ 62
- 0
src/DataAccess/FreeFareTag.cpp Ver arquivo

@@ -29,4 +29,66 @@ freefare_tag_type FreeFareTag::getType() const
29 29
 const std::string &FreeFareTag::getUid() const
30 30
 {
31 31
     return _uid;
32
+}
33
+
34
+ResultBool FreeFareTag::authenticate(int sector, std::string key, int keyType)
35
+{
36
+    if (mifare_classic_connect(_tag) != 0) {
37
+        return ResultBool::error("Failed to connect to MIFARE tag");
38
+    }
39
+
40
+    MifareClassicBlockNumber block = mifare_classic_sector_last_block((MifareClassicBlockNumber)sector);
41
+    if (mifare_classic_authenticate(_tag, block, (const unsigned char*)key.c_str(), (MifareClassicKeyType)keyType) != 0) {
42
+        return ResultBool::error("Failed to authenticate to MIFARE tag");
43
+    }
44
+
45
+    mifare_classic_disconnect(_tag);
46
+    return ResultBool::ok(true);
47
+}
48
+
49
+ResultString FreeFareTag::readSector(int sector, std::string key, int keyType)
50
+{
51
+    if (mifare_classic_connect(_tag) != 0) {
52
+        return ResultString::error("Failed to connect to MIFARE tag");
53
+    }
54
+
55
+    MifareClassicBlockNumber firstBlock = mifare_classic_sector_first_block((MifareClassicBlockNumber)sector);
56
+    MifareClassicBlockNumber lastBlock = mifare_classic_sector_last_block((MifareClassicBlockNumber)sector);
57
+    std::string allData;
58
+    for (MifareClassicBlockNumber block = firstBlock; block <= lastBlock; ++block) {
59
+        if (mifare_classic_authenticate(_tag, block, (const unsigned char *) key.c_str(),
60
+                                        (MifareClassicKeyType) keyType) != 0) {
61
+            return ResultString::error("Failed to authenticate to MIFARE tag");
62
+        }
63
+
64
+        MifareClassicBlock data;
65
+        if (mifare_classic_read(_tag, block, &data)) {
66
+            return ResultString::error("Failed to read MIFARE tag data");
67
+        }
68
+        allData += std::string((const char*)data, sizeof(data));
69
+    }
70
+
71
+    mifare_classic_disconnect(_tag);
72
+    return ResultString::ok(allData);
73
+}
74
+
75
+ResultString FreeFareTag::readBlock(int sector, int block, std::string key, int keyType)
76
+{
77
+    if (mifare_classic_connect(_tag) != 0) {
78
+        return ResultString::error("Failed to connect to MIFARE tag");
79
+    }
80
+
81
+    block = mifare_classic_sector_last_block((MifareClassicBlockNumber)sector) + block;
82
+    if (mifare_classic_authenticate(_tag, (MifareClassicBlockNumber)block, (const unsigned char*)key.c_str(),
83
+                                    (MifareClassicKeyType)keyType) != 0) {
84
+        return ResultString::error("Failed to authenticate to MIFARE tag");
85
+    }
86
+
87
+    MifareClassicBlock data;
88
+    if (mifare_classic_read(_tag, (MifareClassicBlockNumber)block, &data)) {
89
+        return ResultString::error("Failed to read MIFARE tag data");
90
+    }
91
+
92
+    mifare_classic_disconnect(_tag);
93
+    return ResultString::ok(std::string((const char*)data, sizeof(data)));
32 94
 }

+ 8
- 0
src/DataAccess/FreeFareTag.h Ver arquivo

@@ -7,13 +7,21 @@
7 7
 
8 8
 #include <freefare.h>
9 9
 #include <string>
10
+#include <DBO/Result.h>
10 11
 
11 12
 class FreeFareTag
12 13
 {
13 14
 public:
15
+
14 16
     FreeFareTag(FreefareTag tag);
15 17
     ~FreeFareTag();
16 18
 
19
+    ResultBool authenticate(int sector, std::string key, int keyType);
20
+
21
+    ResultString readSector(int sector, std::string key, int keyType);
22
+
23
+    ResultString readBlock(int sector, int block, std::string key, int keyType);
24
+
17 25
     const freefare_tag * getTag() const;
18 26
 
19 27
     freefare_tag_type getType() const;

Carregando…
Cancelar
Salvar