Coder Social home page Coder Social logo

smallchi / jt808 Goto Github PK

View Code? Open in Web Editor NEW
512.0 512.0 246.0 5.85 MB

JT/T808 protocol,JT808 protocol, GB808 protocol (support 2011, 2013, 2019 version) JT/T808协议、JT808协议、GB808协议(支持2011、2013、2019版本)

License: MIT License

C# 99.98% Batchfile 0.02%
1078 808 csharp dotnet dotnetcore gb19056 gb808 gps jt1078 jt19056 jt808 jtt19056 jtt808 net7 net8 tracker

jt808's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jt808's Issues

请问有无兼容Framework4.6.2的版本呢

我需要在Unity端使用此SDK

编译为NET462时,应该是System.Text.Encoding.CodePages版本太高不行

然后我又将System.Text.Encoding.CodePages版本降低到了4.6.0

使用net462编译依然不过

JT808MessagePackReader decode中为什么还要产生一个Span<byte> allocateBuffer呢

JT808MessagePackReader decode中为什么还要产生一个Span allocateBuffer呢,直接读SrcBuffer不是更能减少一次内存分配吗,

/// <summary> /// 在解码的时候把校验和也计算出来,避免在循环一次进行校验 /// </summary> /// <returns></returns> public void Decode(Span<byte> allocateBuffer) { int i = 0; int offset = 0; int len = SrcBuffer.Length; _realCheckXorCode = 0; allocateBuffer[offset++] = SrcBuffer[0]; // 取出校验码看是否需要转义 ReadOnlySpan<byte> checkCodeBufferSpan = SrcBuffer.Slice(len - 3,2); int checkCodeLen = 1; if (checkCodeBufferSpan.SequenceEqual(decode7d01)) { _realCheckXorCode = 0x7d; checkCodeLen += 1; } else if (checkCodeBufferSpan.SequenceEqual(decode7d02)) { _realCheckXorCode = 0x7e; checkCodeLen += 1; } else { _realCheckXorCode = checkCodeBufferSpan[1]; } len = len - checkCodeLen - 1 - 1; ReadOnlySpan<byte> tmpBufferSpan = SrcBuffer.Slice(1, len); while (i < len) { if (tmpBufferSpan[i] == 0x7d) { if (len > i + 1) { if (tmpBufferSpan[i + 1] == 0x01) { allocateBuffer[offset++] = 0x7d; _calculateCheckXorCode = (byte)(_calculateCheckXorCode ^ 0x7d); i++; } else if (tmpBufferSpan[i + 1] == 0x02) { allocateBuffer[offset++] = 0x7e; _calculateCheckXorCode = (byte)(_calculateCheckXorCode ^ 0x7e); i++; } else { allocateBuffer[offset++] = tmpBufferSpan[i]; _calculateCheckXorCode = (byte)(_calculateCheckXorCode ^ tmpBufferSpan[i]); } } } else { allocateBuffer[offset++] = tmpBufferSpan[i]; _calculateCheckXorCode = (byte)(_calculateCheckXorCode ^ tmpBufferSpan[i]); } i++; } allocateBuffer[offset++] = _realCheckXorCode; allocateBuffer[offset++] = SrcBuffer[SrcBuffer.Length- 1]; _checkXorCodeVali = (_calculateCheckXorCode == _realCheckXorCode); Reader = allocateBuffer.Slice(0, offset); _decoded = true; }

改成以下不是更好吗

