RFID期末复习题
1.近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz 频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。NFC采用主动和被动两种读取模式。
2.LLCP(逻辑链路控制协议)规范描述了NFC 协议栈LLC(逻辑链路控制)的
能和特性。LLCP位于Digital协议之上,是LLCP基于NFC-DEP传输协议,LLCP与
NFC-DEP一起应用在点对点通信中。
3NDEF是轻量级的紧凑的二进制格式,可带有URL、vCard和NFC定义的各种数据类型。NDEF的由各种数据记录组成,而各个记录由报头(Header)和有效载荷(Payload)组成,其中NDEF记录的数据类型和大小由记录载荷
的报头注明,这里的报头包含3部分,分别为Length、Type和Identifier。
4.ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。
5.蓝牙低能耗(BLE)技术是低成本、短距离、可互操作的鲁棒性无线技术,工作在免许可的2.4GHz ISM射频频段。蓝牙低能耗技术采用可变连接时间间隔,由于BLE技术采用非常快速的连接方式,因此平时可以处于“非连接”状态(节省能源),此时链路两端相互间只是知晓对方,只有在必要时才开启链路,然后在尽可能短的时间内关闭链路。
6.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)
7.JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。
8.xml
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似HTML
XML 的设计宗旨是传输数据,而非显示数据XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。XML 是W3C 的推荐标准
二、简答
1.请说出NFC有哪两种通信方式。
答:(1)主动模式。
在主动模式下,NFC发起设备要发送数据给
目标设备时,必须产生自己的射频场;
被读NFC设备发送响应给发起设备时,也要
产生自己的射频场。
即,每台NFC设备需要向其他NFC设备发送
数据信息时,都要产生自己的射频场
(2)被动模式。
在被动模式下,主设备在整个通信过程中提
供射频场。
2.请说出NFC哪三种工作模式。
工作模式:读写模式(读卡器模式),p2p
(点对点)模式,卡模拟模式
3.NFC技术标准划分的层次。
1)RF Layer(射频)层
2)Mode Switch(模式切换)层
3)NFC Protocol 层
4)App层
3.BLE协议层的划分:核心协议层、电缆替代
协议层、电话控制协议层和采纳的其它协议
层。
4. NFC五种Tag标签类型
基于ISO 14443A标准的Types 1 and 2; 基于
日本工业标准(JIS)X 6319-4的FeliCa; 兼容
ISO 14443A和B标准的Type 4。NFC-V技术
为解决方案提供商提供了标准化的方式,使
用NFC标准的读写器读取和编码ISO15693
标签。
1.NFC与RFID区别。
答:NFC技术起源于RFID,但与RFID相比有
一定的区别,主要包括:
1)工作频率。NFC工作频率率为13.56MHz,
而RFID工作频率有低频、高频(13.56)和
超高频
2)工作距离。NFC工作距离理论上为
0~20cm,但在产品实现上,由于采用了特殊
功率技术,使其工作距离只有0~10cm.RFID
具有不同工作频率,其工作距离从几厘米到
几十米不等。
3)工作模式。NFC同时支持读写读写模式和
卡模拟模式。RFID中,读卡器和非接触卡是
独立的两个实体,不能相互切换。
4)点对点通信。NFC支持点对点模式,RFID
不支持
5)应用领域。RFID更多的被应用在生产物
流跟踪资产管理上,NFC则在门禁公交车
手机支付等领域发挥作用
6)标准协议。NFC的底层通信技术兼容高频
RFID技术(13.56)的底层通信标准,即兼容
ISO14443/ISO15693标准。NFC技术还定义了
比较完整的上层应用规范,如LLCP、NDEF、
SNEP、RTD等
2.Start service 与bind server区别
服务不能自己运行,需要通过调用
startService()或bindService()方法启动
服务。这两个方法都可以启动Service,但
是它们的使用场合有所不同。
1)使用startService()方法启用服务,调用
者与服务之间没有关连,即使调用者退出了,
服务仍然运行。使用bindService()方法启
用服务,调用者与服务绑定在了一起,调用
者一旦退出,服务也就终止。
2)bindService()方法启动服务,在服务未被
创建时,系统会先调用服务的onCreate()方
法,接着调用onBind()方法。这个时候调用
者和服务绑定在一起,调用者退出了,系统
就会先调用服务的onUnbind()方法,接着调
用onDestroy()方法。如果调用
bindService()方法前服务已经被绑定,多次
调用bindService()方法并不会导致多次创
建服务及绑定(也就是说onCreate()和
onBind()方法并不会被多次调用)。如果调用
者希望与正在绑定的服务解除绑定,可以调
用unbindService()方法,调用该方法也会
导致系统调用服务的
onUnbind()-->onDestroy()方法。
2.请解释下在单线程模型中Message、
Handler、MessageQueue、Looper之间的关
系,Handler简介:
一个Handler允许你发送和处理
Message和Runable对象,这些对象和一个
线程的MessageQueue相关联。每一个线程实
例和一个单独的线程以及该线程的
MessageQueue相关联。当你创建一个新的
Handler时,它就和创建它的线程绑定在一
起了。这里,线程我们也可以理解为线程的
MessageQueue。从这一点上来看,Handler
把Message和Runable对象传递给
MessageQueue,而且在这些对象离开
MessageQueue时,Handler负责执行他们。
Handler有两个主要的用途:(1)确定在
将来的某个时间点执行一个或者一些
Message和Runnable对象。(2)在其他线程
(不是Handler绑定线程)中排入一些要执行
的动作。
3.handler机制的原理
andriod提供了
Handler 和Looper 来满足线程间的通
信。Handler先进先出原则。Looper类用来
管理特定线程内对象之间的消息交换
(MessageExchange)。
1)Looper: 一个线程可以产生一个
Looper对象,由它来管理此线程里的
MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象
来与Looper沟通,以便push新消息到
MessageQueue里;或者接收Looper从
Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来
存放线程放入的消息。
4)线程:UIthread 通常就是
main thread,而Android启动程序时会替
它建立一个MessageQueue
android:allowBackup="true" android:icon="@drawable/logo" android:label="@string/app_nam e" android:theme="@style/AppTheme "> android:name="com.xunfang.io.M ainActivity" android:label="@string/app_nam e"> android:name="android.intent.c https://www.360docs.net/doc/3f4586979.html,UNCHER"/> ****************************
android:name="android.intent.c https://www.360docs.net/doc/3f4586979.html,UNCHER"/> SQL android:allowBackup="true" android:icon="@drawable/logo" android:label="@string/app_nam e" android:theme="@style/AppTheme "> android:name="com.xunfang.sqli te.QueryActivity" android:label="@string/app_nam e"> android:name="android.intent.a ction.MAIN"/> android:name=".ResultActivity" > android:name=".UpdateActivity" > ********************* convertView.setTag(holder ); } else { holder = (ViewHolder) convertView.getTag(); } return convertView; } public BookDao(Context context, String name, CursorFactory factory, int version) { super(context, DB_NAME, factory, DB_VERSION); // TODO Auto-generated constructor stub } * @description建表 public void onCreate(SQLiteDatabase db) { Log.i("tag", "onCreate"); String sql = "create table " + TAB_NAME + " (" + BookBean.FILED_ID + " integer primary key autoincrement, " + BookBean.FILED_BOOKNAME + " varchar(20), " + BookBean.FILED_WRITER + " text, " + BookBean.FILED_PRESS + " varchar(20), " + BookBean.FILED_PRICE + " long)"; System.out.println("sql--->" + sql); db.execSQL(sql); } ************************* * @description更新数据库 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i("tag", "onUpgrade"); String sql = "drop table if exist " + TAB_NAME; db.execSQL(sql); onCreate(db); } /** * @description插入 */ public void insert(){ // SQLiteDatabase db=DB_NAME; }} private void queryData(String strBookname, String strWriter, String strPress, String strPrice) { if (strBookname.equals("") && strWriter.equals("") && strPress.equals("") && strPrice.equals("")) { Toast.makeText(this, "必 须输入至少一项", Toast.LENGTH_SHORT).show(); } else { Intent intent = new Intent(QueryActivity.this, ResultActivity.class); Bundle bundle = new Bundle(); bundle.putString(BookBean .FILED_BOOKNAME, strBookname); bundle.putString(BookBean .FILED_WRITER, strWriter); bundle.putString(BookBea .FILED_PRESS, strPress); bundle.putString(BookBean .FILED_PRICE, strPrice); intent.putExtra(BUNDLE, bundle); startActivity(intent); }}} // sql查询语句拼接 String str1 = ""; if (list1.size() > 1) { for (int i = 0; i < list1.size() - 2; i++) {str1 += " " + list1.get(0) + " and ";} str1 += " " + list1.get(list1.size() - 1); } else {str1 = list1.get(0);} sql += str1; System.out.println("sql-- >" + sql); Cursor c = db.rawQuery(sql, null); while (c.moveToNext()) { // 存入数据集 BookBean book = new BookBean(c.getInt(0), c.getString(1), c.getString(2), c.getString(3), c.getDouble(4)); list.add(book); } Log.i("tag", " 查找成功!"); } catch(Exception e) { Log.i("tag", " 查找失败!"); e.printStackTrace(); } return list;} private void initView() { // 初始化 btnBack = (Button) findViewById(R.id.res_ly_btn_b ack); System.out.println("btn id-->" + btnBack.getId()); listview= (ListView) findViewById(R.id.listview); // 设置监听 btnBack.setOnClickListene r(this); } public void onClick(View v) { if (v.getId() == R.id.res_ly_btn_back) { finish();]] System.out.println("发送 广播..."); finish(); } catch (Exception e) { Toast.makeText(UpdateActi vity.this, "修改失败!", Toast.LENGTH_SHORT) .show(); e.printStackTrace(); } ********************** protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta nceState); setContentView(https://www.360docs.net/doc/3f4586979.html,yout.a ctivity_main); // 获取屏幕分辨率 width = getWindowManager().getDefaultD isplay().getWidth(); getWindowManager().getDefaultD isplay().getHeight(); initListener(); } public void onClick(View v) { switch (v.getId()) { case R.id.btn_write1: etInput = new EditText(context); new AlertDialog.Builder(this) .setTitle("请输入字符串") .setView(etInput) .setPositiveButton("确定", new DialogInterface.OnClickListene r() { public void onClick(DialogInterface dialog, int whichButton) { inputStr = etInput.getText().toString(); write2Memery(inputStr); } }).setNegativeButton("取消", null).show(); break; case R.id.btn_write2: // 数据写入SD卡write2SDCard(); break; case R.id.btn_read1: // 读取内存数据readFromMemery(); break; case R.id.btn_read2: readFromSDCard(); break; case R.id.btn_exit: // 新建对话框确认退出 new AlertDialog.Builder(this) .setTitle("是否确定退出?") .setPositiveButton("确定", new DialogInterface.OnClickListene r() { p ublic void onClick(DialogInterface dialog, int whichButton) { finish(); } }).setNegativeButton("取消", null).show(); break; default: break;}} * @description图片写入sdcard private void write2SDCard() { try ( FileOutputStream fos = new FileOutputStream(SDCard_PATH); // 把assets下的 图片拷入sd卡 InputStream is = getResources().getAssets().ope n("image.jpg"); byte buffer[] = new byte[8192]; // 每次最多写入 8k int count = 0; while ((count = is.read(buffer)) >= 0) { fos.write(buffer, 0, count); } fos.close(); is.close(); Toast.makeText(context, " 图片已经存入"+SDCard_PATH, Toast.LENGTH_SHORT).show(); } catch(Exception e) { Toast.makeText(context, " 写入失败!", Toast.LENGTH_SHORT).show(); } } private void readFromSDCard() { String name = SDCard_PATH; if (!new File(name).exists()) { Toast.makeText( context, android.os.Environment.ge tExternalStorageDirectory() + "中没有图像", Toast.LENGTH_SHORT).show(); return; } try { Bitmap bitmap = getBitmap2(name, width, height); ivSD.setImageBitmap(bitma p);} catch (Exception e) {Toast.makeText(context, "载入 图像失败!", Toast.LENGTH_SHORT).show(); }} * @description读取内存中 的文件 private void readFromMemery() { try { InputStream is = openFileInput(MEM_PATH); byte[] buffer = new byte[100]; int byteCount = is.read(buffer); String str = new String(buffer, 0, byteCount, "utf-8"); Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } catch(Exception e) { Toast.makeText(context, " 读取失败!", Toast.LENGTH_SHORT).show(); } } private void write2Memery(String path) { try { OutputStream os = openFileOutput(MEM_PATH, Activity.MODE_PRIVATE); // String str = "此条信息是从内存中读取。。"; os.write(path.getBytes("u tf-8")); os.close(); Toast.makeText(context, " 写入成功", Toast.LENGTH_SHORT).show(); } catch(Exception e) { Toast.makeText(context, " 读取失败!", Toast.LENGTH_SHORT).show(); }} public static Bitmap getBitmap2(String imageFilePath, int displayWidth, int displayHeight) { BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inJustDecod eBounds = true; Bitmap bmp = BitmapFactory.decodeFile(image FilePath, bitmapOptions); int widthRatio = (int) FloatMath.ceil(bitmapOptions.o utWidth / (float) displayWidth); int heightRatio = (int) FloatMath.ceil(bitmapOptions.o utHeight / (float) displayHeight); if(widthRatio > 1 && heightRatio > 1) { if (widthRatio > heightRatio) { bitmapOptions.inSampleSiz e = widthRatio;} else { bitmapOptions.inSampleSiz e = heightRatio; } bitmapOptions.inJustDecod eBounds = false; bmp = BitmapFactory.decodeFile(image FilePath, bitmapOptions); return bmp; } }