浏览代码

新版解析工具

WebApi
SmallChi(Koike) 4 个月前
父节点
当前提交
a2b84677ec
共有 42 个文件被更改,包括 1914 次插入279 次删除
  1. +0
    -12
      jttools.service
  2. +13
    -0
      jttools_new.service
  3. +7
    -7
      src/JTTools.sln
  4. +3
    -2
      src/JTTools/.config/dotnet-tools.json
  5. +162
    -2
      src/JTTools/Controllers/JT1078Controller.cs
  6. +1
    -2
      src/JTTools/Controllers/JT19056Controller.cs
  7. +133
    -24
      src/JTTools/Controllers/JT808Controller.cs
  8. +75
    -4
      src/JTTools/Controllers/JT809Controller.cs
  9. +20
    -3
      src/JTTools/Controllers/JT905Controller.cs
  10. +1
    -2
      src/JTTools/Controllers/JTActiveSafetyController.cs
  11. +120
    -0
      src/JTTools/Dtos/JT1078PacketDto.cs
  12. +13
    -0
      src/JTTools/Dtos/JT1078PacketResultDto.cs
  13. +1
    -1
      src/JTTools/Dtos/JT808AnalyzeDto.cs
  14. +8
    -0
      src/JTTools/Dtos/JT808AnalyzeResultDto.cs
  15. +2
    -2
      src/JTTools/Dtos/JT809AnalyzeDto.cs
  16. +1
    -5
      src/JTTools/Dtos/JT905AnalyzeDto.cs
  17. +27
    -0
      src/JTTools/Dtos/ResultDto.cs
  18. +21
    -19
      src/JTTools/JTTools.csproj
  19. +68
    -81
      src/JTTools/Program.cs
  20. +2
    -6
      src/JTTools/appsettings.Development.json
  21. +2
    -5
      src/JTTools/appsettings.json
  22. +163
    -58
      src/JTTools/wwwroot/css/site.css
  23. 二进制
      src/JTTools/wwwroot/img/4G_IPC1.jpg
  24. 二进制
      src/JTTools/wwwroot/img/4G_IPC11.jpg
  25. 二进制
      src/JTTools/wwwroot/img/4G_IPC2.jpg
  26. 二进制
      src/JTTools/wwwroot/img/wechat_pay.jpg
  27. 二进制
      src/JTTools/wwwroot/img/yilabao.png
  28. 二进制
      src/JTTools/wwwroot/img/zfb_pay.jpg
  29. +735
    -34
      src/JTTools/wwwroot/index.html
  30. +321
    -1
      src/JTTools/wwwroot/js/site.js
  31. 二进制
      src/JTTools/wwwroot/lib/.DS_Store
  32. +2
    -0
      src/JTTools/wwwroot/lib/axios@1.7.9.min.js
  33. 二进制
      src/JTTools/wwwroot/lib/bootstrap-icons/.DS_Store
  34. +5
    -0
      src/JTTools/wwwroot/lib/bootstrap-icons/bootstrap-icons.min.css
  35. 二进制
      src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff
  36. 二进制
      src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff2
  37. 二进制
      src/JTTools/wwwroot/lib/bootstrap/dist/css/.DS_Store
  38. +0
    -6
      src/JTTools/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css
  39. +0
    -1
      src/JTTools/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map
  40. +7
    -0
      src/JTTools/wwwroot/lib/clipboard@2.0.11.min.js
  41. +0
    -1
      src/JTTools/wwwroot/lib/jquery/dist/jquery.min.map
  42. +1
    -1
      src/global.json

+ 0
- 12
jttools.service 查看文件

@@ -1,12 +0,0 @@
[Unit]
Description=JTTools Server
After=network.target

[Service]
User=root
Restart=on-failure
WorkingDirectory=/home/jttools/
ExecStart=/home/jttools/JTTools

[Install]
WantedBy=multi-user.target

+ 13
- 0
jttools_new.service 查看文件

@@ -0,0 +1,13 @@
[Unit]
Description=JTTools New Server
After=network.target

[Service]
User=root
Restart=on-failure
WorkingDirectory=/home/jttools_new/
ExecStart=dotnet JTTools.dll
Environment="DOTNET_BUNDLE_EXTRACT_BASE_DIR=%h/.net"

[Install]
WantedBy=multi-user.target

+ 7
- 7
src/JTTools.sln 查看文件

@@ -1,9 +1,9 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29123.88
# Visual Studio Version 17
VisualStudioVersion = 17.12.35506.116
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JTTools", "JTTools\JTTools.csproj", "{295AB139-27E0-45AE-8E95-A3D0F1E4161F}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTTools", "JTTools\JTTools.csproj", "{EEB24F42-2C88-4B9F-BA24-F5698988CECB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,10 +11,10 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{295AB139-27E0-45AE-8E95-A3D0F1E4161F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{295AB139-27E0-45AE-8E95-A3D0F1E4161F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{295AB139-27E0-45AE-8E95-A3D0F1E4161F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{295AB139-27E0-45AE-8E95-A3D0F1E4161F}.Release|Any CPU.Build.0 = Release|Any CPU
{EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE


+ 3
- 2
src/JTTools/.config/dotnet-tools.json 查看文件

@@ -3,10 +3,11 @@
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "3.1.5",
"version": "9.0.0",
"commands": [
"dotnet-ef"
]
],
"rollForward": false
}
}
}

+ 162
- 2
src/JTTools/Controllers/JT1078Controller.cs 查看文件

@@ -5,6 +5,9 @@ using JTTools.Configs;
using JTTools.Dtos;
using System.Reflection.Emit;
using JT1078.Protocol;
using JT1078.Protocol.Extensions;
using JT808.Protocol;
using JT808.Protocol.Extensions.JT1078.MessageBody;

namespace JTTools.Controllers
{
@@ -17,18 +20,21 @@ namespace JTTools.Controllers
{
JT1078Serializer serializer;

JT808Serializer jt1078_serializer;

/// <summary>
///
/// </summary>
public JT1078Controller()
public JT1078Controller(JT808_JT1078_Config jT808_JT1078_Config)
{
serializer = new JT1078Serializer();
jt1078_serializer = jT808_JT1078_Config.GetSerializer();
}

/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="request">"30 31 63 64 81 E2 10 88 01 12 34 56 78 10 01 10 00 00 01 6B B3 92 CA 7C 02 80 00 28 00 2E 00 00 00 01 61 E1 A2 BF 00 98 CF C0 EE 1E 17 28 34 07 78 8E 39 A4 03 FD DB D1 D5 46 BF B0 63 01 3F 59 AC 34 C9 7A 02 1A B9 6A 28 A4 2C 08"</param>
/// <returns></returns>
[HttpPost]
[Route("Analyze")]
@@ -36,9 +42,163 @@ namespace JTTools.Controllers
{
ResultDto<JT1078AnalyzeResultDto> result = new ResultDto<JT1078AnalyzeResultDto>();
result.Result = new JT1078AnalyzeResultDto();
try
{
var data = request.Hex.ToHexBytes();
result.Result.JsonValue = serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
}
catch (Exception ex)
{
result.Error(ex);
}
return result;
}

/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("Packet_0x9101")]
public ResultDto<JT1078PacketResultDto> Packet_0x9101(JT1078_0x9101_Dto request)
{
ResultDto<JT1078PacketResultDto> result = new ResultDto<JT1078PacketResultDto>();
result.Result = new JT1078PacketResultDto();
JT808Package jT808Package = new JT808Package();
JT808Header header = new JT808Header();
try
{
header.MsgId = 0x9101;
header.ManualMsgNum = (ushort)request.SN;
header.TerminalPhoneNo = request.Sim;
jT808Package.Header = header;
JT808_0x9101 jT808_0X9101 = new JT808_0x9101();
jT808_0X9101.ServerIp = request.IPAddress;
jT808_0X9101.TcpPort = (ushort)request.TcpPort;
jT808_0X9101.UdpPort = (ushort)request.UdpPort;
jT808_0X9101.ChannelNo = request.LogicalChannelNo;
jT808_0X9101.DataType = (byte)(request.DataType);
jT808_0X9101.StreamType = (byte)(request.StreamType);
jT808Package.Bodies = jT808_0X9101;
result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString();
}
catch (Exception ex)
{
result.Error(ex);
}
return result;
}

/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("Packet_0x9102")]
public ResultDto<JT1078PacketResultDto> Packet_0x9102(JT1078_0x9102_Dto request)
{
ResultDto<JT1078PacketResultDto> result = new ResultDto<JT1078PacketResultDto>();
result.Result = new JT1078PacketResultDto();
JT808Package jT808Package = new JT808Package();
JT808Header header = new JT808Header();
try
{
header.MsgId = 0x9102;
header.ManualMsgNum = (ushort)request.SN;
header.TerminalPhoneNo = request.Sim;
jT808Package.Header = header;
JT808_0x9102 jT808_0X9102 = new JT808_0x9102();
jT808_0X9102.ChannelNo = request.LogicalChannelNo;
jT808_0X9102.ControlCmd = byte.Parse(request.ControlCmd);
jT808_0X9102.CloseAVData = byte.Parse(request.CloseAVData);
jT808_0X9102.StreamType = byte.Parse(request.SwitchStreamType);
jT808Package.Bodies = jT808_0X9102;
result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString();
}
catch (Exception ex)
{
result.Error(ex);
}
return result;
}

/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("Packet_0x9205")]
public ResultDto<JT1078PacketResultDto> Packet_0x9205(JT1078_0x9205_Dto request)
{
ResultDto<JT1078PacketResultDto> result = new ResultDto<JT1078PacketResultDto>();
result.Result = new JT1078PacketResultDto();
JT808Package jT808Package = new JT808Package();
JT808Header header = new JT808Header();
try
{
header.MsgId = 0x9205;
header.ManualMsgNum = (ushort)request.SN;
header.TerminalPhoneNo = request.Sim;
jT808Package.Header = header;
JT808.Protocol.MessageBody.JT808_0x0200 jT808_0X0200 = new JT808.Protocol.MessageBody.JT808_0x0200();
jT808_0X0200.AlarmFlag = (uint)JT808.Protocol.Enums.JT808Alarm.gnss_ant_not_connected;
JT808_0x9205 jT808_0X9205 = new JT808_0x9205();
jT808_0X9205.ChannelNo = request.LogicalChannelNo;
jT808_0X9205.BeginTime = request.BeginTime;
jT808_0X9205.EndTime = request.EndTime;
jT808_0X9205.AlarmFlag = ulong.Parse(request.AlarmFlag);
jT808_0X9205.MediaType = byte.Parse(request.MediaType);
jT808_0X9205.StreamType = byte.Parse(request.MemoryType);
jT808_0X9205.MemoryType = byte.Parse(request.MemoryType);
jT808Package.Bodies = jT808_0X9205;
result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString();
}
catch (Exception ex)
{
result.Error(ex);
}
return result;
}

