Android程序运行分析——中等复杂程度的NTAG I2C Demo为例(二)

本节主要讨论NTAG I2C Demo这个APP里的认证机制(安全机制)

文中会结合一些NXP NFC芯片DataSheet中的内容,但会以尽可能简单的语言描述

首先看一下这句代码

mAuthStatus是一个int型的变量,以private static修饰,足见其安全程度之高

这个变量的初始化是在这个地方,当然一开始初始化为Disabled ,也就是默认你是没有权限的

接下来看一下launchDemo的实现

	private void launchDemo(String currTab) {
		if(mAuthStatus == AuthStatus.Authenticated.getValue()) {
			demo.Auth(mPassword, AuthStatus.Protected_RW.getValue());
		}
		
		// ===========================================================================
		// LED Test
		// ===========================================================================
		if (currTab.equalsIgnoreCase("leds")) {
			// This demo is available even if the product is protected 
			// as long as the SRAM is unprotected  			
			if(mAuthStatus == AuthStatus.Disabled.getValue()
					|| mAuthStatus == AuthStatus.Unprotected.getValue()
					|| mAuthStatus == AuthStatus.Authenticated.getValue()
					|| mAuthStatus == AuthStatus.Protected_W.getValue()
					|| mAuthStatus == AuthStatus.Protected_RW.getValue() ) {
				try {
					// if (LedFragment.getChosen()) {
					demo.LED();
				} catch (Exception e) {
					e.printStackTrace();
					LedFragment.setAnswer(getString(R.string.Tag_lost));
				}
			} else {
				Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected", 
						Toast.LENGTH_LONG).show();
				showAuthDialog();
			}
		}
		// ===========================================================================
		// NDEF Demo
		// ===========================================================================
		if (currTab.equalsIgnoreCase("ndef")) {
			// This demo is only available when the tag is not protected  
			if(mAuthStatus == AuthStatus.Disabled.getValue()
					|| mAuthStatus == AuthStatus.Unprotected.getValue()
					|| mAuthStatus == AuthStatus.Authenticated.getValue()) {
				try {
					demo.NDEF();
				} catch (Exception e) {
					// NdefFragment.setAnswer(getString(R.string.Tag_lost));
				}
			} else {
				Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected", 
						Toast.LENGTH_LONG).show();
				showAuthDialog();
			}
		}
		// ===========================================================================
		// Config
		// ===========================================================================
		if (currTab.equalsIgnoreCase("config")) {
		}
		// ===========================================================================
		// Speedtest
		// ===========================================================================
		if (currTab.equalsIgnoreCase("ntag_rf")) {
			try {
				// SRAM Test
				if ((SpeedTestFragment.isSRamEnabled() == true)) {
					// This demo is available even if the product is protected 
					// as long as the SRAM is unprotected  	
					if(mAuthStatus == AuthStatus.Disabled.getValue()
							|| mAuthStatus == AuthStatus.Unprotected.getValue()
							|| mAuthStatus == AuthStatus.Authenticated.getValue()
							|| mAuthStatus == AuthStatus.Protected_W.getValue()
							|| mAuthStatus == AuthStatus.Protected_RW.getValue()) {
						demo.SRAMSpeedtest();
					} else {
						Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected", 
								Toast.LENGTH_LONG).show();
						showAuthDialog();
					}
				}
				// EEPROM Test
				if ((SpeedTestFragment.isSRamEnabled() == false)) {
					// This demo is only available when the tag is not protected  
					if(mAuthStatus == AuthStatus.Disabled.getValue()
							|| mAuthStatus == AuthStatus.Unprotected.getValue()
							|| mAuthStatus == AuthStatus.Authenticated.getValue()) {
						demo.EEPROMSpeedtest();
					} else {
						Toast.makeText(getApplicationContext(), "NTAG I2C Plus memory is protected", 
								Toast.LENGTH_LONG).show();
						showAuthDialog();
					}
				} // end if eeprom test
			} catch (Exception e) {
				SpeedTestFragment.setAnswer(getString(R.string.Tag_lost));
				e.printStackTrace();
			}
		}		
	}

先看一下传给launchDemo函数的参数,实参是tabID,形参是currTab,也就是当前你选择的是哪个Tab

先查看一下,当前的认证状态(也就是变量mAuthStatus的值)是否是Authenticated,如果是的话,执行demo的Auth函数


那么这个demo的Auth函数是干嘛的呢,其实就是执行一个认证的操作

你给进去一个pwd(一个byte的数组),一个当前的认证状态,这些在注释里面都有写好

我对于你的当前的每个不同认证状态,用条件语句进行判别,分类处理

1.Unprotected

这种状态下,我用protectPlus函数进行处理

我把你的pwd传进去,然后再传进去一个Capability Container的值,这个值其实就是常数0x03,表示密码存放在NXP NFC芯片某个寄存器的offset为0x03的位置,具体的函数实现过程待会儿细说

2.Authenticated