public void Decode() { int i = 0; int len = Reader.Length; // 取出校验码 ReadOnlySpan<byte> checkCodeBufferSpan = Reader.Slice(len - 3, 2); _realCheckXorCode =BinaryPrimitives.ReadUInt16LittleEndian(checkCodeBufferSpan); int checkCodeLen = 2; len = len - checkCodeLen; ReadOnlySpan<byte> tmpBufferSpan = Reader.Slice(0, len); _calculateCheckXorCode = CRC.CalcBufferDataCrc161(tmpBufferSpan); _checkXorCodeVali = (_calculateCheckXorCode == _realCheckXorCode); //Reader = allocateBuffer.Slice(0, offset); _decoded = true; }

JT808MessagePackWriter.WriteChar

public void WriteChar(in char value)
{
    var span = writer.Free;
    span[0] = (byte)value;
    writer.Advance(1);
}

char 占两个字节吧,对于非 ASCII 字符,如汉字,是不是会有问题?

答应数据 分包的问题

/// <summary>
///     请求注册的二维码
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public byte[] Msg0xE003(JT808HeaderPackage request, IJT808Session session)
{
    if (request.Bodies == null)
    {
        logger.LogError("数据体为空");
        return default;
    }


  //   下面的 ImageData  是 一个 100多K 的 图像的数据  我自定义的 MsgId

    var splitPackage = JT808Config.SplitPackageStrategy.Processor(ImageData).ToList();
    ushort packgeCount = (ushort)splitPackage.Count();
    List<string> hexs = new List<string>();
    for (ushort i = 1; i <= packgeCount; i++)
    {
        JT808Package package = new JT808Package
        {
            Header = new JT808Header
            {
                MsgId = 0xF003,
                ManualMsgNum = request.Header.MsgNum,
                TerminalPhoneNo = request.Header.TerminalPhoneNo,
                MessageBodyProperty = new JT808HeaderMessageBodyProperty()
                {
                    IsPackage = true,
                },
                PackgeCount = packgeCount,
                PackageIndex = i
            },
            SubDataBodies = splitPackage[i - 1].Data
        };
        var hex = JT808Serializer.Serialize(package, request.Version).ToHexString();
        hexs.Add(hex);
    }

    foreach (var s in hexs)
    {
        session.SendAsync(s.ToHexBytes());

// 如果 我这里不加上线程的休息 会导致 客户端 收不到全部的数据
global::System.Threading.Thread.Sleep(200);
}

    return default;
}

我觉得这个 Sleep 不是很合理 ,有没有 更好的方法呢!!

文档

您好,您的这个开源项目太赞了,请问哪里有接口使用文档呢。

请教问题

消息体属性里面的消息长度是否包括转义处理0x01 和0x02

如何持续不断的从服务端接收数据?

感谢您提供的封装实现,目前用来向服务端发送数据效果很好。
但是目前没有看到在哪里处理来自服务端的消息?主要是两个需求:
1、需要根据服务端回复确认消息是否发送成功,是否需要重传
2、服务端会主动推送一些指令给客户端,比如远程控车这种指令,这就需要客户端持续不断的监听Socket去读取数据。

请问以上两点,在您的项目里是如何实现的,特别是第二点。

Support for use the project

Hey, congratulations on this really nice project!

Currently, as a studying practice, I'm trying to develop a python parser for JT808. I do not have experience with dotnet platform, but I would like to use this project as a result comparison.

VSCode had added a dockerfile and docker compose for the project, but I was only able to execute docker-compose up after change the file src/JT808.Protocol/JT808.Protocol.csproj to add the following inside Project > PropertyGroup:

<TargetFramework>net8.0</TargetFramework>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>

Still, I'm getting the following error when I execute docker compose up:

Unhandled exception. System.MissingMethodException: Entry point not found in assembly 'JT808.Protocol, Version=2.6.4.0, Culture=neutral, PublicKeyToken=null'.

Can someone help me with some tips on how to use this project?

generated src/JT808.Protocol/Dockerfile

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app

USER app
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG configuration=Release
WORKDIR /src
COPY ["src/JT808.Protocol/JT808.Protocol.csproj", "src/JT808.Protocol/"]
RUN dotnet restore "src/JT808.Protocol/JT808.Protocol.csproj"
COPY . .
WORKDIR "/src/src/JT808.Protocol"
RUN dotnet build "JT808.Protocol.csproj" -c $configuration -o /app/build

FROM build AS publish
ARG configuration=Release
RUN dotnet publish "JT808.Protocol.csproj" -c $configuration -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "JT808.Protocol.dll"]

generated docker-compose.yml

version: '3.4'

services:
  jt808protocol:
    image: jt808protocol
    build:
      context: .
      dockerfile: src/JT808.Protocol/Dockerfile

关于某些消息的位操作的疑问

用2011的车辆控制消息做例子:
7e85000001013512344321303901fc7e
JTTOOL解析的部分结果:
"数据体对象": {
"车辆控制": "01",
"[01]控制标志": 1,
"控制标志对象[00000001]": {
"[bit1~bit7]保留": "0000001",
"[bit0]": "车门解锁"
}
},

