项目简介:
手机端编写屏保软件,利用蓝牙与蓝牙串口模块和指纹识别器组成的指纹采集、识别系统进行通信,从而获取用户指纹验证信息,
软件获取指纹识别器发送的验证结果,以决定是否允许用户解锁锁屏,进入手机主界面。
这很想iPone5s的TouchID,用户只需按下Home键,即可完成用户验证、解锁锁屏和进入主界面这个步骤,代替了传统的解锁方式:
首先按下Home键,然后输入4个数字,用以验证,其次进入主界面。传统解锁方式繁琐复杂,完成解锁需要五个操作:按Home键+4个数字。
而指纹识别解锁只需一个操作:按Home键。
这个想法是12年的冬天想到的,当时我正在宿舍门外用iPhone蹭网,每次解锁iPhone都要经历五个步骤,我感觉到很繁琐。
忽然,我想到了前两天从淘宝上看到的指纹识别器,忽然我就想,那我能不能模拟一下只按Home键即可解锁手机呢?正好当时
我们学校正在组织萌芽杯(就是大学内的科技制作等)比赛,我也早就和两位同学报名了萌芽杯,但是当时报名课题不是指纹一步解锁,
于是我们把课题换成了指纹一步解锁,我觉得这个意义很大,因为手机如果配备上指纹识别器后,将对于解锁和支付等需要密码验证的一类
服务产生巨大的影响。于是说做就做。
时隔一年多,温习一下指纹一步解锁项目。
项目各模块:
1、安卓智能手机
2、UART通信,TTL电平的光学指纹识别模块
3、蓝牙串口模块
4、USB转TTL模块(用电脑串口调试指纹识别器)
指纹识别器与USB转TTL模块连接图
电脑串口调试指纹模块图:
蓝牙串口模块与指纹识别模块连线图:
上图可以看到有一个单片机开发板,其实它没有什么作用,唯一的作用就是提供了蓝牙串口模块和指纹识别模块的电源。
利用手机端蓝牙串口调试软件对指纹识别器进行调试,检查是否连线正确
调试成功!
接着就开始写手机端的软件了。
以下为主要代码段:
package jeff.iphonelock;
import java.util.List;
import android.app.ActivityManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
//蓝牙
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.widget.Toast;
public class MyLockScreenService extends Service {
private final String ACT_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
private final String ACT_SCREEN_ON = "android.intent.action.SCREEN_ON";
public BluetoothAdapter mBluetoothAdapter = null;
public static BluetoothSocket btSocket = null;
public static OutputStream outStream = null;
//蓝牙通信类型:蓝牙串口
public static final UUID
MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
public static String address = "00:15:FF:F3:B8:86"; // <==要连接的蓝牙设备MAC地址
int k=0,is=0,canfinish=0;
public static InputStream inStream = null;
Toast toast=null;
char mes;
byte[] buffer=new byte[20]; // buffer store for the instream
//指纹识别器自动注册指令
static byte[] zhuce={(byte) 0xEF,(byte) 0x01,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte)
0xFF,(byte) 0x01,(byte) 0x00,(byte) 0x03,(byte) 0x10,(byte) 0x00,(byte) 0x14};
//指纹识别器自动识别指令
static byte[] shibie={(byte) 0xEF,(byte) 0x01,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte)
0xFF,(byte) 0x01,(byte) 0x00,(byte) 0x03,(byte) 0x11,(byte) 0x00,(byte) 0x15};
//指纹识别器删除指纹库内编号为0的指纹模板指令
static byte[] shanchu={(byte) 0xEF,(byte) 0x01,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte)
0xFF,(byte) 0x01,(byte) 0x00,(byte) 0x07,(byte) 0x0C,(byte) 0x00,(byte) 0x00,(byte)
0x00,(byte) 0x01,(byte) 0x00,(byte) 0x15};
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.e("", "***********onBind MyLockScreenService");
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
//建立蓝牙连接
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
try {
//约定蓝牙通信类型
btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) {
DisplayToast("套接字创建失败!");
onDestroy();
}
mBluetoothAdapter.cancelDiscovery();
try {
//建立蓝牙通信通道
btSocket.connect();
DisplayToast("蓝牙连接成功!");
} catch (IOException e) {
try {
btSocket.close();
DisplayToast("蓝牙连接没有建立!");
onDestroy();
} catch (IOException e2) {
DisplayToast("连接没有建立,无法关闭套接字!");
onDestroy();
}
}
// register Broadcast
//IntentFilter Filter= new IntentFilter(ACT_SCREEN_OFF);
//registerReceiver(ScreenBCR, Filter);
IntentFilter intentFilter= new IntentFilter(ACT_SCREEN_ON);
registerReceiver(mScreenBCR, intentFilter);
}
private void finish() {
// TODO Auto-generated method stub
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
try {
btSocket.close();
DisplayToast("已断开蓝牙连接!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
unregisterReceiver(mScreenBCR);
}
//接收到Screen_ON 事件:
private BroadcastReceiver mScreenBCR = new BroadcastReceiver() {
@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.e("", "***********onReceive Intent="+intent);
//蓝牙发送数据
//is判断是否锁屏
is=0;
try {
//获取输出数据流
outStream = btSocket.getOutputStream();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
//获取输入数据流
inStream=btSocket.getInputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//发送指令给指纹识别器
outStream.write(shibie);
while(true){
try {
if((k=inStream.read(buffer))!=-1){
//蓝牙串口返回数据为16个字节,避免数据传送阻塞,造成接收错误
while(k!=16)
k+=inStream.read(buffer,k,16-k);
//调试用,查看接收数据字节数
//mes=(char) (k+48);
//buffer[9]为指纹识别器通过蓝牙串口传回的确认码
if(buffer[9]!=0){
if(buffer[9]==2) DisplayToast("未录入指纹!");
else if(buffer[9]==9) DisplayToast("指纹不匹配!");
else DisplayToast("指纹有误!");
is=0;
}// endif
else{
DisplayToast("成功!");
//关闭锁屏
is=1;
if(canfinish==1)
DrawLockScreen.mParentActivity.finish();
}
break;
} //endif
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}//endwhile
}//endtry
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//指纹识别不匹配或不成功时,开启锁屏
if(is==0){
//开启锁屏
Intent i = new Intent();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setClass(context, IPhoneLock.class);
context.startActivity(i);
canfinish=1;//是否可以启用DrawLockScreen.mParentActivity.finish();
}
} //EndonReceive
};//End——BroadcastReceiver
//显示提示内容
public void DisplayToast(String str)
{
if (toast == null)
{
toast=Toast.makeText(this, str, Toast.LENGTH_SHORT);
}
else
{
//当另一个显示内容出现时,立即关闭当前显示,避免“大排队”
toast.cancel();
toast.setText(str);
}
toast.setGravity(Gravity.TOP, 0, 220);
toast.show();
}
}//End_MyLockScreenService;