RFID设备管理C#客户端学习笔记之4:更新数据库[WinForm]

2015-05-12  来源:本站原创  分类:CSharp  人气:368 

事实上,前面的客户端是不够完善的,我们要自动获取IP,还要从数据库中选择工作人员。

除此之外手动控制服务器关闭也是有必要的……像下图所示的效果:

RFID设备管理C#客户端学习笔记之4:更新数据库[WinForm]

图1 收到读写器的消息之后立即插入到数据库

RFID设备管理C#客户端学习笔记之4:更新数据库[WinForm]

图2 开启、打开服务器

1、获取当前主机IP地址

/// <summary>
        /// 获取本机地址列表
        /// </summary>
        public List<string> GetLocalAddresses()
        {
            // 获取主机名
            string strHostName = Dns.GetHostName();

            // 根据主机名进行查找
            IPHostEntry iphostentry = Dns.GetHostEntry(strHostName);
            List<string> iplist = new List<string>();

            foreach (IPAddress ipaddress in iphostentry.AddressList)
            {//过滤IPv6地址
                if (ipaddress.ToString().Length < "111.222.333.444".Length)
                {
                    iplist.Add(ipaddress.ToString());
                }
            }
            return iplist;
        }

启动时调用

//为cb_ips添加本地ip
            List<string> IPs = GetLocalAddresses();
            if (IPs.Count() > 0)
            {
                this.cb_IPs.Items.Clear();
                foreach (var i in IPs)
                {
                    cb_IPs.Items.Add(i);
                }
                cb_IPs.SelectedIndex = 0;
            }

2、查询“人员表”,添加到ComboBox中

2.1 rfid_DBHelper.cs(调用了MySqlHelper.cs,源码)

/// <summary>
    /// 自己定制一些增删改查功能
    /// </summary>
    public abstract class rfid_DBhelper
    {
        static string connectionString =
"Database='rfid2';Data Source='localhost';User Id='uid';Password='psd';charset='utf8';pooling=true";
        /// <summary>
        /// 获取下拉列表的dataset
        /// </summary>
        /// <returns>dataset</returns>
        public static DataSet getComboBox()
        {
            //Debug.WriteLine("【dbhelper】");
            string sql = "select * from tb_people";
            DataSet ds = MySqlHelper.GetDataSet(connectionString, CommandType.Text, sql, null);
            return ds;
        }
        /// <summary>
        /// 插入数据到iohistory中
        /// </summary>
        /// <param name="epc"></param>
        /// <param name="hander"></param>
        /// <param name="dt"></param>
        /// <returns>受影响的行数</returns>
        public static int insert_iohistory(string epc, int hander, DateTime dt)
        {
            string sql =
string.Format("insert into tb_iohistory(tagID,hander,occorTime) values('{0}','{1}','{2}')", epc, hander, dt);
            Debug.WriteLine(sql);

            return MySqlHelper.ExecuteNonQuery(connectionString, CommandType.Text, sql, null);
        }
    }

2.2 HandleFeedback.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections;

namespace Ex02_wifiServer
{
    public class HandleFeedback
    {
        public string type { get; set; }//指令类型
        List<string> devices = new List<string>();

        public void processDevIO(out bool isOK, string code, string h = "1001")
        {
            //识别失败回:(E4 04 82)头,(00 )usercode (05)Status ,( 91)Checksum
            //识别成功回:(E0 10 82)头,(00 )usercode (01)天线号 ,(12 34 00 00 00 00 00 00 00 00 00 10)ID,(37)Checksum 

            string[] strs = code.Split(' ');
            int hander = Convert.ToInt32(h);
            DateTime datetime = DateTime.Now;

            if (strs[4] == "05")
            {
                Debug.WriteLine("【handle feedback】识别失败。");
                isOK = false;
                return;
            }
            else
            {
                StringBuilder epc = new StringBuilder();
                //1、只选择EPC区,12个字节
                epc.Append(strs[5]);
                for (int i = 6; i < 17; i++)
                {
                    epc.Append(' ' + strs[i]);
                }
                Debug.WriteLine("【handle feedback】{0},{1},{2}", epc, hander, datetime);//test ok
                if (rfid_DBhelper.insert_iohistory(epc.ToString(), hander, datetime) != 0)
                {
                    //插入成功
                    isOK = true;
                    //插入过程除了点问题,暂时删除外键
                    //ALTER TABLE `tb_iohistory` DROP FOREIGN KEY `fk_io_tag`;
                }
                else
                {
                    isOK = false;
                }
                return;
            }

        }

    }
}

2.3 调用

