Dies ist die Beschreibung der Python API Bindings für das NFC/RFID Bricklet. Allgemeine Informationen über die Funktionen und technischen Spezifikationen des NFC/RFID Bricklet sind in dessen Hardware Beschreibung zusammengefasst.
Eine Installationanleitung für die Python API Bindings ist Teil deren allgemeine Beschreibung.
Der folgende Beispielcode ist Public Domain (CC0 1.0).
Download (example_write_read_type2.py)
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4HOST = "localhost"
5PORT = 4223
6UID = "XYZ" # Change XYZ to the UID of your NFC/RFID Bricklet
7
8from tinkerforge.ip_connection import IPConnection
9from tinkerforge.bricklet_nfc_rfid import BrickletNFCRFID
10
11# Callback function for state changed callback
12def cb_state_changed(state, idle, nr):
13 if state == nr.STATE_REQUEST_TAG_ID_READY:
14 print("Tag found")
15
16 # Write 16 byte to pages 5-8
17 data_write = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
18 nr.write_page(5, data_write)
19 print("Writing data...")
20 elif state == nr.STATE_WRITE_PAGE_READY:
21 # Request pages 5-8
22 nr.request_page(5)
23 print("Requesting data...")
24 elif state == nr.STATE_REQUEST_PAGE_READY:
25 # Get and print pages
26 data = nr.get_page()
27 print("Read data: [" + " ".join(map(str, data)) + "]")
28 elif state & (1 << 6):
29 # All errors have bit 6 set
30 print("Error: " + str(state))
31
32if __name__ == "__main__":
33 ipcon = IPConnection() # Create IP connection
34 nr = BrickletNFCRFID(UID, ipcon) # Create device object
35
36 ipcon.connect(HOST, PORT) # Connect to brickd
37 # Don't use device before ipcon is connected
38
39 # Register state changed callback to function cb_state_changed
40 nr.register_callback(nr.CALLBACK_STATE_CHANGED,
41 lambda x, y: cb_state_changed(x, y, nr))
42
43 # Select NFC Forum Type 2 tag
44 nr.request_tag_id(nr.TAG_TYPE_TYPE2)
45
46 input("Press key to exit\n") # Use raw_input() in Python 2
47 ipcon.disconnect()
Download (example_write_ndef_message.py)
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4# The following specifications have been used
5# as a basis for writing this example.
6#
7# NFC Data Exchange Format (NDEF), NDEF 1.0:
8# https://github.com/Tinkerforge/nfc-rfid-bricklet/raw/master/datasheets/specification_ndef.pdf
9#
10# Type 1 Tag Operation Specification, T1TOP 1.1:
11# https://github.com/Tinkerforge/nfc-rfid-bricklet/raw/master/datasheets/specification_type1.pdf
12#
13# Type 2 Tag Operation Specification, T2TOP 1.1:
14# https://github.com/Tinkerforge/nfc-rfid-bricklet/raw/master/datasheets/specification_type2.pdf
15
16from tinkerforge.ip_connection import IPConnection
17from tinkerforge.bricklet_nfc_rfid import BrickletNFCRFID
18
19try:
20 from queue import Queue
21except ImportError:
22 from Queue import Queue
23
24from pprint import pprint
25import os
26
27class NdefMessage:
28 tag_type = None
29 records = []
30 capability_container = [0, 0, 0, 0]
31
32 def __init__(self, tag_type):
33 self.tag_type = tag_type
34
35 def add_record(self, record):
36 self.records.append(record)
37
38 # Set end and begin flags as needed
39 if len(self.records) == 1:
40 record.begin = True
41 record.end = True
42 else:
43 self.records[-2].end = False
44 self.records[-1].end = True
45
46 def set_capability_container(self, version, tag_size, read_write_access):
47 # Magic number to indicate NFC Forum defined data is stored
48 self.capability_container[0] = 0xE1
49 self.capability_container[1] = version
50
51 if self.tag_type == BrickletNFCRFID.TAG_TYPE_TYPE1:
52 self.capability_container[2] = tag_size/8 - 1
53 else:
54 self.capability_container[2] = tag_size/8
55
56 self.capability_container[3] = read_write_access
57
58 def get_raw_data_in_chunks(self):
59 raw_data = []
60
61 for record in self.records:
62 raw_data.extend(record.get_raw_data())
63
64 # Use three consecutive byte format if necessary, see 2.3 TLV blocks
65 data_len = len(raw_data)
66
67 if data_len < 0xFF:
68 tlv_ndef = [0x03, data_len]
69 else:
70 tlv_ndef = [0x03, 0xFF, data_len >> 8, data_len % 256]
71
72 if self.tag_type == BrickletNFCRFID.TAG_TYPE_TYPE1:
73 # CC set by set_capability_container
74 # default lock and memory TLVs
75 # NDEF TLV
76 # NDEF message
77 # Terminator TLV
78 raw_data = self.capability_container + \
79 [0x01, 0x03, 0xF2, 0x30, 0x33, 0x02, 0x03, 0xF0, 0x02, 0x03] + \
80 tlv_ndef + \
81 raw_data + \
82 [0xFE]
83 elif self.tag_type == BrickletNFCRFID.TAG_TYPE_TYPE2:
84 # CC set by set_capability_container
85 # NDEF TLV
86 # NDEF message
87 # Terminator TLV
88 raw_data = self.capability_container + \
89 tlv_ndef + \
90 raw_data + \
91 [0xFE]
92 else:
93 # TODO: We could support TAG_TYPE_MIFARE_CLASSIC here, but Mifare
94 # Classic it is not supported in modern smart phones anyway.
95 return [[]]
96
97 chunks = []
98
99 for i in range(0, len(raw_data), 16):
100 chunks.append(raw_data[i:i+16])
101
102 last_chunk_length = len(chunks[-1])
103
104 if last_chunk_length < 16:
105 chunks[-1].extend([0]*(16-last_chunk_length))
106
107 return chunks
108
109class NdefRecord:
110 FLAG_ID_LENGTH = 1 << 3
111 FLAG_SHORT_RECORD = 1 << 4
112 FLAG_CHUNK = 1 << 5
113 FLAG_MESSAGE_END = 1 << 6
114 FLAG_MESSAGE_BEGIN = 1 << 7
115
116 TNF_EMPTY = 0x0
117 TNF_WELL_KNOWN = 0x01
118 TNF_MIME_MEDIA = 0x02
119 TNF_ABSOLUTE_URI = 0x03
120 TNF_EXTERNAL_TYPE = 0x04
121 TNF_UNKNOWN = 0x05
122 TNF_UNCHANGED = 0x06
123 TNF_RESERVED = 0x07
124
125 NDEF_URIPREFIX_NONE = 0x00
126 NDEF_URIPREFIX_HTTP_WWWDOT = 0x01
127 NDEF_URIPREFIX_HTTPS_WWWDOT = 0x02
128 NDEF_URIPREFIX_HTTP = 0x03
129 NDEF_URIPREFIX_HTTPS = 0x04
130 NDEF_URIPREFIX_TEL = 0x05
131 NDEF_URIPREFIX_MAILTO = 0x06
132 NDEF_URIPREFIX_FTP_ANONAT = 0x07
133 NDEF_URIPREFIX_FTP_FTPDOT = 0x08
134 NDEF_URIPREFIX_FTPS = 0x09
135 NDEF_URIPREFIX_SFTP = 0x0A
136 NDEF_URIPREFIX_SMB = 0x0B
137 NDEF_URIPREFIX_NFS = 0x0C
138 NDEF_URIPREFIX_FTP = 0x0D
139 NDEF_URIPREFIX_DAV = 0x0E
140 NDEF_URIPREFIX_NEWS = 0x0F
141 NDEF_URIPREFIX_TELNET = 0x10
142 NDEF_URIPREFIX_IMAP = 0x11
143 NDEF_URIPREFIX_RTSP = 0x12
144 NDEF_URIPREFIX_URN = 0x13
145 NDEF_URIPREFIX_POP = 0x14
146 NDEF_URIPREFIX_SIP = 0x15
147 NDEF_URIPREFIX_SIPS = 0x16
148 NDEF_URIPREFIX_TFTP = 0x17
149 NDEF_URIPREFIX_BTSPP = 0x18
150 NDEF_URIPREFIX_BTL2CAP = 0x19
151 NDEF_URIPREFIX_BTGOEP = 0x1A
152 NDEF_URIPREFIX_TCPOBEX = 0x1B
153 NDEF_URIPREFIX_IRDAOBEX = 0x1C
154 NDEF_URIPREFIX_FILE = 0x1D
155 NDEF_URIPREFIX_URN_EPC_ID = 0x1E
156 NDEF_URIPREFIX_URN_EPC_TAG = 0x1F
157 NDEF_URIPREFIX_URN_EPC_PAT = 0x20
158 NDEF_URIPREFIX_URN_EPC_RAW = 0x21
159 NDEF_URIPREFIX_URN_EPC = 0x22
160 NDEF_URIPREFIX_URN_NFC = 0x23
161
162 NDEF_TYPE_MIME = 0x02
163 NDEF_TYPE_URI = 0x55
164 NDEF_TYPE_TEXT = 0x54
165
166 begin = False
167 end = False
168
169 tnf = 0
170 record_type = None
171 payload = None
172 identifier = None
173
174 def set_identifier(self, identifier):
175 self.identifier = identifier
176
177 def get_raw_data(self):
178 if self.record_type == None or self.payload == None:
179 return []
180
181 # Construct tnf and flags (byte 0 of header)
182 header = [self.tnf]
183
184 if self.begin:
185 header[0] |= NdefRecord.FLAG_MESSAGE_BEGIN
186
187 if self.end:
188 header[0] |= NdefRecord.FLAG_MESSAGE_END
189
190 if len(self.payload) < 256:
191 header[0] |= NdefRecord.FLAG_SHORT_RECORD
192
193 if self.identifier != None:
194 header[0] |= NdefRecord.FLAG_ID_LENGTH
195
196 # Type length (byte 1 of header)
197 header.append(len(self.record_type))
198
199 # Payload length (byte 2 of header)
200 # TODO: payload > 255?
201 header.append(len(self.payload))
202
203 # ID length (byte 3 of header)
204 if self.identifier != None:
205 header.append(len(self.identifier))
206
207 # Record type (byte 4ff of header)
208 header.extend(self.record_type)
209
210 # ID
211 if self.identifier != None:
212 header.extend(self.identifier)
213
214 return header + self.payload
215
216class NdefTextRecord(NdefRecord):
217 # Call with text and ISO/IANA language code
218 def __init__(self, text, language='en'):
219 self.tnf = NdefRecord.TNF_WELL_KNOWN
220 self.record_type = [NdefRecord.NDEF_TYPE_TEXT]
221
222 lang_list = map(ord, language)
223 text_list = map(ord, text)
224
225 # Text Record Content: Status byte, ISO/IANA language code, text
226 # See NDEF 1.0: 3.2.1
227 self.payload = [len(lang_list)] + lang_list + text_list
228
229class NdefUriRecord(NdefRecord):
230 def __init__(self, uri, uri_prefix=NdefRecord.NDEF_URIPREFIX_NONE):
231 self.tnf = NdefRecord.TNF_WELL_KNOWN
232 self.record_type = [NdefRecord.NDEF_TYPE_URI]
233
234 uri_list = map(ord, uri)
235
236 # Text Record Content: URI prefix, URI
237 # See NDEF 1.0: 3.2.2
238 self.payload = [uri_prefix] + uri_list
239
240class NdefMediaRecord(NdefRecord):
241 def __init__(self, mime_type, data):
242 self.tnf = NdefRecord.TNF_MIME_MEDIA
243 self.record_type = map(ord, mime_type)
244
245 if isinstance(data, str):
246 self.payload = map(ord, data)
247 else:
248 self.payload = data
249
250class ExampleNdef:
251 HOST = "localhost"
252 PORT = 4223
253 UID = "XYZ" # Change XYZ to the UID of your NFC/RFID Bricklet
254
255 state_queue = Queue()
256 tag_type = None
257 tag_size = None
258
259 def __init__(self, tag_type, tag_size=512):
260 self.tag_type = tag_type
261 self.tag_size = tag_size
262 self.ipcon = IPConnection() # Create IP connection
263 self.nr = BrickletNFCRFID(self.UID, self.ipcon) # Create device object
264
265 self.ipcon.connect(self.HOST, self.PORT) # Connect to brickd
266
267 self.nr.register_callback(self.nr.CALLBACK_STATE_CHANGED, self.state_changed)
268
269 def write_message(self):
270 chunks = self.message.get_raw_data_in_chunks()
271 print("Trying to write the follwing data to the tag:")
272 pprint(chunks)
273
274 self.nr.request_tag_id(self.tag_type)
275 state = self.state_queue.get()
276
277 if state != self.nr.STATE_REQUEST_TAG_ID:
278 return -1
279
280 state = self.state_queue.get()
281
282 if state != self.nr.STATE_REQUEST_TAG_ID_READY:
283 return -2
284
285 # NFC Forum Type 1 start page is 1 (start of capability container)
286 # NFC Forum Type 2 start page is 3 (start of capability container)
287 if self.tag_type == self.nr.TAG_TYPE_TYPE1:
288 current_page = 1
289 else:
290 current_page = 3
291
292 for chunk in chunks:
293 self.nr.write_page(current_page, chunk)
294 state = self.state_queue.get()
295
296 if state != self.nr.STATE_WRITE_PAGE:
297 return -3
298
299 state = self.state_queue.get()
300
301 if state != self.nr.STATE_WRITE_PAGE_READY:
302 return -4
303
304 # NFC Forum Type 1 has 2 pages per chunk (16 byte)
305 # NFC Forum Type 2 has 4 pages per chunk (16 byte)
306 if self.tag_type == self.nr.TAG_TYPE_TYPE1:
307 current_page += 2
308 else:
309 current_page += 4
310
311 return 0
312
313 def state_changed(self, state, idle):
314 self.state_queue.put(state)
315
316 def make_message_small(self):
317 self.message = NdefMessage(self.tag_type)
318
319 # Capabilities:
320 # Version 1.0 (0x10)
321 # Tag size bytes (given by self.tag_size)
322 # Read/write access for all (0x00)
323 self.message.set_capability_container(0x10, self.tag_size, 0x00)
324
325 record = NdefUriRecord('tinkerforge.com', NdefRecord.NDEF_URIPREFIX_HTTP_WWWDOT)
326 self.message.add_record(record)
327
328 def make_message_large(self):
329 self.message = NdefMessage(self.tag_type)
330
331 # Capabilities:
332 # Version 1.0 (0x10)
333 # Tag size bytes (given by self.tag_size)
334 # Read/write access for all (0x00)
335 self.message.set_capability_container(0x10, self.tag_size, 0x00)
336
337 rec1 = NdefTextRecord('Hello World', 'en')
338 self.message.add_record(rec1)
339 rec2 = NdefTextRecord('Hallo Welt', 'de')
340 self.message.add_record(rec2)
341 rec3 = NdefUriRecord('tinkerforge.com', NdefRecord.NDEF_URIPREFIX_HTTP_WWWDOT)
342 self.message.add_record(rec3)
343 text = '<html><head><title>Hello</title></head><body>World!</body></html>'
344 rec4 = NdefMediaRecord('text/html', text)
345 self.message.add_record(rec4)
346
347 # To test an "image/png" you can can download the file from:
348 # http://download.tinkerforge.com/_stuff/tf_16x16.png
349 if os.path.isfile('tf_16x16.png'):
350 with open('tf_16x16.png', 'rb') as f:
351 logo = f.read()
352
353 rec5 = NdefMediaRecord('image/png', map(ord, logo))
354 self.message.add_record(rec5)
355
356if __name__ == '__main__':
357 example = ExampleNdef(tag_type=BrickletNFCRFID.TAG_TYPE_TYPE2, tag_size=888)
358 #example.make_message_large() # Writes different texts, URI, html site and image
359 example.make_message_small() # Writes simple URI record
360 ret = example.write_message()
361
362 if ret < 0:
363 print('Could not write NDEF Message: ' + str(ret))
364 else:
365 print('NDEF Message written successfully')
Prinzipiell kann jede Funktion der Python Bindings
tinkerforge.ip_connection.Error Exception werfen, welche ein value und
eine description Property hat. value kann verschiende Werte haben:
Error.TIMEOUT = -1
Error.NOT_ADDED = -6 (seit Python Bindings Version 2.0.0 nicht mehr verwendet)
Error.ALREADY_CONNECTED = -7
Error.NOT_CONNECTED = -8
Error.INVALID_PARAMETER = -9
Error.NOT_SUPPORTED = -10
Error.UNKNOWN_ERROR_CODE = -11
Error.STREAM_OUT_OF_SYNC = -12
Error.INVALID_UID = -13
Error.NON_ASCII_CHAR_IN_SECRET = -14
Error.WRONG_DEVICE_TYPE = -15
Error.DEVICE_REPLACED = -16
Error.WRONG_RESPONSE_LENGTH = -17
Alle folgend aufgelisteten Funktionen sind Thread-sicher.
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Erzeugt ein Objekt mit der eindeutigen Geräte ID uid:
nfc_rfid = BrickletNFCRFID("YOUR_DEVICE_UID", ipcon)
Dieses Objekt kann benutzt werden, nachdem die IP Connection verbunden ist.
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Um ein Tag welches sich in der nähe des NFC/RFID Bricklets befindet zu lesen oder zu schreiben muss zuerst diese Funktion mit dem erwarteten Tag Typ aufgerufen werden. Es ist kein Problem wenn der Typ nicht bekannt ist. Es ist möglich die verügbaren Tag Typen einfach nacheinander durchzutesten bis das Tag antwortet.
Aktuell werden die folgenden Tag Typen unterstützt:
Mifare Classic
NFC Forum Type 1
NFC Forum Type 2
Beim Aufruf von request_tag_id() probiert das NFC/RFID Bricklet die Tag ID
eines Tags auszulesen. Nachdem dieser Prozess beendet ist ändert sich
der Zustand des Bricklets. Es ist möglich den CALLBACK_STATE_CHANGED Callback zu
registrieren oder den Zustand über get_state() zu pollen.
Wenn der Zustand auf RequestTagIDError wechselt ist ein Fehler aufgetreten.
Dies bedeutet, dass entweder kein Tag oder kein Tag vom passenden Typ gefunden
werden konnte. Wenn der Zustand auf RequestTagIDReady wechselt ist ein
kompatibles Tag gefunden worden und die Tag ID wurde gespeichert. Die
Tag ID kann nun über get_tag_id() ausgelesen werden.
Wenn sich zwei Tags gleichzeitig in der Nähe des NFC/RFID Bricklets befinden
werden diese nacheinander ausgelesen. Um ein spezifisches Tag zu selektieren
muss request_tag_id() so lange aufgerufen werden bis das korrekte Tag
gefunden wurde.
Falls sich das NFC/RFID Bricklet in einem der Error Zustände befindet
ist die Selektion aufgehoben und request_tag_id() muss erneut
aufgerufen werden.
Die folgenden Konstanten sind für diese Funktion verfügbar:
Für tag_type:
BrickletNFCRFID.TAG_TYPE_MIFARE_CLASSIC = 0
BrickletNFCRFID.TAG_TYPE_TYPE1 = 1
BrickletNFCRFID.TAG_TYPE_TYPE2 = 2
| Rückgabeobjekt: |
|
|---|
Gibt den Tag Typ, die Tag ID und die Länge der Tag ID (4 oder 7 Byte
möglich) zurück. Diese Funktion kann nur aufgerufen werden wenn
sich das Bricklet gerade in einem der Ready-Zustände befindet. Die
zurückgegebene ID ist die letzte ID die durch einen Aufruf von
request_tag_id() gefunden wurde.
Der Ansatz um die Tag ID eines Tags zu bekommen sieht wie folgt aus:
Rufe request_tag_id() auf
Warte auf einen Zustandswechsel auf RequestTagIDReady (siehe
get_state() oder CALLBACK_STATE_CHANGED Callback)
Rufe get_tag_id() auf
Die folgenden Konstanten sind für diese Funktion verfügbar:
Für tag_type:
BrickletNFCRFID.TAG_TYPE_MIFARE_CLASSIC = 0
BrickletNFCRFID.TAG_TYPE_TYPE1 = 1
BrickletNFCRFID.TAG_TYPE_TYPE2 = 2
| Rückgabeobjekt: |
|
|---|
Gibt den aktuellen Zustand des NFC/RFID Bricklets aus.
Während der Startphase ist der Zustand Initialization. Die Initialisierung dauert etwa 20ms. Danach ändert sich der Zustand zu Idle.
Die Funktionen dieses Bricklets können aufgerufen werden wenn der Zustand entweder Idle ist oder einer der Ready oder Error-Zustände erreicht wurde.
Beispiel: Wenn request_page() aufgerufen wird, änder sich der
Zustand zu RequestPage solange der Leseprozess noch nicht abgeschlossen
ist. Danach ändert sich der Zustand zu RequestPageReady wenn das lesen
funktioniert hat oder zu RequestPageError wenn nicht. Wenn die Anfrage
erfolgreich war kann die Page mit get_page() abgerufen werden.
Der gleiche Ansatz kann analog für andere API Funktionen verwendet werden.
Die folgenden Konstanten sind für diese Funktion verfügbar:
Für state:
BrickletNFCRFID.STATE_INITIALIZATION = 0
BrickletNFCRFID.STATE_IDLE = 128
BrickletNFCRFID.STATE_ERROR = 192
BrickletNFCRFID.STATE_REQUEST_TAG_ID = 2
BrickletNFCRFID.STATE_REQUEST_TAG_ID_READY = 130
BrickletNFCRFID.STATE_REQUEST_TAG_ID_ERROR = 194
BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE = 3
BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_READY = 131
BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_ERROR = 195
BrickletNFCRFID.STATE_WRITE_PAGE = 4
BrickletNFCRFID.STATE_WRITE_PAGE_READY = 132
BrickletNFCRFID.STATE_WRITE_PAGE_ERROR = 196
BrickletNFCRFID.STATE_REQUEST_PAGE = 5
BrickletNFCRFID.STATE_REQUEST_PAGE_READY = 133
BrickletNFCRFID.STATE_REQUEST_PAGE_ERROR = 197
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Mifare Classic Tags nutzen Authentifizierung. Wenn eine Page eines
Mifare Classic Tags gelesen oder geschrieben werden soll muss diese
zuvor Authentifiziert werden. Jede Page kann mit zwei Schlüsseln, A
(key_number = 0) und B (key_number = 1),
authentifiziert werden. Ein neues Mifare Classic Tag welches noch nicht
beschrieben wurde kann über Schlüssel A mit dem Standardschlüssel
[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] genutzt werden.
Der Ansatz um eine Mifare Classic Page zu lesen oder zu schreiben sieht wie folgt aus:
Rufe request_tag_id() auf
Warte auf einen Zustandswechsel auf RequestTagIDReady (siehe get_state()
oder CALLBACK_STATE_CHANGED Callback)
Wenn mit einem bestimmten Tag gearbeitet werden soll, dann rufe
get_tag_id() auf und überprüfe, ob der erwartete Tag gefunden wurde,
wenn er nicht gefunden wurde mit Schritt 1 fortfahren
Rufe authenticate_mifare_classic_page() mit Page und Schlüssel für die
Page auf
Warte auf einen Zustandswechsel auf AuthenticatingMifareClassicPageReady
(siehe get_state() oder CALLBACK_STATE_CHANGED Callback)
Rufe request_page() oder write_page() zum Lesen/Schreiben einer
Page auf
Die folgenden Konstanten sind für diese Funktion verfügbar:
Für key_number:
BrickletNFCRFID.KEY_A = 0
BrickletNFCRFID.KEY_B = 1
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Schreibt 16 Bytes startend von der übergebenen Page. Wie viele Pages dadurch geschrieben werden hängt vom Typ des Tags ab. Die Pagegrößen verhalten sich wie folgt:
Mifare Classic Pagegröße: 16 byte (eine Page wird geschrieben)
NFC Forum Type 1 Pagegröße: 8 byte (zwei Pages werden geschrieben)
NFC Forum Type 2 Pagegröße: 4 byte (vier Pages werden geschrieben)
Der generelle Ansatz zum Schreiben eines Tags sieht wie folgt aus:
Rufe request_tag_id() auf
Warte auf einen Zustandswechsel auf RequestTagIDReady (siehe
get_state() oder CALLBACK_STATE_CHANGED callback)
Wenn mit einem bestimmten Tag gearbeitet werden soll, dann rufe
get_tag_id() auf und überprüfe, ob der erwartete Tag gefunden wurde,
wenn er nicht gefunden wurde mit Schritt 1 fortfahren
Rufe write_page() mit der Page sowie den zu schreibenden Daten auf
Warte auf einen Zustandswechsel auf WritePageReady (siehe
get_state() oder CALLBACK_STATE_CHANGED Callback)
Wenn ein Mifare Classic Tag verwendet wird muss die Page authentifiziert
werden bevor sie geschrieben werden kann. Siehe
authenticate_mifare_classic_page().
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Liest 16 Bytes startend von der übergebenen Page und speichert sie in
einem Buffer. Dieser Buffer kann mit get_page() ausgelesen werden.
Wie viele Pages dadurch gelesen werden hängt vom Typ des Tags ab.
Die Pagegrößen verhalten sich wie folgt:
Mifare Classic Pagegröße: 16 byte (eine Page wird gelesen)
NFC Forum Type 1 Pagegröße: 8 byte (zwei Pages werden gelesen)
NFC Forum Type 2 Pagegröße: 4 byte (vier Pages werden gelesen)
Der generelle Ansatz zum Lesen eines Tags sieht wie folgt aus:
Rufe request_tag_id() auf
Warte auf einen Zustandswechsel auf RequestTagIDReady (siehe
get_state() oder CALLBACK_STATE_CHANGED Callback)
Wenn mit einem bestimmten Tag gearbeitet werden soll, dann rufe
get_tag_id() auf und überprüfe, ob der erwartete Tag gefunden wurde,
wenn er nicht gefunden wurde mit Schritt 1 fortfahren
Rufe request_page() mit der zu lesenden Page auf
Warte auf einen Zustandswechsel auf RequestPageReady (siehe
get_state() oder CALLBACK_STATE_CHANGED Callback)
Rufe get_page() auf um die gespeicherte Page abzufragen
Wenn ein Mifare Classic Tag verwendet wird muss die Page authentifiziert
werden bevor sie gelesen werden kann. Siehe authenticate_mifare_classic_page().
| Rückgabe: |
|
|---|
Gibt 16 Bytes Daten aus einem internen Buffer zurück. Der Buffer
kann zuvor mit spezifischen Pages über einen Aufruf von
request_page() gefüllt werden.
| Rückgabeobjekt: |
|
|---|
Gibt die UID, die UID zu der das Bricklet verbunden ist, die Position, die Hard- und Firmware Version sowie den Device Identifier zurück.
Die Position ist 'a', 'b', 'c', 'd', 'e', 'f', 'g' oder 'h' (Bricklet Anschluss). Ein Bricklet hinter einem Isolator Bricklet ist immer an Position 'z'.
Eine Liste der Device Identifier Werte ist hier zu finden. Es gibt auch eine Konstante für den Device Identifier dieses Bricklets.
Callbacks können registriert werden um zeitkritische
oder wiederkehrende Daten vom Gerät zu erhalten. Die Registrierung kann
mit der Funktion register_callback() des
Geräte Objektes durchgeführt werden. Der erste Parameter ist die Callback ID
und der zweite Parameter die Callback-Funktion:
def my_callback(param):
print(param)
nfc_rfid.register_callback(BrickletNFCRFID.CALLBACK_EXAMPLE, my_callback)
Die verfügbaren IDs mit der dazugehörigen Parameteranzahl und -typen werden weiter unten beschrieben.
Bemerkung
Callbacks für wiederkehrende Ereignisse zu verwenden ist immer zu bevorzugen gegenüber der Verwendung von Abfragen. Es wird weniger USB-Bandbreite benutzt und die Latenz ist erheblich geringer, da es keine Paketumlaufzeit gibt.
| Callback-Parameter: |
|
|---|
Dieser Callback wird ausgelöst, wenn der Zustand des NFC/RFID Bricklets
sich verändert. Siehe get_state() für mehr Informationen
über die möglichen Zustände des Bricklets.
Die folgenden Konstanten sind für diese Funktion verfügbar:
Für state:
BrickletNFCRFID.STATE_INITIALIZATION = 0
BrickletNFCRFID.STATE_IDLE = 128
BrickletNFCRFID.STATE_ERROR = 192
BrickletNFCRFID.STATE_REQUEST_TAG_ID = 2
BrickletNFCRFID.STATE_REQUEST_TAG_ID_READY = 130
BrickletNFCRFID.STATE_REQUEST_TAG_ID_ERROR = 194
BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE = 3
BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_READY = 131
BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_ERROR = 195
BrickletNFCRFID.STATE_WRITE_PAGE = 4
BrickletNFCRFID.STATE_WRITE_PAGE_READY = 132
BrickletNFCRFID.STATE_WRITE_PAGE_ERROR = 196
BrickletNFCRFID.STATE_REQUEST_PAGE = 5
BrickletNFCRFID.STATE_REQUEST_PAGE_READY = 133
BrickletNFCRFID.STATE_REQUEST_PAGE_ERROR = 197
Virtuelle Funktionen kommunizieren nicht mit dem Gerät selbst, sie arbeiten nur auf dem API Bindings Objekt. Dadurch können sie auch aufgerufen werden, ohne das das dazugehörige IP Connection Objekt verbunden ist.
| Rückgabeobjekt: |
|
|---|
Gibt die Version der API Definition zurück, die diese API Bindings implementieren. Dies ist weder die Release-Version dieser API Bindings noch gibt es in irgendeiner Weise Auskunft über den oder das repräsentierte(n) Brick oder Bricklet.
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Gibt das Response-Expected-Flag für die Funktion mit der angegebenen Funktions IDs zurück. Es ist true falls für die Funktion beim Aufruf eine Antwort erwartet wird, false andernfalls.
Für Getter-Funktionen ist diese Flag immer gesetzt und kann nicht entfernt
werden, da diese Funktionen immer eine Antwort senden. Für
Konfigurationsfunktionen für Callbacks ist es standardmäßig gesetzt, kann aber
entfernt werden mittels set_response_expected(). Für Setter-Funktionen ist
es standardmäßig nicht gesetzt, kann aber gesetzt werden.
Wenn das Response-Expected-Flag für eine Setter-Funktion gesetzt ist, können Timeouts und andere Fehlerfälle auch für Aufrufe dieser Setter-Funktion detektiert werden. Das Gerät sendet dann eine Antwort extra für diesen Zweck. Wenn das Flag für eine Setter-Funktion nicht gesetzt ist, dann wird keine Antwort vom Gerät gesendet und Fehler werden stillschweigend ignoriert, da sie nicht detektiert werden können.
Die folgenden Konstanten sind für diese Funktion verfügbar:
Für function_id:
BrickletNFCRFID.FUNCTION_REQUEST_TAG_ID = 1
BrickletNFCRFID.FUNCTION_AUTHENTICATE_MIFARE_CLASSIC_PAGE = 4
BrickletNFCRFID.FUNCTION_WRITE_PAGE = 5
BrickletNFCRFID.FUNCTION_REQUEST_PAGE = 6
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Ändert das Response-Expected-Flag für die Funktion mit der angegebenen Funktion IDs. Diese Flag kann nur für Setter-Funktionen (Standardwert: false) und Konfigurationsfunktionen für Callbacks (Standardwert: true) geändert werden. Für Getter-Funktionen ist das Flag immer gesetzt.
Wenn das Response-Expected-Flag für eine Setter-Funktion gesetzt ist, können Timeouts und andere Fehlerfälle auch für Aufrufe dieser Setter-Funktion detektiert werden. Das Gerät sendet dann eine Antwort extra für diesen Zweck. Wenn das Flag für eine Setter-Funktion nicht gesetzt ist, dann wird keine Antwort vom Gerät gesendet und Fehler werden stillschweigend ignoriert, da sie nicht detektiert werden können.
Die folgenden Konstanten sind für diese Funktion verfügbar:
Für function_id:
BrickletNFCRFID.FUNCTION_REQUEST_TAG_ID = 1
BrickletNFCRFID.FUNCTION_AUTHENTICATE_MIFARE_CLASSIC_PAGE = 4
BrickletNFCRFID.FUNCTION_WRITE_PAGE = 5
BrickletNFCRFID.FUNCTION_REQUEST_PAGE = 6
| Parameter: |
|
|---|---|
| Rückgabe: |
|
Ändert das Response-Expected-Flag für alle Setter-Funktionen und Konfigurationsfunktionen für Callbacks diese Gerätes.
Diese Konstante wird verwendet um ein NFC/RFID Bricklet zu identifizieren.
Die get_identity() Funktion und der
IPConnection.CALLBACK_ENUMERATE
Callback der IP Connection haben ein device_identifier Parameter um den Typ
des Bricks oder Bricklets anzugeben.
Diese Konstante stellt den Anzeigenamen eines NFC/RFID Bricklet dar.