using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace HardWareInteface.Common
{
///
/// 车辆道闸帮助类
///
public class CarBarrierGateHelp
{
///
/// 车辆开门返回信息
///
///
///
///
public static string GetOpenCarControlStr(string carNum, string msg)
{
try
{
var showStr = GetCarOperateStr(EnumCarOperateType.下发临显, msg).ToUpper();
var carStr = GetCarOperateStr(EnumCarOperateType.下发语音, carNum).ToUpper();
string retStr = "{\"error_num\":0,\"error_str\":\"noerror\",\"gpio_data\":[{\"ionum\":\"io1\",\"action\":\"on\"}]," +
"\"rs485_data\":[" +
"{\"encodetype\":\"hex2string\",\"data\":\"" + showStr + "\"}" +
",{\"encodetype\":\"hex2string\",\"data\":\"" + carStr + "\"}" +
"]}";
string str = "车辆开门:" + carNum + " 提示信息:" + msg + " 返回字符串:" + retStr;
FangYar.Common.MyLogHelper.WriteMsg(new FangYar.Common.LogInfoMo()
{
message = str,
msgType = FangYar.Common.EnumLogMsgTypeEnum.Info,
path = "CarControlLog"
});
return retStr;
}
catch (Exception ex)
{
string str = "回去开门字符串异常:" + ex;
FangYar.Common.MyLogHelper.WriteMsg(new FangYar.Common.LogInfoMo()
{
message = str,
msgType = FangYar.Common.EnumLogMsgTypeEnum.Error,
path = "CarControlLog"
});
//异常情况下,直接返回开门,并显示祝您一路平安
return "{\"error_num\":0,\"error_str\":\"noerror\",\"gpio_data\":[{\"ionum\":\"io1\",\"action\":\"on\"}]," +
"\"rs485_data\":[{\"encodetype\":\"hex2string\",\"data\":\"AA551F640027001001050300D7A3C4FAD2BBC2B7C6BDB0B25D1DAF\"}]}";
}
}
///
/// 车辆未授权返回信息
///
///
///
///
public static string GetCloseCarControlStr(string carNum, string msg)
{
try
{
var showStr = GetCarOperateStr(EnumCarOperateType.下发临显, msg).ToUpper();
string retStr = "{\"error_num\":0,\"error_str\":\"noerror\",\"gpio_data\":[{\"action\":\"off\"}]," +
"\"rs485_data\":[{\"encodetype\":\"hex2string\",\"data\":\"" + showStr + "\"}]}";
string str = "车辆未授权:" + carNum + " 提示信息:" + msg + " 返回字符串:" + retStr;
FangYar.Common.MyLogHelper.WriteMsg(new FangYar.Common.LogInfoMo()
{
message = str,
msgType = FangYar.Common.EnumLogMsgTypeEnum.Info,
path = "CarControlLog"
});
return retStr;
}
catch (Exception ex)
{
string str = "车牌未授权返回信息异常:" + ex;
FangYar.Common.MyLogHelper.WriteMsg(new FangYar.Common.LogInfoMo()
{
message = str,
msgType = FangYar.Common.EnumLogMsgTypeEnum.Error,
path = "CarControlLog"
});
//异常情况下,直接返回开门,并显示祝您一路平安
return "{\"error_num\":0,\"error_str\":\"noerror\",\"gpio_data\":[{\"ionum\":\"io1\",\"action\":\"on\"}]," +
"\"rs485_data\":[{\"encodetype\":\"hex2string\",\"data\":\"AA551F640027001001050300D7A3C4FAD2BBC2B7C6BDB0B25D1DAF\"}]}";
}
}
public static string GetCarOperateStr(EnumCarOperateType carOperateType, string valStr = "")
{
//返回命令字符串(默认返回取消第一行临时显示)
string retStr = "AA551F6400";
//命令字符串加密字符串
string CRC16Str = "1F6400";
switch (carOperateType)
{
case EnumCarOperateType.取消临显:
//retStr += "2100010196D7AF";
//添加命令信息
retStr += "21";
CRC16Str += "21";
//添加长度信息
retStr += "0001";
CRC16Str += "0001";
//添加行数信息
retStr += "01";
CRC16Str += "01";
break;
case EnumCarOperateType.下发语音:
//添加命令信息
retStr += "22";
CRC16Str += "22";
//加密串
var pwdStr = StringToHexString(valStr);
////添加长度信息
retStr += GetStrLength(pwdStr.Length / 2 + 1);
CRC16Str += GetStrLength(pwdStr.Length / 2 + 1);
//retStr += "0009";
//CRC16Str += "0009";
//添加内容信息
retStr += pwdStr + "01";
CRC16Str += pwdStr + "01";
break;
case EnumCarOperateType.下发临显:
//添加命令信息
retStr += "27";
CRC16Str += "27";
//添加长度信息
retStr += GetStrLengthShow(valStr);
CRC16Str += GetStrLengthShow(valStr);
//添加控制字 1:定义下发内容显示的行号,行号示意及说明如下图信息
retStr += "01";
CRC16Str += "01";
//添加控制字 2:定义该临显内容显示的时长,单位 秒,该参数为 0 时,表示长期显示信息
retStr += "35";
CRC16Str += "35";
//添加控制字 3:定义临显的显示颜色,1-3 有效,1=红色,2=绿色,3=黄色,其他默认为 1信息
retStr += "03";
CRC16Str += "03";
//添加控制字 4:行号为 6 和 7 的时候,生效。用于控制关键数字的颜色信息
retStr += "00";
CRC16Str += "00";
//添加内容信息
retStr += StringToHexString(valStr);
CRC16Str += StringToHexString(valStr);
break;
case EnumCarOperateType.设置音量:
//添加命令信息
retStr += "F0";
CRC16Str += "F0";
//添加长度信息
retStr += "0001";
CRC16Str += "0001";
break;
}
//CRC16Str += "X1X2";
//添加校验码
retStr += GetCrc16Modbus(CRC16Str);
//添加结束字符
retStr += "AF";
return retStr;
}
///
/// 返回字符串长度
///
///
///
private static string GetStrLength(int str)
{
var strLength = str;
if (strLength < 10)
{
return "000" + strLength;
}
else if (strLength < 100)
{
return "00" + strLength;
}
else if (strLength < 1000)
{
return "0" + strLength;
}
else if (strLength < 10000)
{
return "" + strLength;
}
else
{
return "9999";
}
}
///
/// 返回临时显示字符串长度
///
///
///
private static string GetStrLengthShow(string str)
{
str = GetMaxStr(str);
str = "aaaa" + str;
if (str.Length < 10)
{
return "000" + str.Length;
}
else if (str.Length < 100)
{
return "00" + str.Length;
}
else if (str.Length < 1000)
{
return "0" + str.Length;
}
else if (str.Length < 10000)
{
return "" + str.Length;
}
else
{
return "9999";
}
}
///
/// 返回最大字符串
///
///
///
private static string GetMaxStr(string str)
{
if (string.IsNullOrWhiteSpace(str))
{
return "";
}
else if (str.Length > 9999)
{
str = str.Substring(0, 9998);
}
return str;
}
///
/// 16进制字符转字符串
///
/// 16进制字符
/// 编码格式
///
private static string HexStringToString(string hex)
{
Encoding encode = Encoding.Default;
byte[] buffer = new byte[hex.Length / 2];
string result = string.Empty;
for (int i = 0; i < hex.Length / 2; i++)
{
result = hex.Substring(i * 2, 2);
buffer[i] = Convert.ToByte(result, 16);
}
//返回指定编码格式的字符串
return encode.GetString(buffer);
}
///
/// 将字符串转为16进制字符,允许中文
///
///
///
private static string StringToHexString(string s)
{
Encoding encode = Encoding.Default;
byte[] b = encode.GetBytes(s);//按照指定编码将string编程字节数组
string result = string.Empty;
for (int i = 0; i < b.Length; i++)//逐字节变为16进制字符
{
result += Convert.ToString(b[i], 16);
}
return result;
}
#region CRC校验
#endregion
private static string GetCrc16Modbus(string hexString)
{
var arr = ByteStringConvertByteAyy(hexString);
var crcStr = CRC16(arr);
var retStr = ByteToHexStr(crcStr);
return retStr;
}
private static byte[] ByteStringConvertByteAyy(string hex)
{
byte[] buffer = new byte[hex.Length / 2 + 2];
string result = string.Empty;
for (int i = 0; i < hex.Length / 2; i++)
{
result = hex.Substring(i * 2, 2);
buffer[i] = Convert.ToByte(result, 16);
}
//返回指定编码格式的字符串
return buffer;
}
///
/// CRC校验,参数data为byte数组
///
/// 校验数据,字节数组
/// 字节0是高8位,字节1是低8位
public static byte[] CRC16(byte[] data)
{
//crc计算赋初始值
int crc = 0xffff;
for (int i = 0; i < data.Length; i++)
{
crc = crc ^ data[i];
for (int j = 0; j < 8; j++)
{
int temp;
temp = crc & 1;
crc = crc >> 1;
crc = crc & 0x7fff;
if (temp == 1)
{
crc = crc ^ 0xa001;
}
crc = crc & 0xffff;
}
}
//CRC寄存器的高低位进行互换
byte[] crc16 = new byte[2];
//CRC寄存器的高8位变成低8位,
crc16[0] = (byte)((crc >> 8) & 0xff);
//CRC寄存器的低8位变成高8位
crc16[1] = (byte)(crc & 0xff);
return crc16;
}
///
/// byte[]转为16进制字符串
///
///
///
public static string ByteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
}
public enum EnumCarOperateType
{
设置音量 = 0xF0,
取消临显 = 21,
下发语音 = 22,
下发临显 = 27
}
}