浏览代码

添加支持808多包解析

pull/9/head
SmallChi(Koike) 3 年前
父节点
当前提交
05bdd47ed7
共有 7 个文件被更改,包括 131 次插入93 次删除
  1. +3
    -3
      src/JTTools/JTTools.csproj
  2. +1
    -0
      src/JTTools/Pages/Index.razor
  3. +1
    -1
      src/JTTools/Pages/JT1078Parse.razor
  4. +1
    -1
      src/JTTools/Pages/JT19056Analyze.razor
  5. +123
    -86
      src/JTTools/Pages/JT808Analyze.razor
  6. +1
    -1
      src/JTTools/Pages/JT809Analyze.razor
  7. +1
    -1
      src/JTTools/Pages/JTActiveSafetyParse.razor

+ 3
- 3
src/JTTools/JTTools.csproj 查看文件

@@ -7,17 +7,17 @@
</PropertyGroup> </PropertyGroup>


<ItemGroup> <ItemGroup>
<PackageReference Include="AntDesign" Version="0.9.3" />
<PackageReference Include="AntDesign" Version="0.10.0" />
<PackageReference Include="JT1078" Version="1.1.0" /> <PackageReference Include="JT1078" Version="1.1.0" />
<PackageReference Include="JT808" Version="2.4.3" /> <PackageReference Include="JT808" Version="2.4.3" />
<PackageReference Include="JT808.Protocol.Extensions.JT1078" Version="2.4.3" /> <PackageReference Include="JT808.Protocol.Extensions.JT1078" Version="2.4.3" />
<PackageReference Include="JT808.Protocol.Extensions.Streamax" Version="0.2.9" />
<PackageReference Include="JT808.Protocol.Extensions.Streamax" Version="0.3.0" />
<PackageReference Include="JT808.Protocol.Extensions.SuBiao" Version="2.4.3" /> <PackageReference Include="JT808.Protocol.Extensions.SuBiao" Version="2.4.3" />
<PackageReference Include="JT808.Protocol.Extensions.YueBiao" Version="2.4.3" /> <PackageReference Include="JT808.Protocol.Extensions.YueBiao" Version="2.4.3" />
<PackageReference Include="JT809" Version="2.2.0" /> <PackageReference Include="JT809" Version="2.2.0" />
<PackageReference Include="JT809.Protocol.Extensions.JT1078" Version="2.2.0" /> <PackageReference Include="JT809.Protocol.Extensions.JT1078" Version="2.2.0" />
<PackageReference Include="JTActiveSafety" Version="1.0.1" /> <PackageReference Include="JTActiveSafety" Version="1.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.9" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.10" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NLog.Extensions.Logging" Version="1.7.4" /> <PackageReference Include="NLog.Extensions.Logging" Version="1.7.4" />
</ItemGroup> </ItemGroup>


+ 1
- 0
src/JTTools/Pages/Index.razor 查看文件

@@ -11,5 +11,6 @@
<Badge Color="red" />增加808分包的各个包的解析及展示<br /> <Badge Color="red" />增加808分包的各个包的解析及展示<br />
<Badge Color="red" />支持808(粤标)分析工具<br /> <Badge Color="red" />支持808(粤标)分析工具<br />
<Badge Color="red" />支持808的2011版本分析工具<br /> <Badge Color="red" />支持808的2011版本分析工具<br />
<Badge Color="red" />支持808多包解析<br />
</Text> </Text>
</Paragraph> </Paragraph>

+ 1
- 1
src/JTTools/Pages/JT1078Parse.razor 查看文件

@@ -11,7 +11,7 @@
<Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" /> <Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" />
} }
<div class="right"> <div class="right">
<TextArea AllowClear="true" AutoSize="true" MinRows="10" MaxRows="30" @bind-Value="@HexData" />
<TextArea AllowClear="true" Rows="4" @bind-Value="@HexData" />
<pre> <pre>
@Json @Json
</pre> </pre>


+ 1
- 1
src/JTTools/Pages/JT19056Analyze.razor 查看文件

@@ -20,7 +20,7 @@
<Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" /> <Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" />
} }
<div class="right"> <div class="right">
<TextArea AllowClear="true" AutoSize="true" MinRows="10" MaxRows="30" @bind-Value="@HexData" />
<TextArea AllowClear="true" Rows="4" @bind-Value="@HexData" />
<pre> <pre>
@Json @Json
</pre> </pre>