/// <summary>
///
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("Packet_0x9206")]
public ResultDto<JT1078PacketResultDto> Packet_0x9206(JT1078_0x9206_Dto request)
{
ResultDto<JT1078PacketResultDto> result = new ResultDto<JT1078PacketResultDto>();
result.Result = new JT1078PacketResultDto();
JT808Package jT808Package = new JT808Package();
JT808Header header = new JT808Header();
try
{
header.MsgId = 0x9206;
header.ManualMsgNum = (ushort)request.SN;
header.TerminalPhoneNo = request.Sim;
jT808Package.Header = header;
JT808_0x9206 jT808_0X9206 = new JT808_0x9206();
jT808_0X9206.ServerIpLength = byte.Parse(request.ServerIP.Length.ToString());
jT808_0X9206.ServerIp = request.ServerIP;
jT808_0X9206.Port = ushort.Parse(request.Port);
jT808_0X9206.UserName = request.UserName;
jT808_0X9206.Password = request.Password;
jT808_0X9206.FileUploadPath = request.FileUploadPath ?? "";
jT808_0X9206.BeginTime = request.BeginTime;
jT808_0X9206.EndTime = request.EndTime;
jT808_0X9206.AlarmFlag = ulong.Parse(request.AlarmFlag);
jT808_0X9206.MediaType = byte.Parse(request.MediaType);
jT808_0X9206.StreamType = byte.Parse(request.MemoryType);
jT808_0X9206.MemoryPositon = byte.Parse(request.MemoryType);
jT808_0X9206.TaskExcuteCondition = byte.Parse(request.TaskExcuteCondition);
jT808Package.Bodies = jT808_0X9206;
result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString();
}
catch (Exception ex)
{
result.Error(ex);
}
return result;
}
}


+ 1
- 2
src/JTTools/Controllers/JT19056Controller.cs 查看文件

@@ -58,8 +58,7 @@ namespace JTTools.Controllers
}
catch (Exception ex)
{
result.Code = 500;
result.Message = ex.StackTrace??"";
result.Error(ex);
}
return result;
}


+ 133
- 24
src/JTTools/Controllers/JT808Controller.cs 查看文件

@@ -12,6 +12,11 @@ using System.Text.Unicode;
using JT808.Protocol.Interfaces;
using JTTools.Dtos;
using System.Reflection.Emit;
using JT809.Protocol;
using System.Net.Sockets;
using static System.Runtime.InteropServices.JavaScript.JSType;
using System.Reflection.PortableExecutable;
using JT905.Protocol.SerialPort;

namespace JTTools.Controllers
{
@@ -34,7 +39,16 @@ namespace JTTools.Controllers
JT808Serializer JTYueBiao_Serializer;
JT808Serializer JTGps51_Serializer;
JT808Serializer JT1078Serializer;
JT808Serializer JTPrivateSerializer;

/// <summary>
///
/// </summary>
/// <param name="config"></param>
/// <param name="jT808_JT1078_Config"></param>
/// <param name="jT808_SuBiao_Config"></param>
/// <param name="jT808_Streamax_Config"></param>
/// <param name="jT808_YueBiao_Config"></param>
/// <param name="jT808_gps51_Config"></param>
public JT808Controller(
IJT808Config config,
JT808_JT1078_Config jT808_JT1078_Config,
@@ -61,37 +75,132 @@ namespace JTTools.Controllers
}

/// <summary>
/// 序列化字典
///
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet]
[Route("GetDict")]
public ResultDto<List<JTTDictDto>> GetDict()
{
return new ResultDto<List<JTTDictDto>>
{
Result=new List<JTTDictDto>{
{ new JTTDictDto{Label = "国标(通过包自动识别版本号)" ,Value = "JT808"}},
{ new JTTDictDto{Label = "国标扩展JT1078", Value = "JT808_JT1078"}},
{ new JTTDictDto{Label = "国标扩展主动安全(苏标)", Value = "JT808_SuBiao"}},
{ new JTTDictDto{Label = "国标扩展主动安全(粤标)" ,Value = "JT808_YueBiao"}},
{ new JTTDictDto{Label = "公交扩展协议(锐明)", Value = "JT808_JTRM"}},
{ new JTTDictDto{Label = "国标(强制使用2013版本解析)" ,Value = "JT2013Force"}},
{ new JTTDictDto{Label = "国标扩展私有协议", Value = "JTPrivate"} },
{ new JTTDictDto{Label = "国标扩展私有协议(GPS51)", Value = "JT808_GPS51"} }
}
};
}

[HttpPost]
[Route("Analyze")]
public ResultDto<JT808AnalyzeResultDto> Analyze(JT808AnalyzeDto request)
{
ResultDto<JT808AnalyzeResultDto> result = new ResultDto<JT808AnalyzeResultDto>();
result.Result = new JT808AnalyzeResultDto();



if (string.IsNullOrEmpty(request.Hex))
{
result.Fail("hex数据不为空");
return result;
}
if (string.IsNullOrEmpty(request.ProtocolType))
{
result.Fail("请选择对应的版本类型");
return result;
}
SortedList<int, JT808HeaderPackage> sort = new SortedList<int, JT808HeaderPackage>();
List<JT808HeaderPackage> headerPackages;
var total = 0;
try
{
string[] lines = request.Hex.Split('\n', StringSplitOptions.RemoveEmptyEntries);
foreach (var (i, item) in lines.Index())
{
var data = item.ToHexBytes();
var headerPackage = Serializer.HeaderDeserialize(data);
var package = new JT808PackageInfoDto
{
Order = i+1,
MsgId = headerPackage.Header.MsgId.ToString("X2"),
ProtocolVersion = ((JT808.Protocol.Enums.JT808Version)headerPackage.Header.ProtocolVersion).ToString(),
DataLength = headerPackage.Header.MessageBodyProperty.DataLength,
TerminalPhoneNo = headerPackage.Header.TerminalPhoneNo,
Encrypt = headerPackage.Header.MessageBodyProperty.Encrypt != JT808.Protocol.Enums.JT808EncryptMethod.None,
MsgNum = headerPackage.Header.MsgNum
};
//处理分包
if (headerPackage.Header.MessageBodyProperty.IsPackage)
{
total = headerPackage.Header.PackgeCount;
sort.Add(headerPackage.Header.PackageIndex, headerPackage);
package.PackageIndex = headerPackage.Header.PackageIndex;
package.PackgeCount = headerPackage.Header.PackgeCount;
package.Body = headerPackage.Bodies.ToHexString();
}
else
{
switch (request.ProtocolType)
{
case "JT808":
package.JsonValue = Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT808_JT1078":
package.JsonValue = JT1078Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT808_SuBiao":
package.JsonValue = JTSuBiao_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT808_YueBiao":
package.JsonValue = JTYueBiao_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT808_JTRM":
package.JsonValue = JTRM_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
case "JT2013Force":
package.JsonValue = Serializer.Analyze(data, JT808.Protocol.Enums.JT808Version.JTT2013Force, options: JTJsonWriterOptions.Instance);
break;
case "JT808_GPS51":
package.JsonValue = JTGps51_Serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
break;
}
}
result.Result.Packages.Add(package);
}
if (sort.Count > 0)
{
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();
}
headerPackages = sort.Select(s => s.Value).ToList();
if (sort.Count == total)
{
result.Result.IsSubpackage = true;
switch (request.ProtocolType)
{
case "JT808":
result.Result.JsonValue = Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_JT1078":
result.Result.JsonValue = JT1078Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_SuBiao":
result.Result.JsonValue = JTSuBiao_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_YueBiao":
result.Result.JsonValue = JTYueBiao_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT808_JTRM":
result.Result.JsonValue = JTRM_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
case "JT2013Force":
result.Result.JsonValue = Serializer.Analyze(msgid, bodies.ToArray(), JT808.Protocol.Enums.JT808Version.JTT2013Force, options: JTJsonWriterOptions.Instance);
break;
case "JT808_GPS51":
result.Result.JsonValue = JTGps51_Serializer.Analyze(msgid, bodies.ToArray(), options: JTJsonWriterOptions.Instance);
break;
}
}
else
{
result.Fail("包数不匹配,请确认清楚!");
}
}
}
catch (Exception ex)
{
result.Error(ex);
}
return result;
}
}


+ 75
- 4
src/JTTools/Controllers/JT809Controller.cs 查看文件

@@ -11,6 +11,7 @@ using JT809.Protocol.Enums;
using JTTools.Dtos;
using System.Reflection.Emit;
using JT808.Protocol;
using System.Security.Cryptography.Xml;

namespace JTTools.Controllers
{
@@ -45,7 +46,10 @@ namespace JTTools.Controllers
/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="request">
/// HexData2011 "5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D"
/// HexData2019 "5B 00 00 00 C9 00 00 06 82 17 00 01 34 15 F4 01 00 00 00 00 00 27 0F 00 00 00 00 5E 02 A5 07 B8 D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 17 01 00 00 00 8B 01 02 03 04 05 06 07 08 09 10 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E7 D3 5D"
/// </param>
/// <returns></returns>
[HttpPost]
[Route("Analyze")]
@@ -53,12 +57,79 @@ namespace JTTools.Controllers
{
ResultDto<JT809AnalyzeResultDto> result = new ResultDto<JT809AnalyzeResultDto>();
result.Result = new JT809AnalyzeResultDto();
try
{
var data = request.Hex.ToHexBytes();
var encryptOptions = new JT809EncryptOptions();
encryptOptions.M1 = (uint)request.M1;
encryptOptions.IC1 = (uint)request.IC1;
encryptOptions.IA1 = (uint)request.IA1;
switch (request.ProtocolType)
{
case "2011":
if (request.IsEncrypt)
{
result.Result.JsonValue = serializer2011.Analyze(data, JTJsonWriterOptions.Instance);
}
else
{
IJT809Config jt809ConfigInternal = new JT809Config2011(Guid.NewGuid().ToString());
jt809ConfigInternal.EncryptOptions = encryptOptions;
JT809Serializer jT809SerializerInternal = new JT809Serializer(jt809ConfigInternal);
result.Result.JsonValue = jT809SerializerInternal.Analyze(data, JTJsonWriterOptions.Instance);
}
break;
case "2019":
if (request.IsEncrypt)
{
result.Result.JsonValue = serializer2019.Analyze(data, JTJsonWriterOptions.Instance);
}
else
{
IJT809Config jt809ConfigInternal = new JT809Config2019(Guid.NewGuid().ToString());
jt809ConfigInternal.EncryptOptions = encryptOptions;
JT809Serializer jT809SerializerInternal = new JT809Serializer(jt809ConfigInternal);
result.Result.JsonValue = jT809SerializerInternal.Analyze(data, JTJsonWriterOptions.Instance);
}
break;
default:
result.Error("ÊäÈë°æ±¾ºÅÓÐÎð");
result.Result.JsonValue = "";
break;
}
}
catch (JT809Exception ex)
{
result.Result.JsonValue = "";
result.Error(ex);
}
catch (Exception ex)
{
result.Result.JsonValue = "";
result.Error(ex);
}
return result;
}
class JT809Config2011 : JT809GlobalConfigBase
{
public JT809Config2011(string configId)
{
ConfigId = configId;
}

public override string ConfigId { get; }
}

class JT809Config2019 : JT809GlobalConfigBase
{
public JT809Config2019(string configId)
{
ConfigId = configId;
Version = JT809Version.JTT2019;
}

return result;
public override string ConfigId { get; }
}

}
}

