您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE ASP.NET WebRTC
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网 element-plus 图标
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
GPS定位系统-MVC
.NET6.0 GPS定位系统介绍(物联网) 系列源码下载 1、新建.net core web工程 2、添加自定义登录页面 3、添加百度地图页面 4、添加后台日志系统 5、添加mysql数据存储 6、添加SqlServer数据存储(额外内容) 7、用户注册与登录功能实现 8、添加坐标报表页面(用于遍历地图坐标) 9、前后端数据交互与报表数据展示 10、报表数据的编辑与修改 11、用户登录与退出 12、自定义GPRS通讯协议 13、添加TCP通讯功能(接收) 14、添加TCP通讯功能(发送) 15、模拟GPRS数据通讯 16、设备链接状态检测与提示 17、新建Windows Server虚拟机 18、服务器IIS运行环境配置 19、服务器.net程序发布 20、关于如何配置.net3.1框架 21、关于如何配置.net5.0框架 22、WinForm版地图上位机(带数据库和TCP功能) 23、WPF版地图上位机(带数据库和TCP功能) 24、公网映射与外网通讯 25、GPS协议与AT命令流程说明 26、GPRS协议与AT命令流程说明 27、STM32、A9G硬件连接图 28、STM32开发环境搭建 29、STM32 GPS/GPRS通讯功能实现 30、STM32 GPS定位数据上报服务器 31、室外最终效果演示 32、结束语
12、自定义GPRS通讯协议
14、添加TCP通讯功能(发送)
激萌の小宅 小宅博客网 GPS定位系统-MVC

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

添加TCP通讯功能(接收) - (第十三讲)

视频讲解如下:


工程源码下载:GPS定位系统系列教程源码下载

        

        在上一节中,我们一家把当前项目需要的通讯协议格式制定好了,接下来就是教大家如何用程序来实现我们的通讯。

        当前章节是要实现后端部分的TCP通讯,这里需要集成一个自定义的库“Link”,该库的架构可以参考《如何实现TCP通信》章节。该章节的基本架构和自定义库“Link”的架构是一样的。当然,你也可以直接去集成《如何实现TCP通信》章节的功能模块。

        在本章节中,ASP.Net主要是作为TCP Server模式来运行,这样可以确保我们的服务器能够对接多台下位机设备,Link库的添加方法和DbEntity库的添加方法一样,同样是通过新建工程的方式添加,然后将《如何实现TCP通信》章节的代码拷贝进去。

        关于自定义的“Link”库,在工程源码里面都有集成,对于初学者来说,这个库可能会比较复杂,可以先尝试去集成《如何实现TCP通信》章节的功能模块,再回头来看“Link”库,可能就会简单一些了,“Link”库的目录结构说明如下,新建过程我这里就不讲解了,我这里只教大家如何使用这个Link库。

        “Link”库的目录结构说明如下:

QQ截图20220917174019.jpg


        其中GpsModel.cs文件和GpsModel目录属于成对出现的,表示一种类型的下位机设备,这里注意了,是同类型,比如GPS的一组、温湿度传感器的一组,以此类推。

        我们这里采用的校验算法是和校验,代码如下:

/// <summary>
/// 和校验
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static byte GetSum(this byte[] date)
{
    int value = 0;
    if (date.Length > 0)
    {
        for (int i = 0; i < date.Length; i++)
        {
            value ^= date[i];
        }
    }
    return (byte)(value & 0x00FF);
}


数据包的解析和组装都在Package.cs文件中。

数据包组装方法如下:

/// <summary>
/// 按标准格式组装成数据包,并返回
/// </summary>
/// <param name="equi">当前的设备类型</param>
/// <param name="equiNo">设备号</param>
/// <param name="pro">功能码</param>
/// <param name="cont">数据</param>
public Package(byte equi, byte[] equiNo, byte pro, byte[] cont)
{
    // 数据格式:网络识别码 + 设备类型 + 设备号 + 包号 + 功能码 + 内容 + 校验码

    // 网络识别码
    netID = Res.NetID;
    // 当前的设备类型
    equipment = equi;
    // 设备号
    equipmentNo = equiNo;
    // 包号
    packageNo = Res.GetPackageNo();
    // 功能码
    program = pro;
    // 内容
    context = cont;

    // 组装成list
    List<byte> b = new List<byte>();
    b.Add(netID);
    b.Add(equipment);
    b.AddRange(equipmentNo);
    b.AddRange(packageNo);
    b.Add(program);
    b.AddRange(context);

    // 校验
    sum = b.ToArray().GetSum();
    b.Add(sum);
    Data = b.ToArray();
}


数据包解析方法如下:

