using JT808.Gateway.Client;
using JT808.Protocol;
using JT808.Protocol.Enums;
using JT808.Protocol.Extensions;
using JT808.Protocol.MessageBody;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace JT808.Gateway.NBIotSimpleClient.Services
{
///
/// 处理平台下发的数据包
///
public class ProccessPackageService : IHostedService
{
ReceviePackageService ReceviePackageService;
IJT808TcpClientFactory TcpClientFactory;
JT808Serializer Serializer;
DeviceInfoService DeviceInfoService;
ILogger Logger;
public ProccessPackageService(
ILoggerFactory loggerFactory,
IJT808Config jT808Config,
IJT808TcpClientFactory tcpClientFactory,
DeviceInfoService deviceInfoService,
ReceviePackageService receviePackageService)
{
ReceviePackageService = receviePackageService;
TcpClientFactory = tcpClientFactory;
Serializer = jT808Config.GetSerializer();
DeviceInfoService = deviceInfoService;
Logger = loggerFactory.CreateLogger();
}
public Task StartAsync(CancellationToken cancellationToken)
{
Task.Run(() =>
{
try
{
foreach(var package in ReceviePackageService.BlockingCollection.GetConsumingEnumerable(cancellationToken))
{
if(package.Header.MsgId == JT808MsgId.终端注册应答.ToUInt16Value())
{
if (package.Bodies is JT808_0x8100 body)
{
DeviceInfoService.DeviceInfos.TryAdd(package.Header.TerminalPhoneNo, new Metadata.DeviceInfo {
TerminalPhoneNo = package.Header.TerminalPhoneNo,
Code = body.Code
});
Logger.LogInformation($"{package.Header.TerminalPhoneNo}-{body.Code}-success");
}
}
else if (package.Header.MsgId == JT808MsgId.平台通用应答.ToValue())
{
if(package.Bodies is JT808_0x8001 body)
{
if(body.AckMsgId== JT808MsgId.终端鉴权.ToUInt16Value())
{
if(body.JT808PlatformResult== JT808PlatformResult.成功)
{
if (DeviceInfoService.DeviceInfos.TryGetValue(package.Header.TerminalPhoneNo, out var deviceInfo))
{
deviceInfo.Successed = true;
DeviceInfoService.DeviceInfos.TryUpdate(package.Header.TerminalPhoneNo, deviceInfo, deviceInfo);
}
}
Logger.LogInformation($"{package.Header.TerminalPhoneNo}-{body.JT808PlatformResult.ToString()}");
}
}
}
}
}
catch (Exception ex)
{
}
}, cancellationToken);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}