+ 20
- 3
src/JTTools/Controllers/JT905Controller.cs 查看文件

@@ -10,6 +10,8 @@ using JT808.Protocol.Interfaces;
using JTTools.Dtos;
using System.Reflection.Emit;
using JT905.Protocol;
using JT808.Protocol.Extensions;


namespace JTTools.Controllers
{
@@ -23,21 +25,36 @@ namespace JTTools.Controllers
IJT905Config config;
JT905Serializer serializer;
/// <summary>
///
/// </summary>
/// <param name="config"></param>
public JT905Controller(IJT905Config config)
{
this.config = config;
this.serializer = new JT905Serializer(config);
}

/// <summary>
///
/// </summary>
/// <param name="request">7E02000023103456789012007D02000000010000000200BA7F0E07E4F11C003C002110152110100104000000640202007D01347E</param>
/// <returns></returns>
[HttpPost]
[Route("Analyze")]
public ResultDto<JT905AnalyzeResultDto> Analyze(JT905AnalyzeDto request)
{
ResultDto<JT905AnalyzeResultDto> result = new ResultDto<JT905AnalyzeResultDto>();
result.Result = new JT905AnalyzeResultDto();



try
{
var data = request.Hex.ToHexBytes();
result.Result.JsonValue = serializer.Analyze(data, options: JTJsonWriterOptions.Instance);
}
catch (Exception ex)
{
result.Error(ex);
}
return result;
}
}


+ 1
- 2
src/JTTools/Controllers/JTActiveSafetyController.cs 查看文件

@@ -31,8 +31,7 @@ namespace JTTools.Controllers
}
catch (Exception ex)
{
result.Code = 500;
result.Message = ex.StackTrace??"";
result.Error(ex);
}
return result;
}


+ 120
- 0
src/JTTools/Dtos/JT1078PacketDto.cs 查看文件

@@ -0,0 +1,120 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace JTTools.Dtos
{

public class JT1078_0x9101_Dto
{
[Required]
public string Sim { get; set; } = "123456789012";
[Required]
public int SN { get; set; } = new Random().Next(1, 2000);
[Required]
public string IPAddress { get; set; } = "127.0.0.1";
[Required]
public int TcpPort { get; set; }
[Required]
public int UdpPort { get; set; }
[Required]
public byte LogicalChannelNo { get; set; }
[Required]
public int DataType { get; set; } = 1;
[Required]
public int StreamType { get; set; } = 1;
}

public class JT1078_0x9102_Dto
{
[Required]
public string Sim { get; set; } = "123456789012";
[Required]
public int SN { get; set; } = new Random().Next(1, 2000);
[Required]
public byte LogicalChannelNo { get; set; }
[Required]
public string ControlCmd { get; set; } = "0";
[Required]
public string CloseAVData { get; set; } = "0";
[Required]
public string SwitchStreamType { get; set; } = "1";
}
public class JT1078_0x9205_Dto
{
[Required]
public string Sim { get; set; } = "123456789012";
[Required]
public int SN { get; set; } = new Random().Next(1, 2000);
[Required, DisplayName("逻辑通道号")]
public byte LogicalChannelNo { get; set; } = 4;

[Required, DisplayName("开始时间")]
public DateTime BeginTime { get; set; } = DateTime.Today;
[Required, DisplayName("结束时间")]
public DateTime EndTime { get; set; } = DateTime.Now;
[Required, DisplayName("报警标志")]
public string AlarmFlag { get; set; } = "00000000000000000000000000000000";
[Required, DisplayName("音视频资源类型")]
public string MediaType { get; set; } = "0";
[Required, DisplayName("码流类型")]
public string StreamType { get; set; } = "0";
[Required, DisplayName("存储器类型")]
public string MemoryType { get; set; } = "0";
}
/// <summary>
///
/// </summary>
public class JT1078_0x9206_Dto
{
/// <summary>
///
/// </summary>
[Required]
public string Sim { get; set; } = "123456789012";
/// <summary>
///
/// </summary>
[Required]
public int SN { get; set; } = new Random().Next(1, 2000);
/// <summary>
///
/// </summary>
[Required]
public byte LogicalChannelNo { get; set; } = 4;
/// <summary>
///
/// </summary>
public string ServerIP { get; set; } = "127.0.0.1";
/// <summary>
///
/// </summary>
public string Port { get; set; } = "6201";
/// <summary>
///
/// </summary>
public string UserName { get; set; } = "053500";
/// <summary>
///
/// </summary>
public string Password { get; set; } = "053500";
/// <summary>
///
/// </summary>
public string FileUploadPath { get; set; } = "./aaaaaaa";
[Required, DisplayName("开始时间")]
public DateTime BeginTime { get; set; } = DateTime.Today;
[Required, DisplayName("结束时间")]
public DateTime EndTime { get; set; } = DateTime.Now;
[Required, DisplayName("报警标志")]
public string AlarmFlag { get; set; } = "00000000000000000000000000000000";
[Required, DisplayName("音视频资源类型")]
public string MediaType { get; set; } = "0";
[Required, DisplayName("码流类型")]
public string StreamType { get; set; } = "0";
[Required, DisplayName("存储器类型")]
public string MemoryType { get; set; } = "0";

public string TaskExcuteCondition { get; set; } = "7";
}
}

+ 13
- 0
src/JTTools/Dtos/JT1078PacketResultDto.cs 查看文件

@@ -0,0 +1,13 @@
namespace JTTools.Dtos
{
/// <summary>
///
/// </summary>
public class JT1078PacketResultDto
{
/// <summary>
/// hex字符串
/// </summary>
public string Hex { get; set; } = "";
}
}

+ 1
- 1
src/JTTools/Dtos/JT808AnalyzeDto.cs 查看文件

@@ -12,6 +12,6 @@
/// <summary>
/// hex字符串
/// </summary>
public List<string> Hex { get; set; } = new List<string>();
public string Hex { get; set; } = "";
}
}

+ 8
- 0
src/JTTools/Dtos/JT808AnalyzeResultDto.cs 查看文件

@@ -24,6 +24,10 @@
/// </summary>
public class JT808PackageInfoDto
{
/// <summary>
///
/// </summary>
public int Order { get; set; }
/// <summary>
///
/// </summary>
@@ -60,5 +64,9 @@
///
/// </summary>
public string Body { get; set; } = "";
/// <summary>
///
/// </summary>
public string JsonValue { get; set; } = "";
}
}

+ 2
- 2
src/JTTools/Dtos/JT809AnalyzeDto.cs 查看文件

@@ -8,9 +8,9 @@ namespace JTTools.Dtos
public class JT809AnalyzeDto
{
/// <summary>
///
///
/// </summary>
public string ProtocolType { get; set; } = "";
public string ProtocolType { get; set; } = "2011";
/// <summary>
///
/// </summary>


+ 1
- 5
src/JTTools/Dtos/JT905AnalyzeDto.cs 查看文件

@@ -5,13 +5,9 @@
/// </summary>
public class JT905AnalyzeDto
{
/// <summary>
///
/// </summary>
public string ProtocolType { get; set; } = "";
/// <summary>
/// hex字符串
/// </summary>
public List<string> Hex { get; set; } = new List<string>();
public string Hex { get; set; } = "";
}
}

+ 27
- 0
src/JTTools/Dtos/ResultDto.cs 查看文件

@@ -5,5 +5,32 @@
public string Message { get; set; } = "";
public int Code { get; set; } = 200;
public T? Result { get; set; } = default;
/// <summary>
///
/// </summary>
/// <param name="ex"></param>
public void Error(Exception ex)
{
Code = 500;
Message = ex.StackTrace ?? "";
}
/// <summary>
///
/// </summary>
/// <param name="msg"></param>
public void Error(string msg)
{
Code = 500;
Message = msg;
}

/// <summary>
///
/// </summary>
public void Fail(string msg="")
{
Code = 400;
Message = msg;
}
}
}

+ 21
- 19
src/JTTools/JTTools.csproj 查看文件

@@ -1,24 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AssemblyVersion>1.0.4</AssemblyVersion>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AntDesign" Version="0.16.3" />
<PackageReference Include="JT1078" Version="1.2.0-preview6" />
<PackageReference Include="JT808" Version="2.6.5" />
<PackageReference Include="JT808.Protocol.Extensions.JT1078" Version="2.6.5" />
<PackageReference Include="JT808.Protocol.Extensions.Streamax" Version="0.5.0" />
<PackageReference Include="JT808.Protocol.Extensions.SuBiao" Version="2.6.5" />
<PackageReference Include="JT808.Protocol.Extensions.YueBiao" Version="2.6.5" />
<PackageReference Include="JT809" Version="2.2.5" />
<PackageReference Include="JT809.Protocol.Extensions.JT1078" Version="2.2.5" />
<PackageReference Include="JTActiveSafety" Version="1.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.6" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.11" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="JT1078" Version="1.2.0-preview7" />
<PackageReference Include="JT808" Version="2.7.1" />
<PackageReference Include="JT808.Protocol.Extensions.GPS51" Version="2.7.1" />
<PackageReference Include="JT808.Protocol.Extensions.JT1078" Version="2.7.1" />
<PackageReference Include="JT808.Protocol.Extensions.Streamax" Version="0.5.5" />
<PackageReference Include="JT808.Protocol.Extensions.SuBiao" Version="2.7.1" />
<PackageReference Include="JT808.Protocol.Extensions.YueBiao" Version="2.7.1" />
<PackageReference Include="JT809" Version="2.2.6" />
<PackageReference Include="JT809.Protocol.Extensions.JT1078" Version="2.2.6" />
<PackageReference Include="JT905" Version="1.0.0-preview3" />
<PackageReference Include="JTActiveSafety" Version="1.0.2" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageReference Include="NSwag.AspNetCore" Version="14.2.0" />
</ItemGroup>

</Project>

+ 68
- 81
src/JTTools/Program.cs 查看文件

@@ -1,22 +1,18 @@
using System;
using JT808.Protocol;
using JT808.Protocol.Extensions.JT1078;
using JT808.Protocol.Extensions.SuBiao;
using JT808.Protocol.Extensions.YueBiao;
using JT809.Protocol;
using JT809.Protocol.Extensions.JT1078;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json.Serialization;
using JTTools.Configs;
using Newtonsoft.Json;
using JT808.Protocol.Extensions.Streamax;
using System.Text.Json;
using JT808.Protocol.MessagePack;
using JT808.Protocol.MessageBody;
using JTTools.Configs;
using JT808.Protocol.Extensions.GPS51;
using YamlDotNet.Serialization;
using JT905.Protocol;


