Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись меток RFID-считыватель motorola fx7400 
:(
    Опции темы
Ururu
Дата 27.6.2017, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 27.1.2009

Репутация: нет
Всего: нет



Доброго всем дня.
Есть RFID-считыватель Motorola fx7400. Есть EMDK for C от Моторолы, из которого вытащена RFIDAPI32PC.dll для работы со считывателем. Есть задача - записать метку, точнее, перезаписать её TagID.
Подключаюсь к считывателю, считываю метку, передаю её TagID в процедуру записи - выдаёт ошибку 508. Если верить справке, это означает " Tag(s) not found in the field which matches the set Filter(s)". Что за фильтры такие, фиг его знает. Никаких процедур по установке никаких фильтров не вызывается, в процедуре записи RFID_WriteTagID тоже никаких фильтров нет. Может кто сталкивался с этой dll, как с её использованием записывать метки?
Использование конкретно этой dll не принципиально, если есть другие простые способы читать/писать RFID-метки, подскажите. dll использую так как это считывание должно работать из 1С Предприятие, соответственно сейчас схема такая: в dll выполняется чтение метки, потом результат передаётся в 1С. Нужно в эту схему запихать ещё запись метки. 
PM MAIL   Вверх
Snowy
Дата 27.6.2017, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Значит, что такой Tag не значится в списке известных тэгов.
Возможно неверный Tag, либо ты его неправильно передаёшь.

PM MAIL   Вверх
Ururu
Дата 27.6.2017, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 27.1.2009

Репутация: нет
Всего: нет



В справке функция описана так:

Код

RFID_STATUS WINAPI RFID_WriteTagID  ( RFID_HANDLE32  readerHandle,    UINT8 *  pTagID,  UINT32  tagIDLength, LPWRITE_SPECIFIC_FIELD_ACCESS_PARAMS lpWriteSpecificFieldAccessParams,    LPANTENNA_INFO  lpAntennaInfo,  LPVOID  rsvd )

typedef struct _WRITE_SPECIFIC_FIELD_ACCESS_PARAMS

{

UINT8*  pWriteData;

UINT16  writeDataLength;

UINT32  accessPassword;

LPVOID lpReserved[4];

} WRITE_SPECIFIC_FIELD_ACCESS_PARAMS, *LPWRITE_SPECIFIC_FIELD_ACCESS_PARAMS;

Members
UINT8*  pWriteData

Pointer to a UINT8 array which contains the data to be written. Write operation occurs only on word boundaries, hence it is required to input this field accordingly. For e.g The word 0x1122 will be UINT8 writeData[2] = {0x11, 0x22}.

UINT16  writeDataLength

Length of the array pWriteData.

UINT32  accessPassword

Password to be used for the Access operation.

LPVOID lpReserved[4]

Reserved for future.


Функция, которая получает данные метки, так: 
Код


RFID_STATUS WINAPI RFID_GetEventData (RFID_HANDLE32 readerHandle,   RFID_EVENT_TYPE eventType,   STRUCT_HANDLE pEventData)

Parameters
readerHandle

[in] Handle to the RFID Device.

eventType

[in] The Event-type for which the Data is to be fetched

pEventData

[out] Pointer to Event-Data which can be of type:

TAG_DATA for TAG_READ_EVENT

ANTENNA_EVENT_DATA for ANTENNA_EVENT

GPI_EVENT_DATA for GPI_EVENT

typedef struct _TAG_DATA

{

_STRUCT_INFO structInfo;

UINT8 * pTagID;

UINT32 tagIDLength;

UINT32 tagIDAllocated;

UINT16 PC;

UINT32 XPC;

UINT16 CRC;

UINT16 antennaID;

union {

  struct _UP_TIME {

    UINT64 firstSeenTimeStamp;

    UINT64 lastSeenTimeStamp;

  } upTime;

  struct _UTC_TIME {

    SYSTEMTIME firstSeenTimeStamp;

    SYSTEMTIME lastSeenTimeStamp;

  } utcTime;

} seenTime;

INT8 peakRSSI;

UINT16 channelIndex;

UINT16 tagSeenCount;

ACCESS_OPERATION_CODE opCode;

ACCESS_OPERATION_STATUS opStatus;

MEMORY_BANK memoryBank;

UINT8 * pMemoryBankData;

UINT32 memoryBankDataByteOffset;

UINT32 memoryBankDataLength;

UINT32 memoryBankDataAllocated;

TAG_EVENT  tagEvent;

SYSTEMTIME tagEventTimeStamp;

LPLOCATION_INFO lpLocation;

LPACCESS_OPERATION_RESULT lpAccessOperationResult;

UINT16 transmitPort;

UINT16 receivePort;

LPTAG_ZONE_INFO lpZoneInfo;

INT16 phaseInfo;

UINT16 reserved;

LPVOID lpReserved[16-10];

 

} TAG_DATA, *LPTAG_DATA;




У меня в модуле:

Код

TAG_DATA = record
     structInfo: TStructInfo;
     pTagID: array of byte;
     tagIDLength: Cardinal;
     tagIDAllocated: Cardinal;
     PC: Word;
     XPC: Cardinal;
     CRC: Word;
     antennaID: Word;
     seenTime: TseenTime;
     peakRSSI: byte;
     channelIndex: Word;
     tagSeenCount: Word;
     opCode: TAccessOperationCode;
     opStatus: TAccessOperationStatus;
     MemoryBank: TMemoryBank;
     pMemoryBankData: array of byte;
     memoryBankDataByteOffset: Cardinal;
     memoryBankDataLength: Cardinal;
     memoryBankDataAllocated: Cardinal;
     TagEvent: TTagEvent;
     tagEventTimeStamp: TSystemTime;
     LocationInfo: PLocationInfo;
     LpAccessOperationResult: PAccessOperationResult;
     lpPortalDirectionalityTagInfoList: PPortalDirectionalityTagInfoList;
     reserved32: array [0..1] of Cardinal;
     lpReserved: array [0..5] of DWORD;
    End;

    PTAG_DATA = ^TAG_DATA;

  tTagID = array[0..11] of byte;
  pTagID = ^tTagID;

function RFID_GetEventData (readerHandle:Cardinal; eventType: RFID_EVENT_TYPE; lpTagData: PTAG_DATA): Cardinal; stdcall; external 'RFIDAPI32PC.dll';
function RFID_WriteTagID (readerHandle:Cardinal; TagID: pTagID; TagIDLength: Cardinal; lpWriteAccessParams: PWRITE_SPECIFIC_FIELD_ACCESS_PARAMS; lpAntennaInfo:Pointer; rsvd:Pointer): Cardinal; stdcall; external 'RFIDAPI32PC.dll';


Вызывается так:

Код

res := RFID_WriteTagID(descr, @dannye.pTagID, dannye.tagIDLength, @ParamWrite, nil, nil);


То есть сначала RFID_GetEventData возвращает структуру, в которой сидит TagID в виде из 12 байт. Потом указатель ровно  на этот массив я передаю в функцию RFID_WriteTagID. Пробовал вместо типа tTagID = array[0..11] of byte указывать этот параметр функции просто как array of byte. И задавать ему потом длину через SetLength пробовал. Бесполезно. Всё равно ошибка 508. TagID считывает правильно, я проверял. 
Буду очень признателен за идею, как запихать в RFID_WriteTagID нужный TagID так, чтобы оно нашлось.
PM MAIL   Вверх
Snowy
Дата 29.6.2017, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



record по умолчанию выравнивает поля структуры для ускорения доступа.
Чтобы сохранить точную структуру, нужно использовать packed record

TAG_DATA = packed record

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.