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

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

  • 编程语言 >

  • 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 图标 Vue - Ant Design官方
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
GPS定位-EC-01G
ASP.NET GPS定位系统介绍(物联网) GPS定位EC-01G模块系列教程源码下载页(物联网) 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、asp.net发布\winform\wpf版本操作流程 18、GPS协议与AT命令流程说明
12、自定义GPRS通讯协议
14、添加TCP通讯功能(发送)
激萌の小宅 小宅博客 GPS定位-EC-01G

文章作者:激萌の小宅

促销:¥0

价格:¥0

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

    有效期

  • 0

    总销量

  • 0

    累计评价

添加TCP通讯功能(接收)

参考视频如下,视频来源《GPS定位系统-MVC-添加TCP通讯功能(接收)》

备注:视频中的部分操作可能会因为Visual Studio的版本差异有所不一样,总体操作流程都是一样的,请自行尝试。视频中采用的是安信可的A9G模块,和当前系列使用的EC-01G模块在AT指令上可能存在差异,这里以博客内容为主,视频主要是讲操作流程。


工程源码下载:GPS定位EC-01G模块系列教程源码下载页(物联网)

IDE环境:Visual Studio 2022


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

        当前章节是要实现后端部分的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-2026 版权所有

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

文章作者:激萌の小宅

促销:¥0

价格:¥0

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

    有效期

  • 0

    总销量

  • 0

    累计评价

添加TCP通讯功能(接收)

参考视频如下,视频来源《GPS定位系统-MVC-添加TCP通讯功能(接收)》

备注:视频中的部分操作可能会因为Visual Studio的版本差异有所不一样,总体操作流程都是一样的,请自行尝试。视频中采用的是安信可的A9G模块,和当前系列使用的EC-01G模块在AT指令上可能存在差异,这里以博客内容为主,视频主要是讲操作流程。


工程源码下载:GPS定位EC-01G模块系列教程源码下载页(物联网)

IDE环境:Visual Studio 2022


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

        当前章节是要实现后端部分的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