还是个学生 2022-04-22 15:00 采纳率: 50%
浏览 76
已结题

C# Socket tcp请求,怎么按照别人文档发送数据包??

第一次对接单片机,怎么按照文档描述下达指令?

img

我直接发送文档给的例子没有效果,但我保证自己写的客户端是能够与服务端通信的我自己写了一个demo;我感觉就是没按照格式发送才导致这样的结果,请问怎么发送文档描述的格式来请求?麻烦写一个请求的例子!!

img

  • 写回答

2条回答 默认 最新

  • wanghui0380 2022-04-22 17:10
    关注

    随手写一个,环境net4.62
    库:System.Buffers ,如果没有请nuget

    public class XXProtocol
    {
        private static int PackageIndex = 0;
        private static readonly object lockobj = new object();
        /// <summary>
        /// 因为是展示我也不打算给这个协议封啥对象了,单纯
        /// 就事论事写个编码方法,参数也是就事论事的这么写
        /// </summary>
        /// <param name="packagetype"></param>
        /// <param name="json"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static ReadOnlySpan<byte> Encode(int packagetype, string json, Encoding encoding)
        {
    
            json = json.ToLower();
            var databuffer = encoding.GetBytes(json);
            var datalength = databuffer.Length;
            var buffer = new byte[datalength + 8];
            using (MemoryStream ms = new MemoryStream(buffer))
            {
                using (BinaryWriter writer = new BinaryWriter(ms))
                {
                    writer.Write('V');
                    writer.Write('Z');
                    writer.Write((byte)packagetype);
    
                    lock (lockobj)
                    {
                        PackageIndex = PackageIndex & 0xff;
                        byte index = (byte)PackageIndex;
                        writer.Write(index);
    
                        PackageIndex++;
                    } 
                    //先跳过数据区长度,后面直接写
                    ms.Seek(4, SeekOrigin.Current);
                    writer.Write(databuffer);
                 
                }
            }
    
            //这个数据长度我就直接网buffer写把
            var buffer1 = buffer.AsSpan(4);
            System.Buffers.Binary.BinaryPrimitives.WriteInt32BigEndian(buffer1, datalength);
            return buffer;
    
    
    
        }
    
    }
    
    

    虽然代码很多,但是也没啥核心代码,填充byte[]的手段也很多,我只是随便挑了一个writer,你明白意思就号
    里面其实就只有3个地方需要说明
    1.json不知道编码,一般是utf8,但是谁知道对方怎么想,所以编码你需要询问对方
    2.包索引序号,也没啥可说的,只是注意需要使用原子类操作
    3.数据区长度,按文档就是uint32的大端字节方式,这里我直接用int32理论也无问题,反正文档说了他也不认过大数(我估计他也不认小于0的数)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加