├── .gitignore ├── LICENSE ├── README.md ├── jttools_new.service └── src ├── .dockerignore ├── JTTools.sln ├── JTTools ├── .config │ └── dotnet-tools.json ├── Configs │ ├── JT808_GPS51_Config.cs │ ├── JT808_JT1078_Config.cs │ ├── JT808_Streamax_Config.cs │ ├── JT808_SuBiao_Config.cs │ ├── JT808_YueBiao_Config.cs │ ├── JT809_2011_Config.cs │ ├── JT809_2019_Config.cs │ └── JTJsonWriterOptions.cs ├── Controllers │ ├── JT1078Controller.cs │ ├── JT19056Controller.cs │ ├── JT808Controller.cs │ ├── JT809Controller.cs │ ├── JT905Controller.cs │ └── JTActiveSafetyController.cs ├── Dtos │ ├── JT1078AnalyzeDto.cs │ ├── JT1078AnalyzeResultDto.cs │ ├── JT1078PacketDto.cs │ ├── JT1078PacketResultDto.cs │ ├── JT19056AnalyzeDto.cs │ ├── JT19056AnalyzeResultDto.cs │ ├── JT808AnalyzeDto.cs │ ├── JT808AnalyzeResultDto.cs │ ├── JT809AnalyzeDto.cs │ ├── JT809AnalyzeResultDto.cs │ ├── JT905AnalyzeDto.cs │ ├── JT905AnalyzeResultDto.cs │ ├── JTActiveSafetyAnalyzeDto.cs │ ├── JTActiveSafetyAnalyzeResultDto.cs │ ├── JTTDictDto.cs │ └── ResultDto.cs ├── JTTools.csproj ├── Program.cs ├── appsettings.Development.json ├── appsettings.json └── wwwroot │ ├── css │ └── site.css │ ├── img │ ├── 4G_IPC1.jpg │ ├── 4G_IPC11.jpg │ ├── 4G_IPC2.jpg │ ├── github-mark-white.svg │ ├── wechat_pay.jpg │ ├── yilabao.png │ └── zfb_pay.jpg │ ├── index.html │ ├── js │ └── site.js │ └── lib │ ├── axios@1.7.9.min.js │ ├── bootstrap-icons │ ├── .DS_Store │ ├── bootstrap-icons.min.css │ └── fonts │ │ ├── bootstrap-icons.woff │ │ └── bootstrap-icons.woff2 │ ├── bootstrap │ ├── LICENSE │ └── dist │ │ ├── css │ │ ├── .DS_Store │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ │ └── js │ │ ├── bootstrap.bundle.min.js │ │ └── bootstrap.bundle.min.js.map │ ├── clipboard@2.0.11.min.js │ └── jquery │ ├── LICENSE.txt │ └── dist │ └── jquery.min.js ├── global.json ├── publish_linux-x64.txt └── publish_win-x64.txt /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015/2017 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # Visual Studio 2017 auto generated files 33 | Generated\ Files/ 34 | 35 | # MSTest test Results 36 | [Tt]est[Rr]esult*/ 37 | [Bb]uild[Ll]og.* 38 | 39 | # NUNIT 40 | *.VisualState.xml 41 | TestResult.xml 42 | 43 | # Build Results of an ATL Project 44 | [Dd]ebugPS/ 45 | [Rr]eleasePS/ 46 | dlldata.c 47 | 48 | # Benchmark Results 49 | BenchmarkDotNet.Artifacts/ 50 | 51 | # .NET Core 52 | project.lock.json 53 | project.fragment.lock.json 54 | artifacts/ 55 | **/Properties/launchSettings.json 56 | 57 | # StyleCop 58 | StyleCopReport.xml 59 | 60 | # Files built by Visual Studio 61 | *_i.c 62 | *_p.c 63 | *_i.h 64 | *.ilk 65 | *.meta 66 | *.obj 67 | *.iobj 68 | *.pch 69 | *.pdb 70 | *.ipdb 71 | *.pgc 72 | *.pgd 73 | *.rsp 74 | *.sbr 75 | *.tlb 76 | *.tli 77 | *.tlh 78 | *.tmp 79 | *.tmp_proj 80 | *.log 81 | *.vspscc 82 | *.vssscc 83 | .builds 84 | *.pidb 85 | *.svclog 86 | *.scc 87 | 88 | # Chutzpah Test files 89 | _Chutzpah* 90 | 91 | # Visual C++ cache files 92 | ipch/ 93 | *.aps 94 | *.ncb 95 | *.opendb 96 | *.opensdf 97 | *.sdf 98 | *.cachefile 99 | *.VC.db 100 | *.VC.VC.opendb 101 | 102 | # Visual Studio profiler 103 | *.psess 104 | *.vsp 105 | *.vspx 106 | *.sap 107 | 108 | # Visual Studio Trace Files 109 | *.e2e 110 | 111 | # TFS 2012 Local Workspace 112 | $tf/ 113 | 114 | # Guidance Automation Toolkit 115 | *.gpState 116 | 117 | # ReSharper is a .NET coding add-in 118 | _ReSharper*/ 119 | *.[Rr]e[Ss]harper 120 | *.DotSettings.user 121 | 122 | # JustCode is a .NET coding add-in 123 | .JustCode 124 | 125 | # TeamCity is a build add-in 126 | _TeamCity* 127 | 128 | # DotCover is a Code Coverage Tool 129 | *.dotCover 130 | 131 | # AxoCover is a Code Coverage Tool 132 | .axoCover/* 133 | !.axoCover/settings.json 134 | 135 | # Visual Studio code coverage results 136 | *.coverage 137 | *.coveragexml 138 | 139 | # NCrunch 140 | _NCrunch_* 141 | .*crunch*.local.xml 142 | nCrunchTemp_* 143 | 144 | # MightyMoose 145 | *.mm.* 146 | AutoTest.Net/ 147 | 148 | # Web workbench (sass) 149 | .sass-cache/ 150 | 151 | # Installshield output folder 152 | [Ee]xpress/ 153 | 154 | # DocProject is a documentation generator add-in 155 | DocProject/buildhelp/ 156 | DocProject/Help/*.HxT 157 | DocProject/Help/*.HxC 158 | DocProject/Help/*.hhc 159 | DocProject/Help/*.hhk 160 | DocProject/Help/*.hhp 161 | DocProject/Help/Html2 162 | DocProject/Help/html 163 | 164 | # Click-Once directory 165 | publish/ 166 | 167 | # Publish Web Output 168 | *.[Pp]ublish.xml 169 | *.azurePubxml 170 | # Note: Comment the next line if you want to checkin your web deploy settings, 171 | # but database connection strings (with potential passwords) will be unencrypted 172 | *.pubxml 173 | *.publishproj 174 | 175 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 176 | # checkin your Azure Web App publish settings, but sensitive information contained 177 | # in these scripts will be unencrypted 178 | PublishScripts/ 179 | 180 | # NuGet Packages 181 | *.nupkg 182 | # The packages folder can be ignored because of Package Restore 183 | **/[Pp]ackages/* 184 | # except build/, which is used as an MSBuild target. 185 | !**/[Pp]ackages/build/ 186 | # Uncomment if necessary however generally it will be regenerated when needed 187 | #!**/[Pp]ackages/repositories.config 188 | # NuGet v3's project.json files produces more ignorable files 189 | *.nuget.props 190 | *.nuget.targets 191 | 192 | # Microsoft Azure Build Output 193 | csx/ 194 | *.build.csdef 195 | 196 | # Microsoft Azure Emulator 197 | ecf/ 198 | rcf/ 199 | 200 | # Windows Store app package directories and files 201 | AppPackages/ 202 | BundleArtifacts/ 203 | Package.StoreAssociation.xml 204 | _pkginfo.txt 205 | *.appx 206 | 207 | # Visual Studio cache files 208 | # files ending in .cache can be ignored 209 | *.[Cc]ache 210 | # but keep track of directories ending in .cache 211 | !*.[Cc]ache/ 212 | 213 | # Others 214 | ClientBin/ 215 | ~$* 216 | *~ 217 | *.dbmdl 218 | *.dbproj.schemaview 219 | *.jfm 220 | *.pfx 221 | *.publishsettings 222 | orleans.codegen.cs 223 | 224 | # Including strong name files can present a security risk 225 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 226 | #*.snk 227 | 228 | # Since there are multiple workflows, uncomment next line to ignore bower_components 229 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 230 | #bower_components/ 231 | 232 | # RIA/Silverlight projects 233 | Generated_Code/ 234 | 235 | # Backup & report files from converting an old project file 236 | # to a newer Visual Studio version. Backup files are not needed, 237 | # because we have git ;-) 238 | _UpgradeReport_Files/ 239 | Backup*/ 240 | UpgradeLog*.XML 241 | UpgradeLog*.htm 242 | ServiceFabricBackup/ 243 | *.rptproj.bak 244 | 245 | # SQL Server files 246 | *.mdf 247 | *.ldf 248 | *.ndf 249 | 250 | # Business Intelligence projects 251 | *.rdl.data 252 | *.bim.layout 253 | *.bim_*.settings 254 | *.rptproj.rsuser 255 | 256 | # Microsoft Fakes 257 | FakesAssemblies/ 258 | 259 | # GhostDoc plugin setting file 260 | *.GhostDoc.xml 261 | 262 | # Node.js Tools for Visual Studio 263 | .ntvs_analysis.dat 264 | node_modules/ 265 | 266 | # Visual Studio 6 build log 267 | *.plg 268 | 269 | # Visual Studio 6 workspace options file 270 | *.opt 271 | 272 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 273 | *.vbw 274 | 275 | # Visual Studio LightSwitch build output 276 | **/*.HTMLClient/GeneratedArtifacts 277 | **/*.DesktopClient/GeneratedArtifacts 278 | **/*.DesktopClient/ModelManifest.xml 279 | **/*.Server/GeneratedArtifacts 280 | **/*.Server/ModelManifest.xml 281 | _Pvt_Extensions 282 | 283 | # Paket dependency manager 284 | .paket/paket.exe 285 | paket-files/ 286 | 287 | # FAKE - F# Make 288 | .fake/ 289 | 290 | # JetBrains Rider 291 | .idea/ 292 | *.sln.iml 293 | 294 | # CodeRush 295 | .cr/ 296 | 297 | # Python Tools for Visual Studio (PTVS) 298 | __pycache__/ 299 | *.pyc 300 | 301 | # Cake - Uncomment if you are using it 302 | # tools/** 303 | # !tools/packages.config 304 | 305 | # Tabs Studio 306 | *.tss 307 | 308 | # Telerik's JustMock configuration file 309 | *.jmconfig 310 | 311 | # BizTalk build output 312 | *.btp.cs 313 | *.btm.cs 314 | *.odx.cs 315 | *.xsd.cs 316 | 317 | # OpenCover UI analysis results 318 | OpenCover/ 319 | 320 | # Azure Stream Analytics local run output 321 | ASALocalRun/ 322 | 323 | # MSBuild Binary and Structured Log 324 | *.binlog 325 | 326 | # NVidia Nsight GPU debugger configuration file 327 | *.nvuser 328 | 329 | # MFractors (Xamarin productivity tool) working folder 330 | .mfractor/ 331 | /src/.output 332 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 SmallChi(Koike) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JTTools 2 | 3 | JT808、JT809、JT1078、JT905、JT19056解析工具 4 | 5 | 在线解析工具 6 | 7 | 使用systemd托管应用程序 8 | 9 | ``` 1 10 | cp /home/jttools/jttools.service /etc/systemd/system/jttools.service 11 | chmod u+x /home/jttools/jttools 12 | systemctl daemon-reload 13 | 14 | systemctl satrt jttools.service 15 | systemctl status jttools.service 16 | systemctl stop jttools.service 17 | 18 | service jttools satrt 19 | service jttools status 20 | service jttools stop 21 | ``` 22 | 23 | 使用nodejs的PM2托管应用程序 24 | 25 | ``` 2 26 | pm2 start "dotnet JTTools.dll ASPNETCORE_ENVIRONMENT=Production" -n "JTTools.18888" -o "/home/Logs/JTTools/out.log" -e "/home/Logs/JTTools/error.log" 27 | ``` 28 | -------------------------------------------------------------------------------- /jttools_new.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=JTTools New Server 3 | After=network.target 4 | 5 | [Service] 6 | User=root 7 | Restart=on-failure 8 | WorkingDirectory=/home/jttools_new/ 9 | ExecStart=dotnet JTTools.dll 10 | Environment="DOTNET_BUNDLE_EXTRACT_BASE_DIR=%h/.net" 11 | 12 | [Install] 13 | WantedBy=multi-user.target 14 | -------------------------------------------------------------------------------- /src/.dockerignore: -------------------------------------------------------------------------------- 1 | **/.classpath 2 | **/.dockerignore 3 | **/.env 4 | **/.git 5 | **/.gitignore 6 | **/.project 7 | **/.settings 8 | **/.toolstarget 9 | **/.vs 10 | **/.vscode 11 | **/*.*proj.user 12 | **/*.dbmdl 13 | **/*.jfm 14 | **/azds.yaml 15 | **/bin 16 | **/charts 17 | **/docker-compose* 18 | **/Dockerfile* 19 | **/node_modules 20 | **/npm-debug.log 21 | **/obj 22 | **/secrets.dev.yaml 23 | **/values.dev.yaml 24 | LICENSE 25 | README.md -------------------------------------------------------------------------------- /src/JTTools.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.12.35506.116 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTTools", "JTTools\JTTools.csproj", "{EEB24F42-2C88-4B9F-BA24-F5698988CECB}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {EEB24F42-2C88-4B9F-BA24-F5698988CECB}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {3C3239D7-6A1E-4D5B-ABB5-851786B72AED} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /src/JTTools/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-ef": { 6 | "version": "9.0.0", 7 | "commands": [ 8 | "dotnet-ef" 9 | ], 10 | "rollForward": false 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /src/JTTools/Configs/JT808_GPS51_Config.cs: -------------------------------------------------------------------------------- 1 | using JT808.Protocol.Interfaces; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace JTTools.Configs 8 | { 9 | public class JT808_GPS51_Config : GlobalConfigBase 10 | { 11 | public override string ConfigId { get; protected set; } = "JT808_GPS51_Config"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Configs/JT808_JT1078_Config.cs: -------------------------------------------------------------------------------- 1 | using JT808.Protocol.Interfaces; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace JTTools.Configs 8 | { 9 | public class JT808_JT1078_Config : GlobalConfigBase 10 | { 11 | public override string ConfigId { get; protected set; } = "JT808_JT1078_Config"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Configs/JT808_Streamax_Config.cs: -------------------------------------------------------------------------------- 1 | using JT808.Protocol.Interfaces; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace JTTools.Configs 8 | { 9 | public class JT808_Streamax_Config : GlobalConfigBase 10 | { 11 | public override string ConfigId { get; protected set; } = "JT808_Streamax_Config"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Configs/JT808_SuBiao_Config.cs: -------------------------------------------------------------------------------- 1 | using JT808.Protocol.Interfaces; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace JTTools.Configs 8 | { 9 | public class JT808_SuBiao_Config : GlobalConfigBase 10 | { 11 | public override string ConfigId { get; protected set; } = "JT808_SuBiao_Config"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Configs/JT808_YueBiao_Config.cs: -------------------------------------------------------------------------------- 1 | using JT808.Protocol.Interfaces; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace JTTools.Configs 8 | { 9 | public class JT808_YueBiao_Config : GlobalConfigBase 10 | { 11 | public override string ConfigId { get; protected set; } = "JT808_YueBiao_Config"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Configs/JT809_2011_Config.cs: -------------------------------------------------------------------------------- 1 | using JT809.Protocol.Interfaces; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Threading.Tasks; 6 | 7 | namespace JTTools.Configs 8 | { 9 | public class JT809_2011_Config : JT809GlobalConfigBase 10 | { 11 | public override string ConfigId { get; }= "JT809_2011"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Configs/JT809_2019_Config.cs: -------------------------------------------------------------------------------- 1 | using JT809.Protocol.Enums; 2 | using JT809.Protocol.Interfaces; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace JTTools.Configs 9 | { 10 | public class JT809_2019_Config : JT809GlobalConfigBase 11 | { 12 | public override string ConfigId { get; }= "JT809_2019"; 13 | 14 | public JT809_2019_Config() 15 | { 16 | Version = JT809Version.JTT2019; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/JTTools/Configs/JTJsonWriterOptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text.Encodings.Web; 5 | using System.Text.Json; 6 | using System.Text.Unicode; 7 | using System.Threading.Tasks; 8 | 9 | namespace JTTools.Configs 10 | { 11 | public static class JTJsonWriterOptions 12 | { 13 | /// 14 | /// 汉字编码 15 | /// 16 | public readonly static JsonWriterOptions Instance = new System.Text.Json.JsonWriterOptions 17 | { 18 | Indented = true, 19 | Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) 20 | }; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/JTTools/Controllers/JT1078Controller.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using System.Net.NetworkInformation; 3 | using Newtonsoft.Json; 4 | using JTTools.Configs; 5 | using JTTools.Dtos; 6 | using System.Reflection.Emit; 7 | using JT1078.Protocol; 8 | using JT1078.Protocol.Extensions; 9 | using JT808.Protocol; 10 | using JT808.Protocol.Extensions.JT1078.MessageBody; 11 | 12 | namespace JTTools.Controllers 13 | { 14 | /// 15 | /// 16 | /// 17 | [ApiController] 18 | [Route("jtt/[controller]")] 19 | public class JT1078Controller : ControllerBase 20 | { 21 | JT1078Serializer serializer; 22 | 23 | JT808Serializer jt1078_serializer; 24 | 25 | /// 26 | /// 27 | /// 28 | public JT1078Controller(JT808_JT1078_Config jT808_JT1078_Config) 29 | { 30 | serializer = new JT1078Serializer(); 31 | jt1078_serializer = jT808_JT1078_Config.GetSerializer(); 32 | } 33 | 34 | /// 35 | /// 36 | /// 37 | /// "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" 38 | /// 39 | [HttpPost] 40 | [Route("Analyze")] 41 | public ResultDto Analyze(JT1078AnalyzeDto request) 42 | { 43 | ResultDto result = new ResultDto(); 44 | result.Result = new JT1078AnalyzeResultDto(); 45 | try 46 | { 47 | var data = request.Hex.ToHexBytes(); 48 | result.Result.JsonValue = serializer.Analyze(data, options: JTJsonWriterOptions.Instance); 49 | } 50 | catch (Exception ex) 51 | { 52 | result.Error(ex); 53 | } 54 | return result; 55 | } 56 | 57 | /// 58 | /// 59 | /// 60 | /// 61 | [HttpPost] 62 | [Route("Packet_0x9101")] 63 | public ResultDto Packet_0x9101(JT1078_0x9101_Dto request) 64 | { 65 | ResultDto result = new ResultDto(); 66 | result.Result = new JT1078PacketResultDto(); 67 | JT808Package jT808Package = new JT808Package(); 68 | JT808Header header = new JT808Header(); 69 | try 70 | { 71 | header.MsgId = 0x9101; 72 | header.ManualMsgNum = (ushort)request.SN; 73 | header.TerminalPhoneNo = request.Sim; 74 | jT808Package.Header = header; 75 | JT808_0x9101 jT808_0X9101 = new JT808_0x9101(); 76 | jT808_0X9101.ServerIp = request.IPAddress; 77 | jT808_0X9101.TcpPort = (ushort)request.TcpPort; 78 | jT808_0X9101.UdpPort = (ushort)request.UdpPort; 79 | jT808_0X9101.ChannelNo = request.LogicalChannelNo; 80 | jT808_0X9101.DataType = (byte)(request.DataType); 81 | jT808_0X9101.StreamType = (byte)(request.StreamType); 82 | jT808Package.Bodies = jT808_0X9101; 83 | result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString(); 84 | } 85 | catch (Exception ex) 86 | { 87 | result.Error(ex); 88 | } 89 | return result; 90 | } 91 | 92 | /// 93 | /// 94 | /// 95 | /// 96 | [HttpPost] 97 | [Route("Packet_0x9102")] 98 | public ResultDto Packet_0x9102(JT1078_0x9102_Dto request) 99 | { 100 | ResultDto result = new ResultDto(); 101 | result.Result = new JT1078PacketResultDto(); 102 | JT808Package jT808Package = new JT808Package(); 103 | JT808Header header = new JT808Header(); 104 | try 105 | { 106 | header.MsgId = 0x9102; 107 | header.ManualMsgNum = (ushort)request.SN; 108 | header.TerminalPhoneNo = request.Sim; 109 | jT808Package.Header = header; 110 | JT808_0x9102 jT808_0X9102 = new JT808_0x9102(); 111 | jT808_0X9102.ChannelNo = request.LogicalChannelNo; 112 | jT808_0X9102.ControlCmd = byte.Parse(request.ControlCmd); 113 | jT808_0X9102.CloseAVData = byte.Parse(request.CloseAVData); 114 | jT808_0X9102.StreamType = byte.Parse(request.SwitchStreamType); 115 | jT808Package.Bodies = jT808_0X9102; 116 | result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString(); 117 | } 118 | catch (Exception ex) 119 | { 120 | result.Error(ex); 121 | } 122 | return result; 123 | } 124 | 125 | /// 126 | /// 127 | /// 128 | /// 129 | [HttpPost] 130 | [Route("Packet_0x9205")] 131 | public ResultDto Packet_0x9205(JT1078_0x9205_Dto request) 132 | { 133 | ResultDto result = new ResultDto(); 134 | result.Result = new JT1078PacketResultDto(); 135 | JT808Package jT808Package = new JT808Package(); 136 | JT808Header header = new JT808Header(); 137 | try 138 | { 139 | header.MsgId = 0x9205; 140 | header.ManualMsgNum = (ushort)request.SN; 141 | header.TerminalPhoneNo = request.Sim; 142 | jT808Package.Header = header; 143 | JT808.Protocol.MessageBody.JT808_0x0200 jT808_0X0200 = new JT808.Protocol.MessageBody.JT808_0x0200(); 144 | jT808_0X0200.AlarmFlag = (uint)JT808.Protocol.Enums.JT808Alarm.gnss_ant_not_connected; 145 | JT808_0x9205 jT808_0X9205 = new JT808_0x9205(); 146 | jT808_0X9205.ChannelNo = request.LogicalChannelNo; 147 | jT808_0X9205.BeginTime = request.BeginTime; 148 | jT808_0X9205.EndTime = request.EndTime; 149 | jT808_0X9205.AlarmFlag = ulong.Parse(request.AlarmFlag); 150 | jT808_0X9205.MediaType = byte.Parse(request.MediaType); 151 | jT808_0X9205.StreamType = byte.Parse(request.MemoryType); 152 | jT808_0X9205.MemoryType = byte.Parse(request.MemoryType); 153 | jT808Package.Bodies = jT808_0X9205; 154 | result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString(); 155 | } 156 | catch (Exception ex) 157 | { 158 | result.Error(ex); 159 | } 160 | return result; 161 | } 162 | 163 | /// 164 | /// 165 | /// 166 | /// 167 | [HttpPost] 168 | [Route("Packet_0x9206")] 169 | public ResultDto Packet_0x9206(JT1078_0x9206_Dto request) 170 | { 171 | ResultDto result = new ResultDto(); 172 | result.Result = new JT1078PacketResultDto(); 173 | JT808Package jT808Package = new JT808Package(); 174 | JT808Header header = new JT808Header(); 175 | try 176 | { 177 | header.MsgId = 0x9206; 178 | header.ManualMsgNum = (ushort)request.SN; 179 | header.TerminalPhoneNo = request.Sim; 180 | jT808Package.Header = header; 181 | JT808_0x9206 jT808_0X9206 = new JT808_0x9206(); 182 | jT808_0X9206.ServerIpLength = byte.Parse(request.ServerIP.Length.ToString()); 183 | jT808_0X9206.ServerIp = request.ServerIP; 184 | jT808_0X9206.Port = ushort.Parse(request.Port); 185 | jT808_0X9206.UserName = request.UserName; 186 | jT808_0X9206.Password = request.Password; 187 | jT808_0X9206.FileUploadPath = request.FileUploadPath ?? ""; 188 | jT808_0X9206.BeginTime = request.BeginTime; 189 | jT808_0X9206.EndTime = request.EndTime; 190 | jT808_0X9206.AlarmFlag = ulong.Parse(request.AlarmFlag); 191 | jT808_0X9206.MediaType = byte.Parse(request.MediaType); 192 | jT808_0X9206.StreamType = byte.Parse(request.MemoryType); 193 | jT808_0X9206.MemoryPositon = byte.Parse(request.MemoryType); 194 | jT808_0X9206.TaskExcuteCondition = byte.Parse(request.TaskExcuteCondition); 195 | jT808Package.Bodies = jT808_0X9206; 196 | result.Result.Hex = jt1078_serializer.Serialize(jT808Package).ToHexString(); 197 | } 198 | catch (Exception ex) 199 | { 200 | result.Error(ex); 201 | } 202 | return result; 203 | } 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /src/JTTools/Controllers/JT19056Controller.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using JTTools.Configs; 3 | using JT809.Protocol.Enums; 4 | using JTTools.Dtos; 5 | using System.Reflection.Emit; 6 | using JT808.Protocol; 7 | using JT808.Protocol.Extensions; 8 | using Microsoft.OpenApi.Any; 9 | 10 | namespace JTTools.Controllers 11 | { 12 | /// 13 | /// 14 | /// 15 | [ApiController] 16 | [Route("jtt/[controller]")] 17 | public class JT19056Controller : ControllerBase 18 | { 19 | JT808CarDVRSerializer Serializer; 20 | 21 | /// 22 | /// 23 | /// 24 | /// 25 | public JT19056Controller( 26 | IJT808Config config 27 | ) 28 | { 29 | Serializer = config.GetCarDVRSerializer(); 30 | } 31 | 32 | /// 33 | /// 34 | /// 35 | /// 36 | /// 37 | [HttpPost] 38 | [Route("Analyze")] 39 | public ResultDto Analyze(JT19056AnalyzeDto request) 40 | { 41 | ResultDto result = new ResultDto(); 42 | result.Result = new JT19056AnalyzeResultDto(); 43 | try 44 | { 45 | var data = request.Hex.ToHexBytes(); 46 | switch (request.ProtocolType) 47 | { 48 | case "up": 49 | result.Result.JsonValue = Serializer.UpAnalyze(data, options: JTJsonWriterOptions.Instance); 50 | break; 51 | case "down": 52 | result.Result.JsonValue = Serializer.DownAnalyze(data, options: JTJsonWriterOptions.Instance); 53 | break; 54 | default: 55 | result.Result.JsonValue = ""; 56 | break; 57 | } 58 | } 59 | catch (Exception ex) 60 | { 61 | result.Error(ex); 62 | } 63 | return result; 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/JTTools/Controllers/JT808Controller.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/Controllers/JT808Controller.cs -------------------------------------------------------------------------------- /src/JTTools/Controllers/JT809Controller.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/Controllers/JT809Controller.cs -------------------------------------------------------------------------------- /src/JTTools/Controllers/JT905Controller.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using System.Net.NetworkInformation; 3 | using JTTools.Configs; 4 | using System.IO; 5 | using System.Reflection; 6 | using System.Text; 7 | using System.Text.Encodings.Web; 8 | using System.Text.Unicode; 9 | using JT808.Protocol.Interfaces; 10 | using JTTools.Dtos; 11 | using System.Reflection.Emit; 12 | using JT905.Protocol; 13 | using JT808.Protocol.Extensions; 14 | 15 | 16 | namespace JTTools.Controllers 17 | { 18 | /// 19 | /// 20 | /// 21 | [ApiController] 22 | [Route("jtt/[controller]")] 23 | public class JT905Controller : ControllerBase 24 | { 25 | IJT905Config config; 26 | JT905Serializer serializer; 27 | 28 | /// 29 | /// 30 | /// 31 | /// 32 | public JT905Controller(IJT905Config config) 33 | { 34 | this.config = config; 35 | this.serializer = new JT905Serializer(config); 36 | } 37 | 38 | /// 39 | /// 40 | /// 41 | /// 7E02000023103456789012007D02000000010000000200BA7F0E07E4F11C003C002110152110100104000000640202007D01347E 42 | /// 43 | [HttpPost] 44 | [Route("Analyze")] 45 | public ResultDto Analyze(JT905AnalyzeDto request) 46 | { 47 | ResultDto result = new ResultDto(); 48 | result.Result = new JT905AnalyzeResultDto(); 49 | try 50 | { 51 | var data = request.Hex.ToHexBytes(); 52 | result.Result.JsonValue = serializer.Analyze(data, options: JTJsonWriterOptions.Instance); 53 | } 54 | catch (Exception ex) 55 | { 56 | result.Error(ex); 57 | } 58 | return result; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/JTTools/Controllers/JTActiveSafetyController.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Mvc; 2 | using JTTools.Configs; 3 | using JTTools.Dtos; 4 | using JTActiveSafety.Protocol; 5 | using JTActiveSafety.Protocol.Extensions; 6 | 7 | namespace JTTools.Controllers 8 | { 9 | /// 10 | /// 11 | /// 12 | [ApiController] 13 | [Route("jtt/[controller]")] 14 | public class JTActiveSafetyController : ControllerBase 15 | { 16 | /// 17 | /// 18 | /// 19 | /// "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" 20 | /// 21 | [HttpPost] 22 | [Route("Analyze")] 23 | public ResultDto Analyze(JTActiveSafetyAnalyzeDto request) 24 | { 25 | ResultDto result = new ResultDto(); 26 | result.Result = new JTActiveSafetyAnalyzeResultDto(); 27 | try 28 | { 29 | var data = request.Hex.ToHexBytes(); 30 | result.Result.JsonValue = JTActiveSafetySerializer.Analyze(data, options: JTJsonWriterOptions.Instance); 31 | } 32 | catch (Exception ex) 33 | { 34 | result.Error(ex); 35 | } 36 | return result; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT1078AnalyzeDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT1078AnalyzeDto 7 | { 8 | /// 9 | /// hex字符串 10 | /// 11 | public string Hex { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT1078AnalyzeResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT1078AnalyzeResultDto 7 | { 8 | /// 9 | /// 10 | /// 11 | public string JsonValue { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT1078PacketDto.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel.DataAnnotations; 2 | using System.ComponentModel; 3 | 4 | namespace JTTools.Dtos 5 | { 6 | 7 | public class JT1078_0x9101_Dto 8 | { 9 | [Required] 10 | public string Sim { get; set; } = "123456789012"; 11 | [Required] 12 | public int SN { get; set; } = new Random().Next(1, 2000); 13 | [Required] 14 | public string IPAddress { get; set; } = "127.0.0.1"; 15 | [Required] 16 | public int TcpPort { get; set; } 17 | [Required] 18 | public int UdpPort { get; set; } 19 | [Required] 20 | public byte LogicalChannelNo { get; set; } 21 | [Required] 22 | public int DataType { get; set; } = 1; 23 | [Required] 24 | public int StreamType { get; set; } = 1; 25 | } 26 | 27 | public class JT1078_0x9102_Dto 28 | { 29 | [Required] 30 | public string Sim { get; set; } = "123456789012"; 31 | [Required] 32 | public int SN { get; set; } = new Random().Next(1, 2000); 33 | [Required] 34 | public byte LogicalChannelNo { get; set; } 35 | [Required] 36 | public string ControlCmd { get; set; } = "0"; 37 | [Required] 38 | public string CloseAVData { get; set; } = "0"; 39 | [Required] 40 | public string SwitchStreamType { get; set; } = "1"; 41 | } 42 | 43 | public class JT1078_0x9205_Dto 44 | { 45 | [Required] 46 | public string Sim { get; set; } = "123456789012"; 47 | [Required] 48 | public int SN { get; set; } = new Random().Next(1, 2000); 49 | [Required, DisplayName("逻辑通道号")] 50 | public byte LogicalChannelNo { get; set; } = 4; 51 | 52 | [Required, DisplayName("开始时间")] 53 | public DateTime BeginTime { get; set; } = DateTime.Today; 54 | [Required, DisplayName("结束时间")] 55 | public DateTime EndTime { get; set; } = DateTime.Now; 56 | [Required, DisplayName("报警标志")] 57 | public string AlarmFlag { get; set; } = "00000000000000000000000000000000"; 58 | [Required, DisplayName("音视频资源类型")] 59 | public string MediaType { get; set; } = "0"; 60 | [Required, DisplayName("码流类型")] 61 | public string StreamType { get; set; } = "0"; 62 | [Required, DisplayName("存储器类型")] 63 | public string MemoryType { get; set; } = "0"; 64 | } 65 | /// 66 | /// 67 | /// 68 | public class JT1078_0x9206_Dto 69 | { 70 | /// 71 | /// 72 | /// 73 | [Required] 74 | public string Sim { get; set; } = "123456789012"; 75 | /// 76 | /// 77 | /// 78 | [Required] 79 | public int SN { get; set; } = new Random().Next(1, 2000); 80 | /// 81 | /// 82 | /// 83 | [Required] 84 | public byte LogicalChannelNo { get; set; } = 4; 85 | /// 86 | /// 87 | /// 88 | public string ServerIP { get; set; } = "127.0.0.1"; 89 | /// 90 | /// 91 | /// 92 | public string Port { get; set; } = "6201"; 93 | /// 94 | /// 95 | /// 96 | public string UserName { get; set; } = "053500"; 97 | /// 98 | /// 99 | /// 100 | public string Password { get; set; } = "053500"; 101 | /// 102 | /// 103 | /// 104 | public string FileUploadPath { get; set; } = "./aaaaaaa"; 105 | [Required, DisplayName("开始时间")] 106 | public DateTime BeginTime { get; set; } = DateTime.Today; 107 | [Required, DisplayName("结束时间")] 108 | public DateTime EndTime { get; set; } = DateTime.Now; 109 | [Required, DisplayName("报警标志")] 110 | public string AlarmFlag { get; set; } = "00000000000000000000000000000000"; 111 | [Required, DisplayName("音视频资源类型")] 112 | public string MediaType { get; set; } = "0"; 113 | [Required, DisplayName("码流类型")] 114 | public string StreamType { get; set; } = "0"; 115 | [Required, DisplayName("存储器类型")] 116 | public string MemoryType { get; set; } = "0"; 117 | 118 | public string TaskExcuteCondition { get; set; } = "7"; 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT1078PacketResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT1078PacketResultDto 7 | { 8 | /// 9 | /// hex字符串 10 | /// 11 | public string Hex { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT19056AnalyzeDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT19056AnalyzeDto 7 | { 8 | /// 9 | /// up/down 10 | /// 11 | public string ProtocolType { get; set; } = "up"; 12 | /// 13 | /// hex字符串 14 | /// 15 | public string Hex { get; set; } = ""; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT19056AnalyzeResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT19056AnalyzeResultDto 7 | { 8 | /// 9 | /// 10 | /// 11 | public string JsonValue { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT808AnalyzeDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT808AnalyzeDto 7 | { 8 | /// 9 | /// 10 | /// 11 | public string ProtocolType { get; set; } = ""; 12 | /// 13 | /// hex字符串 14 | /// 15 | public string Hex { get; set; } = ""; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT808AnalyzeResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT808AnalyzeResultDto 7 | { 8 | /// 9 | /// 10 | /// 11 | public bool IsSubpackage { get; set; } = false; 12 | /// 13 | /// 14 | /// 15 | public string JsonValue { get; set; } = ""; 16 | /// 17 | /// 18 | /// 19 | public List Packages{ get; set; } = new List(); 20 | } 21 | 22 | /// 23 | /// 24 | /// 25 | public class JT808PackageInfoDto 26 | { 27 | /// 28 | /// 29 | /// 30 | public int Order { get; set; } 31 | /// 32 | /// 33 | /// 34 | public string TerminalPhoneNo { get; set; } = ""; 35 | /// 36 | /// 37 | /// 38 | public string MsgId { get; set; } = ""; 39 | /// 40 | /// 41 | /// 42 | public int MsgNum { get; set; } 43 | /// 44 | /// 45 | /// 46 | public string ProtocolVersion { get; set; } = ""; 47 | /// 48 | /// 49 | /// 50 | public int PackgeCount { get; set; } 51 | /// 52 | /// 53 | /// 54 | public int PackageIndex { get; set; } 55 | /// 56 | /// 57 | /// 58 | public int DataLength { get; set; } 59 | /// 60 | /// 61 | /// 62 | public bool Encrypt { get; set; }= false; 63 | /// 64 | /// 65 | /// 66 | public string Body { get; set; } = ""; 67 | /// 68 | /// 69 | /// 70 | public string JsonValue { get; set; } = ""; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT809AnalyzeDto.cs: -------------------------------------------------------------------------------- 1 | using JT809.Protocol.Configs; 2 | 3 | namespace JTTools.Dtos 4 | { 5 | /// 6 | /// 7 | /// 8 | public class JT809AnalyzeDto 9 | { 10 | /// 11 | /// 12 | /// 13 | public string ProtocolType { get; set; } = "2011"; 14 | /// 15 | /// 16 | /// 17 | public bool IsEncrypt { get; set; } = false; 18 | /// 19 | /// 20 | /// 21 | public long M1 { get; set; } = 0; 22 | /// 23 | /// 24 | /// 25 | public long IA1 { get; set; } = 0; 26 | /// 27 | /// 28 | /// 29 | public long IC1 { get; set; } = 0; 30 | /// 31 | /// hex字符串 32 | /// 33 | public string Hex { get; set; } = ""; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT809AnalyzeResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT809AnalyzeResultDto 7 | { 8 | /// 9 | /// 10 | /// 11 | public string JsonValue { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT905AnalyzeDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT905AnalyzeDto 7 | { 8 | /// 9 | /// hex字符串 10 | /// 11 | public string Hex { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JT905AnalyzeResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JT905AnalyzeResultDto 7 | { 8 | /// 9 | /// 10 | /// 11 | public string JsonValue { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JTActiveSafetyAnalyzeDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JTActiveSafetyAnalyzeDto 7 | { 8 | /// 9 | /// hex字符串 10 | /// 11 | public string Hex { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JTActiveSafetyAnalyzeResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 5 | /// 6 | public class JTActiveSafetyAnalyzeResultDto 7 | { 8 | /// 9 | /// 10 | /// 11 | public string JsonValue { get; set; } = ""; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/JTTDictDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | /// 4 | /// 字典 5 | /// 6 | public class JTTDictDto 7 | { 8 | /// 9 | /// Label 10 | /// 11 | public string Label { get; set; } = ""; 12 | /// 13 | /// Value 14 | /// 15 | public string Value { get; set; } = ""; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/JTTools/Dtos/ResultDto.cs: -------------------------------------------------------------------------------- 1 | namespace JTTools.Dtos 2 | { 3 | public class ResultDto 4 | { 5 | public string Message { get; set; } = ""; 6 | public int Code { get; set; } = 200; 7 | public T? Result { get; set; } = default; 8 | /// 9 | /// 10 | /// 11 | /// 12 | public void Error(Exception ex) 13 | { 14 | Code = 500; 15 | Message = ex.StackTrace ?? ""; 16 | } 17 | /// 18 | /// 19 | /// 20 | /// 21 | public void Error(string msg) 22 | { 23 | Code = 500; 24 | Message = msg; 25 | } 26 | 27 | /// 28 | /// 29 | /// 30 | public void Fail(string msg="") 31 | { 32 | Code = 400; 33 | Message = msg; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/JTTools/JTTools.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net9.0 5 | enable 6 | enable 7 | true 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/JTTools/Program.cs: -------------------------------------------------------------------------------- 1 | using JT808.Protocol; 2 | using JT808.Protocol.Extensions.JT1078; 3 | using JT808.Protocol.Extensions.SuBiao; 4 | using JT808.Protocol.Extensions.YueBiao; 5 | using JT809.Protocol; 6 | using JT809.Protocol.Extensions.JT1078; 7 | using JT808.Protocol.Extensions.Streamax; 8 | using System.Text.Json; 9 | using JT808.Protocol.MessagePack; 10 | using JT808.Protocol.MessageBody; 11 | using JTTools.Configs; 12 | using JT808.Protocol.Extensions.GPS51; 13 | using JT905.Protocol; 14 | 15 | 16 | namespace JTTools 17 | { 18 | public class Program 19 | { 20 | public static void Main(string[] args) 21 | { 22 | var builder = WebApplication.CreateBuilder(args); 23 | 24 | builder.Services.AddJT808Configure(); 25 | builder.Services.AddJT808Configure(new JT808_SuBiao_Config()) 26 | .AddSuBiaoConfigure(); 27 | builder.Services.AddJT808Configure(new JT808_YueBiao_Config()) 28 | .AddYueBiaoConfigure(); 29 | builder.Services.AddJT808Configure(new JT808_JT1078_Config()) 30 | .AddJT1078Configure(); 31 | builder.Services.AddJT809Configure(new JT809_2011_Config()) 32 | .AddJT1078Configure(); 33 | IServiceProvider serviceProvider = builder.Services.BuildServiceProvider(); 34 | builder.Services.AddJT809Configure(new JT809_2019_Config()) 35 | .AddJT1078Configure() 36 | .AddJT809_JT808AnalyzeCallback(0x0200, (bytes, writer, jT809Config) => { 37 | IJT808Config jT808Config = serviceProvider.GetRequiredService(); 38 | JT808MessagePackReader jT808MessagePackReader = new JT808MessagePackReader(bytes); 39 | JT808.Protocol.Extensions.JT808AnalyzeExtensions.Analyze(JT808.Protocol.JT808ConfigExtensions.GetMessagePackFormatter(jT808Config), 40 | ref jT808MessagePackReader, writer, jT808Config); 41 | }); 42 | builder.Services.AddJT808Configure(new JT808_Streamax_Config()) 43 | .AddStreamaxConfigure(); 44 | builder.Services.AddJT808Configure(new JT808_GPS51_Config()) 45 | .AddGPS51Configure(); 46 | builder.Services.AddJT905Configure(); 47 | 48 | builder.Services.AddControllers().AddJsonOptions(options => 49 | { 50 | options.JsonSerializerOptions.PropertyNamingPolicy = null; 51 | }); 52 | 53 | builder.Services.AddOpenApiDocument(); 54 | 55 | builder.Services.AddCors(options => 56 | { 57 | options.AddPolicy("AnyCors", builder=> builder.AllowAnyMethod() 58 | .SetIsOriginAllowed(_ => true) 59 | .AllowAnyHeader() 60 | .AllowCredentials()); 61 | }); 62 | 63 | var app = builder.Build(); 64 | 65 | app.UseCors("AnyCors"); 66 | 67 | app.UseOpenApi(options => 68 | { 69 | options.Path = "/jtt/swagger/{documentName}/swagger.json"; 70 | }); 71 | 72 | app.UseSwaggerUi(options => 73 | { 74 | options.DocumentPath = "/jtt/swagger/{documentName}/swagger.json"; 75 | options.Path ="/jttui/swagger"; 76 | }); 77 | 78 | app.MapControllers(); 79 | 80 | app.UseDefaultFiles(); 81 | 82 | app.MapStaticAssets(); 83 | 84 | app.UseStaticFiles(); 85 | 86 | app.Run(); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/JTTools/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/JTTools/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*", 9 | "urls": "http://*:18889;" 10 | } 11 | -------------------------------------------------------------------------------- /src/JTTools/wwwroot/css/site.css: -------------------------------------------------------------------------------- 1 | @supports (font-family: -apple-system) { 2 | body { 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; 4 | } 5 | } 6 | 7 | html { 8 | font-size: 14px; 9 | } 10 | 11 | @media (min-width: 768px) { 12 | html { 13 | font-size: 16px; 14 | } 15 | } 16 | 17 | .btn:focus, 18 | .btn:active:focus, 19 | .btn-link.nav-link:focus, 20 | .form-control:focus, 21 | .form-check-input:focus { 22 | box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; 23 | } 24 | 25 | html { 26 | position: relative; 27 | min-height: 100%; 28 | } 29 | 30 | body { 31 | min-height: 75rem; 32 | } 33 | 34 | .hide { 35 | display: none; 36 | } 37 | 38 | .bd-placeholder-img { 39 | font-size: 1.125rem; 40 | text-anchor: middle; 41 | -webkit-user-select: none; 42 | -moz-user-select: none; 43 | user-select: none; 44 | } 45 | 46 | @media (min-width: 768px) { 47 | .bd-placeholder-img-lg { 48 | font-size: 3.5rem; 49 | } 50 | } 51 | 52 | .b-example-divider { 53 | height: 3rem; 54 | background-color: rgba(0, 0, 0, .1); 55 | border: solid rgba(0, 0, 0, .15); 56 | border-width: 1px 0; 57 | box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15); 58 | } 59 | 60 | .b-example-vr { 61 | flex-shrink: 0; 62 | width: 1.5rem; 63 | height: 100vh; 64 | } 65 | 66 | .bi { 67 | vertical-align: -.125em; 68 | fill: currentColor; 69 | } 70 | 71 | .nav-scroller { 72 | position: relative; 73 | z-index: 2; 74 | height: 2.75rem; 75 | overflow-y: hidden; 76 | } 77 | 78 | .nav-scroller .nav { 79 | display: flex; 80 | flex-wrap: nowrap; 81 | padding-bottom: 1rem; 82 | margin-top: -1px; 83 | overflow-x: auto; 84 | text-align: center; 85 | white-space: nowrap; 86 | -webkit-overflow-scrolling: touch; 87 | } 88 | 89 | /* 90 | 1.全局样式===== 91 | */ 92 | header .navbar { 93 | padding: 15px; 94 | } 95 | 96 | @media screen and (max-width:768px) { 97 | header .navbar { 98 | padding: 10px; 99 | } 100 | } 101 | 102 | main>.container { 103 | padding: 100px 15px 0; 104 | } 105 | 106 | @media screen and (max-width:768px) { 107 | main>.container { 108 | padding: 65px 15px 0; 109 | } 110 | } 111 | 112 | #main *:focus { 113 | box-shadow: none; 114 | } 115 | 116 | .btn-clear { 117 | background: none; 118 | border: none; 119 | color: #6c757d; 120 | /* Bootstrap的次要颜色 */ 121 | } 122 | 123 | .pre { 124 | background: #fafafa; 125 | padding: 15px; 126 | border-radius: 4px; 127 | border: 1px solid #eeeeee; 128 | } 129 | 130 | .accordion-button:not(.collapsed) { 131 | color: #166ff1; 132 | font-weight: 300; 133 | background-color: #fafafa; 134 | } 135 | 136 | .giuhub-link { 137 | display: block; 138 | } 139 | 140 | .giuhub-logo { 141 | width: 45px; 142 | height: 45px; 143 | } 144 | 145 | @media screen and (max-width:768px) { 146 | .giuhub-logo { 147 | width: 25px; 148 | height: 25px; 149 | } 150 | } 151 | 152 | .badge { 153 | border: 1px solid #d9d9d9; 154 | border-radius: 2px; 155 | font-weight: 500; 156 | } 157 | 158 | .text-bg-primary { 159 | color: #1d39c4 !important; 160 | background: #f0f5ff !important; 161 | border-color: #adc6ff !important; 162 | 163 | } 164 | 165 | .text-bg-secondary { 166 | color: #531dab !important; 167 | background: #f9f0ff !important; 168 | border-color: #d3adf7 !important; 169 | } 170 | 171 | .text-bg-dark { 172 | color: #666 !important; 173 | background: #00000014 !important; 174 | border-color: #b9b8b8 !important; 175 | } 176 | 177 | .text-bg-light { 178 | color: #000 !important; 179 | background: #fff !important; 180 | border-color: #d8d7d7 !important; 181 | } 182 | 183 | .text-bg-success { 184 | color: #20c997 !important; 185 | background: #20c9961a !important; 186 | border-color: #20c99683 !important; 187 | } 188 | 189 | .text-bg-danger { 190 | color: #dc3545 !important; 191 | background: #dc35451a !important; 192 | border-color: #dc354583 !important; 193 | } 194 | 195 | .text-bg-warning { 196 | color: #d46b08 !important; 197 | background: #fff7e6 !important; 198 | border-color: #ffd591 !important; 199 | } 200 | 201 | .text-bg-info { 202 | color: #096dd9 !important; 203 | background: #e6f7ff !important; 204 | border-color: #91d5ff !important; 205 | } 206 | 207 | .row { 208 | margin-left: 0; 209 | margin-right: 0; 210 | } 211 | 212 | /* 213 | 2.JT808Parse模块样式==== 214 | */ 215 | 216 | #JT808Parse textarea { 217 | padding-top: 40px; 218 | } 219 | 220 | #JT808Parse label { 221 | color: rgb(222, 110, 5); 222 | padding-top: 20px; 223 | font-weight: bold; 224 | } 225 | 226 | #JT808Parse label i { 227 | font-size: 20px; 228 | } 229 | 230 | #JT808_Accordion_Result .badge { 231 | margin-left: 10px; 232 | } 233 | 234 | /* 235 | 4.产品模块样式==== 236 | */ 237 | #ProductAD .carousel-inner { 238 | height: 400px; 239 | } 240 | 241 | #ProductAD .icon { 242 | width: 65px; 243 | height: 65px; 244 | background: #ccc; 245 | text-align: center; 246 | border-radius: 50%; 247 | margin: 25px 0 0 25px; 248 | } 249 | 250 | @media screen and (max-width:768px) { 251 | #ProductAD .icon { 252 | width: 50px; 253 | height: 50px; 254 | margin: 15px 0 0 15px; 255 | } 256 | } 257 | 258 | #ProductAD>.card { 259 | border: none 260 | } 261 | 262 | #ProductAD .nav-pills { 263 | border-bottom: 1px solid #eee; 264 | width: 100%; 265 | } 266 | 267 | #ProductAD .nav-pills .nav-link { 268 | background: #eee; 269 | color: #333; 270 | border-bottom-left-radius: 0; 271 | border-bottom-right-radius: 0; 272 | } 273 | 274 | #ProductAD .nav-pills .nav-link.active { 275 | background: #258cfb; 276 | color: #fff; 277 | } 278 | 279 | #ProductAD .row { 280 | margin-left: -12px; 281 | margin-right: -12px; 282 | } 283 | 284 | #ProductAD .custom-tooltip { 285 | --bs-tooltip-bg: #712cf9; 286 | --bs-tooltip-color: #fff; 287 | } -------------------------------------------------------------------------------- /src/JTTools/wwwroot/img/4G_IPC1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/img/4G_IPC1.jpg -------------------------------------------------------------------------------- /src/JTTools/wwwroot/img/4G_IPC11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/img/4G_IPC11.jpg -------------------------------------------------------------------------------- /src/JTTools/wwwroot/img/4G_IPC2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/img/4G_IPC2.jpg -------------------------------------------------------------------------------- /src/JTTools/wwwroot/img/github-mark-white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/JTTools/wwwroot/img/wechat_pay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/img/wechat_pay.jpg -------------------------------------------------------------------------------- /src/JTTools/wwwroot/img/yilabao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/img/yilabao.png -------------------------------------------------------------------------------- /src/JTTools/wwwroot/img/zfb_pay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/img/zfb_pay.jpg -------------------------------------------------------------------------------- /src/JTTools/wwwroot/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | JTTools工具 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 82 |
83 | 84 | 85 | 86 |
87 | 88 |
89 |
90 |
91 | 100 |
101 |
102 | 103 | 104 |
105 |
106 | 107 |
108 |
109 |
110 |
111 | 112 |
113 |
114 |
115 | 116 | 117 | 118 |
119 |
120 |
121 | 125 |
126 |
127 | 131 |
132 |
133 |
134 | M1 135 | 137 |
138 |
139 | IA1 140 | 142 |
143 |
144 | IC1 145 | 147 |
148 |
149 |
150 | 151 |
152 |
153 | 154 |
155 |
156 |
157 |