+ 123
- 86
src/JTTools/Pages/JT808Analyze.razor 查看文件

@@ -13,7 +13,7 @@
@inject JT808_Streamax_Config jT808_Streamax_Config @inject JT808_Streamax_Config jT808_Streamax_Config
@using OneOf; @using OneOf;


<Tag Color="blue">如有分包,请换行区分。</Tag>
<Tag Color="blue">如有分包或多包,请换行(回车)区分。</Tag>
<br /> <br />
<Select TItemValue="string" TItem="string" DefaultValue="@("JT808")" @bind-Value="@protocolType" Style="width:260px" OnSelectedItemChanged="OnSelectProtocolType"> <Select TItemValue="string" TItem="string" DefaultValue="@("JT808")" @bind-Value="@protocolType" Style="width:260px" OnSelectedItemChanged="OnSelectProtocolType">
<SelectOptions> <SelectOptions>
@@ -28,41 +28,58 @@


<Button Type="primary" @onclick="Query">分析</Button> <Button Type="primary" @onclick="Query">分析</Button>


<TextArea AllowClear="true" MinRows="10" MaxRows="15" @bind-Value="@HexData" OnPressEnter="OnAreaTextPressEnter" />
<TextArea AllowClear="true" Rows="4" @bind-Value="@HexData" OnPressEnter="OnAreaTextPressEnter" />
<br />
@if (isOpen) @if (isOpen)
{ {
<Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" /> <Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" />
} }


<div style="padding: 26px; min-height: 350px">
<div style="min-height: 350px">
@if (JT808HeaderPackages != null) @if (JT808HeaderPackages != null)
{ {
<AntList DataSource="@JT808HeaderPackages" TItem="JT808HeaderPackage">
<ListItem>
<ListItemMeta>
<TitleTemplate>
<Tag Color="orange">终端号:@context.Header.TerminalPhoneNo</Tag>
<Tag Color="volcano">消息Id:@("0x" + context.Header.MsgId.ToString("X2"))</Tag>
<Tag Color="purple">消息流水号:@context.Header.MsgNum</Tag>
<Tag Color="pink">设备版本号:@(((JT808.Protocol.Enums.JT808Version)context.Header.ProtocolVersion).ToString())</Tag>
<Tag Color="red">总分包数:@context.Header.PackgeCount</Tag>
<Tag Color="blue">当前页:@context.Header.PackageIndex</Tag>
<Tag Color="cyan">数据体长度:@context.Header.MessageBodyProperty.DataLength</Tag>
<Tag Color="geekblue">是否加密:@context.Header.MessageBodyProperty.Encrypt.ToString()</Tag>
</TitleTemplate>
<DescriptionTemplate>
<pre>
@context.Bodies.ToHexString()
</pre>
</DescriptionTemplate>
</ListItemMeta>
</ListItem>
</AntList>
<Collapse DefaultActiveKey="@(new[]{"1"})">
@for (int i = 0; i < JT808HeaderPackages.Count; i++)
{
var item = JT808HeaderPackages[i];
var index = i + 1;
var header = $"序号:{index}";
<Panel Key="@index.ToString()">
<HeaderTemplate>
@header
<Tag Color="orange">终端号:@item.Header.TerminalPhoneNo</Tag>
<Tag Color="volcano">消息Id:@("0x" + item.Header.MsgId.ToString("X2"))</Tag>
<Tag Color="purple">消息流水号:@item.Header.MsgNum</Tag>
<Tag Color="pink">设备版本号:@(((JT808.Protocol.Enums.JT808Version)item.Header.ProtocolVersion).ToString())</Tag>
<Tag Color="red">总分包数:@item.Header.PackgeCount</Tag>
<Tag Color="blue">当前页:@item.Header.PackageIndex</Tag>
<Tag Color="cyan">数据体长度:@item.Header.MessageBodyProperty.DataLength</Tag>
<Tag Color="geekblue">是否加密:@item.Header.MessageBodyProperty.Encrypt.ToString()</Tag>
</HeaderTemplate>
<ChildContent>
<pre>@item.Bodies.ToHexString()</pre>
</ChildContent>
</Panel>
}
<Panel Header="合并数据体" Key="99">
<pre>@Json</pre>
</Panel>
</Collapse>
}
@if (JT808Packages != null)
{
<Collapse DefaultActiveKey="@(new[]{"1"})">
@for (int i = 0; i < JT808Packages.Count; i++)
{
var item = JT808Packages[i];
var index = i + 1;
var header = $"序号:{index}";
<Panel Header="@header" Key="@index.ToString()">
<pre>@item.Json</pre>
</Panel>
}
</Collapse>
} }
<pre>
@Json
</pre>
</div> </div>


