信息工程学院
《物联网技术实训》报告
专业班级 物联网A1201
学 号 0408120136
姓 名 王强
组 号
实 验 室 H307 H301
成绩评定
老师签名
20## 年 06 月 10 日
一、实训目的
0、理解智能家居网络架构及综合应用
1、掌握无线传感器网络节点开发调试环境搭建
2、掌握固件程序的编译调试方法
3、掌握固件代码的烧写方法
4、掌握上位机程序的开发方法
5、掌握串口调试工具的使用方法
二、实训项目列表
1.智能家居演示及操作实训
2.CC2530串口通信实验
3.CC2530 ADC实验
4.温湿度及光照采集实验
5.简单无线通信实验
6.其他选作实验
三、实训项目过程及结果记录
1.智能家居演示实训
智能家居H301的网络拓扑:
其它基于CC2530做的实验都经过了环境搭建、下载调试过程:
1、固件开发环境(IAR)搭建
打开安装包,并在需要输入密钥时,打开注册机,获得IAR的注册码并填入IAR安装程序中,再一路NEXT,直到安装完成。
2、固件程序编译并下载:
第一:将CC-debugger连接到URS-CC2530RF实验板和电脑,给URS-CC2530RF板供应5V电源并打开电源开关。按下CC-debugger上的REST按键,观察LED是否为绿色。否则就得检查连接是否正常。
第二:打开老师提供的实验文件,找到位于IAR_files文件夹下的simple_RF文件,并双击打开(图2-1)。
第三:在打开后的IAR界面,对程序进行修改后(图2-2)。
第四:点击Make按钮进行编译之后,查看位于下方的Build框内的编译报告,如果Errors不为0,则需根据具体错误提示内容进行对程序的修改,直到Errors为0。
第五:点击Debug按键,对编译好的程序进行下载(图2-3)。下载失败则弹出错误提示框,需要重新检查线路连接,以及工程设置,下载成功则进入调试界面(图2-4)。
第六:点击Go按钮后程序将一直执行,之后点击按钮退出调试。
2.CC2530串口通信实验
串口调试助手使用:
1、进行如下选择:
串口:COM1,波特率:115200,效验位:无,数据位:8,停止位:1。
2、点击“打开串口”。
3、可以看见右边接收到的数据都为十六进制数据,因此需要将“接收设置”下的“十六进制接收”取消,即可看到数据为
www.ourselec.com,再发送任意数据,之后这个数据将会被回传(如图3-1)。
3.CC2530 ADC实验
将程序下载后即可在LCD上看到电压为3.3V,通过调节URS-CC2530RF实验板右下角的两个滑动变阻器,可以在LCD上看见两个电压在依据改变的量在发生改变(如图3-2)。
4.温湿度及光照采集实验
将温湿度及光照采集传感器模块安装到URS-CC2530RF实验板上,同时程序也是已经下载了,我们就可以看到LCD上显示有温湿度和光照数据。将光照传感器遮住发现光照数据改变,对温湿度传感器吹气也会发现LCD上的数值发生改变(如图3-3)。
5.简单无线通信实验
使用两块URS-CC2530RF实验板,在开机状态下按照LCD显示内容按下按键:首先按下SW1,然后通过按下不同的按键SW2/SW3选择该板子为接收模块还是发送模块。之后在发送模块上按下SW4,可以发现在接收板上的LED1亮了,再按下发送板的SW4,接收板的LED1灯灭(如图3-4)。
四、实验总结
通过本次实验使我得到基本实验技能的训练与分析能力的训练,以及初步掌握CC2530的无线通信的基本方法,具有初步独立进行使用CC2530进行对传感器数据处理的能力,如何使程序更具有严谨性,对各门知识得到融会贯通的认识和掌握,加深对理论知识的理解。
附件:
图 3-1 串口助手显示
图 3-2 ADC显示
图 3-3 温湿度与光照采集显示
图 3-4 简单的无线通信实验
第二篇:实训报告物联网技术11-1姓名
实 训 报 告
实训名称: 物联网感知和网络传输技能实训
院 (系): 计算机与通信工程学院
目 录
1 需求说明
食堂餐卡系统需求说明
2 功能描述
食堂餐卡系统功能描述
3 系统设计及实现
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的绝对地址编址可以由下列公式计算得到:
Block X=(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卡的学习与操作。
MIFARE MF1是符合ISO/IEC 14443A的非接触智能卡。其通讯层(MIFARE RF 接口)符合ISO/IEC 14443A标准的第2和第3部分。其安全层支持域检验的CRYPTO1数据流加密。
非接触能源和数据传递
在MIFARE卡中,芯片连接到一个几匝的天线线圈上,并嵌入塑料中,形成了一个无源的非接触卡。不需要电池。当卡接近读写器天线时,高速的RF通讯接口将以106 kBit/s 的速率传输数据。
通讯原理
命令由读写器发出,根据相应区读写条件受数字控制单元的控制。
图(1)通信原理
存储器读写
必须如前所述,先选定卡并通过认证,才能执行存储器操作。
图(2)存储器读写
3 系统设计及实现
(1)打开VC,建立界面:
(2)编写程序:
图(4)编写的主面板
(3)个人信息的录入与整体系统的测试。
设备连接:
图(5)设备连接
写入数据:
图(6)数据写入
读取数据
图(7)数据读取
进行消费与充值
图(8)消费
图(9)充值
4 实训心得
通过实训中心老师的课堂讲解, 使我加深了对自己专业的认识。从而确定自己以后的努力方向。要想在短暂的实训时间内,尽可能多的学到东西,就需要我们跟老师或同学进行很好的沟通,加深彼此的了解。只有我们跟老师多沟通,让老师更了解我们,才能跟真切的对我们进行培训工作。由此,班级的文化“共享”就在生活中慢慢形成了。“纸上得来终觉浅,绝知此事要躬行!”在这短短的时间里,让我深深的感觉到自己在实际应用中所学专业知识的匮乏。让我真真领悟到“学无止境”这句话的涵义。而老师在专业认识周中所讲的,都是课本上没有而对我们又非常实用的东西,这又给我们的实训增加了浓墨淡采的光辉。我懂得了实际生活中,专业知识是怎样应用与实践的。在这些过程中,我不仅知道了职业生涯所需具备的专业知识,而且让我深深体会到一个团队中各成员合作的重要性,要善于团队合作,善于利用别人的智慧,这才是大智慧。靠单一的力量是很难完成一个大项目的,在进行团队合作的时候,还要耐心听取每个成员的意见,使我们的组合达到更加完美。这次实训带给我太多的感触,它让我知道工作上的辛苦,事业途中的艰辛。让我知道了实际的工作并不像在学校学习那样轻松。人非生而知之,虽然我现在的知识结构还很差,但是我知道要学的知识,一靠努力学习,二靠潜心实践。没有实践,学习就是无源之水,无本之木。这次实训让我在一瞬间长大:我们不可能永远呆在象牙塔中,过着一种无忧无虑的生活,我们总是要走上社会的,而社会,就是要靠我们这些年轻的一代来推动。这就是我们不远千里来实训的心得和感受,而不久后的我,面临是就业压力,还是继续深造,我想我都应该好好经营自己的时间,充实、完善自我,不要让自己的人生留下任何空白!
5 附录(代码)
几个重要程序代码:厂商自带代码HANDLE icdev;
int st;
int sector=1;
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
icdev=rf_usbinit();
if (icdev>0)
{
m_list.AddString("设备连接成功!");
m_list.SetCurSel(m_list.GetCount()-1);
unsigned char status[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("获取版本号失败!");
m_list.SetCurSel(m_list.GetCount()-1);
}
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!");
m_list.SetCurSel(m_list.GetCount()-1);
}
else
{
m_list.AddString("load key fail!");
m_list.SetCurSel(m_list.GetCount()-1);
}
rf_beep(icdev,50);
}
else
{
m_list.AddString("连接失败!");
m_list.SetCurSel(m_list.GetCount()-1);
}
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
寻卡的代码是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.SetCurSel(m_list.GetCount()-1);
m_list.AddString(str);
m_list.SetCurSel(m_list.GetCount()-1);
}
else
m_list.AddString("rf_card error");
m_list.SetCurSel(m_list.GetCount()-1);
st=rf_authentication(icdev,0,sector);
if (st!=0)
{
m_list.AddString("验证密码失败!");
m_list.SetCurSel(m_list.GetCount()-1);
}
软件盘上的button代码如1
CString mmstr1;
mmstr1=m_Yue;
mmstr1+="1";
m_Yue=mmstr1;
UpdateData(false);
充值与消费中刚开始遇到的麻烦是获取edit控件里的字符串,查完工具书后实现的代码是rsing=m_Yue.GetBuffer(16);获得m_Yue里的字符串,16为长度。后面的是转换为int,“Anothervalue=atoi(rsing);”,其余的都是数学运算了,获取与存储都是由厂商带的光盘里的代码,代码如下:
unsigned int Anothervalue,m_end,endva;
CString rsing;
unsigned char databuffn[17];
CString data5,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)<<0)
{ MessageBox("消费失败,请重新消费");
UpdateData();
SetDlgItemText(IDC_EDIT3,"");
UpdateData();
rsing=m_Yue.GetBuffer(16);//获得编辑框里的字符串
Anothervalue=atoi(rsing);//转换成int
m_end=endva-Anothervalue;
//rsing=itoa(456);
//y=atoi("456");
UpdateData();
SetDlgItemInt(IDC_EDIT4,m_end);
UpdateData();
SetDlgItemText(IDC_EDIT3,"");
data5=m_v.GetBuffer(16);
UpdateData();
char* data6=data5.GetBuffer(data5.GetLength());
st=rf_write(icdev,sector*6,(unsigned char*)data6);
UpdateData();
ZeroMemory(databuffn,17);
UpdateData();
st=rf_read(icdev,sector*6,databuffn);
if (st==0)
{ m_list.AddString((char*)databuffn);
m_list.SetCurSel(m_list.GetCount()-1);
m_list.AddString("消费成功!");
m_list.SetCurSel(m_list.GetCount()-1);
}
else
m_list.AddString("消费失败!");
m_list.SetCurSel(m_list.GetCount()-1);
UpdateData(false);
}}
void CMyDlg::OnCE()
{
UpdateData();
SetDlgItemText(IDC_EDIT3,"");
m_Yue="";
// TODO: Add your control notification handler code here
}
充值与消费是相对应的。