无线监控系统之二-------C#实现
无线监控系统之二-------C#实现
呵呵,虽然昨晚写得很辛苦了,但还是把我的第一部分写完了,呵呵~今晚就把第二部分写完吧,转载时请不要忘了注明本文来C/S框架网哦。 如图,我们先看看我们的解决方案,大体上按照MVC设计模型设计,分为用户视图层、业务逻辑层和数据访问层,另外还有公共处理模块和主窗体模块。 ![]() 用户登录和主窗体就不多说了。。。。 一、我们首先来看看我们最核心的一层业务逻辑层LOGICDEAL。 (Ⅰ) COMMUNICATE包中主要是上位机与下位机数据通讯方式的实现。
using System;
using System.Collections.Generic; using System.Text; namespace LOGICDEAL.COMMUNICATE { public interface CommunicateInter { void Open(); void Close(); void Read(int NumBytes); byte[] getdata(); void Write(byte[] WriteBytes); void setFtype(byte[] data); } }
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Text; using System.IO.Ports; using System.IO; using System.Threading; namespace LOGICDEAL.COMMUNICATE { public class SerialCommu:CommunicateInter { private byte[] BufBytes = null; //comm port win32 file handle private SerialPort sport = null; protected delegate void HandleInferfaceUpdateDelegate(); HandleInferfaceUpdateDelegate interfaceupdatedelegate = null; public SerialCommu() { } public void newCommu() { sport = new SerialPort(); } //打开串口 public void Open() { //if (!sport.IsOpen) sport.Open(); if (sport == null) { newCommu(); sport.PortName = "com1"; //设置端口 sport.BaudRate = 57600; sport.DataBits = 8; sport.StopBits = System.IO.Ports.StopBits.One; sport.Parity = System.IO.Ports.Parity.None; //serialPort.RtsEnable = true; //serialPort.Encoding = Encoding.UTF8; sport.ReceivedBytesThreshold = 1; interfaceupdatedelegate = new HandleInferfaceUpdateDelegate(resDataCodds); //委托,接收数据 this.sport.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sport_DataReceived); } if (!sport.IsOpen) { try { sport.Open(); //打开端口 } catch { return; } } } //关闭串口 public void Close() { if (sport.IsOpen) sport.Close(); } //读取 NumBytes长度的字节 public void Read(int NumBytes) { if (!sport.IsOpen) Open(); //串口是否打开 int l = 0; int l1 = 0; int i=0; byte[] bytes ; BufBytes = new byte[NumBytes]; //需要读取的字节数 while(l<NumBytes) //读取数据 { l1= sport.BytesToRead; //字节数 if (l1 == 0) continue; bytes= new byte[l1]; sport.Read(bytes,0,l1); for (i = 0; i < bytes.Length; i++) BufBytes[i + l] = bytes[i]; l +=bytes.Length; //已读取的字节数 } setFtype(BufBytes); } public void Write(byte[] WriteBytes) { if (!sport.IsOpen) Open(); sport.Write(WriteBytes,0,WriteBytes.Length); //写串口 } public void sport_DataReceived(object sender, SerialDataReceivedEventArgs e) //数据监听,接收 { try { interfaceupdatedelegate.Invoke(); //唤醒 // Read(22); } catch { } } public void resDataCodds() { Read(22); } //读取数据 public byte[] getdata() //获取数据,供外部类 { return BufBytes; } public void setFtype(byte[] data) { if (data[4].ToString("x").Trim().Equals("2")) LOGICDEAL.COMMUNICATE.Cflag.setFtype(0); //获取温度值 if (data[4].ToString("x").Trim().Equals("3")) LOGICDEAL.COMMUNICATE.Cflag.setFtype(1); //更新网络地址 } } }
namespace LOGICDEAL.COMMUNICATE
{ public class Cflag { private static CommunicateInter CType = null; //通讯类型 private static bool OFlag = true; // 通讯口是否已打开 private static int FType = -1; //数据帧功能类型 public static void setCtpye(CommunicateInter ci) { CType = ci; } //设置通讯类型 public static CommunicateInter getCtype() { return CType; } //获取通讯类型 public static void setOflag(bool oflag) { OFlag = oflag; } //设置打开类型,true为打开 public static bool getOfag() { return OFlag; } //获取打开类型 public static void setFtype(int i) { FType = i; } //设置数据帧功能类型,0:温度数值,1: public static int getFtype() { return FType; } } (Ⅱ) DATAFRAME包中主要实现数据帧及其处理接口 数据帧接口 using System;
using System.Collections.Generic; using System.Text; namespace LOGICDEAL.DATAFRAME { public interface DataFrameInter { byte[] dealFrame(byte[] frame); //接收数据帧函数 byte[] sendFrame(); //发送数据帧函数 void setAFI(); } } 数据帧处理接口 namespace LOGICDEAL.DATAFRAME
{ interface ArthFrameInter { byte[] dealData(byte[] framdata); //数据帧处理函数 } } 数据帧接口实现一:温度值数据帧类TemValueData namespace LOGICDEAL.DATAFRAME 数据帧处理接口实现一:温度值数据帧处理类TemValueArth{ class TemValueData:DataFrameInter { private ArthFrameInter afi = null; //工厂模式:对应的数据帧处理类 private int n=22, m=9; public TemValueData() { } public byte[] dealFrame(byte[] frame) //接收数据帧函数,温度值数据帧长度为21字节 { if (afi.dealData(frame) == null) return null; byte[] adata = new byte[m]; //需要输出的字节数组,长度为9字节 Array.Copy(afi.dealData(frame), adata, m); //adata = afi.dealData(frame); return adata; } public byte[] sendFrame() //发送数据帧函数 { byte[] a = new byte[10]; return a; } public void setAFI() //获取数据帧处理类实例 { this.afi = new TemValueArth(); } } } namespace LOGICDEAL.DATAFRAME
{ public class TemValueArth:ArthFrameInter { private int n = 22, m = 9; public byte[] dealData(byte[] framdata) //数据帧处理函数 { if (!framdata[0].ToString("x").Trim().Equals("aa")) return null; if (!framdata[2].ToString("x").Trim().Equals("11")) return null; if ((!framdata[4].ToString("x").Trim().Equals("3")) && (!framdata[4].ToString("x").Trim().Equals("2"))) return null; int textds = 0; for (int j = 0; j < n - 2; j++) //计算前20字节数之和 { textds += Convert.ToInt32(COMMONDEAL.DataConversion.Hex2Ten(framdata[j].ToString("x").Trim())); } int efficy = Convert.ToInt32(COMMONDEAL.DataConversion.Hex2Ten(framdata[n - 2].ToString("x").Trim() + framdata[n - 1].ToString("x").Trim())); //计算效验码值 if (textds != efficy) { return null; } byte[] adata = new byte[m]; adata[0] = framdata[5]; //提取数据,2字节 adata[1] = framdata[6]; adata[2] = framdata[13]; //提取源地址,2字节 adata[3] = framdata[14]; adata[4] = framdata[15]; //提取网络地址,2字节 adata[5] = framdata[16]; adata[6] = framdata[17]; //网络号,1字节 adata[7] = framdata[18]; //提取通道,1字节 adata[8] = framdata[19]; //提取RSSI,1字节 return adata; } } } (Ⅲ) DEALTHREAD包中用户窗体与数据逻辑层的数据处理线程类: 用户窗体与数据逻辑层的数据处理线程类DealThread namespace LOGICDEAL.DEALTHREAD
{ public abstract class DealThread { //SynchronizationContext private COMMUNICATE.CommunicateInter cci = null; //通讯类型 private DATAFRAME. DataFrameInter dfi = null; //数据帧 public Thread thread = null; //线程 public byte[] data=null; //处理后的数据 public abstract void init(); //初始化 //数据处理 public void start() { thread.Start(); } //开始线程 public abstract void run(); //线程运行函数 public void stop() { thread.Abort();} //停止线程 public byte[] getData() //获得最终数据 { return data; } } } 接口实现一:温度值处理线程类TemVlueThd namespace LOGICDEAL.DEALTHREAD { public class TemVlueThd:DealThread { private COMMUNICATE.CommunicateInter cci = null; //通讯类型 private DATAFRAME.DataFrameInter dfi = null; //数据帧 //private Thread thread = null; //线程 byte[] dataa = null; private int n = 22, m = 9; public TemVlueThd() //构造函数 { init(); } public override void init() { this.cci = COMMUNICATE.Cflag.getCtype(); //初始化通讯类 this.dfi = new DATAFRAME.TemValueData(); //初始化数据帧类 dfi.setAFI(); this.thread = new Thread(new ThreadStart(this.run)); //申请线程 //throw new Exception("The method or operation is not implemented."); } public override void run() //线程运行的方法 { dataa = new byte[n]; if (cci.getdata() == null) return; Array.Copy(cci.getdata(), dataa, n); if (dfi.dealFrame(dataa) == null) return; data = new byte[m]; //返回的数据 Array.Copy(dfi.dealFrame(dataa), data, m); } } } 呵呵~~这一帖第二部分先写到这了。。。。谢谢大家!
参考文档:
C# 简易POS零售系统架构设计源码(3) 无线监控系统之一-------UML设计 [原创]无线监控系统之二-------C#实现(续) 无线监控系统之三-------测试与扩展 无线监控系统之四-------结言 C#植入友商网在线服务并实现同步用户注册接口实现 C# 注册系统热键/快捷键(MainForm HotKey) C#.NET 监视操作系统打开程序(使用Window消息实现全局系统勾子) C#源码-AnyPIM个人信息管理系统 6.2-源码下载 C#源码-mrp生产管理系统(C#.NET)-源码下载 C#源码-仿贝壳房少房产系统网站-源码下载 C#源码-[整站程序]英语沙龙全站系统 net 2.0_esalon-源码下载 信息系统开源框架 - 企业内信息系统应用架构(C#.NET+Winform) Winform三层架构+WebService+权限管理系统软件开发平台(C#.NET开发) C#三层架构系统 C#.NET三层架构快速开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |