diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt index 136f6ed..09fd6c0 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt @@ -12,14 +12,19 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope import com.casic.app.safetreecontroller.databinding.FragmentBaseSettingsBinding import com.casic.app.safetreecontroller.service.SocketConnectionService +import com.casic.app.safetreecontroller.utils.CommandCreator import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch class BaseSettingsFragment : KotlinBaseFragment(), @@ -92,8 +97,16 @@ override fun setUserVisibleHint(isVisibleToUser: Boolean) { super.setUserVisibleHint(isVisibleToUser) if (isVisibleToUser) { - //查询主控板IP、子网掩码、网关IP - SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler ?: return + lifecycleScope.launch(Dispatchers.IO) { + //查询是否配合一体机使用 + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_IS_USE_AI_CODE) + + delay(500) + + //查询主控板IP、子网掩码、网关IP + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + } } } @@ -101,6 +114,20 @@ binding.queryBoardConfigButton.setOnClickListener { SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) } + + //TODO + binding.configurationButton.setOnClickListener { + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler + ?: return@setOnClickListener + lifecycleScope.launch(Dispatchers.IO) { + + + } + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE + message.obj = CommandCreator.createWiFiConfigCommand("YTJ-010002", "zhsz20311hw") + weakReferenceHandler.sendMessage(message) + } } override fun handleMessage(msg: Message): Boolean { @@ -109,6 +136,16 @@ binding.deviceCodeView.text = msg.obj as String } + LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE -> { + //如果配合一体机使用,该项出厂时配置为0,否则出厂时配置为1 + val state = msg.obj as String + if (state == "0") { + binding.serverLayout.visibility = View.VISIBLE + } else { + binding.serverLayout.visibility = View.GONE + } + } + LocaleConstant.BOARD_CONFIG_RESPONSE_CODE -> { val data = msg.obj as String //分割数据 diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt index 136f6ed..09fd6c0 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt @@ -12,14 +12,19 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope import com.casic.app.safetreecontroller.databinding.FragmentBaseSettingsBinding import com.casic.app.safetreecontroller.service.SocketConnectionService +import com.casic.app.safetreecontroller.utils.CommandCreator import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch class BaseSettingsFragment : KotlinBaseFragment(), @@ -92,8 +97,16 @@ override fun setUserVisibleHint(isVisibleToUser: Boolean) { super.setUserVisibleHint(isVisibleToUser) if (isVisibleToUser) { - //查询主控板IP、子网掩码、网关IP - SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler ?: return + lifecycleScope.launch(Dispatchers.IO) { + //查询是否配合一体机使用 + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_IS_USE_AI_CODE) + + delay(500) + + //查询主控板IP、子网掩码、网关IP + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + } } } @@ -101,6 +114,20 @@ binding.queryBoardConfigButton.setOnClickListener { SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) } + + //TODO + binding.configurationButton.setOnClickListener { + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler + ?: return@setOnClickListener + lifecycleScope.launch(Dispatchers.IO) { + + + } + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE + message.obj = CommandCreator.createWiFiConfigCommand("YTJ-010002", "zhsz20311hw") + weakReferenceHandler.sendMessage(message) + } } override fun handleMessage(msg: Message): Boolean { @@ -109,6 +136,16 @@ binding.deviceCodeView.text = msg.obj as String } + LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE -> { + //如果配合一体机使用,该项出厂时配置为0,否则出厂时配置为1 + val state = msg.obj as String + if (state == "0") { + binding.serverLayout.visibility = View.VISIBLE + } else { + binding.serverLayout.visibility = View.GONE + } + } + LocaleConstant.BOARD_CONFIG_RESPONSE_CODE -> { val data = msg.obj as String //分割数据 diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 1acc004..8d76efd 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -82,6 +82,15 @@ LocaleConstant.QUERY_BOARD_CONFIG_CODE -> { tcpClient.sendMessage(CommandCreator.createControlBoardConfigCommand()) } + + LocaleConstant.QUERY_IS_USE_AI_CODE -> { + tcpClient.sendMessage(CommandCreator.createIsUseAICommand()) + } + + LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE -> { + val command = msg.obj as ByteArray + tcpClient.sendMessage(command) + } } return true } @@ -144,13 +153,59 @@ * 安全树主控板IP地址、子网掩码、网关IP查询返回: * * [71, 101, 116, 68, 97, 116, 97, 58, 49, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 53, 49, 44, 50, 53, 53, 46, 50, 53, 53, 46, 50, 53, 53, 46, 48, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 49, 48, 13, 10] + * + * 安全树主控板是否连接远程服务器设置与查询返回: + * + * [71, 101, 116, 68, 97, 116, 97, 58, 52, 44, 48, 13, 10] * */ override fun onMessageReceived(bytes: ByteArray?) { if (bytes == null) { return } Log.d(kTag, bytes.contentToString()) - if (bytes.size == 13) { + //根据帧头判断。不能直接转为ascii,因为有的协议返回的不是ascii,会报错 + val dataHeadArray = bytes.copyOfRange(0, 7) + if (dataHeadArray.contentEquals(byteArrayOf(71, 101, 116, 68, 97, 116, 97))) { + //GetData + //判断类型 + when (Char(bytes[8].toInt())) { + '1' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + + '4' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + } + } else if (dataHeadArray.contentEquals(byteArrayOf())) { + //SetData TODO + when (Char(bytes[10].toInt())) { + '2' -> { + Log.d(kTag, "onMessageReceived: ${bytes.toAsciiCode()}") + } + } + } else { + if (bytes.size != 13) { + Log.d(kTag, "onMessageReceived: 数据长度异常") + return + } + //取前6位解析设备编号 val deviceCode = bytes.take(6).toByteArray().toHex() if (BaseSettingsFragment.weakReferenceHandler != null) { @@ -167,7 +222,8 @@ //甲烷浓度 val dataArray = bytes.copyOfRange(7, bytes.size) val concentration = dataArray.handleGasConcentration() - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_METHANE_RESPONSE_CODE message.obj = concentration @@ -227,31 +283,14 @@ //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE message.obj = temperature weakReferenceHandler.sendMessage(message) } } - } else { - val dataHeadArray = bytes.copyOfRange(0, 7) - if (dataHeadArray.toAsciiCode() == "GetData") { - //判断类型 - when (Char(bytes[10].toInt())) { - '1' -> { - val dataArray = bytes.copyOfRange(10, bytes.size) - val data = dataArray.toAsciiCode() - if (BaseSettingsFragment.weakReferenceHandler != null) { - val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! - val message = weakReferenceHandler.obtainMessage() - message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE - message.obj = data - weakReferenceHandler.sendMessage(message) - } - } - } - } } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt index 136f6ed..09fd6c0 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt @@ -12,14 +12,19 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope import com.casic.app.safetreecontroller.databinding.FragmentBaseSettingsBinding import com.casic.app.safetreecontroller.service.SocketConnectionService +import com.casic.app.safetreecontroller.utils.CommandCreator import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch class BaseSettingsFragment : KotlinBaseFragment(), @@ -92,8 +97,16 @@ override fun setUserVisibleHint(isVisibleToUser: Boolean) { super.setUserVisibleHint(isVisibleToUser) if (isVisibleToUser) { - //查询主控板IP、子网掩码、网关IP - SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler ?: return + lifecycleScope.launch(Dispatchers.IO) { + //查询是否配合一体机使用 + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_IS_USE_AI_CODE) + + delay(500) + + //查询主控板IP、子网掩码、网关IP + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + } } } @@ -101,6 +114,20 @@ binding.queryBoardConfigButton.setOnClickListener { SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) } + + //TODO + binding.configurationButton.setOnClickListener { + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler + ?: return@setOnClickListener + lifecycleScope.launch(Dispatchers.IO) { + + + } + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE + message.obj = CommandCreator.createWiFiConfigCommand("YTJ-010002", "zhsz20311hw") + weakReferenceHandler.sendMessage(message) + } } override fun handleMessage(msg: Message): Boolean { @@ -109,6 +136,16 @@ binding.deviceCodeView.text = msg.obj as String } + LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE -> { + //如果配合一体机使用,该项出厂时配置为0,否则出厂时配置为1 + val state = msg.obj as String + if (state == "0") { + binding.serverLayout.visibility = View.VISIBLE + } else { + binding.serverLayout.visibility = View.GONE + } + } + LocaleConstant.BOARD_CONFIG_RESPONSE_CODE -> { val data = msg.obj as String //分割数据 diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 1acc004..8d76efd 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -82,6 +82,15 @@ LocaleConstant.QUERY_BOARD_CONFIG_CODE -> { tcpClient.sendMessage(CommandCreator.createControlBoardConfigCommand()) } + + LocaleConstant.QUERY_IS_USE_AI_CODE -> { + tcpClient.sendMessage(CommandCreator.createIsUseAICommand()) + } + + LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE -> { + val command = msg.obj as ByteArray + tcpClient.sendMessage(command) + } } return true } @@ -144,13 +153,59 @@ * 安全树主控板IP地址、子网掩码、网关IP查询返回: * * [71, 101, 116, 68, 97, 116, 97, 58, 49, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 53, 49, 44, 50, 53, 53, 46, 50, 53, 53, 46, 50, 53, 53, 46, 48, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 49, 48, 13, 10] + * + * 安全树主控板是否连接远程服务器设置与查询返回: + * + * [71, 101, 116, 68, 97, 116, 97, 58, 52, 44, 48, 13, 10] * */ override fun onMessageReceived(bytes: ByteArray?) { if (bytes == null) { return } Log.d(kTag, bytes.contentToString()) - if (bytes.size == 13) { + //根据帧头判断。不能直接转为ascii,因为有的协议返回的不是ascii,会报错 + val dataHeadArray = bytes.copyOfRange(0, 7) + if (dataHeadArray.contentEquals(byteArrayOf(71, 101, 116, 68, 97, 116, 97))) { + //GetData + //判断类型 + when (Char(bytes[8].toInt())) { + '1' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + + '4' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + } + } else if (dataHeadArray.contentEquals(byteArrayOf())) { + //SetData TODO + when (Char(bytes[10].toInt())) { + '2' -> { + Log.d(kTag, "onMessageReceived: ${bytes.toAsciiCode()}") + } + } + } else { + if (bytes.size != 13) { + Log.d(kTag, "onMessageReceived: 数据长度异常") + return + } + //取前6位解析设备编号 val deviceCode = bytes.take(6).toByteArray().toHex() if (BaseSettingsFragment.weakReferenceHandler != null) { @@ -167,7 +222,8 @@ //甲烷浓度 val dataArray = bytes.copyOfRange(7, bytes.size) val concentration = dataArray.handleGasConcentration() - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_METHANE_RESPONSE_CODE message.obj = concentration @@ -227,31 +283,14 @@ //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE message.obj = temperature weakReferenceHandler.sendMessage(message) } } - } else { - val dataHeadArray = bytes.copyOfRange(0, 7) - if (dataHeadArray.toAsciiCode() == "GetData") { - //判断类型 - when (Char(bytes[10].toInt())) { - '1' -> { - val dataArray = bytes.copyOfRange(10, bytes.size) - val data = dataArray.toAsciiCode() - if (BaseSettingsFragment.weakReferenceHandler != null) { - val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! - val message = weakReferenceHandler.obtainMessage() - message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE - message.obj = data - weakReferenceHandler.sendMessage(message) - } - } - } - } } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt index a9e5b05..1a808c4 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt @@ -74,6 +74,20 @@ } /** + * 查询是否和一体机一起使用指令 + * */ + fun createIsUseAICommand(): ByteArray { + return "GetData:4\r\n".toByteArray() + } + + /** + * 设置主控板WiFi指令 + * */ + fun createWiFiConfigCommand(wifiName: String, password: String): ByteArray { + return "SetData:2,${wifiName},${password}\r\n".toByteArray() + } + + /** * 音量增大指令 * */ fun createIncreaseVoiceCommand(): ByteArray { diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt index 136f6ed..09fd6c0 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt @@ -12,14 +12,19 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope import com.casic.app.safetreecontroller.databinding.FragmentBaseSettingsBinding import com.casic.app.safetreecontroller.service.SocketConnectionService +import com.casic.app.safetreecontroller.utils.CommandCreator import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch class BaseSettingsFragment : KotlinBaseFragment(), @@ -92,8 +97,16 @@ override fun setUserVisibleHint(isVisibleToUser: Boolean) { super.setUserVisibleHint(isVisibleToUser) if (isVisibleToUser) { - //查询主控板IP、子网掩码、网关IP - SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler ?: return + lifecycleScope.launch(Dispatchers.IO) { + //查询是否配合一体机使用 + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_IS_USE_AI_CODE) + + delay(500) + + //查询主控板IP、子网掩码、网关IP + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + } } } @@ -101,6 +114,20 @@ binding.queryBoardConfigButton.setOnClickListener { SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) } + + //TODO + binding.configurationButton.setOnClickListener { + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler + ?: return@setOnClickListener + lifecycleScope.launch(Dispatchers.IO) { + + + } + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE + message.obj = CommandCreator.createWiFiConfigCommand("YTJ-010002", "zhsz20311hw") + weakReferenceHandler.sendMessage(message) + } } override fun handleMessage(msg: Message): Boolean { @@ -109,6 +136,16 @@ binding.deviceCodeView.text = msg.obj as String } + LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE -> { + //如果配合一体机使用,该项出厂时配置为0,否则出厂时配置为1 + val state = msg.obj as String + if (state == "0") { + binding.serverLayout.visibility = View.VISIBLE + } else { + binding.serverLayout.visibility = View.GONE + } + } + LocaleConstant.BOARD_CONFIG_RESPONSE_CODE -> { val data = msg.obj as String //分割数据 diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 1acc004..8d76efd 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -82,6 +82,15 @@ LocaleConstant.QUERY_BOARD_CONFIG_CODE -> { tcpClient.sendMessage(CommandCreator.createControlBoardConfigCommand()) } + + LocaleConstant.QUERY_IS_USE_AI_CODE -> { + tcpClient.sendMessage(CommandCreator.createIsUseAICommand()) + } + + LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE -> { + val command = msg.obj as ByteArray + tcpClient.sendMessage(command) + } } return true } @@ -144,13 +153,59 @@ * 安全树主控板IP地址、子网掩码、网关IP查询返回: * * [71, 101, 116, 68, 97, 116, 97, 58, 49, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 53, 49, 44, 50, 53, 53, 46, 50, 53, 53, 46, 50, 53, 53, 46, 48, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 49, 48, 13, 10] + * + * 安全树主控板是否连接远程服务器设置与查询返回: + * + * [71, 101, 116, 68, 97, 116, 97, 58, 52, 44, 48, 13, 10] * */ override fun onMessageReceived(bytes: ByteArray?) { if (bytes == null) { return } Log.d(kTag, bytes.contentToString()) - if (bytes.size == 13) { + //根据帧头判断。不能直接转为ascii,因为有的协议返回的不是ascii,会报错 + val dataHeadArray = bytes.copyOfRange(0, 7) + if (dataHeadArray.contentEquals(byteArrayOf(71, 101, 116, 68, 97, 116, 97))) { + //GetData + //判断类型 + when (Char(bytes[8].toInt())) { + '1' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + + '4' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + } + } else if (dataHeadArray.contentEquals(byteArrayOf())) { + //SetData TODO + when (Char(bytes[10].toInt())) { + '2' -> { + Log.d(kTag, "onMessageReceived: ${bytes.toAsciiCode()}") + } + } + } else { + if (bytes.size != 13) { + Log.d(kTag, "onMessageReceived: 数据长度异常") + return + } + //取前6位解析设备编号 val deviceCode = bytes.take(6).toByteArray().toHex() if (BaseSettingsFragment.weakReferenceHandler != null) { @@ -167,7 +222,8 @@ //甲烷浓度 val dataArray = bytes.copyOfRange(7, bytes.size) val concentration = dataArray.handleGasConcentration() - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_METHANE_RESPONSE_CODE message.obj = concentration @@ -227,31 +283,14 @@ //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE message.obj = temperature weakReferenceHandler.sendMessage(message) } } - } else { - val dataHeadArray = bytes.copyOfRange(0, 7) - if (dataHeadArray.toAsciiCode() == "GetData") { - //判断类型 - when (Char(bytes[10].toInt())) { - '1' -> { - val dataArray = bytes.copyOfRange(10, bytes.size) - val data = dataArray.toAsciiCode() - if (BaseSettingsFragment.weakReferenceHandler != null) { - val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! - val message = weakReferenceHandler.obtainMessage() - message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE - message.obj = data - weakReferenceHandler.sendMessage(message) - } - } - } - } } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt index a9e5b05..1a808c4 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt @@ -74,6 +74,20 @@ } /** + * 查询是否和一体机一起使用指令 + * */ + fun createIsUseAICommand(): ByteArray { + return "GetData:4\r\n".toByteArray() + } + + /** + * 设置主控板WiFi指令 + * */ + fun createWiFiConfigCommand(wifiName: String, password: String): ByteArray { + return "SetData:2,${wifiName},${password}\r\n".toByteArray() + } + + /** * 音量增大指令 * */ fun createIncreaseVoiceCommand(): ByteArray { diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt index f8f1324..0756741 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -27,6 +27,8 @@ const val OPEN_DEVICE_STATE_TIPS_CODE = 20240011 const val CLOSE_DEVICE_STATE_TIPS_CODE = 20240012 const val QUERY_BOARD_CONFIG_CODE = 20240013 + const val QUERY_IS_USE_AI_CODE = 20240014 + const val SET_BOARD_WIFI_CONFIG_CODE = 20240015 /** * Handler Response Code @@ -35,6 +37,7 @@ const val QUERY_METHANE_RESPONSE_CODE = 20241002 const val DEVICE_RESPONSE_CODE = 20241003 const val BOARD_CONFIG_RESPONSE_CODE = 20241004 + const val QUERY_IS_USE_AI_RESPONSE_CODE = 20241005 /*** * SP Key diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt index 136f6ed..09fd6c0 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/BaseSettingsFragment.kt @@ -12,14 +12,19 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope import com.casic.app.safetreecontroller.databinding.FragmentBaseSettingsBinding import com.casic.app.safetreecontroller.service.SocketConnectionService +import com.casic.app.safetreecontroller.utils.CommandCreator import com.casic.app.safetreecontroller.utils.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.BroadcastManager import com.pengxh.kt.lite.utils.WeakReferenceHandler +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch class BaseSettingsFragment : KotlinBaseFragment(), @@ -92,8 +97,16 @@ override fun setUserVisibleHint(isVisibleToUser: Boolean) { super.setUserVisibleHint(isVisibleToUser) if (isVisibleToUser) { - //查询主控板IP、子网掩码、网关IP - SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler ?: return + lifecycleScope.launch(Dispatchers.IO) { + //查询是否配合一体机使用 + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_IS_USE_AI_CODE) + + delay(500) + + //查询主控板IP、子网掩码、网关IP + weakReferenceHandler.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) + } } } @@ -101,6 +114,20 @@ binding.queryBoardConfigButton.setOnClickListener { SocketConnectionService.weakReferenceHandler?.sendEmptyMessage(LocaleConstant.QUERY_BOARD_CONFIG_CODE) } + + //TODO + binding.configurationButton.setOnClickListener { + val weakReferenceHandler = SocketConnectionService.weakReferenceHandler + ?: return@setOnClickListener + lifecycleScope.launch(Dispatchers.IO) { + + + } + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE + message.obj = CommandCreator.createWiFiConfigCommand("YTJ-010002", "zhsz20311hw") + weakReferenceHandler.sendMessage(message) + } } override fun handleMessage(msg: Message): Boolean { @@ -109,6 +136,16 @@ binding.deviceCodeView.text = msg.obj as String } + LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE -> { + //如果配合一体机使用,该项出厂时配置为0,否则出厂时配置为1 + val state = msg.obj as String + if (state == "0") { + binding.serverLayout.visibility = View.VISIBLE + } else { + binding.serverLayout.visibility = View.GONE + } + } + LocaleConstant.BOARD_CONFIG_RESPONSE_CODE -> { val data = msg.obj as String //分割数据 diff --git a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt index 1acc004..8d76efd 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/service/SocketConnectionService.kt @@ -82,6 +82,15 @@ LocaleConstant.QUERY_BOARD_CONFIG_CODE -> { tcpClient.sendMessage(CommandCreator.createControlBoardConfigCommand()) } + + LocaleConstant.QUERY_IS_USE_AI_CODE -> { + tcpClient.sendMessage(CommandCreator.createIsUseAICommand()) + } + + LocaleConstant.SET_BOARD_WIFI_CONFIG_CODE -> { + val command = msg.obj as ByteArray + tcpClient.sendMessage(command) + } } return true } @@ -144,13 +153,59 @@ * 安全树主控板IP地址、子网掩码、网关IP查询返回: * * [71, 101, 116, 68, 97, 116, 97, 58, 49, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 53, 49, 44, 50, 53, 53, 46, 50, 53, 53, 46, 50, 53, 53, 46, 48, 44, 49, 57, 50, 46, 49, 54, 56, 46, 49, 48, 46, 49, 48, 13, 10] + * + * 安全树主控板是否连接远程服务器设置与查询返回: + * + * [71, 101, 116, 68, 97, 116, 97, 58, 52, 44, 48, 13, 10] * */ override fun onMessageReceived(bytes: ByteArray?) { if (bytes == null) { return } Log.d(kTag, bytes.contentToString()) - if (bytes.size == 13) { + //根据帧头判断。不能直接转为ascii,因为有的协议返回的不是ascii,会报错 + val dataHeadArray = bytes.copyOfRange(0, 7) + if (dataHeadArray.contentEquals(byteArrayOf(71, 101, 116, 68, 97, 116, 97))) { + //GetData + //判断类型 + when (Char(bytes[8].toInt())) { + '1' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + + '4' -> { + val dataArray = bytes.copyOfRange(10, bytes.size) + val data = dataArray.toAsciiCode() + if (BaseSettingsFragment.weakReferenceHandler != null) { + val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! + val message = weakReferenceHandler.obtainMessage() + message.what = LocaleConstant.QUERY_IS_USE_AI_RESPONSE_CODE + message.obj = data + weakReferenceHandler.sendMessage(message) + } + } + } + } else if (dataHeadArray.contentEquals(byteArrayOf())) { + //SetData TODO + when (Char(bytes[10].toInt())) { + '2' -> { + Log.d(kTag, "onMessageReceived: ${bytes.toAsciiCode()}") + } + } + } else { + if (bytes.size != 13) { + Log.d(kTag, "onMessageReceived: 数据长度异常") + return + } + //取前6位解析设备编号 val deviceCode = bytes.take(6).toByteArray().toHex() if (BaseSettingsFragment.weakReferenceHandler != null) { @@ -167,7 +222,8 @@ //甲烷浓度 val dataArray = bytes.copyOfRange(7, bytes.size) val concentration = dataArray.handleGasConcentration() - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_METHANE_RESPONSE_CODE message.obj = concentration @@ -227,31 +283,14 @@ //激光温度 val dataArray = bytes.copyOfRange(10, bytes.size) val temperature = (dataArray[0] * 256 + dataArray[1]) / 10f - val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler ?: return + val weakReferenceHandler = MethaneMonitorFragment.weakReferenceHandler + ?: return val message = weakReferenceHandler.obtainMessage() message.what = LocaleConstant.QUERY_CPU_TEMPERATURE_RESPONSE_CODE message.obj = temperature weakReferenceHandler.sendMessage(message) } } - } else { - val dataHeadArray = bytes.copyOfRange(0, 7) - if (dataHeadArray.toAsciiCode() == "GetData") { - //判断类型 - when (Char(bytes[10].toInt())) { - '1' -> { - val dataArray = bytes.copyOfRange(10, bytes.size) - val data = dataArray.toAsciiCode() - if (BaseSettingsFragment.weakReferenceHandler != null) { - val weakReferenceHandler = BaseSettingsFragment.weakReferenceHandler!! - val message = weakReferenceHandler.obtainMessage() - message.what = LocaleConstant.BOARD_CONFIG_RESPONSE_CODE - message.obj = data - weakReferenceHandler.sendMessage(message) - } - } - } - } } } diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt index a9e5b05..1a808c4 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/CommandCreator.kt @@ -74,6 +74,20 @@ } /** + * 查询是否和一体机一起使用指令 + * */ + fun createIsUseAICommand(): ByteArray { + return "GetData:4\r\n".toByteArray() + } + + /** + * 设置主控板WiFi指令 + * */ + fun createWiFiConfigCommand(wifiName: String, password: String): ByteArray { + return "SetData:2,${wifiName},${password}\r\n".toByteArray() + } + + /** * 音量增大指令 * */ fun createIncreaseVoiceCommand(): ByteArray { diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt index f8f1324..0756741 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt @@ -27,6 +27,8 @@ const val OPEN_DEVICE_STATE_TIPS_CODE = 20240011 const val CLOSE_DEVICE_STATE_TIPS_CODE = 20240012 const val QUERY_BOARD_CONFIG_CODE = 20240013 + const val QUERY_IS_USE_AI_CODE = 20240014 + const val SET_BOARD_WIFI_CONFIG_CODE = 20240015 /** * Handler Response Code @@ -35,6 +37,7 @@ const val QUERY_METHANE_RESPONSE_CODE = 20241002 const val DEVICE_RESPONSE_CODE = 20241003 const val BOARD_CONFIG_RESPONSE_CODE = 20241004 + const val QUERY_IS_USE_AI_RESPONSE_CODE = 20241005 /*** * SP Key diff --git a/app/src/main/res/layout/fragment_base_settings.xml b/app/src/main/res/layout/fragment_base_settings.xml index 96284a0..61aa059 100644 --- a/app/src/main/res/layout/fragment_base_settings.xml +++ b/app/src/main/res/layout/fragment_base_settings.xml @@ -194,78 +194,85 @@ android:textSize="@dimen/sp_16" /> - - - - + android:layout_height="wrap_content" + android:orientation="vertical"> + + - - + - + - + + - + + + + + +