//动态绑定cb_people下拉列表
            cb_people.DataSource = rfid_DBhelper.getComboBox().Tables[0];
            cb_people.ValueMember = "personID";
            cb_people.DisplayMember = "Name";

3、手动开启和关闭服务器端程序

开启服务器按钮调用StartServer(),关闭服务器按钮调用StopServer()

/// <summary>
        /// 启动服务器
        /// </summary>
        private void ServerStart()
        {
            data = "等待用户连接……\n";
            richTextBox1.AppendText(data);
            richTextBox1.Focus();
            toolStripStatusLabel1.Text = DateTime.Now + ":服务器已经打开";
            btn_start.Enabled = false;
            btn_stop.Enabled = true;
            //定义线程开始
            server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipadd = IPAddress.Parse(server_ip);
            IPEndPoint ipe = new IPEndPoint(ipadd, server_port);
            try
            {
                server_socket.Bind(ipe);
                server_socket.Listen(100);
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
                return;
            }
            server_thread = new Thread(Run);
            //后台线程将会随着主线程的退出而退出
            server_thread.IsBackground = true;
            server_thread.Start(server_socket);
        }
        /// <summary>
        /// 关闭服务器
        /// </summary>
        private void ServerStop()
        {
            try
            {
                toolStripStatusLabel1.Text = DateTime.Now+":服务器已经关闭";
                richTextBox1.AppendText("服务器已经关闭\n");
                btn_start.Enabled = true;
                btn_stop.Enabled = false;

                //注意先关闭socket,再停止线程
                foreach (var i in dicSocket)
                {
                    i.Value.Close();
                }
                foreach (var i in dicThread)
                {
                    i.Value.Abort();
                }
                server_socket.Close();
                server_thread.Abort();
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = "关闭出现异常:" + ex;
                throw;
            }
        }

4、RFID读写器读到的结果插入到数据库

在RecMsg(object o)中添加

//交给HandleFeedback去处理
                    bool isInsertOK = false;
                    HandleFeedback hander = new HandleFeedback();
                    hander.processDevIO(out isInsertOK, str, worker);
                    if (isInsertOK)
                    {
                        toolStripStatusLabel1.Text = "添加事件成功";
                    }
                    else
                    {
                        toolStripStatusLabel1.Text = "添加事件失败";
                    }

其中str是接收到的字符串。