158 |             
159 |
160 | 161 | 162 | 163 |
164 |
165 |
166 | 168 |
169 |
170 | 171 |
172 |
173 |
174 |

175 |             
176 |
177 | 178 | 179 | 180 |
181 |

JT1078Packet

182 |
183 |
184 | 190 |
191 |
192 |
193 |
194 | 195 |
196 |
197 |
198 |
199 | 200 |
201 |
202 |
203 |
204 | 205 |
206 |
207 |
208 |
209 | 210 |
211 |
212 |
213 |

214 |             
215 |
216 | 217 | 218 | 219 |
220 |
221 |
222 | 226 |
227 |
228 | 231 |
232 |
233 | 234 |
235 |
236 |
237 |

238 |             
239 |
240 | 241 | 242 | 243 |
244 |
245 |
246 | 248 |
249 |
250 | 251 |
252 |
253 |
254 |

255 |             
256 |
257 | 258 | 259 | 260 |
261 |
262 |
263 | 264 |
265 |
266 | 267 |
268 |
269 |
270 |

271 |             
272 |
273 | 274 | 275 | 276 |
277 |
278 |
279 | 281 | 282 |
283 |
284 | 289 | 291 | 293 |
294 |
295 | 297 | 298 |
299 |
300 |
301 | 302 | 303 | 304 | 365 | 366 | 367 | 368 | 371 | 372 | 373 | 374 |
375 | 376 |
377 |
378 |
379 | 380 | 393 |
394 |
395 |
396 |

