using JT808.Protocol.Attributes;
using JT808.Protocol.Enums;
using JT808.Protocol.Formatters;
using System;
namespace JT808.Protocol
{
public struct JT808HeaderMessageBodyProperty
{
public JT808HeaderMessageBodyProperty(int dataLength,bool isPackage, JT808EncryptMethod jT808EncryptMethod= JT808EncryptMethod.None)
{
IsPackage = isPackage;
Encrypt = jT808EncryptMethod;
DataLength = dataLength;
}
public JT808HeaderMessageBodyProperty(ushort value)
{
IsPackage = (value >> 13) == 1;
switch ((value & 0x400) >> 10)
{
case 0:
Encrypt = JT808EncryptMethod.None;
break;
case 1:
Encrypt = JT808EncryptMethod.RSA;
break;
default:
Encrypt = JT808EncryptMethod.None;
break;
}
DataLength = value & 0x3FF;
}
///
/// 是否分包
/// true-1 表示消息体为长消息,进行分包发送处理
/// false-0 消息头中无消息包封装项字段。
///
public bool IsPackage { get; set; }
///
/// 加密标识,0为不加密
/// 当此三位都为 0,表示消息体不加密;
/// 当第 10 位为 1,表示消息体经过 RSA 算法加密;
/// todo:没有涉及到加密先不考虑
///
public JT808EncryptMethod Encrypt { get; set; }
///
/// 消息体长度
///
public int DataLength { get; set; }
public ushort Wrap()
{
// 1.是否分包
int tmpIsPacke = 0;
// 2.是否加密
int tmpEncrypt = 0;
if (IsPackage)
{
tmpIsPacke = 1 << 13;
}
// 2.3.数据加密方式
switch (Encrypt)
{
case JT808EncryptMethod.None:
tmpEncrypt = 0;
break;
case JT808EncryptMethod.RSA:
tmpEncrypt=1 << 10;
break;
default:
tmpEncrypt = 0;
break;
}
// 2.4.数据长度
if (DataLength <= 0)
{
// 判断有无数据体长度
DataLength = 0;
}
return (ushort)(tmpIsPacke | tmpEncrypt | DataLength);
}
}
}