实验指导书Android平台下NFC读写.docx_第1页
实验指导书Android平台下NFC读写.docx_第2页
实验指导书Android平台下NFC读写.docx_第3页
实验指导书Android平台下NFC读写.docx_第4页
实验指导书Android平台下NFC读写.docx_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三Android平台下NFC标签读取的开发一. 实验目的通过本实验了解Android开发的基本过程、简单的web开发过程和NFC(近场通信)的工作原理,学会Java语言的面向对象的思想,掌握Anroid开发、socket通信和NFC相关知识。二. 实验内容 通过本实验开发出一个能在Android平台下读取NFC卡片相关信息的APP,并能与服务端(电脑)进行通信,将读取到的信息发送到服务端并保存。三. 实验环境1. windows系统电脑一台;2. 支持NFC功能手机一部;3. NFC标签(饭卡也可)若干。4. 实验所需软件如下:4.1 下载安装JDK,并配置环境变量;4.2 下载安装Android SDK 并配置Android SDK Manager;4.3下载安装Eclipse;4.4 下载安装Android开发工具ADT;4.5 下载安装Tomcat;4.6 下载安装数据库Mysql;4.7 下载安装数据库可视化软件Navicat for MySQL;四. 实验步骤1. 下载安装JDK,并配置环境变量通过/technetwork/java/javase/downloads/index.html地址下载JDK。(1)安装JDK 选择安装目录安装过程中会出现两次安装提示。第一次是安装 jdk ,第二次是安装 jre 。建议两个都安装在同一个java文件夹中的不同文件夹中(不能都安装在java文件夹的根目录下,jdk和jre安装在同一文件夹会出错)。因此,安装路径最好应如下图所示(2)具体步骤:2.1) :安装jdk 随意选择目录只需把默认安装目录 java 之前的目录修改即可2.2) :安装jre更改 java 之前目录和安装 jdk 目录相同即可注:若无安装目录要求,可全默认设置。无需做任何修改,两次均直接点下一步。(3)安装成功后继续配置Java的环境变量以便让系统知道JDK的具体位置。3.1) :“开始”-“计算机”-“属性”打开如下窗口“高级系统设置”-“高级”-“环境变量”打开环境变量配置窗口。3.2):在环境变量配置窗口中新建“系统变量”,变量名:JAVA_HOME变量值:C:Program FilesJavajdk1.8.0_25变量名:CLASSPATH变量值:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar编辑变量名为Path的环境变量的变量值,在原有基础上添加jdk1.8.0_25bin路径和Android SDK的tools和platform-tools的文件夹路径。;C:Program FilesJavajdk1.8.0_25bin;E:Javaadt-bundle-windows-x86-20140702sdktools;E:Javaadt-bundle-windows-x86-20140702sdkplatform-tools以上环境变量配置完成后,可以通过以下方法验证JDK是否安装成功。打开cmd窗口,输入java -version查看JDK的版本信息,输入javac检测环境变量Path的变量值中是否添加了c:Javajdk1.8.0_25bin。安装成功且配置环境变量正确会出现如下提示信息:2下载安装Android SDKSDK:(software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。Android SDK 指的是Android专属的软件开发工具包。 Android SDK可从/sdk/index.html,本实验提供了已下载并解压好了的SDK,放在硬盘中即可,后面要用到。3下载安装EclipeseEclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。要获得Android应用程序开发的集成开发环境,就Android来说,推荐Eclipse。Eclipse包直接解压安装即可。4下载安装ADT前面我们已经配置好了java的开发环境,下载安装了Android SDK,安装了开发Android的集成开发工具(Eclipse),但是Eclipse还没有和Android SDK进行关联,也就是它们现在是互相独立的,就好比枪和子弹分开了。为了使得Android应用的创建,运行和调试更加方便快捷,Android的开发团队专门针对Eclipse定制了一个插件:Android Development Tools(ADT)。(1)添加ADT。打开eclipse,进入工作界面后点击菜单栏的help,选择install new software.进入后点击添加(add)按钮。(2)加载ADT。选择Add后,输入你要输入的名字和地址,如图。稍等片刻,就会出现需要我们加载的内容,选择第一个开发工具(Develpe tools)中的所有组件。这里需要注意的是如果你的eclipse提示错误,无法进行下一步的话那么就是你的eclipse的版本有问题,请更换其他版本在进行下载。其中下面的Name自己填写,location改为自己的ADT的安装包的路径,点击Archive找到路径并添加。点击ok,完成添加(3)创建Android虚拟机。在安装ADT插件完成之后,eclipse会重启,这样在eclipse的菜单界面会多两个按钮,点击右边ADT的管理器,进入创建Android虚拟机。点击后会出现以下界面,下面是以前创建的2个虚拟机,点击Create新建按照以下内容创建你的虚拟机,点击正常(ok),完成创建。5. 下载安装TomcatTomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。至此,可以安装Tomcat了。下载好压缩包后,直接解压至某一目录下,目录中不能包含中文,上面安装JDK的时候也是。解压后如下所示:将此文件夹拷贝到你常用的根目录下,这里以E盘为例。这样就算安装好了!接下来开始配置环境变量,打开环境变量同上操作,不在赘述。然后新建三个系统变量:TOMCAT_HOME=E:tomcat-6.0.39CATALINA_HOME=E:tomcat-6.0.39CATALINA_BASE=E:tomcat-6.0.391. 11在Classpath中最后添加%TOMCAT_HOME%libservlet-api.jar;在PAth中最前添加%CATALINA_HOME%bin;注意:前后顺序不影响2. 12至此,配置工作完成!打开bin文件夹,双击startup.bat它会自动打开如下控制台界面。不要关闭控制台界面,打开浏览器,输入http:/localhost:8080出现Tomcat的网页,证明安装并配置成功!最后关闭控制台,关闭控制台即关闭Tomcat服务13注意:如果双击startup.bat时出现闪退,有三种可能1.注册表有以前的Tomcat文件残留2.配置不正确,重新配置一遍!3.版本冲突,刚上手的话最好不要装很多个Tomcat,装一个就够了!如果非要装多个,要去service.bat里修改服务名称使其不同名才可以。6. 下载安装数据库管理软件MysqlMySQL是一个关系型数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性,在WEB应用方面 MySQL 是最好的关系数据库管理系统应用软件之一。(1)、首先单击MySQL5.5.21的安装文件,出现该数据库的安装向导界面,单击“next”继续安装,如图所示:(2)、在打开的窗口中,选择接受安装协议,单击“next”继续安装,如图所示:(3)、在出现选择安装类型的窗口中,有“typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,我们选择“Custom”,因为通过自定义可以更加的让我们去熟悉它的安装过程,单击“next”继续安装,如图所示:(4)、在出现自定义安装界面中选择mysql数据库的安装路径,这里我设置的是“d:Program FileMySQL”,单击“next”继续安装,如图所示:(5)、接下来进入到准备安装的界面,首先确认一下先前的设置,如果有误,按“back”返回,没有错误,单击“Install”按钮继续安装,如图所示:(6)、单击“Install”按钮之后出现如下正在安装的界面,经过很少的时间,MySQL数据库安装完成,出现完成MySQL安装的界面,如图所示:这个界面单击“next”就行。注意要选择上边的“Launch the MySQL Instance Configuration Wizard”选项,这是启动MySQL的配置,单击“Finish”按钮,进入到配置界面。(7)、MySQL数据库的安装十分简单,关键是安装完成之后的配置,单击完成之后出现如下的配置界面向导,单击“next”进行配置,如图所示:(8)、在打开的配置类型窗口中选择配置的方式,“Detailed Configuration(手动精确配置)”、“Standard Configuration(标准配置)”,为了熟悉过程,我们选择“Detailed Configuration(手动精确配置)”,单击“next”继续,如图所示:(9)、在出现的窗口中,选择服务器的类型,“Developer Machine(开发测试类)”、“Server Machine(服务器类型)”、“Dedicated MySQL Server Machine(专门的数据库服务器)”,我们仅仅是用来学习和测试,默认就行,单击“next”继续,如图所示:(10)、在出现的配置界面中选择mysql数据库的用途,“Multifunctional Database(通用多功能型)”、“Transactional Database Only(服务器类型)”、“Non-Transactional Database Only(非事务处理型)”,这里我选择的是第一项,通用安装,单击“next”继续配置,如图所示:(11)、在出现的界面中,进行对InnoDB Tablespace进行配置,就是为InnoDB 数据库文件选择一个存储空间,如果修改了,要记住位置,重装的时候要选择一样的地方,否则可能会造成数据库损坏,当然,对数据库做个备份就没问题了,如图所示:(12)、在打开的页面中,选择mysql的访问量,同时连接的数目,“Decision Support(DSS)/OLAP(20个左右)”、“Online Transaction Processing(OLTP)(500个左右)”、“Manual Setting(手动设置,设置为15个)这里选择手动设置,单击“next”继续,如图所示:(13)、在打开的页面中设置是否启用TCP/IP连接,设定端口,如果不启用,就只能在自己的机器上访问mysql数据库了,这也是连接java的操作,默认的端口是3306,并启用严格的语法设置,单击“next”继续,如图所示:(14)、在打开的字符编码的页面中,设置mysql要使用的字符编码,第一个是西文编码,第二个是多字节的通用utf8编码,第三个是手动,我们选择utf-8或者是gbk,单击“next”,继续配置,如图所示:(15)、在打开的页面中选择是否将mysql安装为windows服务,还可以指定Service Name(服务标识名称),是否将mysql的bin目录加入到Windows PATH(加入后,就可以直接使用bin下的文件,而不用指出目录名,比如连接,“mysql u username p password;”就可以了,单击“next”继续配置,如图所示:(16)、在打开的页面中设置是否要修改默认root用户(超级管理员)的密码(默认为空),“New root password”,如果要修改,就在此填入新密码,并启用root远程访问的功能,不要创建匿名用户,单击“next”继续配置,如图所示:(17)、到这里所有的配置操作都已经完成,单击Execute按钮执行配置,如图所示:(18)、过了几分钟,出现如下的提示界面就代表MySQL配置已经结束了,并提示了成功的信息。(19)、在服务中将mysql数据库启动,并在命令窗口中输入“mysql h localhost u root -p”,接着在出现的提示中输入用户的密码,如图所示:从图中可以看到mysql数据库在启动之后,成功的登录了,在此我们可以对数据库进行操作了。7. 下载安装数据库可视化工具Navicat for MySQL Navicat是数据库的可视化工具,Navicat for MySQL一套专为 MySQL 设计的高性能数据库管理及开发工具。通过它的图形化界面,我们可以很清楚的查看数据的存储信息,并可以做事务操作。8. 实现手机端读取NFC标签信息。(1)创建第一个Android应用程序启动Eclipse,选择菜单File|New|Project 选择other ,展开Android文件夹,选择Android Application Project下一步:输入你创建的工程名字,然后一直默认点击下一步,最后点击完成。至此,你的第一个Android程序创建完成。要运行你的项目时,右键点击你的项目名,选择 run as|Android Application,选择你想将此项目部署的目标设备上,即可完成部署启动。(2)创建NFC读取的应用程序按照上一步做的,创建一个新的Android程序2.1) 在res|layout|下打开.xml布局文件,布局你的App主界面界面布局文件如下:LinearLayout xmlns:android=/apk/res/androidandroid:layout_width=match_parent android:layout_height=wrap_content android:orientation=vertical TextView android:id=+id/tv1 android:layout_width=match_parent android:layout_height=wrap_content android:gravity=center android:text=请将标签靠近手机背面 android:textSize=20sp /View android:layout_width=match_parent android:layout_height=0.2dp android:background=#000000 /TextView android:id=+id/tv2 android:layout_width=match_parent android:layout_height=wrap_content android:text=读取标签ID号: /View android:layout_width=match_parent android:layout_height=0.2dp android:background=#000000 /TextView android:id=+id/tv3 android:layout_width=match_parent android:layout_height=wrap_content android:gravity=center android:text=标签类型信息 /LinearLayout2.2) 在scr下部署文件,找到你刚才创建的.java文件。scr文件下共有两个包:其中com.example.nfc_lab包下的NFC_lab.java文件代码如下:package com.example.nfc_lab;import java.io.IOException;import com.jph.sdg.service.SendDateToServer;import android.app.Activity;import android.app.PendingIntent;import android.content.Intent;import android.content.IntentFilter;import android.content.IntentFilter.MalformedMimeTypeException;import android.nfc.NfcAdapter;import android.nfc.Tag;import android.nfc.tech.MifareClassic;import android.nfc.tech.NfcA;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class NFC_lab extends Activity private NfcAdapter nfcAdapter;private TextView tv1,tv2,tv3;private PendingIntent mPendingIntent;private IntentFilter mFilters;private String mTechLists;private String info=;private int mCount=0;Handler handler=new Handler()public void handleMessage(Message msg) switch (msg.what) case SendDateToServer.SEND_SUCCESS:break;case SendDateToServer.SEND_FAIL:break;default:break;private Button btnSend;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_nfc_lab);init();/刷新控件/获取默认的NFC控制器nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter = null) tv1.setText(设备不支持NFC!); finish(); return; if (!nfcAdapter.isEnabled() tv1.setText(请在系统设置中先启用NFC功能!); finish(); return; mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass().addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); / Setup an intent filter for all MIME based dispatches IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); try ndef.addDataType(*/*); catch (MalformedMimeTypeException e) throw new RuntimeException(fail, e); mFilters = new IntentFilter ndef, ; / Setup a tech list for all NfcA tags mTechLists = new String new String NfcA.class.getName() ; private void init() / TODO 自动生成的方法存根 tv1=(TextView) findViewById(R.id.tv1); tv2=(TextView) findViewById(R.id.tv2); tv3=(TextView) findViewById(R.id.tv3); Override protected void onResume() / TODO 自动生成的方法存根super.onResume();nfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists); Override protected void onNewIntent(Intent intent) / TODO 自动生成的方法存根super.onNewIntent(intent); tv1.setText(发现新的 Tag: + +mCount);/mCount 计数 String intentActionStr = intent.getAction();/ 获取到本次启动的actionif (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentActionStr)/ NDEF类型| NfcAdapter.ACTION_TECH_DISCOVERED.equals(intentActionStr)/ 其他类型| NfcAdapter.ACTION_TAG_DISCOVERED.equals(intentActionStr) / 未知类型/在intent中读取Tag idTag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);byte bytesId = tag.getId();/ 获取id数组info=ByteArrayChange.ByteArrayToHexString(bytesId); tv2.setText(标签UID: +info); tv3.setText(readTag(tag); new SendDateToServer(handler).SendDataToServer(info); public String readTag(Tag tag) tv3=(TextView) findViewById(R.id.tv3); MifareClassic mfc = MifareClassic.get(tag); for (String tech : tag.getTechList() System.out.println(tech);/显示设备支持技术 boolean auth = false; /读取TAG try String metaInfo = ; /Enable I/O operations to the tag from this TagTechnology object. mfc.connect();/部分设备可能会连接失败,不支持读取下面功能 int type = mfc.getType();/获取TAG的类型 int sectorCount = mfc.getSectorCount();/获取TAG中包含的扇区数 String typeS = ; switch (type) case MifareClassic.TYPE_CLASSIC: typeS = TYPE_CLASSIC; break; case MifareClassic.TYPE_PLUS: typeS = TYPE_PLUS; break; case MifareClassic.TYPE_PRO: typeS = TYPE_PRO; break; case MifareClassic.TYPE_UNKNOWN: typeS = TYPE_UNKNOWN; break; metaInfo += 卡片类型: + typeS + n共 + sectorCount + 个扇区n共 + mfc.getBlockCount() + 个块n存储空间: + mfc.getSize() + Bn; return metaInfo; catch (Exception e) /Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); finally if (mfc != null) try mfc.close(); catch (IOException e) Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG) .show(); return 您的设备不支持查询标签信息功能;/如果连接失败 Override public void onPause() super.onPause(); nfcAdapter.disableForegroundDispatch(this); 在com.example.nfc_lab下的ByteArrayChange.java其中加入如下代码:package com.example.nfc_lab;public class ByteArrayChange public static String ByteArrayToHexString(byte bytesId) /Byte数组转换为16进制字符串/ TODO 自动生成的方法存根 int i, j, in; String hex = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F ; String output = ; for (j = 0; j bytesId.length; +j) in = bytesIdj 0xff; i = (in 4) 0x0f; output += hexi; i = in 0x0f; output += hexi; return output;在com.example.service下的SendDataToServer.java中加入以下代码:package com.example.service;import .HttpURLConnection;import .URL;import .URLEncoder;import java.util.HashMap;import java.util.Map;import android.os.Handler;/* * 通过GET方式向服务器发送数据 */public class SendDateToServer /添加访问IP地址,注:改为自己的IP地址格式为 http:/你的IP地址:8080private static String url=16:8080/Android_servlet_test/ServletForGETMethod;/模拟机测试的话,IP设为 /06本机的IPv4地址/关于本机的IP地址,点击电脑左下角的开始菜单,在搜索框内输入cmd,按下回车,然后在里面输入ipconfig,再按下回车键/并在其中找到自己的Ipv4地址public static final int SEND_SUCCESS=0x123;public static final int SEND_FAIL=0x124;private Handler handler;public SendDateToServer(Handler handler) / TODO Auto-generated constructor stubthis.handler=handler;/* * 通过Get方式向服务器发送数据 * param UID 标签号 */public void SendDataToServer(String UID) / TODO Auto-generated method stubfinal MapString, Stringmap=new HashMapString, String();map.put(UID, UID);new Thread(new Runnable() Overridepublic void run() / TODO Auto-generated method stubtry if (sendGetRequest(map,url,utf-8) handler.sendEmptyMessage(SEND_SUCCESS);/通知主线程数据发送成功else /将数据发送给服务器失败 catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();).start();/* * 发送GET请求 * param map 请求参数 * param url 请求路径 * return * throws Exception */private boolean sendGetRequest(MapString, String param, String url,String encoding) throws Exception / TODO Auto-generated method stub/http:/localhost:8080/ServerForGETMethod/ServletForGETMethod?name=aapwd=124StringBuffer sb=new StringBuffer(url);if (!url.equals()!param.isEmpty() sb.append(?);for (Map.EntryString, Stringentry:param.entrySet() sb.append(entry.getKey()+=);sb.append(URLEncoder.encode(entry.getValue(), encoding);sb.append();sb.deleteCharAt(sb.length()-1);/删除字符串最后一个字符“”HttpURLConnection conn=(HttpURLConnection) new URL(sb.toString().openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod(GET);/设置请求方式为GETif (conn.getResponseCode()=2000) return true;return false; 在AndroidManifest.xml中加入NFC权限及相关过滤器?xml version=1.0 encoding=utf-8?manifest xmlns:android=/apk/res/android package=com.example.nfc_lab android:versionCode=1 android:versionName=1.0 uses-sdk android:minSdkVersion=14 android:targetSdkVersion=21 /uses-permission android:name=android.permission.NFC /uses-permission android:name=android.permission.READ_PHONE_STATE/uses-feature android:name=android.hardware.nfc android:required=true /uses-permission android:name=android.permission.INTERNET/application android:allowBackup=true android:icon=drawable/ic_launcher android:label=string/app_name android:theme=style/AppTheme activity android:name=.NFC_lab android:label=string/app_name intent-filteraction android:name=ent.action.MAIN /category android:name=ent.category.LAUNCHER /intent-filterintent-filteraction android:name=android.nfc.action.NDEF_DISCOVERED/intent-filterintent-filteraction android:name=android.nfc.action.TAG_DISCOVERED/actioncategory android:name=ent.category.DEFAULT/category/intent-filterintent-filteraction android:name=android.nfc.action.TECH_DISCOVERED /intent-filtermeta-data android:name=android.nfc.action.TECH_DISCOVERED android:resource=xml/nfc_tech_filter /activity/application/manifest2.3) 在res|文件下加入可识别NFC类型的范围的xml文件右键点击res,新建文件夹,名字为xml,建立完成后,右键xml文件找到other,在新建向导下,找到XML文件夹,找到XML File选中,点击下一步,在文件名中输入nfc_tech_filter.xml点击完成,双击新建xml文件,打开键入以下内容:resources xmlns:xliff=urn:oasis:names:tc:xliff:document:1.2!- 可以处理所有Android支持的NFC类型 -tech-listtechandroid.nfc.tech.IsoDep/techtechandroid.nfc.tech.NfcA/techtechandroid.nfc.tech.NfcB/techtechandroid.nfc.tech.NfcF/techtechandroid.nfc.tech.NfcV/techtechandroid.nfc.tech.Ndef/techtechandroid.nfc.tech.NdefForm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论