/// <summary>
/// 按标准格式解析接收到的数据包
/// </summary>
/// <param name=""></param>
public Package(byte[] bytes)
{
    try
    {
        Data = bytes;
        int len = bytes.Length;
        netID = bytes[0];                                  // 网络识别码
        if (netID != Res.NetID) { errcode = $"网络设备号错误:{netID}"; return; }
        equipment = bytes[1];                              // 设备类型
        equipmentNo = bytes.Skip(2).Take(2).ToArray();     // 设备号
        packageNo = bytes.Skip(4).Take(2).ToArray();       // 包号
        program = bytes[6];                                // 功能码
        context = bytes.Skip(7).Take(len - 8).ToArray();  // 数据
        sum = bytes.Last();
        byte s = (bytes.Take(len - 1).ToArray()).GetSum();
        if (s != sum) errcode = "和校验失败";
    }
    catch
    {
        errcode = "数据包解析失败!";
    }
}


当集成完“Link”库后,需要在我们的工程中引用“Link”,如下:

QQ截图20220917175159.jpg


然后修改ServerInit.cs文件,初始化我们的TCP Server,修改如下:

using DbEntity;
using Link;
using WebApplicationGPS.APP;
using WebApplicationGPS.comm;

namespace WebApplicationGPS
{
    public class ServerInit
    {
        public ServerInit(string sql)
        {
            Res.SqlStr = sql;
            Res.MyDb = new MyDbContext() { config = sql };
        
            LogHelper.Start(); // 启动日志系统
            DbInit();   // 启动数据库
            AppStart(); // 启动后台应用程序

            EventInit();        // 通信数据事件
            LinkInit();         // 启动TCP Server
        }

        /// <summary>
        /// 启动数据库
        /// </summary>
        private void DbInit()
        {
            try
            {
                Res.MyDb.Database.EnsureCreated();
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(e.Message);
            }
        }

        /// <summary>
        /// 启动后台应用
        /// </summary>
        private void AppStart()
        {
            new Thread(() =>
            {
                Service app = new Service();
                while (true)
                {
                    app.TaskService();
                    Thread.Sleep(1000);
                }
            })
            { IsBackground = true }.Start();
        }

        /// <summary>
        /// 启动TCP Server
        /// </summary>
        private void LinkInit()
        {
            // 定义一个设备
            Link.Res.Socs.Add(new Link.Equipment.GpsModel() { equi = 0x01, equino = 1.IntToByte() });

            // 启动Socket Server,端口是2233
            Link.Res.TSC = new Link.Sockets.TcpSocketServer(2233);
            Link.Res.TSC.HandleRecMsg = new Link.Equipment.Server().Calculation;
            Link.Res.TSC.HandleClientClose = new Link.Equipment.Server().ClientDisconnect;
            Link.Res.TSC.StartServer();
        }

        /// <summary>
        /// 事件初始化
        /// </summary>
        private void EventInit()
        {
            // 保存传感器数据
            Link.Res.SenseDataMsg = (a, b) =>
            {
                System.Diagnostics.Debug.WriteLine($"接收到数据:{b}");
            };

            // 后面可以扩展
            /* ... */
        }
    }
}


修改完,我们就可以直接使用网络调试助手,发送我们的数据包了,最终测结果如下:

测试包:CC 01 00 01 00 01 11 33 34 35 36 39 E1

link (1).gif

12、自定义GPRS通讯协议
14、添加TCP通讯功能(发送)

友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

添加TCP通讯功能(接收) - (第十三讲)

视频讲解如下:


工程源码下载:GPS定位系统系列教程源码下载

        

        在上一节中,我们一家把当前项目需要的通讯协议格式制定好了,接下来就是教大家如何用程序来实现我们的通讯。

        当前章节是要实现后端部分的TCP通讯,这里需要集成一个自定义的库“Link”,该库的架构可以参考《如何实现TCP通信》章节。该章节的基本架构和自定义库“Link”的架构是一样的。当然,你也可以直接去集成《如何实现TCP通信》章节的功能模块。

        在本章节中,ASP.Net主要是作为TCP Server模式来运行,这样可以确保我们的服务器能够对接多台下位机设备,Link库的添加方法和DbEntity库的添加方法一样,同样是通过新建工程的方式添加,然后将《如何实现TCP通信》章节的代码拷贝进去。

        关于自定义的“Link”库,在工程源码里面都有集成,对于初学者来说,这个库可能会比较复杂,可以先尝试去集成《如何实现TCP通信》章节的功能模块,再回头来看“Link”库,可能就会简单一些了,“Link”库的目录结构说明如下,新建过程我这里就不讲解了,我这里只教大家如何使用这个Link库。

        “Link”库的目录结构说明如下:

QQ截图20220917174019.jpg


        其中GpsModel.cs文件和GpsModel目录属于成对出现的,表示一种类型的下位机设备,这里注意了,是同类型,比如GPS的一组、温湿度传感器的一组,以此类推。

        我们这里采用的校验算法是和校验,代码如下:

