YModem在Android上的实现(四)
主要问题解决基于Ymodem的library:
一:AS debug 优化使用以及 log使用
二:函数没有正常流程走
1)一开始流程没有走对,主要是蓝牙连接的雷达设备返回数据时,没有调用onDataReceivedFromBLE(bytes)方法,调用onDataReceivedFromBLE(bytes)方法后会进一步执行public void onReceiveData(byte[] respData),具体里面的case(如:case STEP_FILE_NAME,case STEP_FILE_BODY,case STEP_EOT)会进一步 执行对应的handle方法(如:handleFileName(respData),handleFileBody(respData),handleEOT(respData)等);前面的handle系列的方法,主要会对返回的值如:C,ACK,NAK进行分值处理!!
//读取蓝牙设备发出来的数据回调
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {super.onCharacteristicChanged(gatt, characteristic);//接收数据bytes = characteristic.getValue();//针对YModem协议返回值的响应MainActivity.onDataReceivedFromBLE(bytes);Log.d("XTQ_YModem_1028", "[RCV]data="+ Arrays.toString(bytes));
}
三:固件升级的YModem协议的使用与调试
主要是第一次发送EOT,设备返回NAK,第二次发送EOT,设备返回ACK&C的这一部分与实际的原始library的代码的区别;基于对协议规范进行逻辑修改!
三:BLE蓝牙传输的弊端导致传输的中断,进一步的需要加入延时
writeCharacteristic.setValue(data);
Log.d("XTQ_YModem_1031","data长度!!!"+data.length);
mBluetoothGatt.writeCharacteristic(writeCharacteristic);//在发送数据的地方加入延时
try {Thread.sleep(20);
}catch(InterruptedException e){e.printStackTrace();
}
四:android文件的权限报错,
具体报错内容为: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
Step 1:修改manifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Step 2:MainActivity中添加
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE };//确认权限的方法
public static void verifyStoragePermissions(Activity activity) {// Check if we have write permissionint permission = ActivityCompat.checkSelfPermission(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE);if (permission != PackageManager.PERMISSION_GRANTED) {// We don't have permission so prompt the userActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);}
}