首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >斑马用Android Kotlin编写RFID,用一些标签进行预成形,但另一些则不正确。

斑马用Android Kotlin编写RFID,用一些标签进行预成形,但另一些则不正确。
EN

Stack Overflow用户
提问于 2022-03-10 10:47:05
回答 1查看 295关注 0票数 0

我正在开发一个库存管理系统,它需要在RFID标签中写入资产it(最长为17)。

首先,问题是,当我在标签上写入一个比已经写入的ID更短的ID时,它会将未重写的字符保存在标记中。如果标签上写有ID "123456789“,我在标签上写id "abc”。标记的资产id变成abc456789。我试着在写之前杀死和抹去标签,但它没有起作用。

在此之后,我想在目标ID之前加上零,直到它达到最大长度(17),这样就不会在标签上写入长度较短的资产id,在读取后,我删除了所有前面的零。这对于某个标记很好,但对另一个标记无效,我发现另一个标记不能写入超过12个字符,但我不知道为什么,RFID标签中没有问题,因为它在另一个应用程序中运行良好,可以用超过12个字符写入。

如果有人能帮我找出为什么这个标签上只写了12个字符,而资产ID的其余部分却被忽略了,我会非常感激,尽管相同的代码可以与另一个RFID标签一起工作。

这里是写标记方法:

代码语言:javascript
复制
    fun writeTag(sourceEPC: String?, targetData: String): TagData? {
    errorMessage = ""
    try {
        val tagData = TagData()
        val tagAccess = TagAccess()
        val writeAccessParams = tagAccess.WriteAccessParams()
        writeAccessParams.accessPassword = 0
        writeAccessParams.memoryBank = MEMORY_BANK.MEMORY_BANK_EPC
        writeAccessParams.offset = 2
        var paddedTargetData =  padLeftZeros(targetData,17)
        val targetDataInHex = HexStringConverter.getHexStringConverterInstance().stringToHex(if (paddedTargetData.length % 2 != 0) "0$paddedTargetData" else paddedTargetData)//if ODD
        val padded = targetDataInHex + RFID_ADDED_VALUE
        writeAccessParams.setWriteData(padded)
        writeAccessParams.writeRetries = 1
        writeAccessParams.writeDataLength = padded.length / 4 // WORD EQUALS 4 HEX
        reader!!.Actions.TagAccess.writeWait(sourceEPC, writeAccessParams, null, tagData)
        return tagData
    } catch (e: InvalidUsageException) {
        errorMessage = "InvalidUsageException=" + e.vendorMessage + " " + e.info
        println(errorMessage)
        return null
    } catch (e: OperationFailureException) {
        errorMessage = "InvalidUsageException=" + e.vendorMessage + " " + e.results
        println(errorMessage)
        return null
    } catch (e: UnsupportedEncodingException) {
        errorMessage = if (e.message == null) "" else e.message!!
        println(errorMessage)
        return null
    }
}

读取全标签方法:

代码语言:javascript
复制
    fun readFullTag(sourceEPC: String): TagData? {
    errorMessage = ""
    try {
        val tagAccess = TagAccess()
        val readAccessParams = tagAccess.ReadAccessParams()
        readAccessParams.accessPassword = 0
        readAccessParams.memoryBank = MEMORY_BANK.MEMORY_BANK_TID
        readAccessParams.offset = 0
        return reader?.Actions?.TagAccess?.readWait(sourceEPC, readAccessParams, null, false)
    } catch (e: InvalidUsageException) {
        errorMessage = "InvalidUsageException=" + e.vendorMessage + " " + e.info
        println(errorMessage)
        return null
    } catch (e: OperationFailureException) {
        errorMessage = "InvalidUsageException=" + e.vendorMessage + " " + e.results
        println(errorMessage)
        return null
    }
}

处理标记数据方法:

代码语言:javascript
复制
    override fun handleTagData(tagData: Array<TagData?>?) {
    var readValue = ""

    if (!tagData.isNullOrEmpty()) readValue = tagData[0]!!.tagID.trimIndent().replace("\n", "")

    if (isWritingRFID) {
        isWritingRFID = false
        if (currentRFIDAssetCode.isNotEmpty())
            writeRFID(readValue, currentRFIDAssetCode)
    } else {
        CoroutineScope(Dispatchers.Main).launch {
            if (!pDialog.isShowing) readFullRFID(readValue)
        }
    }
}

请随时索取任何额外的代码或信息。

EN

回答 1

Stack Overflow用户

发布于 2022-04-16 23:16:39

另一种解决这个问题的方法是使用NFC中经常使用的技术,而不是填充零,数据的第一个字节是数据长度的值(以十六进制表示)。

因此,如果旧数据不是零,那么就没有关系了,而且您将不会有问题,检测它是空白的零还是真正的零。

例如:

0A 31 32 33 34 35 36 37 38 39 30

或文本

10 1 2 3 4 5 6 7 8 9

将被覆盖

03 41 42 43

或文本

3 A、B、C

结果导致记忆中的文本

3 A B C 4 5 6 7 8 9 0

但是,您将读取第一个字节以获得3的长度,然后再读取3个字节以获取文本。

A、B、C

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71422845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档