这种状态下,用unprotectPlus函数去处理,这个函数不需要任何参数

3.其他认证状态

就是这些认证状态

这些状态下,使用authenticatePlus函数进行进一步的认证,需要的参数是就是你给进去的pwd

上面提到的这些不同认证状态下的认证方式的具体实现,在另外一篇文章详细描述

https://blog.csdn.net/qq_24118527/article/details/82950796

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android手机中使用OTG功能调试USB串口的Demo源码程序可在Android Studio中运行和调试。以下是一个简单的示例: 1. 首先,在MainActivity.java文件中创建一个类,用于处理与USB设备的通信。在该类中,你可以实现打开、关闭USB串口、发送和接收数据等功能。 ```java public class USBSerialCommunicator { private final Context mContext; private final UsbManager mUsbManager; private UsbDeviceConnection mConnection; private UsbSerialDevice mSerialDevice; private final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; public USBSerialCommunicator(Context context) { mContext = context; mUsbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); } public void openUSBSerialPort() { // 检查是否有连接的USB设备 HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); if (!deviceList.isEmpty()) { for (UsbDevice usbDevice : deviceList.values()) { // 检查USB设备是否有权限 PendingIntent permissionIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ACTION_USB_PERMISSION), 0); mUsbManager.requestPermission(usbDevice, permissionIntent); if (mUsbManager.hasPermission(usbDevice)) { mConnection = mUsbManager.openDevice(usbDevice); mSerialDevice = UsbSerialDevice.createUsbSerialDevice(usbDevice, mConnection); if (mSerialDevice != null) { if (mSerialDevice.open()) { mSerialDevice.setBaudRate(9600); mSerialDevice.setDataBits(UsbSerialInterface.DATA_BITS_8); mSerialDevice.setStopBits(UsbSerialInterface.STOP_BITS_1); mSerialDevice.setParity(UsbSerialInterface.PARITY_NONE); mSerialDevice.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); // 设置串口数据接收监听器 mSerialDevice.read(mCallback); } } } } } } // 串口数据接收回调 private UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() { @Override public void onReceivedData(byte[] bytes) { // 处理接收到的数据 } }; public void sendSerialData(byte[] data) { if (mSerialDevice != null) { mSerialDevice.write(data); } } public void closeUSBSerialPort() { if (mSerialDevice != null) { mSerialDevice.close(); mSerialDevice = null; } if (mConnection != null) { mConnection.close(); mConnection = null; } } } ``` 2. 接下来,在MainActivity.java文件中调用USBSerialCommunicator类的方法,以打开、关闭USB串口,并发送接收数据。 ```java public class MainActivity extends AppCompatActivity { private USBSerialCommunicator mUSBSerialCommunicator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mUSBSerialCommunicator = new USBSerialCommunicator(this); mUSBSerialCommunicator.openUSBSerialPort(); byte[] sendData = "Hello!".getBytes(); mUSBSerialCommunicator.sendSerialData(sendData); } @Override protected void onDestroy() { super.onDestroy(); mUSBSerialCommunicator.closeUSBSerialPort(); } } ``` 这是一个简单的示例,展示了如何使用OTG功能调试USB串口的Demo源码程序,并在Android Studio中进行运行和调试。你可以根据需要修改和扩展这个示例,以适应你的具体要求。 ### 回答2: 要在Android Studio上运行和调试OTG功能并调试USB串口的DEMO源码程序,您需要按照以下步骤操作: 1. 首先,确保您的Android手机具备OTG功能并且已经连接了OTG线。 2. 打开Android Studio,点击“File”菜单,选择“New”和“Import Project”选项,然后选择您存放DEMO源码程序的文件夹,点击“OK”导入项目。 3. 等待Android Studio完成项目导入后,找到并打开DEMO源码程序的主活动文件。 4. 检查源码程序中是否已经导入了OTG和USB串口的相关库文件,如果没有,请根据您的需要进行导入。 5. 在源码程序中找到与OTG功能有关的代码片段。这可能是检查设备是否具备OTG功能的代码或者检查OTG线连接状态的代码。 6. 如果没有相关的OTG功能代码,请按照Android开发文档中的指导添加OTG功能支持。 7. 找到与USB串口有关的代码片段。这可能是打开、关闭或者读写USB串口的代码。 8. 检查是否已经在项目的配置文件中申请了USB权限。如果没有,请添加以下权限到AndroidManifest.xml文件中: ```xml <uses-permission android:name="android.permission.USB_PERMISSION" /> ``` 9. 在源码程序中确保已经注册了USB的广播接收器。这个接收器将监听USB设备的插拔和权限相关的事件。 ```java private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if(device != null){ // 在此处进行串口设备的连接和操作 } } else { // 没有获得USB权限 } } } } }; ``` 10. 运行项目并调试。您可以使用虚拟设备或者在手机上运行源码程序,并使用日志输出等方式进行调试。 以上就是在Android Studio上运行和调试OTG功能并调试USB串口的DEMO源码程序的基本步骤。希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值