Browse Source

1

newdev_shunjiawei
fdp 1 year ago
parent
commit
20fe5366e5
  1. 2
      lib/modules/ota_upgrade/controllers/ota_upgrade_controller.dart
  2. 8
      local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt
  3. 93
      local_plugins/ota/android/src/main/kotlin/com/example/ota/OtaPlugin.kt
  4. 26
      local_plugins/ota/android/src/main/kotlin/com/example/ota/tool/ota/OTAManager.kt
  5. 8
      local_plugins/ota/android/src/main/kotlin/com/example/ota/tool/ota/ble/BleManager.java

2
lib/modules/ota_upgrade/controllers/ota_upgrade_controller.dart

@ -294,7 +294,7 @@ class OtaUpgradeController extends GetxController {
// 开始升级 // 开始升级
void _installApp(String path) async { void _installApp(String path) async {
jlota.searchDevices(); jlota.searchDevices();
jlota.startUpgrade(); // jlota.startUpgrade();
// JlOtaPlugin() // JlOtaPlugin()
// final File file = File(path); // final File file = File(path);
// if (await file.exists()) { // if (await file.exists()) {

8
local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt

@ -89,7 +89,7 @@ object BleService {
private lateinit var scanHandler: Handler private lateinit var scanHandler: Handler
private val scanResults = ArrayList<ScanResult>() private val scanResults = ArrayList<ScanResult>()
private var isScanning = false private var isScanning = false
var isota = false
// 连接状态 // 连接状态
val connectionState = MutableLiveData(BleConst.STATE_DISCONNECTED) val connectionState = MutableLiveData(BleConst.STATE_DISCONNECTED)
@ -355,9 +355,12 @@ object BleService {
} }
Log.i(TAG, "检测到已配对设备,MAC: $pairedMac,尝试连接") Log.i(TAG, "检测到已配对设备,MAC: $pairedMac,尝试连接")
if(!isota)
{
// 调用现有的 connect 方法 // 调用现有的 connect 方法
connect(pairedMac) connect(pairedMac)
}
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "自动连接已配对设备失败: ${e.message}", e) Log.e(TAG, "自动连接已配对设备失败: ${e.message}", e)
updateConnectionState(BleConst.STATE_ERROR) updateConnectionState(BleConst.STATE_ERROR)
@ -427,7 +430,6 @@ object BleService {
audioChar = null audioChar = null
} }
} }
// fun startOTA() { // fun startOTA() {
// try { // try {
// otaManager?.startOTA(CustomUpdateCallback(context, null)) // otaManager?.startOTA(CustomUpdateCallback(context, null))

93
local_plugins/ota/android/src/main/kotlin/com/example/ota/OtaPlugin.kt

