广州城市职业学院
学生实验(训)报告
(此表可从校园网下载)
注:此表适用于课内实验、实训;学生每完成一个完整的实验(训)内容,填写一份报告,交指导教师批改。课程结束后,实验(训)报告作为教学文件由教学单位保存。
广州城市职业学院
学生实验(训)报告
(此表可从校园网下载)
注:此表适用于课内实验、实训;学生每完成一个完整的实验(训)内容,填写一份报告,交指导教师批改。课程结束后,实验(训)报告作为教学文件由教学单位保存。
第二篇:物联网10感知和网络传输技能实训
郑州轻工业学院
实 训 报 告
实训名称: 物联网感知和网络传输技能实训
姓 名: 王 博
院(系): 计算机与通信工程学院
专业班级: 物联网技术10-01
学 号: 541013150141
指导教师: 陈燕 苏日建 李娜娜 张涛
成 绩:
时间: 20##年6月25日至20##年9月 14日
目录
1 主要内容. 2
1.1 读卡器的介绍. 2
1.1.1 特性. 2
1.2 M1卡的学习与操作. 2
1.2.1 RF接口. 3
1.2.2 M1卡工作及通讯原理. 3
1.3 上位机管理软件的开发. 3
1.4 个人信息的录入与整体系统的测试. 5
2 实训心得. 8
3 附录. 8
3.1 连接读卡器代码. 8
3.2 寻卡代码. 9
3.3 数字按键赋值代码. 11
3.4 充值代码. 11
3.5 消费代码. 12
3.6 写入数据代码. 13
3.7 清空数据代码. 15
3.8 断开连接代码. 15
1 主要内容
1.1 读卡器的介绍
MIFARE MF1是符合ISO/IEC 14443A的非接触智能卡。其通讯层(MIFARE RF 接口)符合ISO/IEC 14443A标准的第2和第3部分。其安全层支持域检验的CRYPTO1数据流加密。
1.1.1 特性
1. MIFARE RF 接口 (ISO/IEC 14443 A)
? 工作距离:可达100mm (取决于天线尺寸结构)
? 工作频率:13.56 MHz
? ?快速数据传输:106 kbit/s
? 高度数据完整性保护:16 Bit CRC,奇偶校验,位编码,位计数
? 真正的防冲突
2.EEPROM
? 1 Kbyte,分为16个区,每区4个块,每块16字节。
? 用户可定义内存块的读写条件
? 数据耐久性10年
? 写入耐久性10万次以上
3. 安全性
? 三层认证(ISO/IEC DIS9798-2)
? 带射频通道数据加密
? 每区两个密钥,支持密钥分级的多应用场合
? 每卡一个全球唯一序列号
? 在运输过程中以传输密钥保护对EEPROM的访问权
1.2 M1卡的学习与操作
MF1 S50集成电路芯片内含1 Kbyte EEPROM、RF接口和数字控制单元。能量和数据通过天线传输,卡中天线为几匝线圈,直接连接到芯片上。.不再需要额外的组件。
1.2.1 RF接口
– 调制解调器
– 检波器
– 时钟发生器
– 上电复位
– 稳压器
1.2.2 M1卡工作及通讯原理
命令由读写器发出,根据相应区读写条件受数字控制单元的控制。
1. 呼叫(REQUEST STANDARD / ALL)
卡上电复位后,通过发送request应答码(ATQA 符合ISO/IEC 14443A),能够回应读写器向天线范围内所有卡发出的request 命令。
2. 防冲突循环(ANTICOLLISION LOOP)
在防冲突循环中,读回一张卡的序列号。如果在读写器的工作范围内有几张卡,它们可以通过唯一序列号区分开来,并可选定以进行下一步交易。未被选定的卡转入待命状态,等候新的request命令。
3.选卡(SELECT CARD)
读写器通过select card命令选定一张卡以进行认证和存储器相关操作。该卡返回选定应答码(ATS= 08h),明确所选卡的卡型。
4. 三轮认证(3 PASS AUTHENTICATION)
选卡后,读写器指定后续读写的存储器位置,并用相应密钥进行三轮认证。认证成功后,所有的存储器操作都是加密的。
5. 存储器操作
认证后可执行下列操作:
? 读数据块
? 写数据块
? 减值:减少数据块内的数值,并将结果保存在临时内部数据寄存器中。
? 加值:增加数据块内的数值,并将结果保存在数据寄存器中。
? 恢复:将数据块内容移入数据寄存器。
? 转存:将临时内部数据寄存器的内容写入数值块
1.3 上位机管理软件的开发
用vs或vc制作设计操作界面,图1-1
图1-1
在相应按钮和编辑框后加入对应程序代码
连接设备按钮对应代码,图1-2
图1-2
数字按钮“1”对应代码,图1-3
图1-3
按钮太多不再一一截图展示
另因为编辑框和列表框不需要程序代码只需在属性中设置属性,在此不再截图展示
1.4 个人信息的录入与整体系统的测试
程序开始运行界面,图1-4
图1-4
连接设备成功界面,图1-5
图1-5
连接M1卡并读取数据成功界面,图1-6
图1-6
写入数据成功界面,图1-7
图1-7
充值和消费成功界面,图1-8
图1-8
再次连接读取数据成功界面,图1-9
图1-9
2 实训心得
此次实训为期四周,但在机房实训总时间只有十四天,实训刚开始两天老师讲了些M1卡的知识就开始让我们自己做,后来老师又讲了些实用的知识,自己又在网上找些资料还有问老师,还有和同学讨论,共同进步,才慢慢懂得了怎么做。
总体来说实训期间也学到了许多知识,但由于C语言学的不好,很多代码不会写都是粘贴网上或者老师给的例子里面的代码段,让自己写代码的话还是不会。以后还是要多学学C语言。同时也让我认识到了团体的力量,每人解决一个问题,放在一起就能完成一个项目。
3 附录
3.1 连接读卡器代码
icdev=rf_usbinit();
if (icdev>0)
{ m_list.AddString("设备连接成功!");
unsigned char status[19];
st=rf_get_status(icdev,status);
if (st==0)
{ m_list.AddString((char*)status);
}
else
{ m_list.AddString("获取版本号失败!");
}
unsigned char key[6]={0xff,0xff,0xff,0xff,0xff,0xff};
st=rf_load_key(icdev,0,sector,key);
if(st==0)
{ m_list.AddString("load key right!");
}
else
{ m_list.AddString("load key fail!");
}
rf_beep(icdev,50);
}
else
{ m_list.AddString("连接失败!");
}
}
3.2 寻卡代码
unsigned long snr;
st=rf_card(icdev,0,&snr);
if (st==0)
{ CString str;
str.Format("%x",snr);
m_list.AddString("rf_card ok!");
m_list.AddString(str);
}
else
m_list.AddString("rf_card error");
st=rf_authentication(icdev,0,sector);
if (st!=0)
{ m_list.AddString("验证密码失败!");
}
if (st==0)
{ m_list.AddString("读数据成功!");
}
else
m_list.AddString("读数据失败!");
unsigned char databuff[17],databuff1[17],databuff2[17];
ZeroMemory(databuff,17);
ZeroMemory(databuff1,17);
//ZeroMemory(databuff2,17);
st=rf_read(icdev,sector*4,databuff);
st=rf_read(icdev,sector*4+1,databuff1);
st=rf_read(icdev,sector*4+2,databuff2);
if(st==0)
{ SetDlgItemText(IDC_EDIT1,(char*)databuff);
SetDlgItemText(IDC_EDIT2,(char*)databuff1);
SetDlgItemText(IDC_EDIT4,(char*)databuff2);
//m_list.AddString((char*)databuff);
m_list.AddString((char*)databuff);
}
else
m_list.AddString("读数据失败!");
}
3.3 数字按键赋值代码
CString mmstr1;
mmstr1=m_v;
mmstr1+="1";
m_v=mmstr1;
UpdateData(false);
3.4 充值代码
{ unsigned M,N;
CString mmt,mmr;
mmt=m_v.GetBuffer(16)
mmr=m_n.GetBuffer(16);
N=atoi(mmt);
M=atoi(mmr);
M+=N;
SetDlgItemInt(IDC_EDIT4,M);
UpdateData();
CString rsing3=m_n.GetBuffer(16);
m_list.SetCurSel(m_list.GetCount()-1);
char*data3=rsing3.GetBuffer(rsing3.GetLength());
m_list.AddString(data3);
m_list.SetCurSel(m_list.GetCount()-1);
st=rf_write(icdev,sector*4+2,(unsigned char*)data3);
//char* data3=data.GetBuffer(data.GetLength());
if (st==0)
{ m_list.AddString("金额改写成功!");
m_list.SetCurSel(m_list.GetCount()-1);
}
else
{ m_list.AddString("金额改写失败!");
m_list.SetCurSel(m_list.GetCount()-1);
}
UpdateData(false);
UpdateData();
m_v="";
UpdateData(false);
// TODO: Add your control notification handler code here
}
3.5 消费代码
{
unsigned M,N;
CString mmt,mmr;
mmr=m_n.GetBuffer(16);
mmt=m_v.GetBuffer(16);
M=atoi(mmr);
N=atoi(mmt);
M-=N;
SetDlgItemInt(IDC_EDIT4,M);
UpdateData();
CString rsing3=m_n.GetBuffer(16);
m_list.SetCurSel(m_list.GetCount()-1);
char*data3=rsing3.GetBuffer(rsing3.GetLength());
m_list.AddString(data3);
m_list.SetCurSel(m_list.GetCount()-1);
st=rf_write(icdev,sector*4+2,(unsigned char*)data3);
//char* data3=data.GetBuffer(data.GetLength());
if (st==0)
{
m_list.AddString("金额改写成功!");
m_list.SetCurSel(m_list.GetCount()-1);
}
else
{
m_list.AddString("金额改写失败!");
m_list.SetCurSel(m_list.GetCount()-1);
}
UpdateData(false);
UpdateData();
m_v="";
UpdateData(false);
// TODO: Add your control notification handler code here
}
3.6 写入数据代码
{
UpdateData();
CString rsing=m_name.GetBuffer(16);
m_list.SetCurSel(m_list.GetCount()-1);
char* data1=rsing.GetBuffer(rsing.GetLength());
m_list.SetCurSel(m_list.GetCount()-1);
//char* data1=data.GetBuffer(data.GetLength());
st=rf_write(icdev,sector*4,(unsigned char*)data1);
UpdateData();
m_list.SetCurSel(m_list.GetCount()-1);
char* data3=rsing.GetBuffer(rsing.GetLength());
m_list.SetCurSel(m_list.GetCount()-1);
//char* data1=data.GetBuffer(data.GetLength());
st=rf_write(icdev,sector*4,(unsigned char*)data3);
UpdateData(false);
UpdateData();
CString rsing2=m_number.GetBuffer(16);
m_list.SetCurSel(m_list.GetCount()-1);
char*data2=rsing2.GetBuffer(rsing2.GetLength());
m_list.AddString(data2);
m_list.SetCurSel(m_list.GetCount()-1);
st=rf_write(icdev,sector*4+1,(unsigned char*)data2);
//char* data2=data.GetBuffer(data.GetLength());
if (st==0)
{
m_list.AddString("写数据成功!");
m_list.SetCurSel(m_list.GetCount()-1);
}
else
{
m_list.AddString("写数据失败!");
m_list.SetCurSel(m_list.GetCount()-1);
}
UpdateData(false);
// TODO: Add your control notification handler code here
}
3.7 清空数据代码
{
m_list.ResetContent();
m_name="";
m_number="";
UpdateData(false);
}
3.8 断开连接代码
{
st=rf_exit(icdev);
if (st==0)
{
m_list.AddString("断开连接!");
}
}