using SuperSocket.ProtoBase;
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Waste.SocketService
{
///
/// 转换工具
///
public static class Tools
{
public static string GetString(in this ReadOnlySequence payload,
Encoding encoding = null)
{
encoding ??= Encoding.UTF8;
return payload.IsSingleSegment ? encoding.GetString(payload.FirstSpan)
: GetStringSlow(payload, encoding);
static string GetStringSlow(in ReadOnlySequence payload, Encoding encoding)
{
// linearize
int length = checked((int)payload.Length);
var oversized = ArrayPool.Shared.Rent(length);
try
{
payload.CopyTo(oversized);
return encoding.GetString(oversized, 0, length);
}
finally
{
ArrayPool.Shared.Return(oversized);
}
}
}
///
///
///
///
///
public static string ByteToHexStr(this byte bt)
{
return bt.ToString("X2");
}
///
/// byte转int
///
///
///
public static int ByteToInt(this byte bt)
{
return Convert.ToInt32(((int)bt).ToString("X2"), 16);
}
///
/// 字节数组转16进制
///
///
///
public static string BytesToHexStr(this byte[] bt)
{
string returnStr = "";
if (bt != null)
{
for (int i = 0; i < bt.Length; i++)
{
returnStr += bt[i].ToString("X2") + " ";
}
}
return returnStr;
}
///
/// 字节数组转字符串
///
///
///
public static string BytesToString(this byte[] bytes, Encoding enocde)
{
string returnStr = "";
if (bytes != null)
{
returnStr = enocde.GetString(bytes);
}
return returnStr;
}
///
/// 字节数据转中文
///
///
///
public static string BytesToChsString(this byte[] bytes)
{
string hex = BytesToHexStr(bytes);
if (hex == null)
return "";
if (hex.Length % 2 != 0)
{
hex += "20";//空格
}
for (int i = 0; i < bytes.Length; i++)
{
try
{
// 每两个字符是一个 byte。
bytes[i] = byte.Parse(hex.Substring(i * 2, 2),
System.Globalization.NumberStyles.HexNumber);
}
catch
{
}
}
// 获得 GB2312,Chinese Simplified。
Encoding chs = Encoding.GetEncoding("gb2312");
return chs.GetString(bytes);
}
///
/// 16进制转10进制
///
///
///
public static long HextToDec(this string hex)
{
char[] nums = hex.ToCharArray();
long total = 0;
try
{
for (int i = 0; i < nums.Length; i++)
{
String strNum = nums[i].ToString().ToUpper();
switch (strNum)
{
case "A":
strNum = "10";
break;
case "B":
strNum = "11";
break;
case "C":
strNum = "12";
break;
case "D":
strNum = "13";
break;
case "E":
strNum = "14";
break;
case "F":
strNum = "15";
break;
default:
break;
}
double power = Math.Pow(16, Convert.ToDouble(nums.Length - i - 1));
total += Convert.ToInt64(strNum) * Convert.ToInt64(power);
}
}
catch (System.Exception ex)
{
string strErorr = ex.ToString();
return 0;
}
return total;
}
}
///
/// 垃圾分类格式解析,传输过来的数据格式类似于:九方城@前门@厨余垃圾@7.91
///
public class WastePackageFilter : PipelineFilterBase
{
public override MyPackage Filter(ref SequenceReader reader)
{
try
{
if (reader.Length <= 0)
{
return null;
}
var package = new MyPackage();
var _reader = reader;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var GB2312 = Encoding.GetEncoding("GB2312");
var UTF8 = Encoding.UTF8;
string key = "";
int keylen = 1;
package.Str = _reader.ReadString(GB2312);
#region 解析头部,头部固定为A9
if (reader.Length >= 2)
{
keylen = 2;
byte[] keys = new byte[2];
reader.TryRead(out byte key1Byte);
keys[0] = key1Byte;
reader.TryRead(out byte key2Byte);
keys[1] = key2Byte;
key = keys.BytesToString(GB2312);
}
else
{
byte[] keys = new byte[1];
reader.TryRead(out byte key1Byte);
keys[0] = key1Byte;
key = keys.BytesToString(GB2312);
}
#endregion
if (key != "A9" && key != "A8" && key != "A7")
{
var len = reader.Length;
string msg = "";
reader.Rewind(keylen);
for (var i = 0; i < len; i++)
{
reader.TryRead(out byte msgByte);
msg += msgByte.ByteToHexStr();
}
package.IsChecked = false;
package.Body = msg;
return package;
}
else if (key == "A7")
{
key = "A8";//全部GB2312的A8
return ReadA7(reader, package, key, GB2312);
}
else if (key == "A8")
{
package.Key = key;
package.Len = (int)reader.Length - 2;
string body = "";
byte[] bytes = new byte[package.Len];
for (var i = 0; i < package.Len; i++)
{
reader.TryRead(out byte val);
bytes[i] = val;
}
if (bytes.Length == 1 && bytes[0] == 0)
{
return null;
}
body = bytes.BytesToString(UTF8).Replace("\r", "").Replace("\n", "");
package.Body = bytes.BytesToHexStr();
var arr = body.Split('|');
#region 心跳包的处理,IMEI|GPS
if (arr.Length == 2)
{
package.IsHeart = true;
package.IMEI = arr[0];
var gpsarr = arr[1].Split(',');
if (gpsarr.Length == 2)
{
package.Longitude = gpsarr[0];
package.Latitude = gpsarr[1];
}
}
else if (arr.Length == 7 && string.IsNullOrEmpty(arr[6]))
{
package.IsHeart = true;
package.ICCID = arr[0];
package.IMEI = arr[1];
package.IMSI = arr[2];
var gslq = GB2312.GetBytes(arr[3]);
if (gslq.Length == 2)
{
package.GSLQ = Convert.ToInt32(gslq[1]).ToString();
}
else
{
package.GSLQ = gslq.BytesToHexStr();
}
package.Time = $"{arr[4]}{arr[5]}".Replace("-", "").Replace(":", "");
}
else if (arr.Length == 7)
{
package.ICCID = arr[0];
package.IMEI = arr[1];
package.IMSI = arr[2];
var gslq = GB2312.GetBytes(arr[3]);
if (gslq.Length == 2)
{
package.GSLQ = Convert.ToInt32(gslq[1]).ToString();
}
else
{
package.GSLQ = gslq.BytesToHexStr();
}
package.Time = $"{arr[4]}{arr[5]}".Replace("-", "").Replace(":", "");
//uuid@datetime@垃圾类型@子类@重量@价格@金额@操作员
//package.Str = _reader.ReadString(Encoding.UTF8);
var measurearr = arr[6].Split('@');
if (measurearr.Length == 8)
{
Read(package, measurearr);
package.IsWeight = true;
}
//uuid@datetime@垃圾类型@子类@重量@单价@金额@操作员@物品编码@垃圾桶@毛重@皮重@净重@ID1@ID2@ID3@ID4@ID5@ID6@ID7@ID8\r\n
else if (measurearr.Length == 21)
{
Read(package, measurearr);
package.DeviceFacEcode = measurearr[8];
package.Registration = measurearr[9];
package.GrossWeight = measurearr[10];
package.Tare = measurearr[11];
package.NetWeight = measurearr[12];
package.ID1 = measurearr[13];
package.ID2 = measurearr[14];
package.ID3 = measurearr[15];
package.ID4 = measurearr[16];
package.ID5 = measurearr[17];
package.ID6 = measurearr[18];
package.ID7 = measurearr[19];
package.ID8 = measurearr[20];
package.IsWeight = true;
}
else
{
package.size = arr[6];
}
}
#endregion
return package;
}
else
{
//package.Str = _reader.ReadString(GB2312);
package.Key = key;
package.Len = (int)reader.Length - 2;
string body = "";
byte[] bytes = new byte[package.Len];
for (var i = 0; i < package.Len; i++)
{
reader.TryRead(out byte val);
bytes[i] = val;
}
if (bytes.Length == 1 && bytes[0] == 0)
{
return null;
}
body = bytes.BytesToString(GB2312).Replace("\r", "").Replace("\n", "");
package.Body = bytes.BytesToHexStr();
var arr = body.Split('|');
#region 心跳包的处理,IMEI|GPS
if (arr.Length == 2)
{
package.IsHeart = true;
package.IMEI = arr[0];
var gpsarr = arr[1].Split(',');
if (gpsarr.Length == 2)
{
package.Longitude = gpsarr[0];
package.Latitude = gpsarr[1];
}
}
else if (arr.Length == 7 && string.IsNullOrEmpty(arr[6]))
{
package.IsHeart = true;
package.ICCID = arr[0];
package.IMEI = arr[1];
package.IMSI = arr[2];
var gslq = GB2312.GetBytes(arr[3]);
if (gslq.Length == 2)
{
package.GSLQ = Convert.ToInt32(gslq[1]).ToString();
}
else
{
package.GSLQ = gslq.BytesToHexStr();
}
package.Time = $"{arr[4]}{arr[5]}".Replace("-", "").Replace(":", "");
}
else if (arr.Length == 7)
{
package.ICCID = arr[0];
package.IMEI = arr[1];
package.IMSI = arr[2];
var gslq = GB2312.GetBytes(arr[3]);
if (gslq.Length == 2)
{
package.GSLQ = Convert.ToInt32(gslq[1]).ToString();
}
else
{
package.GSLQ = gslq.BytesToHexStr();
}
package.Time = $"{arr[4]}{arr[5]}".Replace("-", "").Replace(":", "");
//厨余垃圾/大桶@垃圾桶编号@厨余垃圾@7.91
var b = GB2312.GetBytes(arr[6]);
if (b.Length > 23)
{
byte[] tbyte = new byte[1]; //桶类型
byte[] codebyte = new byte[5];//垃圾桶编号
byte[] typebyte = new byte[8];//垃圾类型
byte[] wbyte = new byte[b.Length - 23];
byte[] db = new byte[b.Length - 8];
for (var j = 0; j < b.Length; j++)
{
if (j == 6)
{
tbyte[j - 6] = b[j];
}
else if (j > 7 && j < 13)
{
codebyte[j - 8] = b[j];
}
else if (j > 13 && j < 22)
{
typebyte[j - 14] = b[j];
}
else if (j > 22)
{
wbyte[j - 23] = b[j];
}
}
var thex = tbyte.BytesToHexStr();
var codehex = codebyte.BytesToHexStr();
var typehex = typebyte.BytesToHexStr();
var typestr = typebyte.BytesToString(GB2312);
var whex = wbyte.BytesToHexStr();
var wstr = wbyte.BytesToString(GB2312);
package.size = thex.Replace(" ", "");
package.trashcode = codehex.Replace(" ", "").HextToDec().ToString();
package.WasteType = typestr;
package.Weight = wstr;
package.IsWeight = true;
}
else
{
package.size = arr[6];
}
}
#endregion
return package;
}
}
catch (Exception ex)
{
Console.WriteLine($"数据处理发生异常:{ex.Message}");
return new MyPackage();
}
}
private static MyPackage ReadA7(SequenceReader reader, MyPackage package, string key, Encoding encoding)
{
//package.Str = reader.ReadString(encoding);
package.Key = key;
package.Len = (int)reader.Length - 2;
string body = "";
byte[] bytes = new byte[package.Len];
for (var i = 0; i < package.Len; i++)
{
reader.TryRead(out byte val);
bytes[i] = val;
}
if (bytes.Length == 1 && bytes[0] == 0)
{
return null;
}
body = bytes.BytesToString(encoding).Replace("\r", "").Replace("\n", "");
package.Body = bytes.BytesToHexStr();
var arr = body.Split('|');
#region 心跳包的处理,IMEI|GPS
if (arr.Length == 2)
{
package.IsHeart = true;
package.IMEI = arr[0];
var gpsarr = arr[1].Split(',');
if (gpsarr.Length == 2)
{
package.Longitude = gpsarr[0];
package.Latitude = gpsarr[1];
}
}
else if (arr.Length == 7 && string.IsNullOrEmpty(arr[6]))
{
package.IsHeart = true;
package.ICCID = arr[0];
package.IMEI = arr[1];
package.IMSI = arr[2];
var gslq = encoding.GetBytes(arr[3]);
if (gslq.Length == 2)
{
package.GSLQ = Convert.ToInt32(gslq[1]).ToString();
}
else
{
package.GSLQ = gslq.BytesToHexStr();
}
package.Time = $"{arr[4]}{arr[5]}".Replace("-", "").Replace(":", "");
}
else if (arr.Length == 7)
{
package.ICCID = arr[0];
package.IMEI = arr[1];
package.IMSI = arr[2];
var gslq = encoding.GetBytes(arr[3]);
if (gslq.Length == 2)
{
package.GSLQ = Convert.ToInt32(gslq[1]).ToString();
}
else
{
package.GSLQ = gslq.BytesToHexStr();
}
package.Time = $"{arr[4]}{arr[5]}".Replace("-", "").Replace(":", "");
//uuid@datetime@垃圾类型@子类@重量@价格@金额@操作员
var measurearr = arr[6].Split('@');
if (measurearr.Length == 8)
{
Read(package, measurearr);
package.IsWeight = true;
}
//uuid@datetime@垃圾类型@子类@重量@单价@金额@操作员@物品编码@垃圾桶@毛重@皮重@净重@ID1@ID2@ID3@ID4@ID5@ID6@ID7@ID8\r\n
else if (measurearr.Length == 21)
{
Read(package, measurearr);
package.DeviceFacEcode = measurearr[8];
package.Registration = measurearr[9];
package.GrossWeight = measurearr[10];
package.Tare = measurearr[11];
package.NetWeight = measurearr[12];
package.ID1 = measurearr[13];
package.ID2 = measurearr[14];
package.ID3 = measurearr[15];
package.ID4 = measurearr[16];
package.ID5 = measurearr[17];
package.ID6 = measurearr[18];
package.ID7 = measurearr[19];
package.ID8 = measurearr[20];
package.IsWeight = true;
}
else
{
package.size = arr[6];
}
}
#endregion
return package;
}
private static void Read(MyPackage package, string[] measurearr)
{
package.UUID = measurearr[0];
package.UploadTime = measurearr[1];
package.WasteType = measurearr[2];
package.WasteSType = measurearr[3];
package.Weight = measurearr[4];
package.Price = measurearr[5];
package.Amount = measurearr[6];
package.OpUser = measurearr[7];
}
}
}