相关文章
  • RFID设备管理C#客户端学习笔记之4:更新数据库[WinForm] 2015-05-12

    事实上,前面的客户端是不够完善的,我们要自动获取IP,还要从数据库中选择工作人员. 除此之外手动控制服务器关闭也是有必要的--像下图所示的效果: 图1 收到读写器的消息之后立即插入到数据库 图2 开启.打开服务器 1.获取当前主机IP地址 /// <summary> /// 获取本机地址列表 /// </summary> public List<string> GetLocalAddresses() { // 获取主机名 string strHostName = Dns

  • RFID设备管理C#客户端学习笔记之0:引言[WPF] 2015-05-10

    RFID技术已经得到了广泛应用.比如门禁系统.车辆入库出库都会有RFID读写设备在工作.其原理简单讲就是,读写器向自己的有效区域发射信号,RFID标签会反射信号,读写器就读到了标签的信息. RFID标签主要有4部分组成,分别是保留内存区.EPC.TID,和用户自定义存储区.其结构图如下: ref:四个区详细内容介绍 我们打算在JT-8290A读写器和配套通讯协议基础上基于Socket技术做一个Windows小程序.(只是读EPC区,不涉及其他区) 开发工具:Visual Studio 2013

  • MySQL入门很简单-学习笔记 - 第1 章 数据库概述 2012-03-09

    1.1.数据存储方式 1.人工管理阶段 2.文件系统阶段 3.数据库系统阶段 1.2.数据库泛型 数据库泛型就是数据库应该遵循的规则.数据库泛型也称为范式.目前关系数据库最常用的四种范式分别是: 第一范式(1NF).第二范式(2NF).第三范式(3NF)和BCN范式(BCNF) 1.3.SQL语言 SQL(StructuredQuery Language)语言的全称是结构化查询语言.数据库管理系统通过SQL语言来管理数据库中的数据. SQL语言分为三个部分: 数据定义语言(Data Defini

  • MongoDB学习笔记3:创建,更新及删除文档 2015-03-16

    1. 插入并保存文档 插入是向MongoDB中添加数据的基本方法.对目标集使用insert方法,插入一个文档: > db.foo.insert({"bar" : "baz"}) WriteResult({ "nInserted" : 1 }) > db.foo.find() { "_id" : ObjectId("55062bcad94d123625069ca4"), "bar&quo

  • MySQL入门很简单-学习笔记 - 索引页 2012-03-09

    索引一下,方便阅读,后面有完整的PDF下载地址 MySQL入门很简单-学习笔记 - 第1 章 数据库概述 MySQL入门很简单-学习笔记 - 第 2 章 Windows平台下安装与配置MySQL MySQL入门很简单-学习笔记 - 第 4 章 MySQL数据类型 MySQL入门很简单-学习笔记 - 第 5 章 操作数据库 MySQL入门很简单-学习笔记 - 第6章 创建.修改和删除表 MySQL入门很简单-学习笔记 - 第7章 索引 MySQL入门很简单-学习笔记 - 第 8 章 视图 MySQ

  • JavaScript高级程序设计 客户端存储学习笔记 2014-12-16

    JavaScript高级程序设计 客户端存储学习笔记,在客户端用于存储会话信息 第十九章 客户端存储 1.cookie ①最初是在客户端用于存储会话信息的. 1.1 限制 ①cookie在性质上是绑定在特定的域名下的.当设定了一个cookie后,再给创建它的域名发送请求时,都会包含这个cookie. ②cookie的限制: □IE6以及更低版本限制每个域名最多20个cookie. □IE7和之后版本每个域名最多50个cookie. □Firefox50个 □Opera50个 □Safari和Ch

  • JavaScript学习笔记--客户端与服务器端的通信 2012-06-26

    说明:该文为<JavaScript高级程序设计>第16章学习笔记. 在Web项目中,要实现客户端与服务端的交互,可通过cookie.隐藏框架.HTTP请求.LiveConnect请求和智能HTTP请求等方式实现, 一. cookie cookie是第一个JavaScript可以利用的客户端-服务端之间的交互手段.浏览器向服务器发送请求时,为这个服务器存储的cookie会与其他信息一起发送到服务器.这使得JavaScript可以在客户端设置一个cookie,之后服务器端就能够读取它了. 1. c

  • python网络编程学习笔记(二):socket建立网络客户端 2015-04-11

    看了这一节,突然之间对python网络编程学习笔记(1)中的一些不理解的问题有了认识,至少明白了socket是怎么回事.这里关于socket的起源等问题就不做笔记记录了,直接进入主题 1.建立socket 建立socket对象需要搞清通信类型和协议家族.通信类型指明了用什么协议来传输数据.协议的例子包括IPv4.IPv6.IPX\SPX.AFP.对于internet通信,通信类型基本上都是AF_INET(和IPv4对应).协议家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SO

  • python网络编程学习笔记(九):数据库客户端 DB-API 2014-11-23

    这篇文章主要介绍了python 数据库客户端 DB-API的相关资料,需要的朋友可以参考下 一.DB-API概述 python支持很多不同的数据库.由于不同的卖家服务器导致和数据库通信的网络协议各有不同.在python的早期版本中,每一种数据库都带有自己的python模块,所有这些模块以不同的方式工作,并提供不同的函数.这种方法不便于编写能够在多种数据库服务器类型中运行的代码,于是DB-API库函数产生.在DB-API中,所有连接数据库的模块即便是底层网络协议不同,也会提供一个共同的接口.这一点

  • php cookie使用方法学习笔记分享 2013-10-24

    在php中cookie与其它程序中没什么两样,cookie都是用来存储信息到客户端,常用用于安全性要求不高的一些应用中,如用户登录记住密码之类的,下面我来给大家介绍一下php cookie学习笔记 PHP setcookie() 函数向客户端发送一个 HTTP cookie.cookie 是由服务器发送到浏览器的变量.cookie 通常是服务器嵌入到用户计算机中的小文本文件.每当计算机通过浏览器请求一个页面,就会发送这个 cookie.cookie 的名称指定为相同名称的变量.例如,如果被发送的

  • Ext.Net学习笔记之button小结 2013-10-25

    Ext.Net学习笔记之button小结,需要的朋友可以参考一下 1.触发客户端事件 <ext:Button ID="Button1" runat="server" Text="快点我"> <Listeners> <Click Handler="Greet()"></Click> </Listeners> </ext:Button> <script

  • DB2 UDB V8.1管理学习笔记(二) 2013-10-29

    正在看的db2教程是:DB2 UDB V8.1管理学习笔记(二).表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便,简单,无需手工创建和维护数据存储文件.DMS需要手动指定container和存储数据的文件名,并保证有足够磁盘空间可用. 对于一个数据库,至少存在一个page size为4K的系统临时表空间,可以额外建立具有更大page size的用户临时表空间,系统会自动进行使用. 无法用a

  • CI框架学习笔记(一) - 环境安装.基本术语和框架流程 2013-11-19

    本文是CI框架学习笔记的第一篇,主要介绍了CI框架的环境安装,基本术语以及框架流程,非常的详细,有需要的朋友可以参考下 最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时刻提醒自己:借鉴和学习才有出路,忘记过去意味着背叛!基本术语说明 在本文开始之前,有必要对文中反复出现的术语做一个简单的说明,如果你对这一部分已经熟谙,完全可以略过.本文中反复出现

  • DB2 UDB V8.1管理学习笔记(三) 2014-03-14

    正在看的db2教程是:DB2 UDB V8.1管理学习笔记(三).强制断开已有连接,停止实例并删除. $ db2idrop -f instance_name 用于在UNIX下迁移实例. $ db2imigr instance_name 更新实例,用于实例获得一些新的产品选项或修订包的访问权. $ db2iupdt instance_name 获取当前所处的实例. $ db2 get instance 当更新实例级别或数据库级别的参数后,有些可以立即生效,有些需要重新启动实例才可生效.immedi

  • JavaScript高级程序设计 事件学习笔记 2014-05-30

    JavaScript高级程序设计 事件学习笔记,需要的朋友可以参考下. 第12章 事件 1.事件流 1.1事件冒泡(IE事件流) □事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接受,然后逐级向上传播到较为不具体的节点(文档). □所有浏览器均支持事件冒泡.Firefox.chrome.safari将事件一直冒泡到window对象. 1.2事件捕获(Netscape事件流) □不太具体的节点更早收到事件,而具体的节点最后收到节点. □Safa

  • php学习笔记 [预定义数组(超全局数组)] 2014-06-11

    php学习笔记 预定义数组(超全局数组),需要的朋友可以参考下. <?php /* 预定义数组: * 自动全局变量---超全局数组 * * 1.包含了来自WEB服务器,客户端,运行环境和用户输入的数据 * 2.这些数组比较特别 * 3.全局范围内自动生效,都可以直接使用这些数组 * 4.用户不能自定义这些数组,但这些数组的操作方式和自己定义的数组操作的方式一样 * 5.在函数中直接可以使用这些数组 * * $_GET //经由URL请求提交至脚本的变量 * $_POST //经由HTTP POS

  • 两千行代码的PHP学习笔记汇总 2014-06-22

    这篇文章主要介绍了两千行代码的PHP学习笔记汇总,由黑眼诗人整理汇总,包括了PHP学习中各类常见的技巧,非常具有实用价值,需要的朋友可以参考下 本文汇总了PHP学习中常见的各类问题,约有两千多行代码,都是非常实用的技巧.分享给大家供大家参考.具体如下: //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_name

  • 揭开AJAX神秘的面纱(AJAX个人学习笔记)第1/5页 2014-08-17

    写这个学习笔记,只是记载一下自己的学习经过和体会,把一些学习重点记录下来,以备今后的巩固复习及应用,很多知识点没有详细介绍,所以并不完全适用于初学者,如果你是初学者,最好选择一本AJAX学习的书籍,然后与这篇学习笔记对照学习,效果会更好. AJAX技术是多种计算机技术的结晶,它的名称来自:Asynchronism(异步).JavaScript.And.XML这4个单词首字母,即异步JavaScript请求处理XML技术.简单的描述就是数据异步传输网页局部刷新的技术.AJAX很流行,WEB程序设计

  • JavaScript高级程序设计(第3版)学习笔记6 初识js对象 2014-10-12

    砌好墙,下面出场的就是房子了,在ECMAScript中,对象就是我们所说的房子,至于你所写的整个应用程序,那就是一整套建筑群了 在房子里面可以放你想放的任意事物--如果你有足够的美学造诣,你甚至可以弄一个房中房试试--当然,为了方便管理,我们会给房子里存放的所有事物都会取上一个不重复的名字,比如医药房间里的各种药品名称.在ECMAScript中,你可以在对象中存放任意你想放的数据,同样,我们需要给存放的数据取一个名字--也就是对象的属性名,再存放各种数据.再看看ECMA-262中对象的定义:无序

  • php学习笔记之基础知识 2014-10-27

    这篇文章主要介绍了php学习笔记的基础知识部分,需要的朋友可以参考下 php学习至今一年有余,笔记积累挺多的,也挺杂的,写篇文章整理一下吧. php基础部分 PHP 输出文本的基础指令:echo 和 print. echo和print的区别 echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) echo 输出一个或者多个字符串. print 只能打印出简单类型变量的值(如int,string) print_r 可以打印出复杂类型变量的值(如数组