按照协议文档,控制标志的bit0的值: 0为车门解锁 ; 1为车门加锁
上面消息解析后的控制标志为: [00000001]
按我的理解,一个字节位的对应关系应该如下:
bit: 7 6 5 4 3 2 1 0
[0 0 0 0 0 0 0 1]
这样bit0的值为1,应为车门加锁。

但项目中协议分析部分的代码并不是我理解的样子。而是如下:
bit: 0 1 2 3 4 5 6 7
[0 0 0 0 0 0 0 1]
这样bit0的值为0,为车门解锁。和JTTool的解析相符。

还有几条涉及到位操作的协议也是如此。 请问是我的理解有误,还是这是项目的BUG

JT808序列化部分的问题

JT808序列化只支持2013版本, 版本选择没用
`
byte[] data = JT808Serializer.Serialize(jT808Package, JT808Version.JTT2013);
byte[] data = JT808Serializer.Serialize(jT808Package, JT808Version.JTT2019);// 和2013版本结果一样

var hex = data.ToHexString();
//"7E020000261234567890120001000000010000000200BA7F0E07E4F11C0028003C00001810151010100104000000640202007D016C7E"
Assert.Equal("7E02000026123456789012007D02000000010000000200BA7F0E07E4F11C0028003C00001810151010100104000000640202007D01137E", hex);
`

JT808Serializer().HeaderDeserialize()解包头异常

JT808Serializer().HeaderDeserialize()在解析自己组装的2019包时,Header解析错误,采用JT808Serializer().Deserialize()解析正常

JT808Serializer().HeaderDeserialize()解析设备的2019包时,正常

8103设置终端参数解析有误

  1. JT808_0x8103_Factory中没有添加JT808_0x8103_0x0032,导致0x0032参数不能解析

  2. 0x0110参数解析有问题,报异常了。
    测试数据:7E8103000e0135123443213039010000011008ffffffffffffffffed7E
    body部分为: 010000011008ffffffffffffffff 其中01为参数个数, 00000110为参数ID, 08为参数长度8字节,ffffffffffffffff为8字节参数值
    异常:
    at System.Text.Json.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource, Int32 currentDepth, Byte token, JsonTokenType tokenType) at System.Text.Json.Utf8JsonWriter.WriteStringEscapePropertyOrValue(ReadOnlySpan1 propertyName, ReadOnlySpan1 value, Int32 firstEscapeIndexProp, Int32 firstEscapeIndexVal) at System.Text.Json.Utf8JsonWriter.WriteStringEscape(ReadOnlySpan1 propertyName, ReadOnlySpan1 value) at System.Text.Json.Utf8JsonWriter.WriteString(ReadOnlySpan1 propertyName, ReadOnlySpan1 value) at System.Text.Json.Utf8JsonWriter.WriteString(String propertyName, String value) at JT808.Protocol.JT808Package.Analyze(JT808MessagePackReader& reader, Utf8JsonWriter writer, IJT808Config config) at JT808.Protocol.JT808Serializer.Analyze(ReadOnlySpan`1 bytes, JT808Version version, JsonWriterOptions options, Int32 minBufferSize) at JTTools.Pages.JT808Analyze.Query() in D:\MyProject\JTTools\src\JTTools\Pages\JT808Analyze.razor:line 111

获取轨迹数据的需要适配哪个消息?

请教个问题哈
服务端要获取轨迹数据的话,是适配位置信息汇报【0200】,还是定位数据批量上报【0704】?还是需要同时适配处理?这两种消息上报上来位置数据有什么差别? @SmallChi

文档编写错误

文档举个栗子1

  • 笔误1
`MsgId = Enums.JT808MsgId._0x0200`

应改为 `(ushort)JT808.Protocol.Enums.JT808MsgId._0x0200`
  • 笔误2
`byte[] data = JT808Serializer.Serialize(jT808Package);`

应改为 `byte[] data = JT808Serializer.Instance.Serialize(jT808Package);`

JT/T808-2019版本中0x0200附加信息缺失

问题:
1.附加信息:JT808Constants类中0x05、0x06常量缺失
2.附加信息:JT808_0x0200_0x06类中AttachInfoId默认值错误
3.附加信息:JT808_0x0200_0x05类中胎压使用String错误,过检无法识别,改为string->byte[30]即可

自定义协议

自定义协议的body怎么填呢,重新继承JT808Bodies吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.