namespace JTTools
{
@@ -24,80 +20,71 @@ namespace JTTools
{
public static void Main(string[] args)
{
Newtonsoft.Json.JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddJT808Configure();
builder.Services.AddJT808Configure(new JT808_SuBiao_Config())
.AddSuBiaoConfigure();
builder.Services.AddJT808Configure(new JT808_YueBiao_Config())
.AddYueBiaoConfigure();
builder.Services.AddJT808Configure(new JT808_JT1078_Config())
.AddJT1078Configure();
builder.Services.AddJT809Configure(new JT809_2011_Config())
.AddJT1078Configure();
IServiceProvider serviceProvider = builder.Services.BuildServiceProvider();
builder.Services.AddJT809Configure(new JT809_2019_Config())
.AddJT1078Configure()
.AddJT809_JT808AnalyzeCallback(0x0200, (bytes, writer, jT809Config) => {
IJT808Config jT808Config = serviceProvider.GetRequiredService<IJT808Config>();
JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes);
JT808.Protocol.Extensions.JT808AnalyzeExtensions.Analyze(JT808.Protocol.JT808ConfigExtensions.GetMessagePackFormatter<JT808_0x0200>(jT808Config),
ref jT808MessagePackReader, writer, jT808Config);
});
builder.Services.AddJT808Configure(new JT808_Streamax_Config())
.AddStreamaxConfigure();
builder.Services.AddJT808Configure(new JT808_GPS51_Config())
.AddGPS51Configure();
builder.Services.AddJT905Configure();

builder.Services.AddControllers().AddJsonOptions(options =>
{
Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings();
//日期类型默认格式化处理
settings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
//空值处理
settings.NullValueHandling = NullValueHandling.Ignore;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
settings.Converters.Add(new ByteArrayHexConverter());
return settings;
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureServices((hostingContext, services) =>
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddAntDesign();
})
.ConfigureLogging((context, logging) => {
//if (Environment.OSVersion.Platform == PlatformID.Unix)
//{
// NLog.LogManager.LoadConfiguration("Configs/nlog.unix.config");
//}
//else
//{
// NLog.LogManager.LoadConfiguration("Configs/nlog.win.config");
//}
//logging.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true });
//logging.SetMinimumLevel(LogLevel.Trace);
})
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(AppDomain.CurrentDomain.BaseDirectory);
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
})
.Configure(app => {
app.UseRouting();
app.UseStaticFiles();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
});
})
.ConfigureServices(services =>
{
services.AddJT808Configure();
services.AddJT808Configure(new JT808_SuBiao_Config())
.AddSuBiaoConfigure();
services.AddJT808Configure(new JT808_YueBiao_Config())
.AddYueBiaoConfigure();
services.AddJT808Configure(new JT808_JT1078_Config())
.AddJT1078Configure();
services.AddJT809Configure(new JT809_2011_Config())
.AddJT1078Configure();
IServiceProvider serviceProvider = services.BuildServiceProvider();
services.AddJT809Configure(new JT809_2019_Config())
.AddJT1078Configure()
.AddJT809_JT808AnalyzeCallback(0x0200,(bytes, writer, jT809Config)=> {
IJT808Config jT808Config = serviceProvider.GetRequiredService<IJT808Config>();
JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes);
JT808.Protocol.Extensions.JT808AnalyzeExtensions.Analyze(JT808.Protocol.JT808ConfigExtensions.GetMessagePackFormatter<JT808_0x0200>(jT808Config),
ref jT808MessagePackReader, writer, jT808Config);
});
services.AddJT808Configure(new JT808_Streamax_Config())
.AddStreamaxConfigure();
})
.Build()
.Run();

builder.Services.AddOpenApiDocument();

builder.Services.AddCors(options =>
{
options.AddPolicy("AnyCors", builder=> builder.AllowAnyMethod()
.SetIsOriginAllowed(_ => true)
.AllowAnyHeader()
.AllowCredentials());
});

var app = builder.Build();

app.UseCors("AnyCors");

app.UseOpenApi(options =>
{
options.Path = "/jtt/swagger/{documentName}/swagger.json";
});

app.UseSwaggerUi(options =>
{
options.DocumentPath = "/jtt/swagger/{documentName}/swagger.json";
options.Path ="/jttui/swagger";
});

app.MapControllers();

app.UseDefaultFiles();

app.MapStaticAssets();

app.UseStaticFiles();

app.Run();
}
}
}

+ 2
- 6
src/JTTools/appsettings.Development.json 查看文件

@@ -1,12 +1,8 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
"Microsoft.AspNetCore": "Warning"
}
},
"urls": "http://*:18888;",
"AllowedOrigins": "http://jttools.smallchi.cn,https://jttools.smallchi.cn,http://localhost:8080"
}
}

+ 2
- 5
src/JTTools/appsettings.json 查看文件

@@ -2,11 +2,8 @@
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
"Microsoft.AspNetCore": "Warning"
}
},
"urls": "http://*:18888;",
"AllowedHosts": "*",
"AllowedOrigins": "http://jttools.smallchi.cn,https://jttools.smallchi.cn,http://localhost:8080"
"AllowedHosts": "*"
}

+ 163
- 58
src/JTTools/wwwroot/css/site.css 查看文件

@@ -1,3 +1,9 @@
@supports (font-family: -apple-system) {
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
}

html {
font-size: 14px;
}
@@ -8,8 +14,25 @@ html {
}
}

main>.container {
padding: 60px 15px 0;
.btn:focus,
.btn:active:focus,
.btn-link.nav-link:focus,
.form-control:focus,
.form-check-input:focus {
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}

html {
position: relative;
min-height: 100%;
}

body {
min-height: 75rem;
}

.hide {
display: none;
}

.bd-placeholder-img {
@@ -27,7 +50,6 @@ main>.container {
}

.b-example-divider {
width: 100%;
height: 3rem;
background-color: rgba(0, 0, 0, .1);
border: solid rgba(0, 0, 0, .15);
@@ -63,68 +85,151 @@ main>.container {
white-space: nowrap;
-webkit-overflow-scrolling: touch;
}

.btn-bd-primary {
--bd-violet-bg: #712cf9;
--bd-violet-rgb: 112.520718, 44.062154, 249.437846;

--bs-btn-font-weight: 600;
--bs-btn-color: var(--bs-white);
--bs-btn-bg: var(--bd-violet-bg);
--bs-btn-border-color: var(--bd-violet-bg);
--bs-btn-hover-color: var(--bs-white);
--bs-btn-hover-bg: #6528e0;
--bs-btn-hover-border-color: #6528e0;
--bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);
--bs-btn-active-color: var(--bs-btn-hover-color);
--bs-btn-active-bg: #5a23c8;
--bs-btn-active-border-color: #5a23c8;
/*
1.全局样式=====
*/
main>.container {
padding: 100px 15px 0;
}
.bd-mode-toggle {
z-index: 1500;
@media screen and (max-width:768px){
main>.container {
padding: 65px 15px 0;
}

.bd-mode-toggle .dropdown-menu .active .bi {
display: block !important;
}

@keyframes fade-in {
from {
opacity: 0;
}
#main *:focus
{
box-shadow:none;
}
.btn-clear {
background: none;
border: none;
color: #6c757d;
/* Bootstrap的次要颜色 */
}
.pre{
background: #fafafa;
padding: 15px;
border-radius: 4px;
border: 1px solid #eeeeee;
}

@keyframes fade-out {
to {
opacity: 0;
}
.accordion-button:not(.collapsed){
color: #166ff1;
font-weight: 300;
background-color: #fafafa;
}

.badge{
border: 1px solid #d9d9d9;
border-radius: 2px;
font-weight: 500;
}
.text-bg-primary{
color: #1d39c4!important;
background: #f0f5ff!important;
border-color: #adc6ff!important;

}
.text-bg-secondary{
color: #531dab!important;
background: #f9f0ff!important;
border-color: #d3adf7!important;
}
.text-bg-dark{
color: #666 !important;
background: #00000014 !important;
border-color: #b9b8b8 !important;
}
.text-bg-light{
color: #000 !important;
background: #fff !important;
border-color: #d8d7d7 !important;
}
.text-bg-success{
color: #20c997!important;
background: #20c9961a !important;
border-color: #20c99683 !important;
}
.text-bg-danger{
color: #dc3545!important;
background: #dc35451a !important;
border-color: #dc354583 !important;
}
.text-bg-warning{
color: #d46b08!important;
background: #fff7e6!important;
border-color: #ffd591!important;
}
.text-bg-info{
color: #096dd9!important;
background: #e6f7ff!important;
border-color: #91d5ff!important;
}

.row{
margin-left: 0;
margin-right: 0;
}
/*
2.JT808Parse模块样式====
*/

#JT808Parse textarea{
padding-top: 40px;
}
#JT808Parse label{
color: rgb(222, 110, 5);
padding-top: 20px;
font-weight: bold;
}
#JT808Parse label i{
font-size: 20px;
}
#JT808_Accordion_Result .badge{
margin-left: 10px;
}
/*
4.产品模块样式====
*/
#ProductAD .carousel-inner{
height: 400px;
}
#ProductAD .icon{
width: 65px;
height: 65px;
background: #ccc;
text-align: center;
border-radius: 50%;
margin: 25px 0 0 25px;
}
@media screen and (max-width:768px){
#ProductAD .icon{
width: 50px;
height: 50px;
margin: 15px 0 0 15px;
}
}
#ProductAD >.card{
border:none
}

@keyframes slide-from-right {
from {
transform: translateX(90px);
}
#ProductAD .nav-pills{
border-bottom: 1px solid #eee;
width: 100%;
}

@keyframes slide-to-left {
to {
transform: translateX(-90px);
}
#ProductAD .nav-pills .nav-link{
background: #eee;
color: #333;
border-bottom-left-radius: 0 ;
border-bottom-right-radius: 0;
}

/* define animations for the old and new content */
::view-transition-old(slide-it) {
animation: 180ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
600ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-left;
#ProductAD .nav-pills .nav-link.active{
background: #258cfb;
color: #fff;
}

::view-transition-new(slide-it) {
animation: 420ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in,
600ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
#ProductAD .row{
margin-left: -12px;
margin-right: -12px;
}

/* tie the view transition to a given CSS class */
.sample-transition {
view-transition-name: slide-it;
#ProductAD .custom-tooltip {
--bs-tooltip-bg: #712cf9;
--bs-tooltip-color: #fff;
}

二进制
src/JTTools/wwwroot/img/4G_IPC1.jpg 查看文件

之前 之后
宽度: 1000  |  高度: 753  |  大小: 90 KiB

二进制
src/JTTools/wwwroot/img/4G_IPC11.jpg 查看文件