/// <summary>
/// 和校验
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public static byte GetSum(this byte[] date)
{
    int value = 0;
    if (date.Length > 0)
    {
        for (int i = 0; i < date.Length; i++)
        {
            value ^= date[i];
        }
    }
    return (byte)(value & 0x00FF);
}


数据包的解析和组装都在Package.cs文件中。

数据包组装方法如下:

/// <summary>
/// 按标准格式组装成数据包,并返回
/// </summary>
/// <param name="equi">当前的设备类型</param>
/// <param name="equiNo">设备号</param>
/// <param name="pro">功能码</param>
/// <param name="cont">数据</param>
public Package(byte equi, byte[] equiNo, byte pro, byte[] cont)
{
    // 数据格式:网络识别码 + 设备类型 + 设备号 + 包号 + 功能码 + 内容 + 校验码

    // 网络识别码
    netID = Res.NetID;
    // 当前的设备类型
    equipment = equi;
    // 设备号
    equipmentNo = equiNo;
    // 包号
    packageNo = Res.GetPackageNo();
    // 功能码
    program = pro;
    // 内容
    context = cont;

    // 组装成list
    List<byte> b = new List<byte>();
    b.Add(netID);
    b.Add(equipment);
    b.AddRange(equipmentNo);
    b.AddRange(packageNo);
    b.Add(program);
    b.AddRange(context);

    // 校验
    sum = b.ToArray().GetSum();
    b.Add(sum);
    Data = b.ToArray();
}


数据包解析方法如下:

/// <summary>
/// 按标准格式解析接收到的数据包
/// </summary>
/// <param name=""></param>
public Package(byte[] bytes)
{
    try
    {
        Data = bytes;
        int len = bytes.Length;
        netID = bytes[0];                                  // 网络识别码
        if (netID != Res.NetID) { errcode = $"网络设备号错误:{netID}"; return; }
        equipment = bytes[1];                              // 设备类型
        equipmentNo = bytes.Skip(2).Take(2).ToArray();     // 设备号
        packageNo = bytes.Skip(4).Take(2).ToArray();       // 包号
        program = bytes[6];                                // 功能码
        context = bytes.Skip(7).Take(len - 8).ToArray();  // 数据
        sum = bytes.Last();
        byte s = (bytes.Take(len - 1).ToArray()).GetSum();
        if (s != sum) errcode = "和校验失败";
    }
    catch
    {
        errcode = "数据包解析失败!";
    }
}


当集成完“Link”库后,需要在我们的工程中引用“Link”,如下:

QQ截图20220917175159.jpg


然后修改ServerInit.cs文件,初始化我们的TCP Server,修改如下:

using DbEntity;
using Link;
using WebApplicationGPS.APP;
using WebApplicationGPS.comm;

namespace WebApplicationGPS
{
    public class ServerInit
    {
        public ServerInit(string sql)
        {
            Res.SqlStr = sql;
            Res.MyDb = new MyDbContext() { config = sql };
        
            LogHelper.Start(); // 启动日志系统
            DbInit();   // 启动数据库
            AppStart(); // 启动后台应用程序

            EventInit();        // 通信数据事件
            LinkInit();         // 启动TCP Server
        }

        /// <summary>
        /// 启动数据库
        /// </summary>
        private void DbInit()
        {
            try
            {
                Res.MyDb.Database.EnsureCreated();
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(e.Message);
            }
        }

        /// <summary>
        /// 启动后台应用
        /// </summary>
        private void AppStart()
        {
            new Thread(() =>
            {
                Service app = new Service();
                while (true)
                {
                    app.TaskService();
                    Thread.Sleep(1000);
                }
            })
            { IsBackground = true }.Start();
        }

        /// <summary>
        /// 启动TCP Server
        /// </summary>
        private void LinkInit()
        {
            // 定义一个设备
            Link.Res.Socs.Add(new Link.Equipment.GpsModel() { equi = 0x01, equino = 1.IntToByte() });

            // 启动Socket Server,端口是2233
            Link.Res.TSC = new Link.Sockets.TcpSocketServer(2233);
            Link.Res.TSC.HandleRecMsg = new Link.Equipment.Server().Calculation;
            Link.Res.TSC.HandleClientClose = new Link.Equipment.Server().ClientDisconnect;
            Link.Res.TSC.StartServer();
        }

        /// <summary>
        /// 事件初始化
        /// </summary>
        private void EventInit()
        {
            // 保存传感器数据
            Link.Res.SenseDataMsg = (a, b) =>
            {
                System.Diagnostics.Debug.WriteLine($"接收到数据:{b}");
            };

            // 后面可以扩展
            /* ... */
        }
    }
}


修改完,我们就可以直接使用网络调试助手,发送我们的数据包了,最终测结果如下:

测试包:CC 01 00 01 00 01 11 33 34 35 36 39 E1

link (1).gif