mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-03 01:17:41 +08:00
优化:主动控制·远程WOL唤醒功能 #328
This commit is contained in:
parent
00195e6c85
commit
24d152cf87
@ -1,7 +1,5 @@
|
|||||||
package com.idormy.sms.forwarder.server.controller
|
package com.idormy.sms.forwarder.server.controller
|
||||||
|
|
||||||
import android.os.StrictMode
|
|
||||||
import android.os.StrictMode.ThreadPolicy
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.idormy.sms.forwarder.server.model.BaseRequest
|
import com.idormy.sms.forwarder.server.model.BaseRequest
|
||||||
import com.idormy.sms.forwarder.server.model.WolData
|
import com.idormy.sms.forwarder.server.model.WolData
|
||||||
@ -10,6 +8,7 @@ import com.yanzhenjie.andserver.annotation.*
|
|||||||
import java.net.DatagramPacket
|
import java.net.DatagramPacket
|
||||||
import java.net.DatagramSocket
|
import java.net.DatagramSocket
|
||||||
import java.net.InetAddress
|
import java.net.InetAddress
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
@Suppress("PrivatePropertyName")
|
@Suppress("PrivatePropertyName")
|
||||||
@RestController
|
@RestController
|
||||||
@ -25,47 +24,47 @@ class WolController {
|
|||||||
val wolData = bean.data
|
val wolData = bean.data
|
||||||
Log.d(TAG, wolData.toString())
|
Log.d(TAG, wolData.toString())
|
||||||
|
|
||||||
val policy = ThreadPolicy.Builder().permitAll().build()
|
if (TextUtils.isEmpty(wolData.mac)) return "mac is empty"
|
||||||
StrictMode.setThreadPolicy(policy)
|
val port = if (wolData.port > 0) wolData.port else 9
|
||||||
DatagramSocket().use { socket ->
|
val host = if (TextUtils.isEmpty(wolData.ip)) null else wolData.ip
|
||||||
try {
|
|
||||||
val macBytes = getMacBytes(wolData.mac)
|
wakeOnLAN(wolData.mac, host, port)
|
||||||
val bytes = ByteArray(6 + 16 * macBytes.size)
|
|
||||||
for (i in 0..5) {
|
|
||||||
bytes[i] = 0xff.toByte()
|
|
||||||
}
|
|
||||||
var i = 6
|
|
||||||
while (i < bytes.size) {
|
|
||||||
System.arraycopy(macBytes, 0, bytes, i, macBytes.size)
|
|
||||||
i += macBytes.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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "success"
|
return "success"
|
||||||
}
|
}
|
||||||
|
|
||||||
@Throws(IllegalArgumentException::class)
|
private fun wakeOnLAN(macAddress: String, broadcastAddress: String? = null, port: Int = 9) {
|
||||||
private fun getMacBytes(macStr: String): ByteArray {
|
|
||||||
val bytes = ByteArray(6)
|
|
||||||
val hex = macStr.replace("-", ":").split(":").toTypedArray()
|
|
||||||
require(hex.size == 6) { "Invalid MAC address." }
|
|
||||||
try {
|
try {
|
||||||
for (i in 0..5) {
|
val macBytes = macAddress.replace("-", ":").split(":").map { it.uppercase(Locale.getDefault()).toInt(16).toByte() }.toByteArray()
|
||||||
bytes[i] = hex[i].toInt(16).toByte()
|
val magicPacket = ByteArray(102)
|
||||||
|
|
||||||
|
// 首先添加6个0xFF字节
|
||||||
|
for (i in 0 until 6) {
|
||||||
|
magicPacket[i] = 0xFF.toByte()
|
||||||
}
|
}
|
||||||
} catch (e: NumberFormatException) {
|
|
||||||
throw IllegalArgumentException("Invalid hex digit in MAC address. $e")
|
// 之后添加16次MAC地址
|
||||||
|
for (i in 6 until magicPacket.size step macBytes.size) {
|
||||||
|
macBytes.copyInto(magicPacket, i, 0, macBytes.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
val broadcastIP = if (broadcastAddress != null) {
|
||||||
|
InetAddress.getByName(broadcastAddress)
|
||||||
|
} else {
|
||||||
|
InetAddress.getByName("255.255.255.255")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建 UDP 数据包
|
||||||
|
val packet = DatagramPacket(magicPacket, magicPacket.size, broadcastIP, port)
|
||||||
|
|
||||||
|
// 发送数据包
|
||||||
|
val socket = DatagramSocket()
|
||||||
|
socket.send(packet)
|
||||||
|
socket.close()
|
||||||
|
|
||||||
|
Log.d(TAG, "WOL packet sent successfully.")
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.d(TAG, "Error sending WOL packet: ${e.message}")
|
||||||
}
|
}
|
||||||
return bytes
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user