之前 之后
宽度: 1000  |  高度: 712  |  大小: 134 KiB

二进制
src/JTTools/wwwroot/img/4G_IPC2.jpg 查看文件

之前 之后
宽度: 1000  |  高度: 683  |  大小: 129 KiB

二进制
src/JTTools/wwwroot/img/wechat_pay.jpg 查看文件

之前 之后
宽度: 1118  |  高度: 1524  |  大小: 123 KiB

二进制
src/JTTools/wwwroot/img/yilabao.png 查看文件

之前 之后
宽度: 1170  |  高度: 2533  |  大小: 1.5 MiB

二进制
src/JTTools/wwwroot/img/zfb_pay.jpg 查看文件

之前 之后
宽度: 1080  |  高度: 1620  |  大小: 146 KiB

+ 735
- 34
src/JTTools/wwwroot/index.html 查看文件

@@ -1,83 +1,784 @@
<!doctype html>
<html lang="en" class="h-100" data-bs-theme="auto">
<html lang="en" class="h-100">

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords" content="JT808|gb808|JT809|gb809|JT1078|JTT1078|JT19056|gb19056|JT905|GB905|808|809|905|在线解析工具" />
<meta name="description" content="道路运输车辆卫星定位协议在线解析工具" />
<title>JTTools解析工具</title>
<meta name="author" content="SmallChi(Koike)、TK-Liu" />
<link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/css/site.css" />
<script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js" type="text/javascript"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords"
content="JT808|gb808|JT809|gb809|JT1078|JTT1078|JT19056|gb19056|JT905|GB905|808|809|905|hex|ipc|安防|camera|timestamp|在线时间戳|在线解析工具" />
<meta name="description" content="道路运输车辆卫星定位协议在线解析工具" />
<title>JTTools工具</title>
<meta name="author" content="SmallChi(Koike)" />
<link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="/lib/bootstrap-icons/bootstrap-icons.min.css" />

<link rel="stylesheet" href="/css/site.css" />
<script src="/lib/jquery/dist/jquery.min.js" type="text/javascript"></script>
<script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js" type="text/javascript"></script>
<script src="/lib/axios@1.7.9.min.js" type="text/javascript"></script>
<script src="/lib/clipboard@2.0.11.min.js" type="text/javascript"></script>
</head>
<!-- 已简单为主,不使用前端构建工具了 -->

<body class="d-flex flex-column h-100">
<!-- 顶部菜单 start -->
<header>
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="#">JTTools解析工具</a>
<strong class="navbar-brand" href="#">JTTools工具</strong>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse"
aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav me-auto mb-2 mb-md-0">
<li class="nav-item">
<a class="nav-link active" href="#">JT808解析工具</a>
<!-- <a class="nav-link active" aria-current="page" href="#">JT808</a> -->
</li>
<ul class="navbar-nav me-auto mb-2 mb-md-0" id="menus">
<li class="nav-item">
<a class="nav-link" href="#">JT809解析工具</a>
<a class="nav-link active" menu-type="JT808Parse" href="#JT808Parse">JT808解析工具</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">JT1078解析工具</a>
<a class="nav-link" menu-type="JT809Parse" href="#JT809Parse">JT809解析工具</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">JT1078(组包工具)</a>
<a class="nav-link" menu-type="JT1078Parse" href="#JT1078Parse">JT1078解析工具</a>
</li>
<!--
TODO:next version
<li class="nav-item">
<a class="nav-link" menu-type="JT808_JT1078Packet" href="#JT808_JT1078Packet">JT1078组包工具</a>
</li>
-->
<li class="nav-item">
<a class="nav-link" href="#">JT19056解析工具</a>
<a class="nav-link" menu-type="JT19056Parse" href="#JT19056Parse">JT19056解析工具</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">JT905解析工具</a>
<a class="nav-link" menu-type="JT905Parse" href="#JT905Parse">JT905解析工具</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">主动安全解析工具</a>
<a class="nav-link" menu-type="JTSBParse" href="#JTSBParse">主动安全解析工具</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">经纬度解析</a>
<a class="nav-link" menu-type="HexParse" href="#HexParse">Hex工具</a>
</li>
<!--
TODO:next version
<li class="nav-item">
<a class="nav-link" menu-type="TimestampTools" href="#TimestampTools">时间戳工具</a>
</li>
<li class="nav-item">
<a class="nav-link" menu-type="LatLngParse" href="#LatLngParse">经纬度解析</a>
</li>
-->
<li class="nav-item">
<a class="nav-link" href="#">广告推广(勿点)</a>
<a class="nav-link" menu-type="ProductAD" href="#ProductAD">产品推广(勿点)</a>
</li>
</ul>
<div>
<iframe src="https://ghbtns.com/github-btn.html?user=SmallChi&repo=JTTools&type=star&count=true&size=large" frameborder="0" scrolling="0" width="170" height="30" title="GitHub">
<iframe
src="https://ghbtns.com/github-btn.html?user=SmallChi&repo=JTTools&type=star&count=true&size=large"
frameborder="0" scrolling="0" width="170" height="30" title="GitHub">
</iframe>
</div>
</div>
</div>
</nav>
</header>
<!-- 顶部菜单 end -->

<main class="flex-shrink-0">
<div class="container">
<div class="sample-transition">
<h1>Initial Content</h1>
<!-- 内容区域 start -->
<main id="main" class="flex-shrink-0">
<!-- JT808 start -->
<div class="container" id="JT808Parse">
<form class="">
<div class="mb-3 row">
<select id="JT808_ProtocolType" class="form-select" aria-label=".form-select-sm">
<option selected value="JT808">国标(通过包自动识别版本号)</option>
<option value="JT808_JT1078">国标扩展JT1078</option>
<option value="JT808_SuBiao">国标扩展主动安全(苏标)</option>
<option value="JT808_YueBiao">国标扩展主动安全(粤标)</option>
<option value="JT808_JTRM">公交扩展协议(锐明)</option>
<option value="JT2013Force">国标(强制使用2013版本解析)</option>
<option value="JT808_GPS51">国标扩展私有协议(GPS51)</option>
</select>
</div>
<div class="mb-3 row form-floating">
<textarea class="form-control" id="JT808_Hex" style="height: 200px" rows="20"></textarea>
<label for="JT808_Hex"><i class="bi bi-exclamation-circle"></i> 小技巧:如有分包或多包,请回车区分。</label>
</div>
<div class="mb-3 row">
<button type="button" id="JT808_Parse" class="btn btn-primary mb-3">分析</button>
</div>
</form>
<div>
<div class="accordion" id="JT808_Accordion_Result">

</div>
</div>
</div>
</main>
<!-- JT808 end -->

<!-- JT809 start -->
<div class="container hide" id="JT809Parse">
<form class="">
<div class="mb-3 row">
<select id="JT809_ProtocolType" class="form-select form-select-sm" aria-label=".form-select-sm">
<option selected value="2011">2011版本</option>
<option value="2019">2019版本</option>
</select>
</div>
<div class="mb-3 row">
<select id="JT809_EncryptType" class="form-select form-select-sm" aria-label=".form-select-sm">
<option selected value="none">未加密</option>
<option value="encrypt">加密</option>
</select>
</div>
<div class="hide" id="JT809_Encrypt_Group">
<div class="input-group mb-3">
<span class="input-group-text" id="JT809_M1">M1</span>
<input type="number" id="JT809_M1_Value" class="form-control" value="0" placeholder="M1"
aria-label="M1" aria-describedby="JT809_M1">
</div>
<div class="input-group mb-3">
<span class="input-group-text" id="JT809_M1">IA1</span>
<input type="number" id="JT809_IA1_Value" class="form-control" value="0" placeholder="IA1"
aria-labtextel="IA1" aria-describedby="JT809_IA1">
</div>
<div class="input-group mb-3">
<span class="input-group-text" id="JT809_IC1">IC1</span>
<input type="number" id="JT809_IC1_Value" class="form-control" value="0" placeholder="IC1"
aria-label="IC1" aria-describedby="JT809_IC1">
</div>
</div>
<div class="mb-3 row">
<textarea class="form-control" id="JT809_Hex" rows="10"></textarea>
</div>
<div class="mb-3 row">
<button type="button" id="JT809_Parse" class="btn btn-primary mb-3">分析</button>
</div>
</form>
<div class="pre">
<pre id="JT809_Result"></pre>
</div>
</div>
<!-- JT809 end -->

<!-- JT1078 start -->
<div class="container hide" id="JT1078Parse">
<form class="">
<div class="mb-3 row">
<textarea class="form-control" id="JT1078_Hex" rows="7">
</textarea>
</div>
<div class="mb-3 row">
<button type="button" id="JT1078_Parse" class="btn btn-primary mb-3">分析</button>
</div>
</form>
<div class="pre">
<pre id="JT1078_Result"></pre>
</div>
</div>
<!-- JT1078 end -->

<!-- JT808_JT1078 start -->
<div class="container hide" id="JT808_JT1078Packet">
<h1 class="mt-5">JT1078Packet</h1>
<form class="">
<div class="mb-3 row">
<select id="JT808_JT1078_MsgType" class="form-select form-select-sm" aria-label=".form-select-sm">
<option selected value="0x9101" data-url="Packet_0x9101">808_打开看视频</option>
<option value="0x9102" data-url="Packet_0x9102">808_关闭看视频</option>
<option value="0x9205" data-url="Packet_0x9205">808_关闭看视频</option>
<option value="0x9206" data-url="Packet_0x9206">808_文件上传</option>
</select>
</div>
</form>
<div class="" id="JT808_JT1078_Packet_0x9101">
<form class="">

</form>
</div>
<div class="" id="JT808_JT1078_Packet_0x9102">
<form class="">

</form>
</div>
<div class="" id="JT808_JT1078_Packet_0x9205">
<form class="">

</form>
</div>
<div class="" id="JT808_JT1078_Packet_0x9206">
<form class="">

</form>
</div>
<div class="pre">
<pre id="JT808_JT1078_Result"></pre>
</div>
</div>
<!-- JT808_JT1078 end -->

<!-- JT19056 start -->
<div class="container hide" id="JT19056Parse">
<form class="">
<div class="mb-3 row">
<select id="JT19056_ProtocolType" class="form-select form-select-sm" aria-label=".form-select-sm">
<option selected value="up">上行</option>
<option value="down">下行</option>
</select>
</div>
<div class="mb-3 row">
<textarea class="form-control" id="JT19056_Hex" rows="3">

</textarea>
</div>
<div class="mb-3 row">
<button type="button" id="JT19056_Parse" class="btn btn-primary mb-3">分析</button>
</div>
</form>
<div class="pre">
<pre id="JT19056_Result"></pre>
</div>
</div>
<!-- JT19056 end -->