@code { @code {
@@ -78,13 +95,18 @@
private JT808Serializer JT1078Serializer; private JT808Serializer JT1078Serializer;


string protocolType = "JT808"; string protocolType = "JT808";

private List<JT808HeaderPackage> JT808HeaderPackages; private List<JT808HeaderPackage> JT808HeaderPackages;

private List<JT808PackageInfo> JT808Packages;

private string HexData = HexDataTmp; private string HexData = HexDataTmp;

private static string HexDataTmp = "7E 02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01 13 7E"; private static string HexDataTmp = "7E 02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01 13 7E";

private static string Hex2013ForceTmp = "7e0102400c01003000068109024a3130303330303030363831857e"; private static string Hex2013ForceTmp = "7e0102400c01003000068109024a3130303330303030363831857e";
private static string HexSubDataTmp = "7E120523A204066657506200EB00020001015A00000023012012191042052012191050190000000000000000000101064446D10120121910221720121910420500000000000000000001010F1FE8EB0120121910023420121910221700000000000000000001010F182D5C0120121909471120121910015500000000000000000001010B38F2430120121909274020121909471100000000000000000001010F056DB40120121909080920121909274000000000000000000001010F0724380120121908483820121909080900000000000000000001010F0530AB0120121908290720121908483800000000000000000001010F05896C0120121908093720121908290700000000000000000001010F02CD3B0120121907500520121908093700000000000000000001010F056FEF0120121907303420121907500500000000000000000001010F043C3401201219072541201219073034000000000000000000010103C26C5F0120121907061120121907254100000000000000000001010F03F0C10120121906464220121907061100000000000000000001010F02F6330120121906271220121906464200000000000000000001010F02E43B0120121906074220121906271200000000000000000001010F033D670120121905481120121906074200000000000000000001010F088BF20120121905284120121905481100000000000000000001010F03F9FE0120121905091020121905284100000000000000000001010F05B1040120121904494020121905091000000000000000000001010F02B3540120121904301020121904494000000000000000000001010F0417B00120121904103920121904301000000000000000000001010F0538970120121903510820121904103900000000000000000001010F054E9E0120121903313820121903510800000000000000000001010F016ECB0120121903120820121903313800000000000000000001010F0333C00120121902523820121903120700000000000000000001010F029D230120121902330720121902523700000000000000000001010F0354E40120121902133720121902330700000000000000000001010F03303D0120121901540720121902133700000000000000000001010F04981E0120121901343720121901540700000000000000000001010F02AD940120121901150820121901343700000000000000000001010EFFD7CF0120121900553720121901150800000000000000000001010F07D9330120121900360720121900553700000000000000000001010F040E740C7E\n7E1205203804066657506200EC000200020120121900163320121900360700000000000000000001010F0CE4CD0120121900002220121900163300000000000000000001010C6F9E7B5D7E";


private string Json;
private static string HexSubDataTmp = "7E120523A204066657506200EB00020001015A00000023012012191042052012191050190000000000000000000101064446D10120121910221720121910420500000000000000000001010F1FE8EB0120121910023420121910221700000000000000000001010F182D5C0120121909471120121910015500000000000000000001010B38F2430120121909274020121909471100000000000000000001010F056DB40120121909080920121909274000000000000000000001010F0724380120121908483820121909080900000000000000000001010F0530AB0120121908290720121908483800000000000000000001010F05896C0120121908093720121908290700000000000000000001010F02CD3B0120121907500520121908093700000000000000000001010F056FEF0120121907303420121907500500000000000000000001010F043C3401201219072541201219073034000000000000000000010103C26C5F0120121907061120121907254100000000000000000001010F03F0C10120121906464220121907061100000000000000000001010F02F6330120121906271220121906464200000000000000000001010F02E43B0120121906074220121906271200000000000000000001010F033D670120121905481120121906074200000000000000000001010F088BF20120121905284120121905481100000000000000000001010F03F9FE0120121905091020121905284100000000000000000001010F05B1040120121904494020121905091000000000000000000001010F02B3540120121904301020121904494000000000000000000001010F0417B00120121904103920121904301000000000000000000001010F0538970120121903510820121904103900000000000000000001010F054E9E0120121903313820121903510800000000000000000001010F016ECB0120121903120820121903313800000000000000000001010F0333C00120121902523820121903120700000000000000000001010F029D230120121902330720121902523700000000000000000001010F0354E40120121902133720121902330700000000000000000001010F03303D0120121901540720121902133700000000000000000001010F04981E0120121901343720121901540700000000000000000001010F02AD940120121901150820121901343700000000000000000001010EFFD7CF0120121900553720121901150800000000000000000001010F07D9330120121900360720121900553700000000000000000001010F040E740C7E\n7E1205203804066657506200EC000200020120121900163320121900360700000000000000000001010F0CE4CD0120121900002220121900163300000000000000000001010C6F9E7B5D7E";


private string ErrerMessage; private string ErrerMessage;


@@ -101,7 +123,7 @@
{ {
HexData = HexSubDataTmp; HexData = HexSubDataTmp;
} }
else if("JT2013Force"== protocolType)
else if ("JT2013Force" == protocolType)
{ {
HexData = Hex2013ForceTmp; HexData = Hex2013ForceTmp;
} }
@@ -110,7 +132,6 @@
HexData = HexDataTmp; HexData = HexDataTmp;
} }
protocolType = value; protocolType = value;
//StateHasChanged();
} }


