JT808 icon indicating copy to clipboard operation
JT808 copied to clipboard

答应数据 分包的问题

Open leida1983 opened this issue 1 year ago • 3 comments

/// <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 不是很合理 ,有没有 更好的方法呢!!

leida1983 avatar Feb 21 '24 15:02 leida1983

这个跟编码没有关系吧,是不是设备端处理的方式有问题呢,没有处理连包问题?

SmallChi avatar Feb 23 '24 01:02 SmallChi

不知道是不是太大了 100k的 分成100多个包 中间偶发 包会解析失败

回到前面问题 调用的时候返回多包 您是怎么写的啊 愿意付费 咨询 但是你们qq没人

leida1983 avatar Feb 24 '24 03:02 leida1983

  • 如果 我这里不加上线程的休息 会导致 客户端 收不到全部的数据

    这是客户端问题,与你无关

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

    移除相关代码,让客户端自己排查

  • 不知道是不是太大了 100k的 分成100多个包 中间偶发 包会解析失败

    与数据大小无关,与分包数量无关,同上让客户端自己排查

  • 调用的时候返回多包 您是怎么写的

    这个需要根据实际情况而定,没有固定的写法,也没有所谓的模板,因为这与业务挂钩

大致看了下你的代码,可能你对协议文档或者808机制不熟,稍微调整了下,伪代码如下

        public List<byte[]> AutoSplitPackage(string simNumber, byte[] data, IJT808Config config)
        {
            var splitPackage = config.SplitPackageStrategy.Processor(data).ToList();
            var result = new List<byte[]>();
            for (ushort i = 1, packgeCount = (ushort)splitPackage.Count; i <= packgeCount; i++)
            {
                var package = new JT808Package
                {
                    Header = new JT808Header
                    {
                        MsgId = 0xF003,
                        TerminalPhoneNo = simNumber,
                        MessageBodyProperty = new JT808HeaderMessageBodyProperty()
                        {
                            IsPackage = true,
                        },
                        PackgeCount = packgeCount,
                        PackageIndex = i
                    },
                    SubDataBodies = splitPackage[i - 1].Data
                };
                result.Add(config.GetSerializer().Serialize(package));
            }
            return result;
        }

yedajiang44 avatar Feb 24 '24 05:02 yedajiang44