优化:主动控制·远程WOL唤醒功能 #328

This commit is contained in:
pppscn 2023-07-29 21:22:38 +08:00
parent 00195e6c85
commit 24d152cf87

View File

@ -1,71 +1,70 @@
package com.idormy.sms.forwarder.server.controller package com.idormy.sms.forwarder.server.controller
import android.os.StrictMode import android.util.Log
import android.os.StrictMode.ThreadPolicy import com.idormy.sms.forwarder.server.model.BaseRequest
import android.util.Log import com.idormy.sms.forwarder.server.model.WolData
import com.idormy.sms.forwarder.server.model.BaseRequest import com.xuexiang.xrouter.utils.TextUtils
import com.idormy.sms.forwarder.server.model.WolData import com.yanzhenjie.andserver.annotation.*
import com.xuexiang.xrouter.utils.TextUtils import java.net.DatagramPacket
import com.yanzhenjie.andserver.annotation.* import java.net.DatagramSocket
import java.net.DatagramPacket import java.net.InetAddress
import java.net.DatagramSocket import java.util.Locale
import java.net.InetAddress
@Suppress("PrivatePropertyName")
@Suppress("PrivatePropertyName") @RestController
@RestController @RequestMapping(path = ["/wol"])
@RequestMapping(path = ["/wol"]) class WolController {
class WolController {
private val TAG: String = WolController::class.java.simpleName
private val TAG: String = WolController::class.java.simpleName
//远程WOL
//远程WOL @CrossOrigin(methods = [RequestMethod.POST])
@CrossOrigin(methods = [RequestMethod.POST]) @PostMapping("/send")
@PostMapping("/send") fun send(@RequestBody bean: BaseRequest<WolData>): String {
fun send(@RequestBody bean: BaseRequest<WolData>): String { val wolData = bean.data
val wolData = bean.data Log.d(TAG, wolData.toString())
Log.d(TAG, wolData.toString())
if (TextUtils.isEmpty(wolData.mac)) return "mac is empty"
val policy = ThreadPolicy.Builder().permitAll().build() val port = if (wolData.port > 0) wolData.port else 9
StrictMode.setThreadPolicy(policy) val host = if (TextUtils.isEmpty(wolData.ip)) null else wolData.ip
DatagramSocket().use { socket ->
try { wakeOnLAN(wolData.mac, host, port)
val macBytes = getMacBytes(wolData.mac)
val bytes = ByteArray(6 + 16 * macBytes.size) return "success"
for (i in 0..5) { }
bytes[i] = 0xff.toByte()
} private fun wakeOnLAN(macAddress: String, broadcastAddress: String? = null, port: Int = 9) {
var i = 6 try {
while (i < bytes.size) { val macBytes = macAddress.replace("-", ":").split(":").map { it.uppercase(Locale.getDefault()).toInt(16).toByte() }.toByteArray()
System.arraycopy(macBytes, 0, bytes, i, macBytes.size) val magicPacket = ByteArray(102)
i += macBytes.size
} // 首先添加6个0xFF字节
val host = if (TextUtils.isEmpty(wolData.ip)) "230.0.0.1" else wolData.ip for (i in 0 until 6) {
val port = if (wolData.port > 0) wolData.port else 9 magicPacket[i] = 0xFF.toByte()
val address: InetAddress = InetAddress.getByName(host) }
val packet = DatagramPacket(bytes, bytes.size, address, port)
socket.send(packet) // 之后添加16次MAC地址
socket.close() for (i in 6 until magicPacket.size step macBytes.size) {
Log.d(TAG, "Wake-on-LAN packet sent.") macBytes.copyInto(magicPacket, i, 0, macBytes.size)
} catch (e: Exception) { }
Log.e(TAG, "Failed to send Wake-on-LAN packet: $e")
} val broadcastIP = if (broadcastAddress != null) {
} InetAddress.getByName(broadcastAddress)
} else {
return "success" InetAddress.getByName("255.255.255.255")
} }
@Throws(IllegalArgumentException::class) // 创建 UDP 数据包
private fun getMacBytes(macStr: String): ByteArray { val packet = DatagramPacket(magicPacket, magicPacket.size, broadcastIP, port)
val bytes = ByteArray(6)
val hex = macStr.replace("-", ":").split(":").toTypedArray() // 发送数据包
require(hex.size == 6) { "Invalid MAC address." } val socket = DatagramSocket()
try { socket.send(packet)
for (i in 0..5) { socket.close()
bytes[i] = hex[i].toInt(16).toByte()
} Log.d(TAG, "WOL packet sent successfully.")
} catch (e: NumberFormatException) { } catch (e: Exception) {
throw IllegalArgumentException("Invalid hex digit in MAC address. $e") Log.d(TAG, "Error sending WOL packet: ${e.message}")
} }
return bytes }
}
} }