private void OnAreaTextPressEnter(KeyboardEventArgs eventArgs) private void OnAreaTextPressEnter(KeyboardEventArgs eventArgs)
@@ -126,92 +147,108 @@
JTRM_Serializer = jT808_Streamax_Config.GetSerializer(); JTRM_Serializer = jT808_Streamax_Config.GetSerializer();
} }


string Json = "";

private void Query() private void Query()
{ {
try try
{ {
isOpen = false; isOpen = false;
JT808HeaderPackages = null; JT808HeaderPackages = null;
JT808Packages = null;
Json = "";
var hexs = HexData.Split("\n", StringSplitOptions.RemoveEmptyEntries); var hexs = HexData.Split("\n", StringSplitOptions.RemoveEmptyEntries);
if (hexs.Length == 1)
{
var data = HexData.ToHexBytes();
switch (protocolType)
{
case "JT808":
Json = Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT808_JT1078":
Json = JT1078Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT808_SuBiao":
Json = JTSuBiao_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT808_JTRM":
Json = JTRM_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT2013Force":
Json = Serializer.Analyze(data, JT808.Protocol.Enums.JT808Version.JTT2013Force ,options: JTJsonWriterOptions.Instance);
break;
}
}
else if (hexs.Length > 1)
if (hexs.Length > 0)
{ {
SortedList<int, JT808HeaderPackage> sort = new SortedList<int, JT808HeaderPackage>(); SortedList<int, JT808HeaderPackage> sort = new SortedList<int, JT808HeaderPackage>();
JT808Packages = new List<JT808PackageInfo>();
var total = 0; var total = 0;
for (var i = 0; i < hexs.Length; i++) for (var i = 0; i < hexs.Length; i++)
{ {
var data = hexs[i].ToHexBytes(); var data = hexs[i].ToHexBytes();
var headerPackage = Serializer.HeaderDeserialize(data); var headerPackage = Serializer.HeaderDeserialize(data);
total = headerPackage.Header.PackgeCount;
sort.Add(headerPackage.Header.PackageIndex, headerPackage);
}
if (sort.Count == total)
{
List<byte> bodies = new List<byte>();
ushort msgid = 0;
foreach (var item in sort)
//处理分包
if (headerPackage.Header.MessageBodyProperty.IsPackage)
{ {
msgid = item.Value.Header.MsgId;
bodies = bodies.Concat(item.Value.Bodies).ToList();
total = headerPackage.Header.PackgeCount;
sort.Add(headerPackage.Header.PackageIndex, headerPackage);
} }
JT808HeaderPackages = sort.Select(s => s.Value).ToList();
switch (protocolType)
else
{ {
case "JT808":
Json = Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_JT1078":
Json = JT1078Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_SuBiao":
Json = JTSuBiao_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_JTRM":
Json = JTRM_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT2013Force":
Json = Serializer.Analyze(msgid, bodies.ToArray(), JT808.Protocol.Enums.JT808Version.JTT2013Force, options: JTJsonWriterOptions.Instance);
break;
switch (protocolType)
{
case "JT808":
JT808Packages.Add(new JT808PackageInfo { Order = i, Json = Serializer.Analyze(data, options: JTJsonWriterOptions.Instance) });
break;
case "JT808_JT1078":
JT808Packages.Add(new JT808PackageInfo { Order = i, Json = JT1078Serializer.Analyze(data, options: JTJsonWriterOptions.Instance) });
break;
case "JT808_SuBiao":
JT808Packages.Add(new JT808PackageInfo { Order = i, Json = JTSuBiao_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance) });
break;
case "JT808_JTRM":
JT808Packages.Add(new JT808PackageInfo { Order = i, Json = JTRM_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance) });
break;
case "JT2013Force":
JT808Packages.Add(new JT808PackageInfo { Order = i, Json = Serializer.Analyze(data, JT808.Protocol.Enums.JT808Version.JTT2013Force, options: JTJsonWriterOptions.Instance) });
break;
}
} }
} }
else
if (sort.Count > 0)
{ {
Json = "包数不匹配,请确认清楚!";
if (sort.Count == total)
{
List<byte> bodies = new List<byte>();
ushort msgid = 0;
foreach (var item in sort)
{
msgid = item.Value.Header.MsgId;
bodies = bodies.Concat(item.Value.Bodies).ToList();
}
JT808HeaderPackages = sort.Select(s => s.Value).ToList();
switch (protocolType)
{
case "JT808":
Json = Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_JT1078":
Json = JT1078Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_SuBiao":
Json = JTSuBiao_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_JTRM":
Json = JTRM_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT2013Force":
Json = Serializer.Analyze(msgid, bodies.ToArray(), JT808.Protocol.Enums.JT808Version.JTT2013Force, options: JTJsonWriterOptions.Instance);
break;
}
}
else
{
Json = "包数不匹配,请确认清楚!";
}
} }
} }
} }
catch (JT808Exception ex) catch (JT808Exception ex)
{ {
isOpen = !isOpen; isOpen = !isOpen;
Json = "";
ErrerMessage = ex.Message; ErrerMessage = ex.Message;
} }
catch (Exception ex) catch (Exception ex)
{ {
isOpen = !isOpen; isOpen = !isOpen;
Json = "";
ErrerMessage = ex.StackTrace; ErrerMessage = ex.StackTrace;
} }
} }

public class JT808PackageInfo
{
public int Order { get; set; }

public string Json { get; set; }
}
} }

+ 1
- 1
src/JTTools/Pages/JT809Analyze.razor 查看文件

@@ -48,7 +48,7 @@
} }


<div class="right"> <div class="right">
<TextArea AllowClear="true" AutoSize="true" MinRows="10" MaxRows="30" @bind-Value="@HexData" />
<TextArea AllowClear="true" Rows="4" @bind-Value="@HexData" />
<pre> <pre>
@Json @Json
</pre> </pre>


+ 1
- 1
src/JTTools/Pages/JTActiveSafetyParse.razor 查看文件

@@ -11,7 +11,7 @@
<Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" /> <Alert Type="@AlertType.Error" Description="@ErrerMessage" Closable AfterClose="OnDismiss" />
} }
<div class="right"> <div class="right">
<TextArea AllowClear="true" AutoSize="true" MinRows="10" MaxRows="60" @bind-Value="@HexData" />
<TextArea AllowClear="true" Rows="4" @bind-Value="@HexData" />
<pre> <pre>
@Json @Json
</pre> </pre>


正在加载...
取消
保存