<footer class="footer mt-auto py-3 bg-body-tertiary">
<!-- JT905 start -->
<div class="container hide" id="JT905Parse">
<form class="">
<div class="mb-3 row">
<textarea class="form-control" id="JT905_Hex" rows="3">
</textarea>
</div>
<div class="mb-3 row">
<button type="button" id="JT905_Parse" class="btn btn-primary mb-3">分析</button>
</div>
</form>
<div class="pre">
<pre id="JT905_Result"></pre>
</div>
</div>
<!-- JT905 end -->

<!-- JTSB start -->
<div class="container hide" id="JTSBParse">
<form class="">
<div class="mb-3 row">
<textarea class="form-control" id="JTSB_Hex" rows="10"></textarea>
</div>
<div class="mb-3 row">
<button type="button" id="JTSB_Parse" class="btn btn-primary mb-3">分析</button>
</div>
</form>
<div class="pre">
<pre id="JTSB_Result"></pre>
</div>
</div>
<!-- JTSB end -->

<!-- Hex start -->
<div class="container hide" id="HexParse">
<form class="">
<div class="mb-3 form-floating">
<textarea class="form-control" placeholder="待转换十六进制字符串(回车为多行)" id="HexTools" style="height: 200px"
rows="20"></textarea>
<label for="HexTools">待转换十六进制字符串(回车为多行)</label>
</div>
<div class="mb-3 btn-group" role="group" aria-label="HexTools">
<button type="button" id="HexToolsConvert" class="btn btn-primary">
<!-- TODO: HEX双向转换图标及功能下版本做 -->
<!-- <i class="bi bi-arrow-down-up"></i> -->
<i class="bi bi-file-arrow-down"></i>
转换</button>
<button type="button" id="HexToolsClear" class="btn btn-danger"><i class="bi bi-trash3"></i>
清空</button>
<button type="button" id="HexToolsDemo" class="btn btn-success"><i class="bi bi-stickies"></i>
示例</button>
</div>
<div class="mb-3 form-floating">
<textarea class="form-control" placeholder="转换结果" id="HexToolsResult" style="height: 200px"
rows="20"></textarea>
<label for="HexToolsResult">转换结果</label>
</div>
</form>
</div>
<!-- Hex end -->

<!-- Timestamp start -->
<!-- <div class="container hide" id="TimestampTools">
<div class="card mb-3">
<div class="card-body">
<div class="card-text">
<div class="input-group mb-3">
<span class="input-group-text">当前时间戳</span>
<input type="text" readonly class="form-control"
aria-label="Dollar amount (with dot and two decimal places)" />
<button class="btn btn-outline-secondary dropdown-toggle" type="button"
data-bs-toggle="dropdown" aria-expanded="false">秒</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">秒</a></li>
<li><a class="dropdown-item" href="#">毫秒</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body">
<div class="card-text">
<div class="input-group mb-7">
<span class="input-group-text">Unix时间戳</span>
<input type="text" readonly class="form-control"
aria-label="Dollar amount (with dot and two decimal places)" />
<button class="btn btn-outline-secondary dropdown-toggle" type="button"
data-bs-toggle="dropdown" aria-expanded="false">秒</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">秒</a></li>
<li><a class="dropdown-item" href="#">毫秒</a></li>
</ul>
<button type="button" class="btn btn-primary mb-3">转换</button>
<span class="input-group-text">北京时间</span>
<input type="text" readonly class="form-control"
aria-label="Dollar amount (with dot and two decimal places)" />
</div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body">
<div class="card-text">
<div class="input-group mb-3">
<span class="input-group-text">北京时间</span>
<input type="text" readonly class="form-control"
aria-label="Dollar amount (with dot and two decimal places)">
<button type="button" class="btn btn-primary mb-3">转换</button>
<span class="input-group-text">Unix时间戳</span>
<input type="text" readonly class="form-control"
aria-label="Dollar amount (with dot and two decimal places)">
<button class="btn btn-outline-secondary dropdown-toggle" type="button"
data-bs-toggle="dropdown" aria-expanded="false">秒</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">秒</a></li>
<li><a class="dropdown-item" href="#">毫秒</a></li>
</ul>
</div>
</div>
</div>
</div>
</div> -->
<!-- Timestamp end -->

<!-- LatLng start -->
<!-- <div class="container hide" id="LatLngParse">
<h1 class="mt-5">LatLngParse</h1>
</div> -->
<!-- LatLng end -->

<!-- Product start -->
<div class="container hide" id="ProductAD">
<!-- 产品 -->
<div class="card mb-9">
<div class="row g-0">
<div class="col-md-5">
<!-- 产品图片 -->
<div id="ProductCarousel" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<img src="/img/4G_IPC11.jpg" class="d-block w-100 object-fit-fill " alt="4G智能摄像头">
</div>
<div class="carousel-item">
<img src="/img/4G_IPC1.jpg" class="d-block w-100 object-fit-fill " alt="4G智能摄像头">
</div>
<div class="carousel-item">
<img src="/img/4G_IPC2.jpg" class="d-block w-100 object-fit-fill " alt="4G智能摄像头">
</div>
</div>
</div>
</div>
<div class="col-md-7">
<div class="card-body ms-sm-2 ms-lg-4 ">
<h2 class="card-title mb-3">4G智能摄像头</h2>
<p class="card-text mb-2">
<!-- <span class="badge me-2 mb-2 text-bg-primary">终端号:40666575062</span>
<span class="badge me-2 mb-2 text-bg-secondary">消息Id:1205</span>
<span class="badge me-2 mb-2 text-bg-success">消息流水号:235</span>
<span class="badge me-2 mb-2 text-bg-danger">设备版本号:JTT2013</span>
<span class="badge me-2 mb-2 text-bg-warning">总分包数:2</span>
<span class="badge me-2 mb-2 text-bg-info">当前页:1</span>
<span class="badge me-2 mb-2 text-bg-dark">数据体长度:930</span>
<span class="badge me-2 mb-2 text-bg-light">是否加密:否</span> -->
</p>
<p class="card-text mb-3">集GPS/北斗双模定位和实时音视频功能于一体的4G智能AI摄像头,适用于普货、城配、网约车、工程机械等领域,自主研发,支持定制。
</p>
<div class="alert alert-primary mb-3" role="alert">
支持GPS51,三一,通天星,超越,CarEye等平台。 <button id="ProductAD_GPS51" href="#" target="_blank"
class="btn btn-primary">点击前往体验</button>
</div>
<figure>
<blockquote class="blockquote">
<p>联系方式</p>
</blockquote>
<figcaption class="blockquote-footer">
联系人:<cite title="张先生">张先生</cite>
</figcaption>
<figcaption class="blockquote-footer">
联系电话:<cite title="13424258972">13424258972</cite>
</figcaption>
<figcaption class="blockquote-footer">
电子邮箱:<cite title="13424258972@163.com">13424258972@163.com</cite>
</figcaption>
<figcaption class="blockquote-footer">
微信号:<cite title="13424258972">13424258972</cite>
</figcaption>
</figure>
<figure>
<blockquote class="blockquote">
<p>提前预告</p>
</blockquote>
<figcaption class="blockquote-footer">
<cite title="算力设备已在研发路上">算力设备已在研发路上...</cite>
</figcaption>
</figure>
<!-- <button type="button" class="btn btn-outline-warning">平台支持</button> -->
</div>
</div>
</div>
</div>
<!-- 详情 -->
<div class="row mb-3 ">
<div data-bs-spy="scroll" data-bs-target="#navbar-product-detail" data-bs-root-margin="0px 0px -40%"
data-bs-smooth-scroll="true" class="scrollspy-example bg-body-tertiary p-3 rounded-2" tabindex="0">
<div class="mb-5">
<h4 id="list-item-1">功能特性</h4>
<div id="scrollspyFeatures">
<!-- <ol class="list-group list-group-numbered">
<li class="list-group-item">4G全网通</li>
<li class="list-group-item">GPS/北斗双模定位</li>
<li class="list-group-item">ACC自动检测,支持<strong>9~50V</strong>宽电压</li>
<li class="list-group-item">断电报警、欠压报警,低电保护,延时关机,定时开关机</li>
<li class="list-group-item">双向对讲</li>
<li class="list-group-item">实时音视频预览及存储,远程录像回放</li>
<li class="list-group-item">1080P高性能图像处理芯片,H.265 编码,高压缩比图像清晰</li>
<li class="list-group-item">内置G-sensor,实时监控车辆驾驶行为</li>
<li class="list-group-item">RS485接口连接外设传感器,如:油杆、超声波、正反转等传感器</li>
<li class="list-group-item">AI智能算法</li>
<li class="list-group-item">【电源】专业车载电源<strong>9V-50V</strong>直流宽电压输入设计</li>
<li class="list-group-item">【电源】欠压、短路、反接等多种保护电路,适用于各种车型</li>
<li class="list-group-item">【电源】智能电源管理,低电自动启动低电保护模式</li>
<li class="list-group-item">支持TF卡存储,最大支持<strong>256G</strong></li>
<li class="list-group-item">支持RS485扩展接口,I/O</li>
</ol> -->
<div>
<div class="row row-cols-2 row-cols-lg-5 g-2 g-lg-3">
<div class="col">
<div class="p-3">4G全网通</div>
</div>
<div class="col">
<div class="p-3">GPS/北斗双模定位</div>
</div>
<div class="col">
<div class="p-3">ACC自动检测,支持<strong>9~50V</strong>宽电压</div>
</div>
<div class="col">
<div class="p-3">断电报警、欠压报警,低电保护,延时关机,定时开关机</div>
</div>
<div class="col">
<div class="p-3">双向对讲</div>
</div>
<div class="col">
<div class="p-3">实时音视频预览及存储,远程录像回放</div>
</div>
<div class="col">
<div class="p-3">1080P高性能图像处理芯片,H.265 编码,高压缩比图像清晰</div>
</div>
<div class="col">
<div class="p-3">内置G-sensor,实时监控车辆驾驶行为</div>
</div>
<div class="col">
<div class="p-3">RS485接口连接外设传感器,如:油杆、超声波、正反转等传感器</div>
</div>
<div class="col">
<div class="p-3">智能算法如:人形检测、移动侦测</div>
</div>
<div class="col">
<div class="p-3">【电源】专业车载电源<strong>9V-50V</strong>直流宽电压输入设计</div>
</div>
<div class="col">
<div class="p-3">【电源】欠压、短路、反接等多种保护电路,适用于各种车型</div>
</div>
<div class="col">
<div class="p-3">【电源】智能电源管理,低电自动启动低电保护模式</div>
</div>
<div class="col">
<div class="p-3">支持TF卡存储,最大支持<strong>256G</strong></div>
</div>
<div class="col">
<div class="p-3">支持RS485扩展接口,I/O</div>
</div>
</div>
</div>
<!-- <div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="icon">
<i class="bi bi-reception-4 fs-1"></i>
</div>
<div class="card-body">
<h5 class="card-title">4G全网通</h5>
<p class="card-text">This is a longer card with supporting text below as a
natural lead-in to additional
content. This content is a little bit longer.</p>
</div>
</div>
</div> -->

