我正在开发一个库存管理系统,它需要在RFID标签中写入资产it(最长为17)。
首先,问题是,当我在标签上写入一个比已经写入的ID更短的ID时,它会将未重写的字符保存在标记中。如果标签上写有ID "123456789“,我在标签上写id "abc”。标记的资产id变成abc456789。我试着在写之前杀死和抹去标签,但它没有起作用。
在此之后,我想在目标ID之前加上零,直到它达到最大长度(17),这样就不会在标签上写入长度较短的资产id,在读取后,我删除了所有前面的零。这对于某个标记很好,但对另一个标记无效,我发现另一个标记不能写入超过12个字符,但我不知道为什么,RFID标签中没有问题,因为它在另一个应用程序中运行良好,可以用超过12个字符写入。
如果有人能帮我找出为什么这个标签上只写了12个字符,而资产ID的其余部分却被忽略了,我会非常感激,尽管相同的代码可以与另一个RFID标签一起工作。
这里是写标记方法:
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
}
}读取全标签方法:
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
}
}处理标记数据方法:
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)
}
}
}请随时索取任何额外的代码或信息。
发布于 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
https://stackoverflow.com/questions/71422845
复制相似问题