安徽工业大学《物联网工程实习报告书》1实习地点:安徽祥云科技有限公司,逸夫楼机房实验室2实习内容:【1】参观马钢云计算实验室,了解运作流程,熟悉液态冷凝塔等作用,并实地探查锅炉温度监控区域,分析相关原理图;由相关技术人员指导上机进行公司架设系统的操作运行等。
【2】逸夫楼机房实验室进行系统开发课程设计,包括计时系统,校园一卡通系统等。
计时系统校园一卡通系统【1】简介:校园一卡通系统是学校内部管理人员提供具有开放性、灵活性、面向校园的应用服务管理平台。
一方面,学生和教职员工可以通过一张卡片,方便的使用校内的各种应用;另一方面,学校也可以通过一卡通系统,实现更加方便、高效的校园管理。
同时,校园一卡通系统提供了一个统一、简便、快捷的平台,进而可以与学校的各种管理信息系统无缝连接,作为信息化系统的纽带促进“数字化校园”的建设。
【2】需求分析:2-1用户分析一卡通系统的用户分为三类:1管理员:管理并授权2消费人员:持卡消费3学生和教职工:持卡使用授权服务2-2需求架构校园一卡通系统核心是所有现金、票证或需要识别身份的场合均可采用卡来完成。
从功能上来看,主要分为服务授权和消费两大功能。
2-3服务授权需求管理员具有制卡等终端权限,开放四大功能给学生和教职工使用。
2-4消费管理需求消费管理模块是系统的核心模块,它提供各种消费服务功能。
其模块用例模型如下:将卡片信息删除,被删卡将不能使用。
在本模块中,其用例模型如下:2-5实施环境需求软件环境:开发软件Microsoft Visual Studio 11.0、SQL Server Management Studio 。
硬件环境:ISO/IEC14443A标准卡、13.56MHz ISO/IEC14444A/B RFID读写器、串口线等。
2-6接口需求本系统需与13.56MHz ISO/IEC14444A/B RFID读写器连接,需要添加ISO1443DLL。
【3】硬件系统构成在IVS京胜世纪物联网仿真平台上选用14443读写器和标签,配好电源并打开串口,这里使用COM101端口:【4】软件系统开发4-1发卡功能输入合法的个人信息,保存至数据库,要获得管理员的授权示例示范:学生和教职员工消费时进行刷卡,工作人员输入消费的金额,扣除的金额保存至数据库。
4-3充值功能持卡人缴费,更改数据库中对应的金额4—4数据库设计表结构设计4—5串口调试4—6主界面初稿:【5】主要源代码:1连接数据库:namespace Utils{///<summary>///数据库操作工具/// Date:2016-09-29/// Author:Y.T. He///</summary>class DbUtil{privatestaticstring conStr;//保存数据库连接字符串static DbUtil(){///使用App.config中的连接字符串信息进行配置foreach (ConnectionStringSettings cs in ConfigurationManager.ConnectionStrings) {if (.Equals("db")){conStr = cs.ConnectionString;break;}}}public DataTable Query(string sql, paramsobject[] value){SqlConnection conn = GetConnection();SqlCommand cmd = new SqlCommand(sql, conn);string[] paramNames = GetParameterNames(sql);if (paramNames != null){for (int i = 0; i < paramNames.Length; i++){cmd.Parameters.AddWithValue(paramNames[i], value[i]);}}SqlDataAdapter adapter = new SqlDataAdapter(cmd);DataSet dataSet = new DataSet();DataTable table = new DataTable();try{adapter.Fill(dataSet);table = dataSet.Tables[0];}catch (SqlException ex){MessageBox.Show(ex.Message);}finally{cmd.Dispose();conn.Close();}return table;}publicint Update(string sql, paramsobject[] value){SqlConnection conn = GetConnection();SqlCommand cmd = new SqlCommand(sql, conn);string[] paramNames = GetParameterNames(sql);if (paramNames != null){for (int i = 0; i < paramNames.Length; i++){cmd.Parameters.AddWithValue(paramNames[i], value[i]); }}int rowCount = 0;try{rowCount = cmd.ExecuteNonQuery();}catch(Exception e){MessageBox.Show("写数据库时出错", e.Message);}finally{conn.Close();}return rowCount;}///<summary>///连接数据库///</summary>private SqlConnection GetConnection(){SqlConnection sc = new SqlConnection(conStr);try{sc.Open();//MessageBox.Show("已经打开数据库连接!");return sc;}catch (Exception ex){MessageBox.Show(string.Format("SqlConn:{0}", ex.Message)); returnnull;}}///<summary>///取得sql语句中的参数名称///</summary>///<param name="sql"></param>///<returns>返回所有参数的名称</returns>privatestring[] GetParameterNames(string sql){if (string.IsNullOrWhiteSpace(sql)){returnnull;}string pattern = @"@(\w+)";Regex reg = new Regex(pattern);MatchCollection matches = reg.Matches(sql);if (matches.Count == 0){returnnull;}string[] rs = newstring[matches.Count];int i = 0;foreach (Match m in matches){rs[i++] = m.Value.Trim();}return rs;}}}//byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);//string[] strArr = new string[bytes.Length];//for (int k = 0; k < bytes.Length; k++)//{// strArr[k] = bytes[k].ToString("x");// strNum = strNum + strArr[k].ToString().Trim();//}return myArr;}publicstring ToChina(string str){byte[] bytes;// 需要将 hex 转换成 byte 数组。
bytes = newbyte[str.Length / 2];for (int i = 0; i < bytes.Length; i++){// 每两个字符是一个 byte。
bytes[i] = byte.Parse(str.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); }// 获得 GB2312,Chinese Simplified。
System.Text.Encoding chs =System.Text.Encoding.GetEncoding("UTF-8");return chs.GetString(bytes);}}}2串口类:namespace CampusOneCard.Tools{class RFID{#region打开串口方法///<summary>///打开串口方法///</summary>///<param name="portName">串口编号</param>publicvoid OpenPort(string portName){//if (portNames.Count() < 1)//{// MessageBox.Show("请选择串口。
");//}//打开串口if (FR102.OpenSerialPort(portName) != FR102.StatusCode.AllDone){MessageBox.Show(String.Format("串口{0}打开失败!", portName.Trim()));}MessageBox.Show(String.Format("串口{0}打开成功!", portName.Trim()));//检测并连接设备if (FR102.TestReader() != FR102.StatusCode.AllDone)// Reader.TestReader() != 0x00){MessageBox.Show(String.Format("没有检测到连接到串口{0}的设备,请检查与设备连接的串口!", portName.Trim()));if (FR102.CloseSerialPort() == 0x00){MessageBox.Show(String.Format("串口{0}关闭成功!", portName.Trim()));}return;}if (FR102.RestartReader() != FR102.StatusCode.AllDone){MessageBox.Show("设备启动失败!");return;}//设置波特率方法默认为 9600if (FR102.ChangeBaudRate(Int32.Parse("9600")) != 0x00){MessageBox.Show("修改串口波特率失败!");return;}}3卡片信息类:class CardInf{publicstring CardID { get; set; }publicstring StudentID { get; set; }publicstring Name { get; set; }publicstring Gender { get; set; }publicint Age { get; set; }publicint Money { get; set; }publicstring State { get; set; }publicstatic CardInf GetCardInf(string cardID){string sql="select CardID,StudentID,Name,Gender,Age,Money,State from Student where CardID=@cardID";DataTable table=new DbUtil().Query(sql,cardID);if (table.Rows.Count > 0)//卡号对应的数据存在{CardInf ci = new CardInf(){CardID = table.Rows[0]["cardID"].ToString(),StudentID = table.Rows[0]["studentID"].ToString(),Name = table.Rows[0]["Name"].ToString(),Gender = table.Rows[0]["Gender"].ToString(),Age = int.Parse(table.Rows[0]["Age"].ToString()),Money = int.Parse(table.Rows[0]["Money"].ToString()),State = table.Rows[0]["State"].ToString()};return ci;}else//没找到相关数据{returnnull;}}publicint Insert(){string sql = "insert into Student"+ "(CardID,StudentID,Name,Gender,Age,Money,State)"+ "values(@carid,@sid, @name, @gender,@age,@money,@state)";int r = new DbUtil().Update(sql, CardID, StudentID,Name, Gender, Age, Money, State);return r;}publicint UpdateMoney(){string sql = "update Student set Money=@money WHERE CardID=@cardID";int r = new DbUtil().Update(sql,Money,CardID);return r;}RFID识别并连接publicpartialclass FrmConnection : Form{public FrmConnection(){InitializeComponent();}private RFID rfid=new RFID();privatevoid FrmConnection_Load(object sender, EventArgs e)//为了防止用户在组Á合框中输入,将组合框的DropDownList属性设置为aDropDownList{//获取所有可用的串口名string[] portNames = SerialPort.GetPortNames();//把串口名添加到组合框foreach (var p in portNames){comboBox1.Items.Add(p);}//默认选取第一个串口if (comboBox1.Items.Count > 0){comboBox1.SelectedIndex = 0;}else{MessageBox.Show("找不到串口");}}privatevoid button1_Click(object sender, EventArgs e){string port = boBox1.Text;if (port == ""){MessageBox.Show("请选择一个串口号");}else{rfid.OpenPort(port);this.Close();}}}制作卡片信息并储存到数据库publicpartialclass FrmNewCard : Form{public FrmNewCard(){InitializeComponent();}privatestring[] information;private RFID rfid = new RFID();privatevoid timer1_Tick(object sender, EventArgs e){if (txtCardID.Text == ""){this.txtCardID.Text = rfid.GetCardID();string sql = "select CardID from Student where CardID='{0}'"; DataTable dtb = new Utils.DbUtil().Query(sql, this.txtCardID.Text); if (dtb.Rows.Count > 0){MessageBox.Show("该卡已登记注册,请检查换卡");this.Close();timer1.Stop();}}}privatevoid btnCancel_Click(object sender, EventArgs e){timer1.Start();}privatebool Check(){bool flag = false;if (txtCardID.Text == ""){MessageBox.Show("未读到卡号");flag = false;}elseif (txtName.Text == ""){MessageBox.Show("姓名不能为空");flag = false;}elseif (cmbGender.Text == "请选择" || cmbGender.Text == "") {MessageBox.Show("请选择性别");flag = false;}elseif (txtAge.Text == ""){MessageBox.Show("年龄不能为空");flag = false;}elseif (txtStudentID.Text == ""){MessageBox.Show("学号不能为空");flag = false;}elseif (txtMoney.Text == ""){MessageBox.Show("请填写金额");flag = false;}else{flag = true;}if (txtName.Text != ""){byte[] b = System.Text.Encoding.Default.GetBytes(txtName.Text); if (b.Length > 8){MessageBox.Show("字符过长");flag = false;}}return flag;}privatevoid GetInformation(){information = newstring[1];}privatevoid btnEnroll_Click(object sender, EventArgs e){if (Check()){GetInformation();rfid.Initialize(txtCardID.Text);rfid.Writer(txtCardID.Text, information);rfid.Recharge(txtMoney.Text);//向卡里写入金额CardInf ci = new CardInf(){CardID = txtCardID.Text,StudentID =txtStudentID.Text,Name = txtName.Text,Gender = cmbGender.Text,Age = int.Parse(txtAge.Text),Money = int.Parse(txtMoney.Text),State = txtState.Text};timer1.Stop();ci.Insert();MessageBox.Show("注册成功!");this.Close();timer1.Stop();}}}持卡消费,扣除金额并写回数据库publicpartialclass MessConsume : Form{private RFID rfid = new RFID();privatestring[] information;private CardInf ci;public MessConsume(){InitializeComponent();}privatevoid MessConsume_Load(object sender, EventArgs e) {timer1.Start();}privatevoid timer1_Tick(object sender, EventArgs e){if (txtCardID.Text == ""){this.txtCardID.Text = rfid.GetCardID();ci = CardInf.GetCardInf(txtCardID.Text); if (ci != null){txtCardID.Text = ci.CardID;txtState.Text = ci.State;txtMoney.Text = ci.Money.ToString(); }}}获取卡片信息并显示privatevoid GetInformation(){information = newstring[1];}privatevoid btnOk_Click(object sender, EventArgs e){GetInformation();rfid.Initialize(txtCardID.Text);if (txtState.Text!= "正常"){MessageBox.Show("状态异常,拒绝充值");return;}if (ci.Money >= int.Parse(txtConsumeMoney.Text)){rfid.CutPayment(txtConsumeMoney.Text);ci.Money -= int.Parse(txtConsumeMoney.Text);ci.UpdateMoney();//??????????????????? MessageBox.Show("消费成功");}else{MessageBox.Show("余额不足");}timer1.Stop();this.Close();timer1.Stop();}}各模块操作方法:///<summary>///读卡方法///</summary>///<param name="cardID">卡号</param>///<returns>读取到的数据</returns>publicstring Reader(string cardID){string information = "";Byte[] Data;string str = "";AuthenticatedKey(cardID);for (int i = 5; i < 7; i++){FR102.StatusCode ec = FR102.PcdRead(Convert.ToByte(i), out Data);information += Encoding.UTF8.GetString(Data);}#region注释掉的//if (ec1 != FR102.StatusCode.AllDone)//{// MessageBox.Show(String.Format("失败:试图读取卡片:{0}的{1}块数据失败!")); //}//str1 = Converter.ArrayToHexStr(Data1);//strChina1 = ToChina(str1);//#endregion//#region 读取第二块//Byte[] Data2;//FR102.StatusCode ec2 = FR102.PcdRead(Convert.ToByte("6"), out Data2);//if (ec2 != FR102.StatusCode.AllDone)//{// MessageBox.Show(String.Format("失败:试图读取卡片:{0}的{1}块数据失败!")); //}//str2 = Converter.ArrayToHexStr(Data2);//strChina2 = ToChina(str2);//for (int i = 0; i < strChina2.Length; i++)//{// if (strChina2.Substring(i, 1) != ".")// {// str3 += strChina2.Substring(i, 1);// }// else// {// break;// }//}//#endregion#endregion//if (cardID != "")//{// try// {// information = information.Substring(0, information.IndexOf('@')); // }// catch// {// }//}return information;}#endregion#region写卡方法///<summary>///写卡方法///</summary>///<param name="cardID">卡号</param>///<param name="information">要写入的信息</param>publicvoid Writer(string cardID, string[] information){AuthenticatedKey(cardID);string str = "";for (int i = 0; i < information.Length; i++){str = str + information[i] + "$";}str = str.Remove(stIndexOf("$"), 1);byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);List<byte[]> myArr = To16(str);byte[] allByte = newbyte[myArr.Count * 16];for (int k = 5; k < myArr.Count + 5; k++){byte[] byteArr = myArr[k - 5];FR102.StatusCode ec = FR102.PcdWrite(Byte.Parse(k.ToString()), byteArr); }#region注释掉的//int num = To16(".").Length;//if (strNum.Length > 32)//{// strFirst = strNum.Substring(0, 32);// strLast = strNum.Substring(32);// #region 第一块// addr = Byte.Parse(address);// //int num = strNum.Length;// Byte[] Data;// Data = Converter.HexStrToArray(strFirst);// if (Data.Length != 16)// {// MessageBox.Show("数据无效。