</div>
</div>
<div id="scrollspyParameters" class="mb-5">
<h4 id="list-item-1">技术参数</h4>
<table class="table table-bordered">
<thead>
<tr>
<th scope="col">设备参数</th>
<th scope="col">规格描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>视频分辨率</td>
<td>1080P/720P/HD</td>
</tr>
<tr>
<td>祝频编码</td>
<td>H.265</td>
</tr>
<tr>
<td>咅频编码</td>
<td>G711A</td>
</tr>
<tr>
<td>夜视</td>
<td>红外夜祝</td>
</tr>
<tr>
<td>工作电压</td>
<td>DC9V-50V</td>
</tr>
<tr>
<td>工作电流</td>
<td>24V250mA(满载)</td>
</tr>
<tr>
<td>防水等级</td>
<td>IP67</td>
</tr>
<tr>
<td>4G通讯</td>
<td>4G全网通(支持电信,移动,联通卡)</td>
</tr>
<tr>
<td>卫星定位</td>
<td>GPS/北斗双模定位</td>
</tr>
<tr>
<td>SIM卡</td>
<td>外插卡,Nano-SIM卡</td>
</tr>
<tr>
<td>存储</td>
<td>外插卡,最大支持256GTF卡(Class 10 及以上)</td>
</tr>
<tr>
<td>网口</td>
<td>支持以太网口</td>
</tr>
<tr>
<td>喇叭</td>
<td>@twitter</td>
</tr>
<tr>
<td>拾音器</td>
<td>内置拾音器</td>
</tr>
<tr>
<td>工作温度</td>
<td>-20~70℃</td>
</tr>
<tr>
<td>串口</td>
<td>支持1路RS485</td>
</tr>
<tr>
<td>升级模式</td>
<td>远程升级/TF卡升级</td>
</tr>
<tr>
<td>点火输人</td>
<td>ACC自动检测</td>
</tr>
<tr>
<td>尺寸(长x宽x高)</td>
<td>80mm*75mm*70mm(含支架)</td>
</tr>
<tr>
<td>毛重</td>
<td>设备:290g,含配件:570g</td>
</tr>
</tbody>
</table>
</div>
</div>

</div>
<!-- 打赏 -->
<div class="row mb-5">
<div class="card p-0">
<div class="card-header">
<h5 class="card-title">要是觉得工具有用打赏一点喝杯咖啡</h5>
</div>
<div class="card-body ">
<div class="row gx-5 text-center">
<div class=" col-sm-12 col-md-4 col-lg-3">
<img src="/img/zfb_pay.jpg" class="img-fluid mb-5" alt="pay">
</div>
<div class=" col-sm-12 col-md-4 col-lg-3">
<img src="/img/wechat_pay.jpg" class="img-fluid mb-5" alt="pay">
</div>
</div>
</div>
</div>
</div>
<!-- 打赏End -->
</div>
<!-- 产品End -->
</div>
<!-- Product end -->
</main>
<!-- 内容区域 end -->
<!-- 底部版权说明 start -->
<footer class="footer mt-auto py-3 bg-light">
<div class="container" style="text-align: center;">
<span class="text-body-secondary">
<a href="http://www.beian.miit.gov.cn" target="_blank">Copyright © 2015-2024 SmallChi. All Rights Reserved.粤ICP备19128140号-1</a>
<span>
<a href="http://www.beian.miit.gov.cn" target="_blank">Copyright © 2015-2024 SmallChi. All Rights
Reserved.粤ICP备19128140号-1</a>
</span>
</div>
</footer>
<!-- 底部版权说明 end -->
<script src="/js/site.js" type="text/javascript"></script>
</body>


+ 321
- 1
src/JTTools/wwwroot/js/site.js 查看文件

@@ -1 +1,321 @@

axios.defaults.baseURL = "http://120.76.99.64:18889/jtt";

function hexToString(hexStr) {
// 移除可能存在的空格和换行符
hexStr = hexStr.replace(/\s+/g, '');
// 将16进制字符串转换为字节数组
let bytes = [];
for (let i = 0; i < hexStr.length; i += 2) {
bytes.push(parseInt(hexStr.substring(i, i + 2), 16));
}
// 将字节数组转换为字符串
return String.fromCharCode.apply(null, bytes);
}

/*ref: https://kimi.moonshot.cn/ auto-generated code */
jQuery.fn.extend({
autoHeight: function () {
return this.each(function () {
var $this = jQuery(this);
if (!$this.attr('_initAdjustHeight')) {
$this.attr('_initAdjustHeight', $this.outerHeight());
}
_adjustH(this).on('input', function () {
_adjustH(this);
});
});
function _adjustH(elem) {
var $obj = jQuery(elem);
return $obj.css({ height: $obj.attr('_initAdjustHeight'), 'overflow-y': 'hidden' })
.height(elem.scrollHeight);
}
}
});