@ -25,6 +25,13 @@ import android.util.Log
import androidx.annotation.NonNull import androidx.annotation.NonNull
import com.jieli.otasdk.tool.config.ConfigHelper import com.jieli.otasdk.tool.config.ConfigHelper
import com.yunqiinnovation.ble_service.BleService import com.yunqiinnovation.ble_service.BleService
import com.yunqiinnovation.ble_service.BleConst
import android.os.Handler
import android.os.Looper
import java.io.File
import java.io.FileOutputStream
import java.io.RandomAccessFile
class CustomUpdateCallback( class CustomUpdateCallback(
val device: BluetoothDevice? val device: BluetoothDevice?
@ -71,14 +78,14 @@ import com.yunqiinnovation.ble_service.BleService
} }
/** OtaPlugin */ /** OtaPlugin */
class OtaPlugin: FlutterPlugin, MethodCallHandler { class OtaPlugin : BleService.Callback, FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android /// The MethodChannel that will the communication between Flutter and native Android
/// ///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it /// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity /// when the Flutter Engine is detached from the Activity
private lateinit var channel : MethodChannel private lateinit var channel : MethodChannel
private lateinit var context: Context private lateinit var context: Context
private lateinit var device1: BluetoothDevice
private lateinit var bluetoothHelper : BluetoothHelper private lateinit var bluetoothHelper : BluetoothHelper
val otaConnectionMLD = MutableLiveData<DeviceConnection>() val otaConnectionMLD = MutableLiveData<DeviceConnection>()
val mandatoryUpgradeMLD = MutableLiveData<BluetoothDevice>() val mandatoryUpgradeMLD = MutableLiveData<BluetoothDevice>()
@ -90,11 +97,29 @@ private lateinit var bluetoothHelper : BluetoothHelper
if ((status == StateCode.CONNECTION_FAILED || status == StateCode.CONNECTION_DISCONNECT) && bluetoothHelper.getConnectedDevice() != null) { if ((status == StateCode.CONNECTION_FAILED || status == StateCode.CONNECTION_DISCONNECT) && bluetoothHelper.getConnectedDevice() != null) {
bluetoothHelper.disconnectDevice(bluetoothHelper.getConnectedDevice()) bluetoothHelper.disconnectDevice(bluetoothHelper.getConnectedDevice())
} }
// 更新连接状态的 LiveData,用于通知 UI 或其他逻辑
otaConnectionMLD.value = DeviceConnection(device, status) otaConnectionMLD.value = DeviceConnection(device, status)
Log.d("bluetoothCallback", "onConnection,status${status}")
if( status == StateCode.CONNECTION_OK) {
Log.d("TAG", "startUpgrade")
val directoryName = "ota_upgrades"
val fileName = "1.ufw"
// 创建WAV输出文件路径
val filePath = context.getExternalFilesDir(null)?.absolutePath + "/downloads/ota_upgrades/$fileName"
Log.d("TAG", "startUpgrade,filePath=${filePath}")
otaManager.bluetoothOption.firmwareFilePath = filePath
otaManager.startOTA(
CustomUpdateCallback(
otaManager.bluetoothHelper.getConnectedDevice()
)
)
}
} }
override fun onMandatoryUpgrade(device: BluetoothDevice?) { override fun onMandatoryUpgrade(device: BluetoothDevice?) {
mandatoryUpgradeMLD.postValue(device!!) mandatoryUpgradeMLD.postValue(device!!)
Log.d("bluetoothCallback", "onMandatoryUpgrade")
} }
} }
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
@ -115,21 +140,26 @@ private lateinit var bluetoothHelper : BluetoothHelper
bluetoothHelper = BluetoothHelper(context) bluetoothHelper = BluetoothHelper(context)
// 如果需要额外的初始化逻辑,请在这里添加 // 如果需要额外的初始化逻辑,请在这里添加
otaManager.registerBluetoothCallback(bluetoothCallback) otaManager.registerBluetoothCallback(bluetoothCallback)
BleService.addCallback(this)
// otaManager.registerBluetoothCallback(bluetoothCallback) // otaManager.registerBluetoothCallback(bluetoothCallback)
result.success("Android ${android.os.Build.VERSION.RELEASE}") result.success("Android ${android.os.Build.VERSION.RELEASE}")
}else if (call.method == "searchDevices") { }else if (call.method == "searchDevices") {
Log.d("TAG", "searchDevices") Log.d("TAG", "searchDevices")
// otaManager.configHelper BleService.isota=true
BleService.disconnect() device1 = BleService.bluetoothGatt?.device!!
// 确保先初始化 ConfigHelper BleService.disconnect()
otaManager.bluetoothHelper.startScan(BleService.bluetoothGatt?.device)
// otaManager.registerBluetoothCallback(bluetoothCallback)
result.success("Android ${android.os.Build.VERSION.RELEASE}")
} else if (call.method == "startUpgrade") { } else if (call.method == "startUpgrade") {
Log.d("TAG", "startUpgrade") Log.d("TAG", "startUpgrade")
var filePath = "/storage/emulated/0/Download/JieLiOTA/upgrade/update - v0.1.0_添加杰理OTA,优化主从切换拾音丢失问题.ufw" val directoryName = "ota_upgrades"
val fileName = "1.ufw"
// 创建WAV输出文件路径
val filePath = context.getExternalFilesDir(null)?.absolutePath + "/downloads/ota_upgrades/$fileName"
Log.d("TAG", "startUpgrade,filePath=${filePath}")
//var filePath = "/storage/emulated/0/Download/JieLiOTA/upgrade/update - v0.1.0_添加杰理OTA,优化主从切换拾音丢失问题.ufw"
otaManager.bluetoothOption.firmwareFilePath = filePath otaManager.bluetoothOption.firmwareFilePath = filePath
otaManager.startOTA( otaManager.startOTA(
CustomUpdateCallback( CustomUpdateCallback(
@ -145,4 +175,45 @@ private lateinit var bluetoothHelper : BluetoothHelper
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null) channel.setMethodCallHandler(null)
} }
override fun onScanResult(devices: List<Map<String, Any>>) {
// 不处理扫描结果
}
override fun onConnectionStateChanged(state: Int) {
// // 可选:处理连接状态变化
// if (state == BleConst.STATE_CONNECTED) {
// Log.d(TAG, "Ble设备已连接,准备好语音交互")
// } else if (state == BleConst.STATE_DISCONNECTED) {
Log.d("TAG", "Ble设备已断开,onConnectionStateChanged")
// // 设备断开连接,停止语音服务
// // stopListening()
// }
if (state == BleConst.STATE_DISCONNECTED) {
Handler(Looper.getMainLooper()).postDelayed({
otaManager.bluetoothHelper.startScan(device1)
}, 2000) // 2000 毫秒 = 2 秒
}
}
override fun onAudioDataReceived(data: ByteArray) {
// 可选:处理音频数据
}
/**
* 处理唤醒信号
* 在收到唤醒信号时启动语音识别
*/
override fun onWakeupSignalReceived() {
}
override fun onDeviceInfoReceived(infoType: Int, infoData: Map<String, Any>) {
// 不处理设备信息
}
} }

