我正在开发一个库存管理系统,该系统要求将资产ID(长度最大为17(写入RFID标签。
首先,问题是当我在标签上写一个长度比已经写的ID短的ID时,它会保留标签中的非重写字符。例如:如果标签具有ID"0";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)
}
}
}
请随时询问任何其他代码或信息。
解决此问题的另一种方法是使用NFC中经常使用的技术,即数据的第一个字节是数据长度的值(十六进制(,而不是用零填充。
因此,旧数据是否为零并不重要,检测它是用于消隐的零还是实际的零也不会有问题
例如
0A 31 32 33 34 35 36 37 38 39 30
或文本
10 1 2 3 4 5 6 7 8 9 0
将被覆盖
03 41 42 43
或文本
3 A B C
导致内存中的文本
3 A B C 4 5 6 7 8 9 0
但是你会读第一个字节得到3的长度,然后再读3个字节得到文本
A B C