|
|
#region << 版 本 注 释 >>
|
|
|
|
|
|
/*--------------------------------------------------------------------
|
|
|
* 版权所有 (c) 2025 WenJY 保留所有权利。
|
|
|
* CLR版本:4.0.30319.42000
|
|
|
* 机器名称:Mr.Wen's MacBook Pro
|
|
|
* 命名空间:Sln.Iot.Business
|
|
|
* 唯一标识:9444FDB4-4E04-4E00-9CF5-168CDE43F77B
|
|
|
*
|
|
|
* 创建者:WenJY
|
|
|
* 电子邮箱:
|
|
|
* 创建时间:2025-05-08 17:19:21
|
|
|
* 版本:V1.0.0
|
|
|
* 描述:
|
|
|
*
|
|
|
*--------------------------------------------------------------------
|
|
|
* 修改人:
|
|
|
* 时间:
|
|
|
* 修改说明:
|
|
|
*
|
|
|
* 版本:V1.0.0
|
|
|
*--------------------------------------------------------------------*/
|
|
|
|
|
|
#endregion << 版 本 注 释 >>
|
|
|
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using Newtonsoft.Json;
|
|
|
using Sln.Iot.Business.@base;
|
|
|
using Sln.Iot.Common;
|
|
|
using Sln.Iot.Config;
|
|
|
using Sln.Iot.Model.dao;
|
|
|
using Sln.Iot.Model.dto;
|
|
|
using Sln.Iot.Serilog;
|
|
|
using Sln.Iot.Socket.Adapter;
|
|
|
using TouchSocket.Core;
|
|
|
using TouchSocket.Sockets;
|
|
|
|
|
|
namespace Sln.Iot.Business
|
|
|
{
|
|
|
public class LocalBusiness:BaseBusiness
|
|
|
{
|
|
|
public LocalBusiness(SerilogHelper logger, AppConfig appConfig, StringChange stringChange) : base(logger, appConfig, stringChange)
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
public override FilterResult BufferAnalysis(ISocketClient client, BufferRequestInfo requestInfo, int bodyLength)
|
|
|
{
|
|
|
ByteBlock byteBlock = new ByteBlock(requestInfo.Body);
|
|
|
|
|
|
if (byteBlock.CanReadLen < 1)
|
|
|
{
|
|
|
return FilterResult.Cache;
|
|
|
}
|
|
|
int pos = byteBlock.Pos;
|
|
|
|
|
|
try
|
|
|
{
|
|
|
var amount = requestInfo.BufferLength / bodyLength;
|
|
|
|
|
|
_logger.Info($"收到{amount}个物联网环境数据,开始循环解析......");
|
|
|
|
|
|
for (int i = 0; i < amount; i++)
|
|
|
{
|
|
|
byte[] ids = new byte[3];
|
|
|
Array.Copy(requestInfo.buffer, 1, ids, 0, ids.Length);
|
|
|
string idsStr = _stringChange.bytesToHexStr(ids,ids.Length);
|
|
|
_logger.Info($"设备编号:{idsStr}");
|
|
|
do
|
|
|
{
|
|
|
byteBlock.Read(out byte[] b_UA_flag, 2);
|
|
|
base._stringChange.ConvertBytesToUInt16(b_UA_flag, out uint flag);
|
|
|
switch (flag)
|
|
|
{
|
|
|
case 0xB401: //纬度
|
|
|
byteBlock.Read(out byte[] latitudeBuffer, 5);
|
|
|
var latitudeStr = _stringChange.bytesToHexStr(latitudeBuffer,latitudeBuffer.Length);
|
|
|
decimal latitude = decimal.Parse(latitudeStr.Substring(0, 2) + "." + latitudeStr.Substring(2, 6));
|
|
|
int latitudeType = int.Parse(latitudeStr.Substring(latitudeStr.Length - 2));
|
|
|
_logger.Info($"{(latitudeType == 10 ? "北纬":"南纬")}:{latitude}°");
|
|
|
break;
|
|
|
case 0xB402: //经度
|
|
|
byteBlock.Read(out byte[] longitudeBuffer, 6);
|
|
|
var longitudeStr = _stringChange.bytesToHexStr(longitudeBuffer,longitudeBuffer.Length);
|
|
|
decimal longitude = decimal.Parse(longitudeStr.Substring(0, 3) + "." + longitudeStr.Substring(3, 7));
|
|
|
int longitudeType = int.Parse(longitudeStr.Substring(longitudeStr.Length - 2));
|
|
|
_logger.Info($"{(longitudeType == 20 ? "东经":"西经")}:{longitude}°");
|
|
|
break;
|
|
|
case 0xB403: //卫星数量
|
|
|
byteBlock.Read(out byte[] satelliteBuffer, 1);
|
|
|
var satelliteStr = _stringChange.bytesToHexStr(satelliteBuffer,satelliteBuffer.Length);
|
|
|
_logger.Info($"卫星数量:{satelliteStr}");
|
|
|
break;
|
|
|
case 0xB404: //时间
|
|
|
byteBlock.Read(out byte[] timeBuffer, 6);
|
|
|
var timeStr = _stringChange.bytesToHexStr(timeBuffer,timeBuffer.Length);
|
|
|
_logger.Info($"时间:{timeStr}");
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
} while (byteBlock.Pos % bodyLength != 0);
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return FilterResult.Success;
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
base._logger.Error($"物联网数据解析异常:{e.Message}");
|
|
|
}
|
|
|
|
|
|
return FilterResult.Cache;
|
|
|
}
|
|
|
|
|
|
public override void ResponseHandle(ISocketClient client, BufferRequestInfo requestInfo)
|
|
|
{
|
|
|
MessagePack SendMessagePackInfo = new MessagePack()
|
|
|
{
|
|
|
//m_MessageType = 0xB5
|
|
|
};
|
|
|
base.GetMessagePack(ref SendMessagePackInfo, requestInfo.buffer);
|
|
|
|
|
|
base.SendMessageAsync(client,SendMessagePackInfo);
|
|
|
}
|
|
|
}
|
|
|
} |