diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/WolSendFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/WolSendFragment.kt index fa23fcda..0f5ed0cd 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/WolSendFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/WolSendFragment.kt @@ -88,8 +88,8 @@ class WolSendFragment : BaseFragment(), View.OnCl .items(wolHistory.keys) .itemsCallbackSingleChoice(0) { _: MaterialDialog?, _: View?, _: Int, text: CharSequence -> //XToastUtils.info("$which: $text") - binding!!.etIp.setText(text) - binding!!.etMac.setText(wolHistory[text]) + binding!!.etMac.setText(text) + binding!!.etIp.setText(wolHistory[text]) true // allow selection } .positiveText(R.string.select) @@ -128,9 +128,17 @@ class WolSendFragment : BaseFragment(), View.OnCl return } + val port = binding!!.etPort.text.toString() + val portRegex = getString(R.string.wol_port_regex).toRegex() + if (!TextUtils.isEmpty(port) && !portRegex.matches(port)) { + XToastUtils.error(ResUtils.getString(R.string.wol_port_error)) + return + } + val dataMap: MutableMap = mutableMapOf() dataMap["ip"] = ip dataMap["mac"] = mac + dataMap["port"] = port msgMap["data"] = dataMap val requestMsg: String = Gson().toJson(msgMap) diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/component/AppMessageConverter.kt b/app/src/main/java/com/idormy/sms/forwarder/server/component/AppMessageConverter.kt index 15153b1b..80f429bb 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/server/component/AppMessageConverter.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/server/component/AppMessageConverter.kt @@ -2,7 +2,7 @@ package com.idormy.sms.forwarder.server.component import android.text.TextUtils import android.util.Log -import com.google.gson.Gson +import com.google.gson.GsonBuilder import com.idormy.sms.forwarder.server.model.BaseRequest import com.idormy.sms.forwarder.utils.HttpServerUtils import com.yanzhenjie.andserver.annotation.Converter @@ -36,8 +36,12 @@ class AppMessageConverter : MessageConverter { val json = if (charset == null) IOUtils.toString(stream) else IOUtils.toString(stream, charset) Log.d(TAG, "Json: $json") - //TODO:待迁移kotlinx.serialization,type转换问题 - val t: T? = Gson().fromJson(json, type) + //修改接口数据中的null、“”为默认值 + val builder = GsonBuilder() + builder.registerTypeAdapter(Int::class.java, IntegerDefaultAdapter()) + builder.registerTypeAdapter(String::class.java, StringDefaultAdapter()) + val gson = builder.create() + val t: T? = gson.fromJson(json, type) Log.d(TAG, "Bean: $t") //校验时间戳(时间误差不能超过1小时)&& 签名 diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/component/IntegerDefaultAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/server/component/IntegerDefaultAdapter.kt new file mode 100644 index 00000000..63ec2bf7 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/server/component/IntegerDefaultAdapter.kt @@ -0,0 +1,23 @@ +package com.idormy.sms.forwarder.server.component + +import com.google.gson.TypeAdapter +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonWriter +import java.io.IOException + +class IntegerDefaultAdapter : TypeAdapter() { + @Throws(IOException::class) + override fun write(jsonWriter: JsonWriter, value: Int) { + jsonWriter.value(value.toString()) + } + + @Throws(IOException::class) + override fun read(jsonReader: JsonReader): Int { + return try { + Integer.valueOf(jsonReader.nextString()) + } catch (e: NumberFormatException) { + e.printStackTrace() + -1 + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/component/StringDefaultAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/server/component/StringDefaultAdapter.kt new file mode 100644 index 00000000..605fb262 --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/server/component/StringDefaultAdapter.kt @@ -0,0 +1,24 @@ +package com.idormy.sms.forwarder.server.component + +import com.google.gson.TypeAdapter +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonToken +import com.google.gson.stream.JsonWriter +import java.io.IOException + +class StringDefaultAdapter : TypeAdapter() { + @Throws(IOException::class) + override fun write(jsonWriter: JsonWriter, s: String?) { + jsonWriter.value(s) + } + + @Throws(IOException::class) + override fun read(jsonReader: JsonReader): String { + return if (jsonReader.peek() === JsonToken.NULL) { + jsonReader.nextNull() + "" + } else { + jsonReader.nextString() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/controller/WolController.kt b/app/src/main/java/com/idormy/sms/forwarder/server/controller/WolController.kt index c35291d1..3c126824 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/server/controller/WolController.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/server/controller/WolController.kt @@ -39,13 +39,12 @@ class WolController { System.arraycopy(macBytes, 0, bytes, i, macBytes.size) i += macBytes.size } - val packet = if (TextUtils.isEmpty(wolData.ip)) { - val address: InetAddress = InetAddress.getByName(wolData.ip) - DatagramPacket(bytes, bytes.size, address, 9) - } else { - DatagramPacket(bytes, bytes.size) - } + val host = if (TextUtils.isEmpty(wolData.ip)) "230.0.0.1" else wolData.ip + val port = if (wolData.port > 0) wolData.port else 9 + val address: InetAddress = InetAddress.getByName(host) + val packet = DatagramPacket(bytes, bytes.size, address, port) socket.send(packet) + socket.close() Log.d(TAG, "Wake-on-LAN packet sent.") } catch (e: Exception) { Log.e(TAG, "Failed to send Wake-on-LAN packet: $e") diff --git a/app/src/main/java/com/idormy/sms/forwarder/server/model/WolData.kt b/app/src/main/java/com/idormy/sms/forwarder/server/model/WolData.kt index f46abca9..5d5b4291 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/server/model/WolData.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/server/model/WolData.kt @@ -8,4 +8,6 @@ data class WolData( var mac: String, @SerializedName("ip") var ip: String = "", + @SerializedName("port") + var port: Int = 9, ) : Serializable \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_client_wol_send.xml b/app/src/main/res/layout/fragment_client_wol_send.xml index 2a0bd5f5..74d84a20 100644 --- a/app/src/main/res/layout/fragment_client_wol_send.xml +++ b/app/src/main/res/layout/fragment_client_wol_send.xml @@ -75,6 +75,31 @@ + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index d13efa19..b1565db8 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -883,13 +883,16 @@ AppSecret Sample Text Sample Markdown - Please enter an IP address, eg. 192.168.168.168 + IP address/broadcast address, eg. 192.168.1.255 Malformed IP address, eg. 192.168.168.168 ^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])$ - Please enter the network card mac, eg. AA:BB:CC:DD:EE:FF + Network card mac, eg. AA:BB:CC:DD:EE:FF The network card mac format is incorrect, eg. AA:BB:CC:DD:EE:FF ^((([a-fA-F0-9]{2}:){5})|(([a-fA-F0-9]{2}-){5}))[a-fA-F0-9]{2}$ IP MAC There is no history record, WOL will be added automatically after successful sending + WOL is generally sent over port 7 or port 9 + Port number value range: 1~65535 + ^([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9b2e9cfb..91b00b6d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -884,13 +884,16 @@ AppSecret 文本类型 Markdown类型 - 请输入IP地址,例如:192.168.168.168 + 可选,主机IP/广播地址,例如:192.168.1.255 IP地址格式错误,例如:192.168.168.168 ^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])$ - 请输入网卡mac,例如:AA:BB:CC:DD:EE:FF + 必填,网卡mac,例如:AA:BB:CC:DD:EE:FF 网卡mac格式错误,例如:AA:BB:CC:DD:EE:FF ^((([a-fA-F0-9]{2}:){5})|(([a-fA-F0-9]{2}-){5}))[a-fA-F0-9]{2}$ - IP地址 + 主机IP/广播地址 网卡MAC 暂无历史记录,WOL发送成功后自动加入 + 可选,WOL一般透过端口7或端口9进行发送 + 端口号取值范围:1~65535 + ^([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$