package com.dayu.general.bean.card
|
|
import com.dayu.baselibrary.tools.HexUtil
|
import java.io.Serializable
|
|
/**
|
* IP地址设置卡
|
* 用于项目现场修改IP地址,通过刷卡方式修改IP地址
|
*/
|
class IpSettingCard : BaseCard(), Serializable {
|
companion object {
|
const val CARD_TYPE = "B5" // 卡类型:IP设置卡
|
const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 识别码A0
|
const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 识别码B1
|
const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 识别码C2
|
const val IDENTIFY_CODE_89 = 0x89.toByte() // 识别码89
|
|
const val MAX_IP_ROUTE = 4 // 最大IP路数
|
}
|
|
var ipRouteNumber: Int = 1 // IP地址序列号(1-4)
|
var ipAddress: String = "" // IP地址
|
var port: Int = 0 // 端口号
|
|
/**
|
* 写卡完成后校验是否写卡成功
|
*/
|
fun equalsIpSettingCard(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>): IpSettingCard? {
|
try {
|
val ipSettingCard = IpSettingCard()
|
|
// 解析第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
|
}
|
|
// 解析IP路数(13位)
|
val routeNumber = zero[13].toInt()
|
if (routeNumber !in 1..MAX_IP_ROUTE) {
|
return null
|
}
|
ipSettingCard.ipRouteNumber = routeNumber
|
|
// 解析第1块 - IP地址
|
val one = data[1]
|
val ipBuilder = StringBuilder()
|
for (i in 0..14) {
|
ipBuilder.append(one[i].toInt().toChar())
|
}
|
ipSettingCard.ipAddress = ipBuilder.toString()
|
|
// 解析第2块 - 端口号
|
val two = data[2]
|
val portBuilder = StringBuilder()
|
for (i in 0..4) {
|
portBuilder.append(two[i].toInt().toChar())
|
}
|
ipSettingCard.port = portBuilder.toString().toInt()
|
|
return ipSettingCard
|
} catch (e: Exception) {
|
e.printStackTrace()
|
return null
|
}
|
}
|
|
/**
|
* 生成第0块数据
|
*/
|
inner class Zero : BaseCard() {
|
fun toBytes(): ByteArray {
|
val data = ByteArray(16)
|
try {
|
// 设置备用位(0-7位)
|
for (i in 0..7) {
|
data[i] = 0x00
|
}
|
|
// 设置卡类型(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
|
|
// 设置IP路数(13位)
|
data[13] = ipRouteNumber.toByte()
|
|
// 设置备用位(14位)
|
data[14] = 0x00
|
|
// 设置校验和(15位)
|
data[15] = getByteSum(data)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return data
|
}
|
}
|
|
/**
|
* 生成第1块数据 - IP地址
|
*/
|
inner class One : BaseCard() {
|
fun toBytes(): ByteArray {
|
val data = ByteArray(16)
|
try {
|
// 格式化IP地址
|
val formattedIp = formatIpAddress(ipAddress)
|
|
// 写入IP地址(0-14位)
|
formattedIp.forEachIndexed { index, char ->
|
data[index] = char.code.toByte()
|
}
|
|
// 设置校验和(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 {
|
// 格式化端口号
|
val formattedPort = String.format("%05d", port)
|
|
// 写入端口号(0-4位)
|
formattedPort.forEachIndexed { index, char ->
|
data[index] = char.code.toByte()
|
}
|
|
// 设置备用位(5-14位)
|
for (i in 5..14) {
|
data[i] = 0x00
|
}
|
|
// 设置校验和(15位)
|
data[15] = getByteSum(data)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
return data
|
}
|
}
|
|
/**
|
* 格式化IP地址
|
* 将IP地址格式化为标准格式:每组3位,不足补0
|
*/
|
private fun formatIpAddress(ip: String): String {
|
val parts = ip.split(".")
|
if (parts.size != 4) throw IllegalArgumentException("Invalid IP address format")
|
|
return parts.joinToString(".") { part ->
|
String.format("%03d", part.toInt())
|
}
|
}
|
|
/**
|
* 验证IP地址格式是否正确
|
*/
|
fun isValidIpAddress(): Boolean {
|
return try {
|
val parts = ipAddress.split(".")
|
if (parts.size != 4) return false
|
|
parts.all { part ->
|
val num = part.toInt()
|
num in 0..255
|
}
|
} catch (e: Exception) {
|
false
|
}
|
}
|
|
/**
|
* 验证端口号是否正确
|
*/
|
fun isValidPort(): Boolean {
|
return port in 1..65535
|
}
|
|
fun getZeroBytes(): ByteArray = Zero().toBytes()
|
fun getOneBytes(): ByteArray = One().toBytes()
|
fun getTwoBytes(): ByteArray = Two().toBytes()
|
}
|