Как я могу прочитать пользовательские данные (память) из метки EPC RFID через LLRP? - PullRequest
0 голосов
/ 18 сентября 2018

Я кодирую два тега EPC через «NiceLabel Pro» с данными:

  1. Первый тег: EPC: 555555555, Данные пользователя: 9876543210123456789
  2. Второй тег: EPC: 444444444, Данные пользователя: 123456789123456789

Теперь я пытаюсь получить эти данные через LLRP (в моем приложении Java):

Мой клиент LLRP (одна функция):

public void PrepareInventoryRequest() {
    AccessCommand accessCommand = new AccessCommand();

    // A list to hold the op specs for this access command.
    accessCommand.setAccessCommandOpSpecList(GenerateOpSpecList());

    // Create a new tag spec.
    C1G2TagSpec tagSpec = new C1G2TagSpec();
    C1G2TargetTag targetTag = new C1G2TargetTag();
    targetTag.setMatch(new Bit(1));
    // We want to check memory bank 1 (the EPC memory bank).
    TwoBitField memBank = new TwoBitField("2");
    targetTag.setMB(memBank);
    // The EPC data starts at offset 0x20.
    // Start reading or writing from there.
    targetTag.setPointer(new UnsignedShort(0));
    // This is the mask we'll use to compare the EPC.
    // We want to match all bits of the EPC, so all mask bits are set.
    BitArray_HEX tagMask = new BitArray_HEX("00");
    targetTag.setTagMask(tagMask);
    // We only only to operate on tags with this EPC.
    BitArray_HEX tagData = new BitArray_HEX("00");
    targetTag.setTagData(tagData);

    // Add a list of target tags to the tag spec.
    List <C1G2TargetTag> targetTagList =
            new ArrayList<>();
    targetTagList.add(targetTag);
    tagSpec.setC1G2TargetTagList(targetTagList);

    // Add the tag spec to the access command.
    accessCommand.setAirProtocolTagSpec(tagSpec);

    accessSpec.setAccessCommand(accessCommand);
...

private List<AccessCommandOpSpec> GenerateOpSpecList() {
    // A list to hold the op specs for this access command.
    List <AccessCommandOpSpec> opSpecList =
            new ArrayList<>();

    // Set default opspec which for eventcycle of accessspec 3.
    C1G2Read opSpec1 = new C1G2Read();
    // Set the OpSpecID to a unique number.
    opSpec1.setOpSpecID(new UnsignedShort(1));
    opSpec1.setAccessPassword(new UnsignedInteger(0));

    // We'll read from user memory (bank 3).
    TwoBitField opMemBank = new TwoBitField("3");
    opSpec1.setMB(opMemBank);

    // We'll read from the base of this memory bank (0x00).
    opSpec1.setWordPointer(new UnsignedShort(0));
    // Read two words.
    opSpec1.setWordCount(new UnsignedShort(0));

    opSpecList.add(opSpec1);

    return opSpecList;
}

Функция обработки моего тега:

 private void updateTable(TagReportData tag) {
    if (tag != null) {
        EPCParameter epcParam = tag.getEPCParameter();
        String EPCStr;

        List<AccessCommandOpSpecResult> accessResultList = tag.getAccessCommandOpSpecResultList();

        for (AccessCommandOpSpecResult accessResult : accessResultList) {
            if (accessResult instanceof C1G2ReadOpSpecResult) {
                C1G2ReadOpSpecResult op = (C1G2ReadOpSpecResult) accessResult;
                if ((op.getResult().intValue() == C1G2ReadResultType.Success) &&
                        (op.getOpSpecID().intValue() < 1000)) {
                    UnsignedShortArray_HEX userMemoryHex = op.getReadData();
                    System.out.println("User Memory read from the tag is = " + userMemoryHex.toString());
                }
            }
        }
...

Для первого тега "userMemoryHex.toString ()" = "3938 3736"
Для второго тега "userMemoryHex.toString ()" = "3132 3334"

Почему? Как мне получить все данные пользователя?

Это мой тег RFID .

1 Ответ

0 голосов
/ 18 сентября 2018

Полученные значения кажутся первыми 4 символами числа (интерпретируются как строка ASCII):

  • 39383736 = "9876" (при интерпретации этих 4 байтов как символов ASCII)
  • 31323334 = "1234" (при интерпретации этих 4 байтов как символов ASCII)

Поскольку спецификация вашего тега говорит

Память: EPC 128 бит, Пользователь 32 бит

ваш тег может содержать только 32 бита (= 4 байта) пользовательских данных. Следовательно, ваш тег просто не может содержать полное значение (то есть 9876543210123456789 или 123456789123456789), которое вы пытались записать как UserData (независимо от того, было ли это интерпретировано как десятичное число или строка).

Вместо этого ваше приложение записи, похоже, взяло первые 4 символа этих значений, закодировало их в ASCII и записало их в тег.

...