package com.dayu.general.bean.card
|
|
import com.dayu.baselibrary.tools.HexUtil
|
import com.dayu.general.tool.CardCommon
|
import java.io.Serializable
|
|
/**
|
* 域名设置卡
|
* 用于项目现场修改域名,通过刷卡方式修改域名
|
*/
|
class DomainSettingCard : BaseCard(), Serializable {
|
companion object {
|
const val CARD_TYPE = CardCommon.AREA_CARD // 卡类型:域名设置卡
|
|
|
const val MAX_DOMAIN_ROUTE = 4 // 最大域名路数
|
const val MAX_DOMAIN_LENGTH = 38 // 最大域名长度
|
}
|
|
var domainRouteNumber: Int = 1 // 域名序列号(1-4)
|
var domain: String = "" // 域名
|
var domainLength: Int = 0 // 域名长度
|
|
/**
|
* 写卡完成后校验是否写卡成功
|
*/
|
fun equalsDomainSettingCard(data: List<ByteArray>?): Boolean {
|
if (data == null || data.size < 3) {
|
return false
|
}
|
return data[0].contentEquals(getZeroBytes()) &&
|
data[1].contentEquals(getOneBytes()) &&
|
data[2].contentEquals(getTwoBytes())
|
}
|
|
/**
|
* 通过byte转bean
|
*/
|
fun getBean(data: List<ByteArray>): DomainSettingCard? {
|
try {
|
val domainSettingCard = DomainSettingCard()
|
|
// 解析第0块
|
val zero = data[0]
|
|
// 验证卡类型(8位)
|
if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
|
return null
|
}
|
|
// 验证识别码(9-12位)
|
if (zero[9] != IDENTIFY_CODE_A0 ||
|
zero[10] != IDENTIFY_CODE_B1 ||
|
zero[11] != IDENTIFY_CODE_C2 ||
|
zero[12] != IDENTIFY_CODE_89
|
) {
|
return null
|
}
|
|
// 解析域名路数(13位)
|
val routeNumber = zero[13].toInt()
|
if (routeNumber !in 1..MAX_DOMAIN_ROUTE) {
|
return null
|
}
|
domainSettingCard.domainRouteNumber = routeNumber
|
|
// 解析域名长度(14位)
|
domainSettingCard.domainLength = zero[14].toInt()
|
|
// 解析域名前8个字符(0-7位)
|
val domainBuilder = StringBuilder()
|
for (i in 0..7) {
|
if (zero[i] != 0.toByte()) {
|
domainBuilder.append(zero[i].toInt().toChar())
|
}
|
}
|
|
// 解析第1块 - 域名中间15个字符
|
val one = data[1]
|
for (i in 0..14) {
|
if (one[i] != 0.toByte()) {
|
domainBuilder.append(one[i].toInt().toChar())
|
}
|
}
|
|
// 解析第2块 - 域名剩余15个字符
|
val two = data[2]
|
for (i in 0..14) {
|
if (two[i] != 0.toByte()) {
|
domainBuilder.append(two[i].toInt().toChar())
|
}
|
}
|
|
domainSettingCard.domain = domainBuilder.toString()
|
|
return domainSettingCard
|
} catch (e: Exception) {
|
e.printStackTrace()
|
return null
|
}
|
}
|
|
/**
|
* 生成第0块数据
|
*/
|
inner class Zero : BaseCard() {
|
fun toBytes(): ByteArray {
|
val data = ByteArray(16)
|
try {
|
// 写入域名前8个字符(0-7位)
|
domain.take(8).forEachIndexed { index, char ->
|
data[index] = char.code.toByte()
|
}
|
// 补0
|
for (i in domain.length.coerceAtMost(8) until 8) {
|
data[i] = 0
|
}
|
|
// 设置卡类型(8位)
|
data[8] = HexUtil.hexToByte(CARD_TYPE)
|
|
// 设置识别码(9-12位)
|
data[9] = IDENTIFY_CODE_A0
|
data[10] = IDENTIFY_CODE_B1
|
data[11] = IDENTIFY_CODE_C2
|
data[12] = IDENTIFY_CODE_89
|
|
// 设置域名路数(13位)
|
data[13] = domainRouteNumber.toByte()
|
|
// 设置域名长度(14位)
|
data[14] = domain.length.toByte()
|
|
// 设置校验和(15位)
|
data[15] = getByteSum(data)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return data
|
}
|
}
|
|
/**
|
* 生成第1块数据 - 域名中间部分
|
*/
|
inner class One : BaseCard() {
|
fun toBytes(): ByteArray {
|
val data = ByteArray(16)
|
try {
|
// 写入域名中间15个字符(0-14位)
|
domain.drop(8).take(15).forEachIndexed { index, char ->
|
data[index] = char.code.toByte()
|
}
|
// 补0
|
for (i in (domain.length - 8).coerceAtMost(15) until 15) {
|
data[i] = 0
|
}
|
|
// 设置校验和(15位)
|
data[15] = getByteSum(data)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return data
|
}
|
}
|
|
/**
|
* 生成第2块数据 - 域名结尾部分
|
*/
|
inner class Two : BaseCard() {
|
fun toBytes(): ByteArray {
|
val data = ByteArray(16)
|
try {
|
// 写入域名最后15个字符(0-14位)
|
domain.drop(23).take(15).forEachIndexed { index, char ->
|
data[index] = char.code.toByte()
|
}
|
// 补0
|
for (i in (domain.length - 23).coerceAtMost(15) until 15) {
|
data[i] = 0
|
}
|
|
// 设置校验和(15位)
|
data[15] = getByteSum(data)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return data
|
}
|
}
|
|
/**
|
* 验证域名格式是否正确
|
*/
|
fun isValidDomain(): Boolean {
|
return domain.isNotEmpty() &&
|
domain.length <= MAX_DOMAIN_LENGTH &&
|
domain.matches(Regex("^[a-zA-Z0-9.-]+$"))
|
}
|
|
/**
|
* 验证域名路数是否正确
|
*/
|
fun isValidRouteNumber(): Boolean {
|
return domainRouteNumber in 1..MAX_DOMAIN_ROUTE
|
}
|
|
fun getZeroBytes(): ByteArray = Zero().toBytes()
|
fun getOneBytes(): ByteArray = One().toBytes()
|
fun getTwoBytes(): ByteArray = Two().toBytes()
|
}
|