package com.flightfeather.uav.socket.bean
|
|
import java.text.SimpleDateFormat
|
import java.util.*
|
|
/**
|
* @author riku
|
* Date: 2020/9/10
|
*/
|
open class BaseMessage {
|
|
var head: String = ""
|
var length: String = ""
|
|
var qn: String = ""
|
var st: String = ""
|
var cn: String = ""
|
var pw: String = ""
|
var mn: String = ""
|
var flag: String = ""
|
var cp: String = ""
|
var extra: String = ""
|
|
var crc: String = ""
|
|
open fun newMessage() {
|
head = "##"
|
qn = SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.getDefault()).format(Date())
|
}
|
|
fun parse2Str():String {
|
val str = "QN=$qn;ST=$st;CN=$cn;PW=$pw;MN=$mn;Flag=$flag;CP=&&${cp}&&$extra"
|
return "$head${getLength(str.length)}$str${getCrc(str.toByteArray(), str.length)}\r\n"
|
}
|
|
/**
|
* crc计算工具类
|
* @param bufData 数据段字符串转化的byte[],
|
* @param bufLen 的长度
|
* @return CRC码:4字节
|
*/
|
fun getCrc(bufData: ByteArray, bufLen: Int): String? {
|
var crc = 0x0000ffff
|
val polynomial = 0x0000a001
|
var j: Int
|
if (bufLen == 0) {
|
return null
|
}
|
var i: Int = 0
|
while (i < bufLen) {
|
crc = crc xor (bufData[i].toInt() and 0x000000ff)
|
j = 0
|
while (j < 8) {
|
if (crc and 0x00000001 != 0) {
|
crc = crc shr 1
|
crc = crc xor polynomial
|
} else {
|
crc = crc shr 1
|
}
|
j++
|
}
|
i++
|
}
|
var strCRC = Integer.toHexString(crc).toString()
|
if (strCRC.length < 4) {
|
strCRC += "0"
|
}
|
return strCRC
|
}
|
|
fun getLength(length: Int): String {
|
val size = StringBuilder()
|
when {
|
length >= 100 -> {
|
size.append("0")
|
}
|
length >= 10 -> {
|
size.append("00")
|
}
|
length >= 0 -> {
|
size.append("000")
|
}
|
}
|
size.append(length)
|
return size.toString()
|
}
|
}
|