4G智能摄像头

397 |

398 | 406 |

407 |

集GPS/北斗双模定位和实时音视频功能于一体的4G智能AI摄像头,适用于普货、城配、网约车、工程机械等领域,自主研发,支持功能定制,设备出海,全球化。 408 |

409 | 413 |
414 |
415 |

联系方式

416 |
417 | 420 | 423 | 426 | 429 |
430 |
431 |
432 |

提前预告

433 |
434 | 437 |
438 | 439 |
440 |
441 |
442 |
443 | 444 |
445 |
447 |
448 |

功能特性

449 |
450 | 467 |
468 |
469 |
470 |
4G全网通
471 |
472 |
473 |
GPS/北斗双模定位
474 |
475 |
476 |
ACC自动检测,支持9~50V宽电压
477 |
478 |
479 |
断电报警、欠压报警,低电保护,延时关机,定时开关机
480 |
481 |
482 |
双向对讲
483 |
484 |
485 |
实时音视频预览及存储,远程录像回放
486 |
487 |
488 |
1080P高性能图像处理芯片,H.265 编码,高压缩比图像清晰
489 |
490 |
491 |
内置G-sensor,实时监控车辆驾驶行为
492 |
493 |
494 |
RS485接口连接外设传感器,如:油杆、超声波、正反转等传感器
495 |
496 |
497 |
智能算法如:人形检测、移动侦测
498 |
499 |
500 |
【电源】专业车载电源9V-50V直流宽电压输入设计
501 |
502 |
503 |
【电源】欠压、短路、反接等多种保护电路,适用于各种车型
504 |
505 |
506 |
【电源】智能电源管理,低电自动启动低电保护模式
507 |
508 |
509 |
支持TF卡存储,最大支持256G
510 |
511 |
512 |
支持RS485扩展接口,I/O
513 |
514 |
515 |
516 |
517 |
518 |
519 |

