Mercurial > code > home > repos > homeauto
changeset 1207:db0534d5e264
build more of libfreefare
Ignore-this: efb50f50a9cc9de6d8ce068cd391a6fc
darcs-hash:a9f5f5687189fca481c18daccf81b5a2068c5d57
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sun, 10 Mar 2019 04:02:59 -0700 |
parents | a9af0fa097d0 |
children | 6ae4dd24f407 |
files | service/rfid_pn532_py/Dockerfile.pi service/rfid_pn532_py/Dockerfile.pyfreefare.pi service/rfid_pn532_py/Dockerfile.pyfreefare.x86 service/rfid_pn532_py/build_ctypes_modules.sh service/rfid_pn532_py/makefile service/rfid_pn532_py/pyfreefare/freefare.h service/rfid_pn532_py/requirements.txt service/rfid_pn532_py/tags.py service/rfid_pn532_py/tags_test.py |
diffstat | 9 files changed, 156 insertions(+), 144 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/rfid_pn532_py/Dockerfile.pi Sun Mar 10 04:02:59 2019 -0700 @@ -0,0 +1,18 @@ +FROM bang6:5000/base_pi + + + + +WORKDIR /opt +RUN apt-get install -y libnfc5 libfreefare0 libnfc-dev libfreefare-dev +RUN apt-get install -y python3-nose2 +COPY pyfreefare-build-pi ./pyfreefare-build + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY *.py *.html ./ + +ENV PYTHONPATH=/opt/pyfreefare-build +EXPOSE 10012 +
--- a/service/rfid_pn532_py/Dockerfile.pyfreefare.pi Mon Mar 04 15:18:46 2019 -0800 +++ b/service/rfid_pn532_py/Dockerfile.pyfreefare.pi Sun Mar 10 04:02:59 2019 -0700 @@ -2,10 +2,9 @@ WORKDIR /opt -RUN apt-get install -y python-clang-5.0 libclang-5.0-dev -RUN pip install ctypeslib2 +RUN apt-get install -y python-clang-5.0 libclang-5.0-dev libnfc5 libfreefare0 libnfc-dev libfreefare-dev +RUN pip install git+https://github.com/drewp/ctypeslib.git@enable-modules-flag -RUN apt-get install -y libnfc5 libfreefare0 libnfc-dev libfreefare-dev COPY build_ctypes_modules.sh ./ -CMD ["/opt/build_ctypes_modules.sh"] \ No newline at end of file +CMD ["/bin/sh", "/opt/build_ctypes_modules.sh"] \ No newline at end of file
--- a/service/rfid_pn532_py/Dockerfile.pyfreefare.x86 Mon Mar 04 15:18:46 2019 -0800 +++ b/service/rfid_pn532_py/Dockerfile.pyfreefare.x86 Sun Mar 10 04:02:59 2019 -0700 @@ -2,11 +2,9 @@ WORKDIR /opt -RUN apt-get install -y python-clang-5.0 libclang-5.0-dev -RUN pip install ctypeslib2 - -RUN apt-get install -y libnfc5 libfreefare0 libnfc-dev libfreefare-dev +RUN apt-get install -y python-clang-5.0 libclang-5.0-dev libnfc5 libfreefare0 libnfc-dev libfreefare-dev +RUN pip install git+https://github.com/drewp/ctypeslib.git@enable-modules-flag COPY build_ctypes_modules.sh ./ -CMD ["/opt/build_ctypes_modules.sh"] +CMD ["/bin/sh", "/opt/build_ctypes_modules.sh"]
--- a/service/rfid_pn532_py/build_ctypes_modules.sh Mon Mar 04 15:18:46 2019 -0800 +++ b/service/rfid_pn532_py/build_ctypes_modules.sh Sun Mar 10 04:02:59 2019 -0700 @@ -1,7 +1,14 @@ #!/bin/sh -TARGET=x86_64-Linux -CARGS="-I/usr/include/x86_64-linux-gnu -I/usr/lib/llvm-5.0/lib/clang/5.0.1/include -I/usr/lib/llvm-5.0/lib/" +set -x +proc=`uname --processor` +if [ "$proc" = "armv7l" ]; then + ARCH=arm-linux-gnueabihf + TARGET=armv7l +else + ARCH=x86_64-linux-gnu + TARGET=x86_64-Linux +fi +CARGS="-I/usr/include/${ARCH} -I/usr/lib/llvm-5.0/lib/clang/5.0.1/include -I/usr/lib/llvm-5.0/lib/" +clang2py -o /opt/pyfreefare-build/nfc.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/${ARCH}/libnfc.so --comments /opt/pyfreefare/nfc.h -clang2py -o /opt/pyfreefare-build/nfc.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/x86_64-linux-gnu/libnfc.so -c /opt/pyfreefare/nfc.h - -clang2py -o /opt/pyfreefare-build/freefare.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/x86_64-linux-gnu/libfreefare.so -c /opt/pyfreefare/freefare.h +PYTHONPATH=/opt/pyfreefare-build clang2py -o /opt/pyfreefare-build/freefare.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/${ARCH}/libfreefare.so --comments --module nfc /opt/pyfreefare/freefare.h
--- a/service/rfid_pn532_py/makefile Mon Mar 04 15:18:46 2019 -0800 +++ b/service/rfid_pn532_py/makefile Sun Mar 10 04:02:59 2019 -0700 @@ -1,16 +1,25 @@ - -pyfreefare_build_image_x86: Dockerfile.pyfreefare.x86 +pyfreefare-build-x86/nfc.py: Dockerfile.pyfreefare.x86 pyfreefare/nfc.h pyfreefare/freefare.h build_ctypes_modules.sh docker build --file Dockerfile.pyfreefare.x86 -t pyfreefare_build_x86:latest . - -pyfreefare_build_image_pi: Dockerfile.pyfreefare.pi - docker build --file Dockerfile.pyfreefare.pi -t pyfreefare_build_pi:latest . - -pyfreefare-build-x86/nfc.py: pyfreefare_build_image_x86 pyfreefare/nfc.h pyfreefare/freefare.h docker run --rm --net=host \ -v `pwd`/pyfreefare:/opt/pyfreefare \ -v `pwd`/pyfreefare-build-x86:/opt/pyfreefare-build \ --name pyfreefare_build pyfreefare_build_x86:latest +pyfreefare-build-pi/nfc.py: Dockerfile.pyfreefare.pi pyfreefare/nfc.h pyfreefare/freefare.h build_ctypes_modules.sh + docker build --file Dockerfile.pyfreefare.pi -t pyfreefare_build_pi:latest . + docker run --rm --net=host \ + -v `pwd`/pyfreefare:/opt/pyfreefare \ + -v `pwd`/pyfreefare-build-pi:/opt/pyfreefare-build \ + --name pyfreefare_build pyfreefare_build_pi:latest + #pyfreefare/nfc.py pyfreefare/freefare.py test_tags: tags.py tags_test.py - PYTHONPATH=pyfreefare nose2-3 tags_test + PYTHONPATH=pyfreefare-build-x86 nose2-3 tags_test + + +rfid_build_image_pi: pyfreefare-build-pi/nfc.py pyfreefare-build-pi/freefare.py + docker build --file Dockerfile.pi -t bang6:5000/rfid_pn532_py_pi:latest . + docker push bang6:5000/rfid_pn532_py_pi:latest + +# test on pi: +# docker pull bang6:5000/rfid_pn532_py_pi:latest && docker run -it --rm --privileged --name rfid_shell bang6:5000/rfid_pn532_py_pi:latest nose2-3 tags_test
--- a/service/rfid_pn532_py/pyfreefare/freefare.h Mon Mar 04 15:18:46 2019 -0800 +++ b/service/rfid_pn532_py/pyfreefare/freefare.h Sun Mar 10 04:02:59 2019 -0700 @@ -46,20 +46,20 @@ FreefareTag *freefare_get_tags(nfc_device *device); FreefareTag freefare_tag_new(nfc_device *device, nfc_target target); freefare_tag_type freefare_get_tag_type(FreefareTag tag); - // const char *freefare_get_tag_friendly_name(FreefareTag tag); - // char *freefare_get_tag_uid(FreefareTag tag); - // void freefare_free_tag(FreefareTag tag); - // void freefare_free_tags(FreefareTag *tags); - // bool freefare_selected_tag_is_present(nfc_device *device); - // - // const char *freefare_strerror(FreefareTag tag); - // int freefare_strerror_r(FreefareTag tag, char *buffer, size_t len); - // void freefare_perror(FreefareTag tag, const char *string); - // - // - // +const char *freefare_get_tag_friendly_name(FreefareTag tag); +char *freefare_get_tag_uid(FreefareTag tag); +void freefare_free_tag(FreefareTag tag); +void freefare_free_tags(FreefareTag *tags); +bool freefare_selected_tag_is_present(nfc_device *device); + +const char *freefare_strerror(FreefareTag tag); +int freefare_strerror_r(FreefareTag tag, char *buffer, size_t len); +void freefare_perror(FreefareTag tag, const char *string); + + + // bool felica_taste(nfc_device *device, nfc_target target); - // + // #define FELICA_SC_RW 0x0009 // #define FELICA_SC_RO 0x000b // @@ -152,67 +152,67 @@ // FreefareTag mifare_mini_tag_new(nfc_device *device, nfc_target target); // FreefareTag mifare_classic1k_tag_new(nfc_device *device, nfc_target target); // FreefareTag mifare_classic4k_tag_new(nfc_device *device, nfc_target target); -// void mifare_classic_tag_free(FreefareTag tag); -// -// typedef unsigned char MifareClassicBlock[16]; -// -// typedef uint8_t MifareClassicSectorNumber; -// typedef unsigned char MifareClassicBlockNumber; -// -// typedef enum { MFC_KEY_A, MFC_KEY_B } MifareClassicKeyType; -// typedef unsigned char MifareClassicKey[6]; -// -// /* NFC Forum public key */ -// extern const MifareClassicKey mifare_classic_nfcforum_public_key_a; -// -// int mifare_classic_connect(FreefareTag tag); -// int mifare_classic_disconnect(FreefareTag tag); -// -// int mifare_classic_authenticate(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicKey key, const MifareClassicKeyType key_type); -// int mifare_classic_read(FreefareTag tag, const MifareClassicBlockNumber block, MifareClassicBlock *data); -// int mifare_classic_init_value(FreefareTag tag, const MifareClassicBlockNumber block, const int32_t value, const MifareClassicBlockNumber adr); -// int mifare_classic_read_value(FreefareTag tag, const MifareClassicBlockNumber block, int32_t *value, MifareClassicBlockNumber *adr); -// int mifare_classic_write(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicBlock data); -// -// int mifare_classic_increment(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount); -// int mifare_classic_decrement(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount); -// int mifare_classic_restore(FreefareTag tag, const MifareClassicBlockNumber block); -// int mifare_classic_transfer(FreefareTag tag, const MifareClassicBlockNumber block); -// -// int mifare_classic_get_trailer_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const uint16_t permission, const MifareClassicKeyType key_type); -// int mifare_classic_get_data_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const unsigned char permission, const MifareClassicKeyType key_type); +void mifare_classic_tag_free(FreefareTag tag); // -// int mifare_classic_format_sector(FreefareTag tag, const MifareClassicSectorNumber sector); -// -// void mifare_classic_trailer_block(MifareClassicBlock *block, const MifareClassicKey key_a, uint8_t ab_0, uint8_t ab_1, uint8_t ab_2, uint8_t ab_tb, const uint8_t gpb, const MifareClassicKey key_b); -// -// MifareClassicSectorNumber mifare_classic_block_sector(MifareClassicBlockNumber block); -// MifareClassicBlockNumber mifare_classic_sector_first_block(MifareClassicSectorNumber sector); -// size_t mifare_classic_sector_block_count(MifareClassicSectorNumber sector); -// MifareClassicBlockNumber mifare_classic_sector_last_block(MifareClassicSectorNumber sector); -// -// #define C_000 0 -// #define C_001 1 -// #define C_010 2 -// #define C_011 3 -// #define C_100 4 -// #define C_101 5 -// #define C_110 6 -// #define C_111 7 -// #define C_DEFAULT 255 -// -// /* MIFARE Classic Access Bits */ -// #define MCAB_R 0x8 -// #define MCAB_W 0x4 -// #define MCAB_D 0x2 -// #define MCAB_I 0x1 -// -// #define MCAB_READ_KEYA 0x400 -// #define MCAB_WRITE_KEYA 0x100 -// #define MCAB_READ_ACCESS_BITS 0x040 -// #define MCAB_WRITE_ACCESS_BITS 0x010 -// #define MCAB_READ_KEYB 0x004 -// #define MCAB_WRITE_KEYB 0x001 +typedef unsigned char MifareClassicBlock[16]; + +typedef uint8_t MifareClassicSectorNumber; +typedef unsigned char MifareClassicBlockNumber; + +typedef enum { MFC_KEY_A, MFC_KEY_B } MifareClassicKeyType; +typedef unsigned char MifareClassicKey[6]; + +/* NFC Forum public key */ +extern const MifareClassicKey mifare_classic_nfcforum_public_key_a; + +int mifare_classic_connect(FreefareTag tag); +int mifare_classic_disconnect(FreefareTag tag); + +int mifare_classic_authenticate(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicKey key, const MifareClassicKeyType key_type); +int mifare_classic_read(FreefareTag tag, const MifareClassicBlockNumber block, MifareClassicBlock *data); +int mifare_classic_init_value(FreefareTag tag, const MifareClassicBlockNumber block, const int32_t value, const MifareClassicBlockNumber adr); +int mifare_classic_read_value(FreefareTag tag, const MifareClassicBlockNumber block, int32_t *value, MifareClassicBlockNumber *adr); +int mifare_classic_write(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicBlock data); + +int mifare_classic_increment(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount); +int mifare_classic_decrement(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount); +int mifare_classic_restore(FreefareTag tag, const MifareClassicBlockNumber block); +int mifare_classic_transfer(FreefareTag tag, const MifareClassicBlockNumber block); + +int mifare_classic_get_trailer_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const uint16_t permission, const MifareClassicKeyType key_type); +int mifare_classic_get_data_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const unsigned char permission, const MifareClassicKeyType key_type); + +int mifare_classic_format_sector(FreefareTag tag, const MifareClassicSectorNumber sector); + +void mifare_classic_trailer_block(MifareClassicBlock *block, const MifareClassicKey key_a, uint8_t ab_0, uint8_t ab_1, uint8_t ab_2, uint8_t ab_tb, const uint8_t gpb, const MifareClassicKey key_b); + +MifareClassicSectorNumber mifare_classic_block_sector(MifareClassicBlockNumber block); +MifareClassicBlockNumber mifare_classic_sector_first_block(MifareClassicSectorNumber sector); +size_t mifare_classic_sector_block_count(MifareClassicSectorNumber sector); +MifareClassicBlockNumber mifare_classic_sector_last_block(MifareClassicSectorNumber sector); + +#define C_000 0 +#define C_001 1 +#define C_010 2 +#define C_011 3 +#define C_100 4 +#define C_101 5 +#define C_110 6 +#define C_111 7 +#define C_DEFAULT 255 + +/* MIFARE Classic Access Bits */ +#define MCAB_R 0x8 +#define MCAB_W 0x4 +#define MCAB_D 0x2 +#define MCAB_I 0x1 + +#define MCAB_READ_KEYA 0x400 +#define MCAB_WRITE_KEYA 0x100 +#define MCAB_READ_ACCESS_BITS 0x040 +#define MCAB_WRITE_ACCESS_BITS 0x010 +#define MCAB_READ_KEYB 0x004 +#define MCAB_WRITE_KEYB 0x001 // // struct mad_aid { // uint8_t application_code;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/rfid_pn532_py/requirements.txt Sun Mar 10 04:02:59 2019 -0700 @@ -0,0 +1,1 @@ +
--- a/service/rfid_pn532_py/tags.py Mon Mar 04 15:18:46 2019 -0800 +++ b/service/rfid_pn532_py/tags.py Sun Mar 10 04:02:59 2019 -0700 @@ -1,3 +1,4 @@ +import time from ctypes import pointer, byref import nfc, freefare import logging @@ -17,7 +18,9 @@ print(f'{devices_found} connection strings') for i in range(devices_found): print(f' dev {i}: {conn_strings[i]}') - + if devices_found < 1: + raise IOError("no devices") + print("open dev") self.dev = nfc.nfc_open(self.context, conn_strings[0]) if nfc.nfc_device_get_last_error(self.dev): @@ -27,46 +30,19 @@ if self.dev: nfc.nfc_close(self.dev) nfc.nfc_exit(self.context) -''' def getTags(self): log.info("getting tags") t0 = time.time() ret = freefare.freefare_get_tags(self.dev) - if not ret: raise IOError("freefare_get_tags returned null") - log.info(f"found tags in {time.time() - t0}") - return ret - - # freefare lib wants to free all the tag memory, so process them in a - # callback and don't keep them outside that. - def forAllTags(self, onTag: (NfcTag) -> None): - ret = self.getTags() - for tagp in ret: - if isNil(tagp): - break - if cast[int](tagp) < 10: - # pointer value looks wrong - break - - let tag: FreefareTag = tagp[] - if isNil(tag): - break - onTag(NfcTag(tag: tag)) - freefare.freefare_free_tags(ret) - -def blockFromString(s: str): - result = MifareClassicBlock() - for i in 0..result.high: - if i < s.len: - result[i] = s[i] - else: - result[i] = '\x00' - return result - -proc stringFromBlock(b: MifareClassicBlock) -> string - return ''.join(b)#cast[array[16,char]](b).join - -type TagArray {.unchecked.} = array[999, ptr FreefareTag] + if not ret: + raise IOError("freefare_get_tags returned null") + try: + log.info(f"found tags in {time.time() - t0}") + for t in ret: + yield NfcTag(t) + finally: + freefare.freefare_free_tags(ret) pubkey = ['\xff', '\xff', '\xff', '\xff', '\xff', '\xff'] @@ -78,7 +54,7 @@ def __init__(self, tag): #FreefareTag self.tag = tag - def tagType(self): freefare.freefare_tag_type = + def tagType(self) -> freefare.freefare_tag_type: return freefare.freefare_get_tag_type(self.tag) def uid(self): @@ -90,27 +66,26 @@ def disconnect(self): check(freefare.mifare_classic_disconnect(self.tag), "disconnect") - def readBlock(self, blockNumber: int) -> string: - blockNum = cast[freefare.MifareClassicBlockNumber](blockNumber) + def readBlock(self, blockNumber: int) -> str: + blockNum = freefare.MifareClassicBlockNumber(blockNumber) check(freefare.mifare_classic_authenticate( self.tag, blockNum, pubkey, freefare.MFC_KEY_A), - &"mifare_classic_authenticate() failed") + "mifare_classic_authenticate() failed") - var data: freefare.MifareClassicBlock + data = freefare.MifareClassicBlock() - check(mifare_classic_read(self.tag, blockNum, addr data), + check(freefare.mifare_classic_read(self.tag, blockNum, pointer(data)), "classic_read() failed") - return toString(data) + return data def writeBlock(self, blockNumber: int, - data: freefare.MifareClassicBlock) = - var blocknum = cast[freefare.MifareClassicBlockNumber](blockNumber) + data: freefare.MifareClassicBlock): + blocknum = freefare.MifareClassicBlockNumber(blockNumber) check(freefare.mifare_classic_authenticate( self.tag, blocknum, pubkey, freefare.MFC_KEY_A), - &"mifare_classic_authenticate() failed") + "mifare_classic_authenticate() failed") - check(mifare_classic_write(self.tag, blocknum, data), + check(freefare.mifare_classic_write(self.tag, blocknum, data), "classic_write() failed") - log.info(&" wrote block {blocknum}: {data}") -''' + log.info(" wrote block {blocknum}: {data}")
--- a/service/rfid_pn532_py/tags_test.py Mon Mar 04 15:18:46 2019 -0800 +++ b/service/rfid_pn532_py/tags_test.py Sun Mar 10 04:02:59 2019 -0700 @@ -1,8 +1,13 @@ import unittest import tags +import os +os.environ['LIBNFC_DEFAULT_DEVICE'] = "pn532_i2c:/dev/i2c-1" class TestNfc(unittest.TestCase): def test_open_close(self): n = tags.NfcDevice() del n + def test_get_tags(self): + n = tags.NfcDevice() + print(n.getTags())