$(document).ready(function () {
const JT808HexData = "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";
const JT8082013ForceHexData = "7e0102400c01003000068109024a3130303330303030363831857e";
const JT808JT1078HexData = "7E120523A204066657506200EB00020001015A00000023012012191042052012191050190000000000000000000101064446D10120121910221720121910420500000000000000000001010F1FE8EB0120121910023420121910221700000000000000000001010F182D5C0120121909471120121910015500000000000000000001010B38F2430120121909274020121909471100000000000000000001010F056DB40120121909080920121909274000000000000000000001010F0724380120121908483820121909080900000000000000000001010F0530AB0120121908290720121908483800000000000000000001010F05896C0120121908093720121908290700000000000000000001010F02CD3B0120121907500520121908093700000000000000000001010F056FEF0120121907303420121907500500000000000000000001010F043C3401201219072541201219073034000000000000000000010103C26C5F0120121907061120121907254100000000000000000001010F03F0C10120121906464220121907061100000000000000000001010F02F6330120121906271220121906464200000000000000000001010F02E43B0120121906074220121906271200000000000000000001010F033D670120121905481120121906074200000000000000000001010F088BF20120121905284120121905481100000000000000000001010F03F9FE0120121905091020121905284100000000000000000001010F05B1040120121904494020121905091000000000000000000001010F02B3540120121904301020121904494000000000000000000001010F0417B00120121904103920121904301000000000000000000001010F0538970120121903510820121904103900000000000000000001010F054E9E0120121903313820121903510800000000000000000001010F016ECB0120121903120820121903313800000000000000000001010F0333C00120121902523820121903120700000000000000000001010F029D230120121902330720121902523700000000000000000001010F0354E40120121902133720121902330700000000000000000001010F03303D0120121901540720121902133700000000000000000001010F04981E0120121901343720121901540700000000000000000001010F02AD940120121901150820121901343700000000000000000001010EFFD7CF0120121900553720121901150800000000000000000001010F07D9330120121900360720121900553700000000000000000001010F040E740C7E\n7E1205203804066657506200EC000200020120121900163320121900360700000000000000000001010F0CE4CD0120121900002220121900163300000000000000000001010C6F9E7B5D7E";
const JT808YueBiaoHexData = "7E0200405C01000000000012345678913CC400000000008C0003015198CF06C158C5000801F200E52203151206110104000716E30302000014040000000015040000000016040000000017020000180300000025040000000030011F310117EF0D49249200000049249011000003DE7E\n7E0200405C01000000000012345678913CC400000000008C0003015198CF06C158C5000801F200E52203151206110104000716E30302000014040000000015040000000016040000000017020000180300000025040000000030011F310117EF0D49249200000049249011000003DE7E";
const JT808GPS51HexData = "7e020000470412106280030233000000000000200201d365df072f15d500280000002d21091719155801040002a10f2a0200042b049203a46f520103eb06000100ce0a5730011b31010951080000000000000000ca7e";
const JT19056UpHexData = "55 7A C4 00 00 00 EB";
const JT19056DownHexData = "55 7A C4 00 14 00 20 03 25 10 26 01 20 03 25 10 26 01 00 00 12 34 00 12 34 56 A9";
const JT905HexData = "7E02000023103456789012007D02000000010000000200BA7F0E07E4F11C003C002110152110100104000000640202007D01347E";
const JTSBHexData = "30 31 63 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 61 6C 61 72 6D 2E 78 6C 73 78 00 00 00 01 00 00 00 05 01 02 03 04 05";
const JT1078HexData = "30 31 63 64 81 E2 10 88 01 12 34 56 78 10 01 10 00 00 01 6B B3 92 CA 7C 02 80 00 28 00 2E 00 00 00 01 61 E1 A2 BF 00 98 CF C0 EE 1E 17 28 34 07 78 8E 39 A4 03 FD DB D1 D5 46 BF B0 63 01 3F 59 AC 34 C9 7A 02 1A B9 6A 28 A4 2C 08";
const JT809HexData2011 = "5B 00 00 00 92 00 00 06 82 94 00 01 33 EF B8 01 00 00 00 00 00 27 0F D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 94 01 00 00 00 5C 01 00 02 00 00 00 00 5A 01 AC 3F 40 12 3F FA A1 00 00 00 00 5A 01 AC 4D 50 03 73 6D 61 6C 6C 63 68 69 00 00 00 00 00 00 00 00 31 32 33 34 35 36 37 38 39 30 31 00 00 00 00 00 00 00 00 00 31 32 33 34 35 36 40 71 71 2E 63 6F 6D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BA D8 5D";
const JT809HexData2019 = "5B 00 00 00 C9 00 00 06 82 17 00 01 34 15 F4 01 00 00 00 00 00 27 0F 00 00 00 00 5E 02 A5 07 B8 D4 C1 41 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 02 17 01 00 00 00 8B 01 02 03 04 05 06 07 08 09 10 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E7 D3 5D";
const HexTools = "68747470733a2f2f6a74746f6f6c732e736d616c6c6368692e636e\n68747470733a2f2f67707335312e636f6d2f232f6c6f67696e";
var route_state = 0;
var navbarCollapse = new bootstrap.Collapse('#navbarCollapse', {
toggle: false
});
var carousel = new bootstrap.Carousel('#ProductCarousel', {
interval: 2000,
touch: false
});
$("#JT808_Hex").val(JT808HexData);
$("#JT809_Hex").val(JT809HexData2011);
$("#JT19056_Hex").val(JT19056UpHexData);
$("#JT905_Hex").val(JT905HexData);
$("#JTSB_Hex").val(JTSBHexData);
$("#JT1078_Hex").val(JT1078HexData);
$("#HexTools").val(HexTools);

window.addEventListener('load', function () {
console.log('load location: ', document.location, 'state: ', event.state);
var MenuTypeHash = window.location.hash;
if (MenuTypeHash) {
console.log(MenuTypeHash);
$("#menus>li a").removeClass('active');
$("#menus>li a[menu-type=" + MenuTypeHash.substring(1) + "]").addClass('active');
$("#main>div.container").hide();
$("#main>div.container").removeClass("hide");
$(MenuTypeHash).fadeIn();
navbarCollapse.hide();
}
});

/* 使用history API和监听popstate事件 */
window.addEventListener('popstate', function (event) {
if (route_state == 1) {
route_state = 0;
return;
}
console.log('popstate location: ', document.location, 'state: ', event.state);
var MenuTypeHash = window.location.hash;
if (MenuTypeHash) {
console.log(MenuTypeHash);
$("#menus>li a").removeClass('active');
$("#menus>li a[menu-type=" + MenuTypeHash.substring(1) + "]").addClass('active');
$("#main>div.container").hide();
$("#main>div.container").removeClass("hide");
$(MenuTypeHash).fadeIn();
navbarCollapse.hide();
}
});

$("#menus>li a").on("click", function () {
route_state = 1;
$("#menus>li a").removeClass('active');
$(this).addClass('active');
var currentMenuType = $(this).attr("menu-type");
// console.debug(currentMenuType);
// console.debug($("#main>div.container"));
$("#main>div.container").hide();
$("#main>div.container").removeClass("hide");
$("#" + currentMenuType).fadeIn();
navbarCollapse.hide();
});

$("#JT808_ProtocolType").change(function () {
var protocolType = $(this).val();
var hexData = JT808HexData;
if ("JT808_JT1078" == protocolType) {
hexData = JT808JT1078HexData;
}
else if ("JT808_YueBiao" == protocolType) {
hexData = JT808YueBiaoHexData;
}
else if ("JT2013Force" == protocolType) {
hexData = JT8082013ForceHexData;
}
else if ("JT808_GPS51" == protocolType) {
hexData = JT808GPS51HexData;
}
$("#JT808_Hex").val(hexData);
$("#JT808_Hex").autoHeight();
//$("#JT809_Result").text("");
});

$("#JT809_ProtocolType").change(function () {
var selectedValue = $(this).val();
if (selectedValue == "2011") {
$("#JT809_Hex").val(JT809HexData2011);
} else {
$("#JT809_Hex").val(JT809HexData2019);
}
$("#JT809_Result").text("");
});

$("#JT809_EncryptType").change(function () {
var selectedValue = $(this).val();
if (selectedValue == "none") {
$("#JT809_Encrypt_Group").fadeOut();
} else {
$("#JT809_Encrypt_Group").fadeIn();
}
});

$("#JT19056_ProtocolType").change(function () {
var selectedValue = $(this).val();
if (selectedValue == "up") {
$("#JT19056_Hex").val(JT19056UpHexData);
} else {
$("#JT19056_Hex").val(JT19056DownHexData);
}
$("#JT19056_Result").text("");
});

$("#HexToolsConvert").on("click", function () {
var hexLines = $("#HexTools").val().split('\n');
var hexStr = "";
if (hexLines) {
for (var i = 0; i < hexLines.length; i++) {
var hex = hexToString(hexLines[i]);
hexStr += hex + "\n";
}
}
$("#HexToolsResult").val(hexStr);
});

$("#HexToolsDemo").on("click", function () {
$("#HexTools").val(HexTools);
});

$("#HexToolsClear").on("click", function () {
$("#HexTools").val("");
$("#HexToolsResult").val("");
});

$("#JT808_Parse").on("click", function () {
axios.post("/JT808/Analyze",
{
Hex: $("#JT808_Hex").val(),
ProtocolType: $("#JT808_ProtocolType").val()
}).then((res) => {
console.debug(res);
if (res.data.Code == 200) {
$('#JT808_Accordion_Result').html("");
if (res.data.Result.IsSubpackage) {
if (res.data.Result.Packages) {
$.each(res.data.Result.Packages, function (index, item) {
var accordionHeader_content = '';
accordionHeader_content += '<span class="badge text-bg-primary">终端号:' + item.TerminalPhoneNo + '</span>';
accordionHeader_content += '<span class="badge text-bg-secondary">消息Id:' + item.MsgId + '</span>';
accordionHeader_content += '<span class="badge text-bg-success">消息流水号:' + item.MsgNum + '</span>';
accordionHeader_content += '<span class="badge text-bg-danger">设备版本号:' + item.ProtocolVersion + '</span>';
accordionHeader_content += '<span class="badge text-bg-warning">总分包数:' + item.PackgeCount + '</span>';
accordionHeader_content += '<span class="badge text-bg-info">当前页:' + item.PackageIndex + '</span>';
accordionHeader_content += '<span class="badge text-bg-dark">数据体长度:' + item.DataLength + '</span>';
accordionHeader_content += '<span class="badge text-bg-light">是否加密:' + (item.Encrypt ? '是' : '否') + '</span>';
var accordionHeader = '<h2 class="accordion-header"><button class="accordion-button" type="button" data-bs-target="#collapse' + index + '" aria-expanded="false" aria-controls="collapse' + index + '">' + '序号:' + item.Order + accordionHeader_content + '</button></h2>';
var accordionBody = '<div id="collapse' + index + '" class="accordion-collapse collapse"><div class="accordion-body"><pre>' + item.Body + '</pre></div></div>';
var accordionItem = '<div class="accordion-item">' + accordionHeader + accordionBody + '</div>';
$('#JT808_Accordion_Result').append(accordionItem);
});
{
var index = res.data.Result.Packages.length + 1;
var accordionHeader = '<h2 class="accordion-header"><button class="accordion-button" type="button" data-bs-target="#collapse' + index + '" aria-expanded="false" aria-controls="collapse' + index + '">' + '合并数据体' + '</button></h2>';
var accordionBody = '<div id="collapse' + index + '" class="accordion-collapse collapse"><div class="accordion-body"><pre>' + res.data.Result.JsonValue + '</pre></div></div>';
var accordionItem = '<div class="accordion-item">' + accordionHeader + accordionBody + '</div>';
$('#JT808_Accordion_Result').append(accordionItem);
}
$('#JT808_Accordion_Result div.accordion-collapse').addClass('show');
} else {
$('#JT808_Accordion_Result').html("处理异常,请检测对应Hex数据包");
}
} else {
if (res.data.Result.Packages) {
$.each(res.data.Result.Packages, function (index, item) {
var accordionHeader = '<h2 class="accordion-header"><button class="accordion-button" type="button" data-bs-target="#collapse' + index + '" aria-expanded="false" aria-controls="collapse' + index + '">' + '序号:' + item.Order + '</button></h2>';
var accordionBody = '<div id="collapse' + index + '" class="accordion-collapse collapse"><div class="accordion-body"><pre>' + item.JsonValue + '</pre></div></div>';
var accordionItem = '<div class="accordion-item">' + accordionHeader + accordionBody + '</div>';
$('#JT808_Accordion_Result').append(accordionItem);
});
$('#JT808_Accordion_Result div.accordion-collapse').addClass('show');
} else {
$('#JT808_Accordion_Result').html("处理异常,请检测对应Hex数据包");
}
}
} else {
$("#JT808_Accordion_Result").html(res.data.Message);
}
});
});

$("#JT809_Parse").on("click", function () {
axios.post("/JT809/Analyze",
{
Hex: $("#JT809_Hex").val(),
ProtocolType: $("#JT809_ProtocolType").val(),
IsEncrypt: $("#JT809_EncryptType").val() == "none",
M1: parseInt($("#JT809_M1_Value").val()),
IA1: parseInt($("#JT809_IA1_Value").val()),
IC1: parseInt($("#JT809_IC1_Value").val()),
}).then((res) => {
console.debug(res);
if (res.data.Code == 200) {
console.debug(res.data.Result.JsonValue);
$("#JT809_Result").text(res.data.Result.JsonValue);
} else {
$("#JT809_Result").text(res.data.Message);
}
});
});

$("#JT19056_Parse").on("click", function () {
axios.post("/JT19056/Analyze",
{
Hex: $("#JT19056_Hex").val(),
ProtocolType: $("#JT19056_ProtocolType").val()
}).then((res) => {
console.debug(res);
if (res.data.Code == 200) {
console.debug(res.data.Result.JsonValue);
$("#JT19056_Result").text(res.data.Result.JsonValue);
} else {
$("#JT19056_Result").text(res.data.Message);
}
});
});

$("#JT905_Parse").on("click", function () {
axios.post("/JT905/Analyze",
{
Hex: $("#JT905_Hex").val()
}).then((res) => {
console.debug(res);
if (res.data.Code == 200) {
console.debug(res.data.Result.JsonValue);
$("#JT905_Result").text(res.data.Result.JsonValue);
} else {
$("#JT905_Result").text(res.data.Message);
}
});
});

$("#JTSB_Parse").on("click", function () {
axios.post("/JTActiveSafety/Analyze",
{
Hex: $("#JTSB_Hex").val()
}).then((res) => {
console.debug(res);
if (res.data.Code == 200) {
console.debug(res.data.Result.JsonValue);
$("#JTSB_Result").text(res.data.Result.JsonValue);
} else {
$("#JTSB_Result").text(res.data.Message);
}
});
});

$("#JT1078_Parse").on("click", function () {
axios.post("/JT1078/Analyze",
{
Hex: $("#JT1078_Hex").val()
}).then((res) => {
console.debug(res);
if (res.data.Code == 200) {
console.debug(res.data.Result.JsonValue);
$("#JT1078_Result").text(res.data.Result.JsonValue);
} else {
$("#JT1078_Result").text(res.data.Message);
}
});
});

$("#ProductAD_GPS51").on("click", function () {
window.open("https://gps51.com/#/login?username=19019000002&password=Aa0002", '_blank');
});
});

二进制
src/JTTools/wwwroot/lib/.DS_Store 查看文件


+ 2
- 0
src/JTTools/wwwroot/lib/axios@1.7.9.min.js
文件差异内容过多而无法显示
查看文件


二进制
src/JTTools/wwwroot/lib/bootstrap-icons/.DS_Store 查看文件


+ 5
- 0
src/JTTools/wwwroot/lib/bootstrap-icons/bootstrap-icons.min.css
文件差异内容过多而无法显示
查看文件


二进制
src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff 查看文件


二进制
src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff2 查看文件


二进制
src/JTTools/wwwroot/lib/bootstrap/dist/css/.DS_Store 查看文件


+ 0
- 6
src/JTTools/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css
文件差异内容过多而无法显示
查看文件


+ 0
- 1
src/JTTools/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map
文件差异内容过多而无法显示
查看文件


+ 7
- 0
src/JTTools/wwwroot/lib/clipboard@2.0.11.min.js
文件差异内容过多而无法显示
查看文件


+ 0
- 1
src/JTTools/wwwroot/lib/jquery/dist/jquery.min.map
文件差异内容过多而无法显示
查看文件


+ 1
- 1
src/global.json 查看文件

@@ -1,5 +1,5 @@
{
"sdk": {
"version": "8.0.300"
"version": "9.0.100"
}
}

正在加载...
取消
保存