技术参数

520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 |
设备参数规格描述
视频分辨率1080P/720P/HD
祝频编码H.265
咅频编码G711A
夜视红外夜祝
工作电压DC9V-50V
工作电流24V250mA(满载)
防水等级IP67
4G通讯4G全网通(支持电信,移动,联通卡)
卫星定位GPS/北斗双模定位
SIM卡外插卡,Nano-SIM卡
存储外插卡,最大支持256GTF卡(Class 10 及以上)
网口支持以太网口
喇叭内置喇叭
拾音器内置拾音器
工作温度-20~70℃
串口支持1路RS485
升级模式远程升级/TF卡升级
点火输人ACC自动检测
尺寸(长x宽x高)80mm*75mm*70mm(含支架)
毛重设备:290g,含配件:570g
610 |
611 |
612 | 613 |
614 | 615 |
616 |
617 |
618 |
要是觉得工具有用打赏一点喝杯咖啡
619 |
620 |
621 |
622 |
623 | pay 624 |
625 |
626 | pay 627 |
628 |
629 |
630 |
631 |
632 | 633 |
634 | 635 | 636 | 637 |
638 | 639 | 640 | 648 | 649 | 650 | 651 | 652 | -------------------------------------------------------------------------------- /src/JTTools/wwwroot/js/site.js: -------------------------------------------------------------------------------- 1 | axios.defaults.baseURL = "https://jttools.smallchi.cn/jtt"; 2 | 3 | function hexToString(hexStr) { 4 | // 移除可能存在的空格和换行符 5 | hexStr = hexStr.replace(/\s+/g, ''); 6 | // 将16进制字符串转换为字节数组 7 | let bytes = []; 8 | for (let i = 0; i < hexStr.length; i += 2) { 9 | bytes.push(parseInt(hexStr.substring(i, i + 2), 16)); 10 | } 11 | // 将字节数组转换为字符串 12 | return String.fromCharCode.apply(null, bytes); 13 | } 14 | 15 | /*ref: https://kimi.moonshot.cn/ auto-generated code */ 16 | jQuery.fn.extend({ 17 | autoHeight: function () { 18 | return this.each(function () { 19 | var $this = jQuery(this); 20 | if (!$this.attr('_initAdjustHeight')) { 21 | $this.attr('_initAdjustHeight', $this.outerHeight()); 22 | } 23 | _adjustH(this).on('input', function () { 24 | _adjustH(this); 25 | }); 26 | }); 27 | function _adjustH(elem) { 28 | var $obj = jQuery(elem); 29 | return $obj.css({ height: $obj.attr('_initAdjustHeight'), 'overflow-y': 'hidden' }) 30 | .height(elem.scrollHeight); 31 | } 32 | } 33 | }); 34 | 35 | $(document).ready(function () { 36 | 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"; 37 | const JT8082013ForceHexData = "7e0102400c01003000068109024a3130303330303030363831857e"; 38 | const JT808JT1078HexData = "7E120523A204066657506200EB00020001015A00000023012012191042052012191050190000000000000000000101064446D10120121910221720121910420500000000000000000001010F1FE8EB0120121910023420121910221700000000000000000001010F182D5C0120121909471120121910015500000000000000000001010B38F2430120121909274020121909471100000000000000000001010F056DB40120121909080920121909274000000000000000000001010F0724380120121908483820121909080900000000000000000001010F0530AB0120121908290720121908483800000000000000000001010F05896C0120121908093720121908290700000000000000000001010F02CD3B0120121907500520121908093700000000000000000001010F056FEF0120121907303420121907500500000000000000000001010F043C3401201219072541201219073034000000000000000000010103C26C5F0120121907061120121907254100000000000000000001010F03F0C10120121906464220121907061100000000000000000001010F02F6330120121906271220121906464200000000000000000001010F02E43B0120121906074220121906271200000000000000000001010F033D670120121905481120121906074200000000000000000001010F088BF20120121905284120121905481100000000000000000001010F03F9FE0120121905091020121905284100000000000000000001010F05B1040120121904494020121905091000000000000000000001010F02B3540120121904301020121904494000000000000000000001010F0417B00120121904103920121904301000000000000000000001010F0538970120121903510820121904103900000000000000000001010F054E9E0120121903313820121903510800000000000000000001010F016ECB0120121903120820121903313800000000000000000001010F0333C00120121902523820121903120700000000000000000001010F029D230120121902330720121902523700000000000000000001010F0354E40120121902133720121902330700000000000000000001010F03303D0120121901540720121902133700000000000000000001010F04981E0120121901343720121901540700000000000000000001010F02AD940120121901150820121901343700000000000000000001010EFFD7CF0120121900553720121901150800000000000000000001010F07D9330120121900360720121900553700000000000000000001010F040E740C7E\n7E1205203804066657506200EC000200020120121900163320121900360700000000000000000001010F0CE4CD0120121900002220121900163300000000000000000001010C6F9E7B5D7E"; 39 | const JT808YueBiaoHexData = "7E0200405C01000000000012345678913CC400000000008C0003015198CF06C158C5000801F200E52203151206110104000716E30302000014040000000015040000000016040000000017020000180300000025040000000030011F310117EF0D49249200000049249011000003DE7E\n7E0200405C01000000000012345678913CC400000000008C0003015198CF06C158C5000801F200E52203151206110104000716E30302000014040000000015040000000016040000000017020000180300000025040000000030011F310117EF0D49249200000049249011000003DE7E"; 40 | const JT808GPS51HexData = "7e020000470412106280030233000000000000200201d365df072f15d500280000002d21091719155801040002a10f2a0200042b049203a46f520103eb06000100ce0a5730011b31010951080000000000000000ca7e"; 41 | const JT19056UpHexData = "55 7A C4 00 00 00 EB"; 42 | 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"; 43 | const JT905HexData = "7E02000023103456789012007D02000000010000000200BA7F0E07E4F11C003C002110152110100104000000640202007D01347E"; 44 | 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"; 45 | 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"; 46 | 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"; 47 | 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"; 48 | const HexTools = "68747470733a2f2f6a74746f6f6c732e736d616c6c6368692e636e\n68747470733a2f2f67707335312e636f6d2f232f6c6f67696e"; 49 | var route_state = 0; 50 | var navbarCollapse = new bootstrap.Collapse('#navbarCollapse', { 51 | toggle: false 52 | }); 53 | var carousel = new bootstrap.Carousel('#ProductCarousel', { 54 | interval: 2000, 55 | touch: false 56 | }); 57 | $("#JT808_Hex").val(JT808HexData); 58 | $("#JT809_Hex").val(JT809HexData2011); 59 | $("#JT19056_Hex").val(JT19056UpHexData); 60 | $("#JT905_Hex").val(JT905HexData); 61 | $("#JTSB_Hex").val(JTSBHexData); 62 | $("#JT1078_Hex").val(JT1078HexData); 63 | $("#HexTools").val(HexTools); 64 | 65 | window.addEventListener('load', function () { 66 | console.log('load location: ', document.location, 'state: ', event.state); 67 | var MenuTypeHash = window.location.hash; 68 | if (MenuTypeHash) { 69 | console.log(MenuTypeHash); 70 | $("#menus>li a").removeClass('active'); 71 | $("#menus>li a[menu-type=" + MenuTypeHash.substring(1) + "]").addClass('active'); 72 | $("#main>div.container").hide(); 73 | $("#main>div.container").removeClass("hide"); 74 | $(MenuTypeHash).fadeIn(); 75 | navbarCollapse.hide(); 76 | } 77 | }); 78 | 79 | /* 使用history API和监听popstate事件 */ 80 | window.addEventListener('popstate', function (event) { 81 | if (route_state == 1) { 82 | route_state = 0; 83 | return; 84 | } 85 | console.log('popstate location: ', document.location, 'state: ', event.state); 86 | var MenuTypeHash = window.location.hash; 87 | if (MenuTypeHash) { 88 | console.log(MenuTypeHash); 89 | $("#menus>li a").removeClass('active'); 90 | $("#menus>li a[menu-type=" + MenuTypeHash.substring(1) + "]").addClass('active'); 91 | $("#main>div.container").hide(); 92 | $("#main>div.container").removeClass("hide"); 93 | $(MenuTypeHash).fadeIn(); 94 | navbarCollapse.hide(); 95 | } 96 | }); 97 | 98 | $("#menus>li a").on("click", function () { 99 | route_state = 1; 100 | $("#menus>li a").removeClass('active'); 101 | $(this).addClass('active'); 102 | var currentMenuType = $(this).attr("menu-type"); 103 | // console.debug(currentMenuType); 104 | // console.debug($("#main>div.container")); 105 | $("#main>div.container").hide(); 106 | $("#main>div.container").removeClass("hide"); 107 | $("#" + currentMenuType).fadeIn(); 108 | navbarCollapse.hide(); 109 | }); 110 | 111 | $("#JT808_ProtocolType").on("change", function () { 112 | var protocolType = $(this).val(); 113 | var hexData = JT808HexData; 114 | if ("JT808_JT1078" == protocolType) { 115 | hexData = JT808JT1078HexData; 116 | } 117 | else if ("JT808_YueBiao" == protocolType) { 118 | hexData = JT808YueBiaoHexData; 119 | } 120 | else if ("JT2013Force" == protocolType) { 121 | hexData = JT8082013ForceHexData; 122 | } 123 | else if ("JT808_GPS51" == protocolType) { 124 | hexData = JT808GPS51HexData; 125 | } 126 | $("#JT808_Hex").val(hexData); 127 | $("#JT808_Hex").autoHeight(); 128 | //$("#JT809_Result").text(""); 129 | }); 130 | 131 | $("#JT809_ProtocolType").on("change", function () { 132 | var selectedValue = $(this).val(); 133 | if (selectedValue == "2011") { 134 | $("#JT809_Hex").val(JT809HexData2011); 135 | } else { 136 | $("#JT809_Hex").val(JT809HexData2019); 137 | } 138 | $("#JT809_Result").text(""); 139 | }); 140 | 141 | $("#JT809_EncryptType").on("change", function () { 142 | var selectedValue = $(this).val(); 143 | if (selectedValue == "none") { 144 | $("#JT809_Encrypt_Group").fadeOut(); 145 | } else { 146 | $("#JT809_Encrypt_Group").fadeIn(); 147 | } 148 | }); 149 | 150 | $("#JT19056_ProtocolType").on("change", function () { 151 | var selectedValue = $(this).val(); 152 | if (selectedValue == "up") { 153 | $("#JT19056_Hex").val(JT19056UpHexData); 154 | } else { 155 | $("#JT19056_Hex").val(JT19056DownHexData); 156 | } 157 | $("#JT19056_Result").text(""); 158 | }); 159 | 160 | $("#HexToolsConvert").on("click", function () { 161 | var hexLines = $("#HexTools").val().split('\n'); 162 | var hexStr = ""; 163 | if (hexLines) { 164 | for (var i = 0; i < hexLines.length; i++) { 165 | var hex = hexToString(hexLines[i]); 166 | hexStr += hex + "\n"; 167 | } 168 | } 169 | $("#HexToolsResult").val(hexStr); 170 | }); 171 | 172 | $("#HexToolsDemo").on("click", function () { 173 | $("#HexTools").val(HexTools); 174 | }); 175 | 176 | $("#HexToolsClear").on("click", function () { 177 | $("#HexTools").val(""); 178 | $("#HexToolsResult").val(""); 179 | }); 180 | 181 | $("#JT808_Parse").on("click", function () { 182 | axios.post("/JT808/Analyze", 183 | { 184 | Hex: $("#JT808_Hex").val(), 185 | ProtocolType: $("#JT808_ProtocolType").val() 186 | }).then((res) => { 187 | console.debug(res); 188 | if (res.data.Code == 200) { 189 | $('#JT808_Accordion_Result').html(""); 190 | if (res.data.Result.IsSubpackage) { 191 | if (res.data.Result.Packages) { 192 | $.each(res.data.Result.Packages, function (index, item) { 193 | var accordionHeader_content = ''; 194 | accordionHeader_content += '终端号:' + item.TerminalPhoneNo + ''; 195 | accordionHeader_content += '消息Id:' + item.MsgId + ''; 196 | accordionHeader_content += '消息流水号:' + item.MsgNum + ''; 197 | accordionHeader_content += '设备版本号:' + item.ProtocolVersion + ''; 198 | accordionHeader_content += '总分包数:' + item.PackgeCount + ''; 199 | accordionHeader_content += '当前页:' + item.PackageIndex + ''; 200 | accordionHeader_content += '数据体长度:' + item.DataLength + ''; 201 | accordionHeader_content += '是否加密:' + (item.Encrypt ? '是' : '否') + ''; 202 | var accordionHeader = '

'; 203 | var accordionBody = '
' + item.Body + '
'; 204 | var accordionItem = '
' + accordionHeader + accordionBody + '
'; 205 | $('#JT808_Accordion_Result').append(accordionItem); 206 | }); 207 | { 208 | var index = res.data.Result.Packages.length + 1; 209 | var accordionHeader = '

'; 210 | var accordionBody = '
' + res.data.Result.JsonValue + '
'; 211 | var accordionItem = '
' + accordionHeader + accordionBody + '
'; 212 | $('#JT808_Accordion_Result').append(accordionItem); 213 | } 214 | $('#JT808_Accordion_Result div.accordion-collapse').addClass('show'); 215 | } else { 216 | $('#JT808_Accordion_Result').html("处理异常,请检测对应Hex数据包"); 217 | } 218 | } else { 219 | if (res.data.Result.Packages) { 220 | $.each(res.data.Result.Packages, function (index, item) { 221 | var accordionHeader = '

'; 222 | var accordionBody = '
' + item.JsonValue + '
'; 223 | var accordionItem = '
' + accordionHeader + accordionBody + '
'; 224 | $('#JT808_Accordion_Result').append(accordionItem); 225 | }); 226 | $('#JT808_Accordion_Result div.accordion-collapse').addClass('show'); 227 | } else { 228 | $('#JT808_Accordion_Result').html("处理异常,请检测对应Hex数据包"); 229 | } 230 | } 231 | } else { 232 | $("#JT808_Accordion_Result").html(res.data.Message); 233 | } 234 | }); 235 | }); 236 | 237 | $("#JT809_Parse").on("click", function () { 238 | axios.post("/JT809/Analyze", 239 | { 240 | Hex: $("#JT809_Hex").val(), 241 | ProtocolType: $("#JT809_ProtocolType").val(), 242 | IsEncrypt: $("#JT809_EncryptType").val() == "none", 243 | M1: parseInt($("#JT809_M1_Value").val()), 244 | IA1: parseInt($("#JT809_IA1_Value").val()), 245 | IC1: parseInt($("#JT809_IC1_Value").val()), 246 | }).then((res) => { 247 | console.debug(res); 248 | if (res.data.Code == 200) { 249 | console.debug(res.data.Result.JsonValue); 250 | $("#JT809_Result").text(res.data.Result.JsonValue); 251 | } else { 252 | $("#JT809_Result").text(res.data.Message); 253 | } 254 | }); 255 | }); 256 | 257 | $("#JT19056_Parse").on("click", function () { 258 | axios.post("/JT19056/Analyze", 259 | { 260 | Hex: $("#JT19056_Hex").val(), 261 | ProtocolType: $("#JT19056_ProtocolType").val() 262 | }).then((res) => { 263 | console.debug(res); 264 | if (res.data.Code == 200) { 265 | console.debug(res.data.Result.JsonValue); 266 | $("#JT19056_Result").text(res.data.Result.JsonValue); 267 | } else { 268 | $("#JT19056_Result").text(res.data.Message); 269 | } 270 | }); 271 | }); 272 | 273 | $("#JT905_Parse").on("click", function () { 274 | axios.post("/JT905/Analyze", 275 | { 276 | Hex: $("#JT905_Hex").val() 277 | }).then((res) => { 278 | console.debug(res); 279 | if (res.data.Code == 200) { 280 | console.debug(res.data.Result.JsonValue); 281 | $("#JT905_Result").text(res.data.Result.JsonValue); 282 | } else { 283 | $("#JT905_Result").text(res.data.Message); 284 | } 285 | }); 286 | }); 287 | 288 | $("#JTSB_Parse").on("click", function () { 289 | axios.post("/JTActiveSafety/Analyze", 290 | { 291 | Hex: $("#JTSB_Hex").val() 292 | }).then((res) => { 293 | console.debug(res); 294 | if (res.data.Code == 200) { 295 | console.debug(res.data.Result.JsonValue); 296 | $("#JTSB_Result").text(res.data.Result.JsonValue); 297 | } else { 298 | $("#JTSB_Result").text(res.data.Message); 299 | } 300 | }); 301 | }); 302 | 303 | $("#JT1078_Parse").on("click", function () { 304 | axios.post("/JT1078/Analyze", 305 | { 306 | Hex: $("#JT1078_Hex").val() 307 | }).then((res) => { 308 | console.debug(res); 309 | if (res.data.Code == 200) { 310 | console.debug(res.data.Result.JsonValue); 311 | $("#JT1078_Result").text(res.data.Result.JsonValue); 312 | } else { 313 | $("#JT1078_Result").text(res.data.Message); 314 | } 315 | }); 316 | }); 317 | 318 | $("#ProductAD_GPS51").on("click", function () { 319 | window.open("https://gps51.com/#/login?username=001test&password=Aa1357", '_blank'); 320 | }); 321 | }); -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/axios@1.7.9.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(e){var r,n;function o(r,n){try{var a=e[r](n),u=a.value,s=u instanceof t;Promise.resolve(s?u.v:u).then((function(t){if(s){var n="return"===r?"return":"next";if(!u.k||t.done)return o(n,t);t=e[n](t).value}i(a.done?"return":"normal",t)}),(function(e){o("throw",e)}))}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":r.resolve({value:t,done:!0});break;case"throw":r.reject(t);break;default:r.resolve({value:t,done:!1})}(r=r.next)?o(r.key,r.arg):n=null}this._invoke=function(e,t){return new Promise((function(i,a){var u={key:e,arg:t,resolve:i,reject:a,next:null};n?n=n.next=u:(r=n=u,o(e,t))}))},"function"!=typeof e.return&&(this.return=void 0)}function t(e,t){this.v=e,this.k=t}function r(e){var r={},n=!1;function o(r,o){return n=!0,o=new Promise((function(t){t(e[r](o))})),{done:!1,value:new t(o,1)}}return r["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},r.next=function(e){return n?(n=!1,e):o("next",e)},"function"==typeof e.throw&&(r.throw=function(e){if(n)throw n=!1,e;return o("throw",e)}),"function"==typeof e.return&&(r.return=function(e){return n?(n=!1,e):o("return",e)}),r}function n(e){var t,r,n,i=2;for("undefined"!=typeof Symbol&&(r=Symbol.asyncIterator,n=Symbol.iterator);i--;){if(r&&null!=(t=e[r]))return t.call(e);if(n&&null!=(t=e[n]))return new o(t.call(e));r="@@asyncIterator",n="@@iterator"}throw new TypeError("Object is not async iterable")}function o(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return o=function(e){this.s=e,this.n=e.next},o.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var r=this.s.return;return void 0===r?Promise.resolve({value:e,done:!0}):t(r.apply(this.s,arguments))},throw:function(e){var r=this.s.return;return void 0===r?Promise.reject(e):t(r.apply(this.s,arguments))}},new o(e)}function i(e){return new t(e,0)}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(s&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),A(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;A(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:L(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}function c(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function l(t){return function(){return new e(t.apply(this,arguments))}}function p(e,t,r,n,o,i,a){try{var u=e[i](a),s=u.value}catch(e){return void r(e)}u.done?t(s):Promise.resolve(s).then(n,o)}function h(e){return function(){var t=this,r=arguments;return new Promise((function(n,o){var i=e.apply(t,r);function a(e){p(i,n,o,a,u,"next",e)}function u(e){p(i,n,o,a,u,"throw",e)}a(void 0)}))}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function v(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r2&&void 0!==arguments[2]?arguments[2]:{},i=o.allOwnKeys,a=void 0!==i&&i;if(null!=e)if("object"!==f(e)&&(e=[e]),N(e))for(r=0,n=e.length;r0;)if(t===(r=n[o]).toLowerCase())return r;return null}var Q="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Z=function(e){return!_(e)&&e!==Q};var ee,te=(ee="undefined"!=typeof Uint8Array&&j(Uint8Array),function(e){return ee&&e instanceof ee}),re=P("HTMLFormElement"),ne=function(e){var t=Object.prototype.hasOwnProperty;return function(e,r){return t.call(e,r)}}(),oe=P("RegExp"),ie=function(e,t){var r=Object.getOwnPropertyDescriptors(e),n={};$(r,(function(r,o){var i;!1!==(i=t(r,o,e))&&(n[o]=i||r)})),Object.defineProperties(e,n)},ae="abcdefghijklmnopqrstuvwxyz",ue="0123456789",se={DIGIT:ue,ALPHA:ae,ALPHA_DIGIT:ae+ae.toUpperCase()+ue};var ce,fe,le,pe,he=P("AsyncFunction"),de=(ce="function"==typeof setImmediate,fe=U(Q.postMessage),ce?setImmediate:fe?(le="axios@".concat(Math.random()),pe=[],Q.addEventListener("message",(function(e){var t=e.source,r=e.data;t===Q&&r===le&&pe.length&&pe.shift()()}),!1),function(e){pe.push(e),Q.postMessage(le,"*")}):function(e){return setTimeout(e)}),ve="undefined"!=typeof queueMicrotask?queueMicrotask.bind(Q):"undefined"!=typeof process&&process.nextTick||de,ye={isArray:N,isArrayBuffer:C,isBuffer:function(e){return null!==e&&!_(e)&&null!==e.constructor&&!_(e.constructor)&&U(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:function(e){var t;return e&&("function"==typeof FormData&&e instanceof FormData||U(e.append)&&("formdata"===(t=A(e))||"object"===t&&U(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&C(e.buffer)},isString:F,isNumber:B,isBoolean:function(e){return!0===e||!1===e},isObject:D,isPlainObject:I,isReadableStream:G,isRequest:K,isResponse:V,isHeaders:X,isUndefined:_,isDate:q,isFile:M,isBlob:z,isRegExp:oe,isFunction:U,isStream:function(e){return D(e)&&U(e.pipe)},isURLSearchParams:J,isTypedArray:te,isFileList:H,forEach:$,merge:function e(){for(var t=Z(this)&&this||{},r=t.caseless,n={},o=function(t,o){var i=r&&Y(n,o)||o;I(n[i])&&I(t)?n[i]=e(n[i],t):I(t)?n[i]=e({},t):N(t)?n[i]=t.slice():n[i]=t},i=0,a=arguments.length;i3&&void 0!==arguments[3]?arguments[3]:{},o=n.allOwnKeys;return $(t,(function(t,n){r&&U(t)?e[n]=R(t,r):e[n]=t}),{allOwnKeys:o}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,r,n){e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},toFlatObject:function(e,t,r,n){var o,i,a,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],n&&!n(a,e,t)||u[a]||(t[a]=e[a],u[a]=!0);e=!1!==r&&j(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:A,kindOfTest:P,endsWith:function(e,t,r){e=String(e),(void 0===r||r>e.length)&&(r=e.length),r-=t.length;var n=e.indexOf(t,r);return-1!==n&&n===r},toArray:function(e){if(!e)return null;if(N(e))return e;var t=e.length;if(!B(t))return null;for(var r=new Array(t);t-- >0;)r[t]=e[t];return r},forEachEntry:function(e,t){for(var r,n=(e&&e[Symbol.iterator]).call(e);(r=n.next())&&!r.done;){var o=r.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var r,n=[];null!==(r=e.exec(t));)n.push(r);return n},isHTMLForm:re,hasOwnProperty:ne,hasOwnProp:ne,reduceDescriptors:ie,freezeMethods:function(e){ie(e,(function(t,r){if(U(e)&&-1!==["arguments","caller","callee"].indexOf(r))return!1;var n=e[r];U(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+r+"'")}))}))},toObjectSet:function(e,t){var r={},n=function(e){e.forEach((function(e){r[e]=!0}))};return N(e)?n(e):n(String(e).split(t)),r},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:Y,global:Q,isContextDefined:Z,ALPHABET:se,generateString:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:16,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:se.ALPHA_DIGIT,r="",n=t.length;e--;)r+=t[Math.random()*n|0];return r},isSpecCompliantForm:function(e){return!!(e&&U(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:function(e){var t=new Array(10);return function e(r,n){if(D(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[n]=r;var o=N(r)?[]:{};return $(r,(function(t,r){var i=e(t,n+1);!_(i)&&(o[r]=i)})),t[n]=void 0,o}}return r}(e,0)},isAsyncFn:he,isThenable:function(e){return e&&(D(e)||U(e))&&U(e.then)&&U(e.catch)},setImmediate:de,asap:ve};function me(e,t,r,n,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),o&&(this.response=o,this.status=o.status?o.status:null)}ye.inherits(me,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:ye.toJSONObject(this.config),code:this.code,status:this.status}}});var be=me.prototype,ge={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){ge[e]={value:e}})),Object.defineProperties(me,ge),Object.defineProperty(be,"isAxiosError",{value:!0}),me.from=function(e,t,r,n,o,i){var a=Object.create(be);return ye.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e})),me.call(a,e.message,t,r,n,o),a.cause=e,a.name=e.name,i&&Object.assign(a,i),a};function we(e){return ye.isPlainObject(e)||ye.isArray(e)}function Ee(e){return ye.endsWith(e,"[]")?e.slice(0,-2):e}function Oe(e,t,r){return e?e.concat(t).map((function(e,t){return e=Ee(e),!r&&t?"["+e+"]":e})).join(r?".":""):t}var Se=ye.toFlatObject(ye,{},null,(function(e){return/^is[A-Z]/.test(e)}));function xe(e,t,r){if(!ye.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var n=(r=ye.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!ye.isUndefined(t[e])}))).metaTokens,o=r.visitor||c,i=r.dots,a=r.indexes,u=(r.Blob||"undefined"!=typeof Blob&&Blob)&&ye.isSpecCompliantForm(t);if(!ye.isFunction(o))throw new TypeError("visitor must be a function");function s(e){if(null===e)return"";if(ye.isDate(e))return e.toISOString();if(!u&&ye.isBlob(e))throw new me("Blob is not supported. Use a Buffer instead.");return ye.isArrayBuffer(e)||ye.isTypedArray(e)?u&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,r,o){var u=e;if(e&&!o&&"object"===f(e))if(ye.endsWith(r,"{}"))r=n?r:r.slice(0,-2),e=JSON.stringify(e);else if(ye.isArray(e)&&function(e){return ye.isArray(e)&&!e.some(we)}(e)||(ye.isFileList(e)||ye.endsWith(r,"[]"))&&(u=ye.toArray(e)))return r=Ee(r),u.forEach((function(e,n){!ye.isUndefined(e)&&null!==e&&t.append(!0===a?Oe([r],n,i):null===a?r:r+"[]",s(e))})),!1;return!!we(e)||(t.append(Oe(o,r,i),s(e)),!1)}var l=[],p=Object.assign(Se,{defaultVisitor:c,convertValue:s,isVisitable:we});if(!ye.isObject(e))throw new TypeError("data must be an object");return function e(r,n){if(!ye.isUndefined(r)){if(-1!==l.indexOf(r))throw Error("Circular reference detected in "+n.join("."));l.push(r),ye.forEach(r,(function(r,i){!0===(!(ye.isUndefined(r)||null===r)&&o.call(t,r,ye.isString(i)?i.trim():i,n,p))&&e(r,n?n.concat(i):[i])})),l.pop()}}(e),t}function Re(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Te(e,t){this._pairs=[],e&&xe(e,this,t)}var ke=Te.prototype;function je(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Ae(e,t,r){if(!t)return e;var n=r&&r.encode||je;ye.isFunction(r)&&(r={serialize:r});var o,i=r&&r.serialize;if(o=i?i(t,r):ye.isURLSearchParams(t)?t.toString():new Te(t,r).toString(n)){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+o}return e}ke.append=function(e,t){this._pairs.push([e,t])},ke.toString=function(e){var t=e?function(t){return e.call(this,t,Re)}:Re;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var Pe=function(){function e(){d(this,e),this.handlers=[]}return y(e,[{key:"use",value:function(e,t,r){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!r&&r.synchronous,runWhen:r?r.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){ye.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),Le={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ne={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Te,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},_e="undefined"!=typeof window&&"undefined"!=typeof document,Ce="object"===("undefined"==typeof navigator?"undefined":f(navigator))&&navigator||void 0,Fe=_e&&(!Ce||["ReactNative","NativeScript","NS"].indexOf(Ce.product)<0),Ue="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,Be=_e&&window.location.href||"http://localhost",De=u(u({},Object.freeze({__proto__:null,hasBrowserEnv:_e,hasStandardBrowserWebWorkerEnv:Ue,hasStandardBrowserEnv:Fe,navigator:Ce,origin:Be})),Ne);function Ie(e){function t(e,r,n,o){var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),u=o>=e.length;return i=!i&&ye.isArray(n)?n.length:i,u?(ye.hasOwnProp(n,i)?n[i]=[n[i],r]:n[i]=r,!a):(n[i]&&ye.isObject(n[i])||(n[i]=[]),t(e,r,n[i],o)&&ye.isArray(n[i])&&(n[i]=function(e){var t,r,n={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=ye.isObject(e);if(i&&ye.isHTMLForm(e)&&(e=new FormData(e)),ye.isFormData(e))return o?JSON.stringify(Ie(e)):e;if(ye.isArrayBuffer(e)||ye.isBuffer(e)||ye.isStream(e)||ye.isFile(e)||ye.isBlob(e)||ye.isReadableStream(e))return e;if(ye.isArrayBufferView(e))return e.buffer;if(ye.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return xe(e,new De.classes.URLSearchParams,Object.assign({visitor:function(e,t,r,n){return De.isNode&&ye.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((r=ye.isFileList(e))||n.indexOf("multipart/form-data")>-1){var a=this.env&&this.env.FormData;return xe(r?{"files[]":e}:e,a&&new a,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,r){if(ye.isString(e))try{return(t||JSON.parse)(e),ye.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(r||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||qe.transitional,r=t&&t.forcedJSONParsing,n="json"===this.responseType;if(ye.isResponse(e)||ye.isReadableStream(e))return e;if(e&&ye.isString(e)&&(r&&!this.responseType||n)){var o=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e)}catch(e){if(o){if("SyntaxError"===e.name)throw me.from(e,me.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:De.classes.FormData,Blob:De.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};ye.forEach(["delete","get","head","post","put","patch"],(function(e){qe.headers[e]={}}));var Me=qe,ze=ye.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),He=Symbol("internals");function Je(e){return e&&String(e).trim().toLowerCase()}function We(e){return!1===e||null==e?e:ye.isArray(e)?e.map(We):String(e)}function Ge(e,t,r,n,o){return ye.isFunction(n)?n.call(this,t,r):(o&&(t=r),ye.isString(t)?ye.isString(n)?-1!==t.indexOf(n):ye.isRegExp(n)?n.test(t):void 0:void 0)}var Ke=function(e,t){function r(e){d(this,r),e&&this.set(e)}return y(r,[{key:"set",value:function(e,t,r){var n=this;function o(e,t,r){var o=Je(t);if(!o)throw new Error("header name must be a non-empty string");var i=ye.findKey(n,o);(!i||void 0===n[i]||!0===r||void 0===r&&!1!==n[i])&&(n[i||t]=We(e))}var i=function(e,t){return ye.forEach(e,(function(e,r){return o(e,r,t)}))};if(ye.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(ye.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i(function(e){var t,r,n,o={};return e&&e.split("\n").forEach((function(e){n=e.indexOf(":"),t=e.substring(0,n).trim().toLowerCase(),r=e.substring(n+1).trim(),!t||o[t]&&ze[t]||("set-cookie"===t?o[t]?o[t].push(r):o[t]=[r]:o[t]=o[t]?o[t]+", "+r:r)})),o}(e),t);else if(ye.isHeaders(e)){var a,u=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=O(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){u=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(e.entries());try{for(u.s();!(a=u.n()).done;){var s=b(a.value,2),c=s[0];o(s[1],c,r)}}catch(e){u.e(e)}finally{u.f()}}else null!=e&&o(t,e,r);return this}},{key:"get",value:function(e,t){if(e=Je(e)){var r=ye.findKey(this,e);if(r){var n=this[r];if(!t)return n;if(!0===t)return function(e){for(var t,r=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=n.exec(e);)r[t[1]]=t[2];return r}(n);if(ye.isFunction(t))return t.call(this,n,r);if(ye.isRegExp(t))return t.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=Je(e)){var r=ye.findKey(this,e);return!(!r||void 0===this[r]||t&&!Ge(0,this[r],r,t))}return!1}},{key:"delete",value:function(e,t){var r=this,n=!1;function o(e){if(e=Je(e)){var o=ye.findKey(r,e);!o||t&&!Ge(0,r[o],o,t)||(delete r[o],n=!0)}}return ye.isArray(e)?e.forEach(o):o(e),n}},{key:"clear",value:function(e){for(var t=Object.keys(this),r=t.length,n=!1;r--;){var o=t[r];e&&!Ge(0,this[o],o,e,!0)||(delete this[o],n=!0)}return n}},{key:"normalize",value:function(e){var t=this,r={};return ye.forEach(this,(function(n,o){var i=ye.findKey(r,o);if(i)return t[i]=We(n),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=We(n),r[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,r=new Array(t),n=0;n1?r-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,r=null,n&&(clearTimeout(n),n=null),e.apply(null,t)};return[function(){for(var e=Date.now(),t=e-o,u=arguments.length,s=new Array(u),c=0;c=i?a(s,e):(r=s,n||(n=setTimeout((function(){n=null,a(r)}),i-t)))},function(){return r&&a(r)}]}ye.inherits(Ye,me,{__CANCEL__:!0});var tt=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,n=0,o=Ze(50,250);return et((function(r){var i=r.loaded,a=r.lengthComputable?r.total:void 0,u=i-n,s=o(u);n=i;var c=m({loaded:i,total:a,progress:a?i/a:void 0,bytes:u,rate:s||void 0,estimated:s&&a&&i<=a?(a-i)/s:void 0,event:r,lengthComputable:null!=a},t?"download":"upload",!0);e(c)}),r)},rt=function(e,t){var r=null!=e;return[function(n){return t[0]({lengthComputable:r,total:e,loaded:n})},t[1]]},nt=function(e){return function(){for(var t=arguments.length,r=new Array(t),n=0;n1?t-1:0),n=1;n1?"since :\n"+u.map(At).join("\n"):" "+At(u[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return r};function Nt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ye(null,e)}function _t(e){return Nt(e),e.headers=Ve.from(e.headers),e.data=Xe.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Lt(e.adapter||Me.adapter)(e).then((function(t){return Nt(e),t.data=Xe.call(e,e.transformResponse,t),t.headers=Ve.from(t.headers),t}),(function(t){return $e(t)||(Nt(e),t&&t.response&&(t.response.data=Xe.call(e,e.transformResponse,t.response),t.response.headers=Ve.from(t.response.headers))),Promise.reject(t)}))}var Ct="1.7.9",Ft={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Ft[e]=function(r){return f(r)===e||"a"+(t<1?"n ":" ")+e}}));var Ut={};Ft.transitional=function(e,t,r){function n(e,t){return"[Axios v1.7.9] Transitional option '"+e+"'"+t+(r?". "+r:"")}return function(r,o,i){if(!1===e)throw new me(n(o," has been removed"+(t?" in "+t:"")),me.ERR_DEPRECATED);return t&&!Ut[o]&&(Ut[o]=!0,console.warn(n(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(r,o,i)}},Ft.spelling=function(e){return function(t,r){return console.warn("".concat(r," is likely a misspelling of ").concat(e)),!0}};var Bt={assertOptions:function(e,t,r){if("object"!==f(e))throw new me("options must be an object",me.ERR_BAD_OPTION_VALUE);for(var n=Object.keys(e),o=n.length;o-- >0;){var i=n[o],a=t[i];if(a){var u=e[i],s=void 0===u||a(u,i,e);if(!0!==s)throw new me("option "+i+" must be "+s,me.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new me("Unknown option "+i,me.ERR_BAD_OPTION)}},validators:Ft},Dt=Bt.validators,It=function(){function e(t){d(this,e),this.defaults=t,this.interceptors={request:new Pe,response:new Pe}}var t;return y(e,[{key:"request",value:(t=h(s().mark((function e(t,r){var n,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this._request(t,r);case 3:return e.abrupt("return",e.sent);case 6:if(e.prev=6,e.t0=e.catch(0),e.t0 instanceof Error){n={},Error.captureStackTrace?Error.captureStackTrace(n):n=new Error,o=n.stack?n.stack.replace(/^.+\n/,""):"";try{e.t0.stack?o&&!String(e.t0.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(e.t0.stack+="\n"+o):e.t0.stack=o}catch(e){}}throw e.t0;case 10:case"end":return e.stop()}}),e,this,[[0,6]])}))),function(e,r){return t.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var r=t=st(this.defaults,t),n=r.transitional,o=r.paramsSerializer,i=r.headers;void 0!==n&&Bt.assertOptions(n,{silentJSONParsing:Dt.transitional(Dt.boolean),forcedJSONParsing:Dt.transitional(Dt.boolean),clarifyTimeoutError:Dt.transitional(Dt.boolean)},!1),null!=o&&(ye.isFunction(o)?t.paramsSerializer={serialize:o}:Bt.assertOptions(o,{encode:Dt.function,serialize:Dt.function},!0)),Bt.assertOptions(t,{baseUrl:Dt.spelling("baseURL"),withXsrfToken:Dt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&ye.merge(i.common,i[t.method]);i&&ye.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete i[e]})),t.headers=Ve.concat(a,i);var u=[],s=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(s=s&&e.synchronous,u.unshift(e.fulfilled,e.rejected))}));var c,f=[];this.interceptors.response.forEach((function(e){f.push(e.fulfilled,e.rejected)}));var l,p=0;if(!s){var h=[_t.bind(this),void 0];for(h.unshift.apply(h,u),h.push.apply(h,f),l=h.length,c=Promise.resolve(t);p0;)n._listeners[t](e);n._listeners=null}})),this.promise.then=function(e){var t,r=new Promise((function(e){n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},t((function(e,t,o){n.reason||(n.reason=new Ye(e,t,o),r(n.reason))}))}return y(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,r=function(e){t.abort(e)};return this.subscribe(r),t.signal.unsubscribe=function(){return e.unsubscribe(r)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}(),zt=Mt;var Ht={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ht).forEach((function(e){var t=b(e,2),r=t[0],n=t[1];Ht[n]=r}));var Jt=Ht;var Wt=function e(t){var r=new qt(t),n=R(qt.prototype.request,r);return ye.extend(n,qt.prototype,r,{allOwnKeys:!0}),ye.extend(n,r,null,{allOwnKeys:!0}),n.create=function(r){return e(st(t,r))},n}(Me);return Wt.Axios=qt,Wt.CanceledError=Ye,Wt.CancelToken=zt,Wt.isCancel=$e,Wt.VERSION=Ct,Wt.toFormData=xe,Wt.AxiosError=me,Wt.Cancel=Wt.CanceledError,Wt.all=function(e){return Promise.all(e)},Wt.spread=function(e){return function(t){return e.apply(null,t)}},Wt.isAxiosError=function(e){return ye.isObject(e)&&!0===e.isAxiosError},Wt.mergeConfig=st,Wt.AxiosHeaders=Ve,Wt.formToJSON=function(e){return Ie(ye.isHTMLForm(e)?new FormData(e):e)},Wt.getAdapter=Lt,Wt.HttpStatusCode=Jt,Wt.default=Wt,Wt})); 2 | //# sourceMappingURL=axios.min.js.map -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/bootstrap-icons/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/lib/bootstrap-icons/.DS_Store -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/lib/bootstrap-icons/fonts/bootstrap-icons.woff2 -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/bootstrap/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2011-2021 Twitter, Inc. 4 | Copyright (c) 2011-2021 The Bootstrap Authors 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/bootstrap/dist/css/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SmallChi/JTTools/86bdd584aa9ae1ea6674243e490756a5168a1778/src/JTTools/wwwroot/lib/bootstrap/dist/css/.DS_Store -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/clipboard@2.0.11.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.11 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function (t, e) { "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.ClipboardJS = e() : t.ClipboardJS = e() }(this, function () { return n = { 686: function (t, e, n) { "use strict"; n.d(e, { default: function () { return b } }); var e = n(279), i = n.n(e), e = n(370), u = n.n(e), e = n(817), r = n.n(e); function c(t) { try { return document.execCommand(t) } catch (t) { return } } var a = function (t) { t = r()(t); return c("cut"), t }; function o(t, e) { var n, o, t = (n = t, o = "rtl" === document.documentElement.getAttribute("dir"), (t = document.createElement("textarea")).style.fontSize = "12pt", t.style.border = "0", t.style.padding = "0", t.style.margin = "0", t.style.position = "absolute", t.style[o ? "right" : "left"] = "-9999px", o = window.pageYOffset || document.documentElement.scrollTop, t.style.top = "".concat(o, "px"), t.setAttribute("readonly", ""), t.value = n, t); return e.container.appendChild(t), e = r()(t), c("copy"), t.remove(), e } var f = function (t) { var e = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : { container: document.body }, n = ""; return "string" == typeof t ? n = o(t, e) : t instanceof HTMLInputElement && !["text", "search", "url", "tel", "password"].includes(null == t ? void 0 : t.type) ? n = o(t.value, e) : (n = r()(t), c("copy")), n }; function l(t) { return (l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t })(t) } var s = function () { var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}, e = t.action, n = void 0 === e ? "copy" : e, o = t.container, e = t.target, t = t.text; if ("copy" !== n && "cut" !== n) throw new Error('Invalid "action" value, use either "copy" or "cut"'); if (void 0 !== e) { if (!e || "object" !== l(e) || 1 !== e.nodeType) throw new Error('Invalid "target" value, use a valid Element'); if ("copy" === n && e.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); if ("cut" === n && (e.hasAttribute("readonly") || e.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes') } return t ? f(t, { container: o }) : e ? "cut" === n ? a(e) : f(e, { container: o }) : void 0 }; function p(t) { return (p = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t })(t) } function d(t, e) { for (var n = 0; n < e.length; n++) { var o = e[n]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o) } } function y(t, e) { return (y = Object.setPrototypeOf || function (t, e) { return t.__proto__ = e, t })(t, e) } function h(n) { var o = function () { if ("undefined" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if ("function" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], function () { })), !0 } catch (t) { return !1 } }(); return function () { var t, e = v(n); return t = o ? (t = v(this).constructor, Reflect.construct(e, arguments, t)) : e.apply(this, arguments), e = this, !(t = t) || "object" !== p(t) && "function" != typeof t ? function (t) { if (void 0 !== t) return t; throw new ReferenceError("this hasn't been initialised - super() hasn't been called") }(e) : t } } function v(t) { return (v = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { return t.__proto__ || Object.getPrototypeOf(t) })(t) } function m(t, e) { t = "data-clipboard-".concat(t); if (e.hasAttribute(t)) return e.getAttribute(t) } var b = function () { !function (t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), e && y(t, e) }(r, i()); var t, e, n, o = h(r); function r(t, e) { var n; return function (t) { if (!(t instanceof r)) throw new TypeError("Cannot call a class as a function") }(this), (n = o.call(this)).resolveOptions(e), n.listenClick(t), n } return t = r, n = [{ key: "copy", value: function (t) { var e = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : { container: document.body }; return f(t, e) } }, { key: "cut", value: function (t) { return a(t) } }, { key: "isSupported", value: function () { var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], t = "string" == typeof t ? [t] : t, e = !!document.queryCommandSupported; return t.forEach(function (t) { e = e && !!document.queryCommandSupported(t) }), e } }], (e = [{ key: "resolveOptions", value: function () { var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; this.action = "function" == typeof t.action ? t.action : this.defaultAction, this.target = "function" == typeof t.target ? t.target : this.defaultTarget, this.text = "function" == typeof t.text ? t.text : this.defaultText, this.container = "object" === p(t.container) ? t.container : document.body } }, { key: "listenClick", value: function (t) { var e = this; this.listener = u()(t, "click", function (t) { return e.onClick(t) }) } }, { key: "onClick", value: function (t) { var e = t.delegateTarget || t.currentTarget, n = this.action(e) || "copy", t = s({ action: n, container: this.container, target: this.target(e), text: this.text(e) }); this.emit(t ? "success" : "error", { action: n, text: t, trigger: e, clearSelection: function () { e && e.focus(), window.getSelection().removeAllRanges() } }) } }, { key: "defaultAction", value: function (t) { return m("action", t) } }, { key: "defaultTarget", value: function (t) { t = m("target", t); if (t) return document.querySelector(t) } }, { key: "defaultText", value: function (t) { return m("text", t) } }, { key: "destroy", value: function () { this.listener.destroy() } }]) && d(t.prototype, e), n && d(t, n), r }() }, 828: function (t) { var e; "undefined" == typeof Element || Element.prototype.matches || ((e = Element.prototype).matches = e.matchesSelector || e.mozMatchesSelector || e.msMatchesSelector || e.oMatchesSelector || e.webkitMatchesSelector), t.exports = function (t, e) { for (; t && 9 !== t.nodeType;) { if ("function" == typeof t.matches && t.matches(e)) return t; t = t.parentNode } } }, 438: function (t, e, n) { var u = n(828); function i(t, e, n, o, r) { var i = function (e, n, t, o) { return function (t) { t.delegateTarget = u(t.target, n), t.delegateTarget && o.call(e, t) } }.apply(this, arguments); return t.addEventListener(n, i, r), { destroy: function () { t.removeEventListener(n, i, r) } } } t.exports = function (t, e, n, o, r) { return "function" == typeof t.addEventListener ? i.apply(null, arguments) : "function" == typeof n ? i.bind(null, document).apply(null, arguments) : ("string" == typeof t && (t = document.querySelectorAll(t)), Array.prototype.map.call(t, function (t) { return i(t, e, n, o, r) })) } }, 879: function (t, n) { n.node = function (t) { return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType }, n.nodeList = function (t) { var e = Object.prototype.toString.call(t); return void 0 !== t && ("[object NodeList]" === e || "[object HTMLCollection]" === e) && "length" in t && (0 === t.length || n.node(t[0])) }, n.string = function (t) { return "string" == typeof t || t instanceof String }, n.fn = function (t) { return "[object Function]" === Object.prototype.toString.call(t) } }, 370: function (t, e, n) { var f = n(879), l = n(438); t.exports = function (t, e, n) { if (!t && !e && !n) throw new Error("Missing required arguments"); if (!f.string(e)) throw new TypeError("Second argument must be a String"); if (!f.fn(n)) throw new TypeError("Third argument must be a Function"); if (f.node(t)) return c = e, a = n, (u = t).addEventListener(c, a), { destroy: function () { u.removeEventListener(c, a) } }; if (f.nodeList(t)) return o = t, r = e, i = n, Array.prototype.forEach.call(o, function (t) { t.addEventListener(r, i) }), { destroy: function () { Array.prototype.forEach.call(o, function (t) { t.removeEventListener(r, i) }) } }; if (f.string(t)) return t = t, e = e, n = n, l(document.body, t, e, n); throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); var o, r, i, u, c, a } }, 817: function (t) { t.exports = function (t) { var e, n = "SELECT" === t.nodeName ? (t.focus(), t.value) : "INPUT" === t.nodeName || "TEXTAREA" === t.nodeName ? ((e = t.hasAttribute("readonly")) || t.setAttribute("readonly", ""), t.select(), t.setSelectionRange(0, t.value.length), e || t.removeAttribute("readonly"), t.value) : (t.hasAttribute("contenteditable") && t.focus(), n = window.getSelection(), (e = document.createRange()).selectNodeContents(t), n.removeAllRanges(), n.addRange(e), n.toString()); return n } }, 279: function (t) { function e() { } e.prototype = { on: function (t, e, n) { var o = this.e || (this.e = {}); return (o[t] || (o[t] = [])).push({ fn: e, ctx: n }), this }, once: function (t, e, n) { var o = this; function r() { o.off(t, r), e.apply(n, arguments) } return r._ = e, this.on(t, r, n) }, emit: function (t) { for (var e = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[t] || []).slice(), o = 0, r = n.length; o < r; o++)n[o].fn.apply(n[o].ctx, e); return this }, off: function (t, e) { var n = this.e || (this.e = {}), o = n[t], r = []; if (o && e) for (var i = 0, u = o.length; i < u; i++)o[i].fn !== e && o[i].fn._ !== e && r.push(o[i]); return r.length ? n[t] = r : delete n[t], this } }, t.exports = e, t.exports.TinyEmitter = e } }, r = {}, o.n = function (t) { var e = t && t.__esModule ? function () { return t.default } : function () { return t }; return o.d(e, { a: e }), e }, o.d = function (t, e) { for (var n in e) o.o(e, n) && !o.o(t, n) && Object.defineProperty(t, n, { enumerable: !0, get: e[n] }) }, o.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, o(686).default; function o(t) { if (r[t]) return r[t].exports; var e = r[t] = { exports: {} }; return n[t](e, e.exports, o), e.exports } var n, r }); -------------------------------------------------------------------------------- /src/JTTools/wwwroot/lib/jquery/LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Copyright OpenJS Foundation and other contributors, https://openjsf.org/ 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /src/global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "9.0.201" 4 | } 5 | } -------------------------------------------------------------------------------- /src/publish_linux-x64.txt: -------------------------------------------------------------------------------- 1 | dotnet publish ./JTTools/JTTools.csproj -c Release -o .output -r linux-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true -p:IncludeNativeLibrariesForSelfExtract=true -------------------------------------------------------------------------------- /src/publish_win-x64.txt: -------------------------------------------------------------------------------- 1 | dotnet publish ./JTTools/JTTools.csproj -c Release -o .output -r win-x64 -p:PublishSingleFile=true -p:PublishTrimmed=true -p:IncludeNativeLibrariesForSelfExtract=true --------------------------------------------------------------------------------