物联网技术实训报告食堂餐卡系统Word格式.docx
《物联网技术实训报告食堂餐卡系统Word格式.docx》由会员分享,可在线阅读,更多相关《物联网技术实训报告食堂餐卡系统Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
4实训心得
5附录(代码)
1需求说明
食堂餐卡系统需求说明
(1)完成售饭终端的软件设计。
(2)实现M1卡的信息录入与修改。
(3)整个系统运行稳定。
(4)报告书写规范。
2功能描述
食堂餐卡系统功能描述
(1)读卡器芯片的学习与使用。
Mifare1S50非接触式智能卡片有着16个Sector(扇区);
每个Sector包含4个Block(块);
每个Block具有16个byte的存储容量。
Sector被定义为Sector0至Sector15;
Block被分为Block0至Block3;
整个Mifare1S50非接触式智能卡共有64个Block。
Sector0中的Block0记录了该张智能卡的序列号(SerialNumber)以及生产厂商的标志信息等,这些信息已在卡片出厂时固化,不能更改。
因此该Block不能再复用为应用数据块。
每个Sector中的Block3被特别用来存放对该Sector中应用块Block0,1,2及其本身Block3进行数据存取的密码及存取权限。
整个Mifare1S50非接触式智能卡共有16个Block3。
根据绝对地址编址,他们可被编为Block3(在Sector0中),Block7(在Sector1中),Block11(在Sector2中),以及Block63(在Sector15中)等等。
对于某一Sector中的Block3的绝对地址编址可以由下列公式计算得到:
BlockX=(N+1)*4-1
其中:
X:
绝对地址编址的Block块号
N:
Sector扇号,0至15
通常每个扇区的Block0,1,2都存放着非常保密的数据,例如坐公交车/出租车前在公交公司指定地点已购买的车资钱款,智能大厦/智能小区进出时所需的控制信息,股票交易时持有股票交易智能卡片者必须对已存放在智能卡中的交易密码数据(例如帐户、存款信息、已买进股票数量/品种等等)进行确认,才能得以股票交易,等等。
由于每一个Block3中包含了该扇区的密码字节以及对该扇区中其余Block0,1,2进行数据处理的存取控制权限字节,因此如何操作处理Block3将是很重要的内容。
以下将展开对每个扇区的Block3进行研究。
Block3有16个byte组成。
前6个字节是密码A(KEYA),KEYA的缺省值可能为“A0A1A2A3A4A5”;
最后6个字节是密码B(KEYB),KEYB的缺省值可能为“B0B1B2B3B4B5”;
中间4个字节是控制字节,缺省值可能为“FFH07H80H69H”;
利用KEYA或KEYB并遵守早已定义在4个控制字节中的存取条件,我们便能对该密码(KEYA或KEYB)所对应的Sector内的应用块Block0,1,2进行数据读/写/更新等操作。
由于非接触式智能卡的操作,包括数据流的传递等都是以“非接触”方式来完成的,因此在MCU与非接触式智能卡之间必须有一个传递密码(或数据流)的中间媒体,即ASIC模块。
RC150/170就是这样一种ASIC模块。
它担负着非接触式智能卡与MCU(微处理机)之间所有的密码/数据相互传递的重要任务。
对非接触式智能卡进行密码操作,变成对RC150/170ASIC模块进行密码操作。
RC150/170ASIC模块与非接触式智能卡之间的信息传递(包括密码等)对用户来说是透明的,会自动传递并完成。
因此如何对非接触式智能卡进行“密码操作”(对Block3的操作)变成如何对RC150/170ASIC模块进行密码操作。
Philips公司的MCM200模块,MCM500模块或SB201,SB601(Uni-VisionEngineeringLtd.的产品)模块中都包含有RC150/170ASIC模块,因此本文所讨论的内容,包括下面设计的程序等,也适用于这些模块。
RC170是RC150的新一代ASIC模块,速度较快。
(2)M1卡的学习与操作。
MIFAREMF1是符合ISO/IEC14443A的非接触智能卡。
其通讯层(MIFARERF接口)符合ISO/IEC14443A标准的第2和第3部分。
其安全层支持域检验的CRYPTO1数据流加密。
非接触能源和数据传递
在MIFARE卡中,芯片连接到一个几匝的天线线圈上,并嵌入塑料中,形成了一个无源的非接触卡。
不需要电池。
当卡接近读写器天线时,高速的RF通讯接口将以106kBit/s的速率传输数据。
通讯原理
命令由读写器发出,根据相应区读写条件受数字控制单元的控制。
图
(1)通信原理
存储器读写
必须如前所述,先选定卡并通过认证,才能执行存储器操作。
图
(2)存储器读写
3系统设计及实现
(1)打开VC,建立界面:
(2)编写程序:
图(4)编写的主面板
(3)个人信息的录入与整体系统的测试。
设备连接:
图(5)设备连接
写入数据:
图(6)数据写入
读取数据
图(7)数据读取
进行消费与充值
图(8)消费
图(9)充值
4实训心得
通过实训中心老师的课堂讲解,使我加深了对自己专业的认识。
从而确定自己以后的努力方向。
要想在短暂的实训时间内,尽可能多的学到东西,就需要我们跟老师或同学进行很好的沟通,加深彼此的了解。
只有我们跟老师多沟通,让老师更了解我们,才能跟真切的对我们进行培训工作。
由此,班级的文化“共享”就在生活中慢慢形成了。
“纸上得来终觉浅,绝知此事要躬行!
”在这短短的时间里,让我深深的感觉到自己在实际应用中所学专业知识的匮乏。
让我真真领悟到“学无止境”这句话的涵义。
而老师在专业认识周中所讲的,都是课本上没有而对我们又非常实用的东西,这又给我们的实训增加了浓墨淡采的光辉。
我懂得了实际生活中,专业知识是怎样应用与实践的。
在这些过程中,我不仅知道了职业生涯所需具备的专业知识,而且让我深深体会到一个团队中各成员合作的重要性,要善于团队合作,善于利用别人的智慧,这才是大智慧。
靠单一的力量是很难完成一个大项目的,在进行团队合作的时候,还要耐心听取每个成员的意见,使我们的组合达到更加完美。
这次实训带给我太多的感触,它让我知道工作上的辛苦,事业途中的艰辛。
让我知道了实际的工作并不像在学校学习那样轻松。
人非生而知之,虽然我现在的知识结构还很差,但是我知道要学的知识,一靠努力学习,二靠潜心实践。
没有实践,学习就是无源之水,无本之木。
这次实训让我在一瞬间长大:
我们不可能永远呆在象牙塔中,过着一种无忧无虑的生活,我们总是要走上社会的,而社会,就是要靠我们这些年轻的一代来推动。
这就是我们不远千里来实训的心得和感受,而不久后的我,面临是就业压力,还是继续深造,我想我都应该好好经营自己的时间,充实、完善自我,不要让自己的人生留下任何空白!
5附录(代码)
几个重要程序代码:
厂商自带代码HANDLEicdev;
intst;
intsector=1;
BOOLCMyDlg:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
icdev=rf_usbinit();
if(icdev>
0)
m_list.AddString("
设备连接成功!
"
);
m_list.SetCurSel(m_list.GetCount()-1);
unsignedcharstatus[19];
st=rf_get_status(icdev,status);
if(st==0)
m_list.AddString((char*)status);
m_list.SetCurSel(m_list.GetCount()-1);
else
m_list.AddString("
获取版本号失败!
unsignedcharkey[6]={0xff,0xff,0xff,0xff,0xff,0xff};
st=rf_load_key(icdev,0,sector,key);
if(st==0)
loadkeyright!
loadkeyfail!
rf_beep(icdev,50);
else
连接失败!
//TODO:
Addextrainitializationhere
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
}
寻卡的代码是unsignedlongsnr;
st=rf_card(icdev,0,&
snr);
if(st==0)
CStringstr;
str.Format("
%x"
snr);
rf_cardok!
m_list.AddString(str);
rf_carderror"
m_list.SetCurSel(m_list.GetCount()-1);
st=rf_authentication(icdev,0,sector);
if(st!
=0)
验证密码失败!
软件盘上的button代码如1
CStringmmstr1;
mmstr1=m_Yue;
mmstr1+="
1"
;
m_Yue=mmstr1;
UpdateData(false);
充值与消费中刚开始遇到的麻烦是获取edit控件里的字符串,查完工具书后实现的代码是rsing=m_Yue.GetBuffer(16);
获得m_Yue里的字符串,16为长度。
后面的是转换为int,“Anothervalue=atoi(rsing);
”,其余的都是数学运算了,获取与存储都是由厂商带的光盘里的代码,代码如下:
unsignedintAnothervalue,m_end,endva;
CStringrsing;
unsignedchardatabuffn[17];
CStringdata5,y;
ZeroMemory(databuffn,17);
//UpdateData();
st=rf_read(icdev,sector*6,databuffn);
m_end=atoi((LPCTSTR)databuffn);
endva=m_end;
UpdateData();
rsing=m_Yue.GetBuffer(16);
//获得编辑框里的字符串
Anothervalue=atoi(rsing);
//转换成int
if((m_end=m_end-Anothervalue)<
<
{MessageBox("
消费失败,请重新消费"
SetDlgItemText(IDC_EDIT3,"
m_end=endva-Anothervalue;
//rsing=itoa(456);
//y=atoi("
456"
SetDlgItemInt(IDC_EDIT4,m_end);
SetDlgItemText(IDC_EDIT3,"
data5=m_v.GetBuffer(16);
UpdateData();
char*data6=data5.GetBuffer(data5.GetLength());
st=rf_write(icdev,sector*6,(unsignedchar*)data6);
ZeroMemory(databuffn,17);
st=rf_read(icdev,sector*6,databuffn);
if(st==0)
{m_list.AddString((char*)databuffn);
消费成功!
else
消费失败!
}}
voidCMyDlg:
OnCE()
{
m_Yue="
Addyourcontrolnotificationhandlercodehere
充值与消费是相对应的。