26
local_plugins/ota/android/src/main/kotlin/com/example/ota/tool/ota/OTAManager.kt

@ -23,12 +23,30 @@ class OTAManager(context: Context) : BluetoothOTAManager(context) {
val configHelper = ConfigHelper.getInstance() val configHelper = ConfigHelper.getInstance()
val bluetoothHelper = BluetoothHelper.getInstance(context) val bluetoothHelper = BluetoothHelper.getInstance(context)
/**
* 转换成OTA库的连接状态
*
* @param status 连接状态
* @return 库的连接状态
*/
fun changeConnectStatus(status: Int): Int {
var changeStatus = StateCode.CONNECTION_DISCONNECT
when (status) {
2 -> {
changeStatus = StateCode.CONNECTION_OK
}
1 -> {
changeStatus = StateCode.CONNECTION_CONNECTING
}
}
return changeStatus
}
val btEventCallback = object : OnBTEventCallback() { val btEventCallback = object : OnBTEventCallback() {
override fun onDeviceConnection(device: BluetoothDevice?, way: Int, status: Int) { override fun onDeviceConnection(device: BluetoothDevice?, way: Int, status: Int) {
super.onDeviceConnection(device, way, status) super.onDeviceConnection(device, way, status)
// val connectionState = AppUtil.changeConnectStatus(status) val connectionState = changeConnectStatus(status)
// Log.i( // Log.i(
// TAG, "onConnection >>> device : ${printDeviceInfo(device)}, way = $way" + // TAG, "onConnection >>> device : ${printDeviceInfo(device)}, way = $way" +
// " status :$status, change status : $connectionState" // " status :$status, change status : $connectionState"
@ -37,9 +55,9 @@ class OTAManager(context: Context) : BluetoothOTAManager(context) {
//注释掉 //注释掉
Log.i( Log.i(
TAG, "onConnection >>> device : ${device}, way = $way" + TAG, "onConnection >>> device : ${device}, way = $way" +
" status :$status, change status : 3" " status :$status, change status : $connectionState"
) )
onBtDeviceConnection(device, 1) onBtDeviceConnection(device, connectionState)
} }
override fun onReceiveData( override fun onReceiveData(

8
local_plugins/ota/android/src/main/kotlin/com/example/ota/tool/ota/ble/BleManager.java

@ -88,7 +88,7 @@ public class BleManager {
private volatile boolean isBleScanning; private volatile boolean isBleScanning;
private NotifyCharacteristicRunnable mNotifyCharacteristicRunnable; private NotifyCharacteristicRunnable mNotifyCharacteristicRunnable;
private BluetoothDevice deviced;//需要连接手机设备信息 private BluetoothDevice deviced1;//需要连接手机设备信息
private long timeout = 15000;//扫描设备时间 private long timeout = 15000;//扫描设备时间
private int mRetryConnectCount = 0;//连接失败后尝试连接次数 private int mRetryConnectCount = 0;//连接失败后尝试连接次数
private long startConnectTime = 0; //开始连接时间戳 private long startConnectTime = 0; //开始连接时间戳
@ -311,7 +311,8 @@ public class BleManager {
} }
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
public boolean startLeScan(BluetoothDevice deviced) { public boolean startLeScan(BluetoothDevice deviced) {
Log.i(TAG, ", timeout = " + timeout); deviced1=deviced;
Log.i(TAG, ", deviced = " + deviced);
if (!isBluetoothEnable() || !isLocationPermissionGranted(mContext)) { if (!isBluetoothEnable() || !isLocationPermissionGranted(mContext)) {
checkPermissionsAndRequest(mContext); checkPermissionsAndRequest(mContext);
return false; return false;
@ -632,7 +633,8 @@ public class BleManager {
&& !mDiscoveredBleDevices.contains(device)) { && !mDiscoveredBleDevices.contains(device)) {
Log.d(TAG, "notify device : " + printDeviceInfo(device)); Log.d(TAG, "notify device : " + printDeviceInfo(device));
Log.d(TAG, "device.getAddress : " + device.getAddress()); Log.d(TAG, "device.getAddress : " + device.getAddress());
if ("4D:9B:09:38:22:F5".equals(device.getAddress())) { Log.d(TAG, "deviced1.getAddress() : " + deviced1.getAddress());
if (deviced1 != null && deviced1.getAddress().equals(device.getAddress())) {
// 匹配成功 // 匹配成功
Log.i(TAG, "filterDevice找到了DeapSound设备"); Log.i(TAG, "filterDevice找到了DeapSound设备");

Loading…
Cancel
Save