commit 07/10/2025
This commit is contained in:
@@ -50,42 +50,40 @@ class TCP_Android_Command_Server {
|
||||
while (isActive) {
|
||||
if (tcpserver.isClosed) break
|
||||
try {
|
||||
tcpserver.accept().use { socket ->
|
||||
{
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
if (socket != null) {
|
||||
// key is IP address only
|
||||
val key: String = socket.inetAddress.hostAddress
|
||||
socketMap[key] = socket
|
||||
Logger.info { "Start communicating with $key" }
|
||||
socket.getInputStream().let { din ->
|
||||
{
|
||||
while (isActive) {
|
||||
if (din.available() > 0) {
|
||||
val bb = ByteArray(din.available())
|
||||
din.read(bb)
|
||||
// B4A format, 4 bytes di depan adalah size
|
||||
val str = String(bb, 4, bb.size - 4)
|
||||
str.split("@").map { it.trim() }.filter { ValidString(it) }
|
||||
.map { it.uppercase() }.forEach {
|
||||
process_command(key,it) { reply ->
|
||||
try {
|
||||
socket.getOutputStream().write(String_to_Byte_Android(reply))
|
||||
} catch (e: Exception) {
|
||||
logcb.accept("Failed to send reply to $key, Message : ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
val socket = tcpserver.accept()
|
||||
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
if (socket != null) {
|
||||
// key is IP address only
|
||||
val key: String = socket.inetAddress.hostAddress
|
||||
socketMap[key] = socket
|
||||
Logger.info { "Start communicating with IPMT/IPM with IP $key" }
|
||||
val din = socket.getInputStream()
|
||||
val dout = socket.getOutputStream()
|
||||
while (isActive) {
|
||||
if (din.available() > 0) {
|
||||
val bb = ByteArray(din.available())
|
||||
din.read(bb)
|
||||
// B4A format, 4 bytes di depan adalah size
|
||||
val str = String(bb, 4, bb.size - 4)
|
||||
println("Received from $key : $str")
|
||||
str.split("@").map { it.trim() }.filter { ValidString(it) }
|
||||
.forEach {
|
||||
process_command(key,it) { reply ->
|
||||
try {
|
||||
println("Reply to $key : ${reply.length} bytes")
|
||||
dout.write(String_to_Byte_Android(reply))
|
||||
} catch (e: Exception) {
|
||||
logcb.accept("Failed to send reply to $key, Message : $e")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
logcb.accept("Finished communicatiing with $key")
|
||||
socketMap.remove(key)
|
||||
}
|
||||
|
||||
}
|
||||
logcb.accept("Finished communicatiing with $key")
|
||||
socketMap.remove(key)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} catch (ex: Exception) {
|
||||
@@ -109,8 +107,8 @@ class TCP_Android_Command_Server {
|
||||
*/
|
||||
private fun String_to_Byte_Android(str: String): ByteArray {
|
||||
if (ValidString(str)) {
|
||||
val len = str.length
|
||||
val bytes = str.toByteArray()
|
||||
val bytes = str.toByteArray(Charsets.UTF_8)
|
||||
val len = bytes.size
|
||||
return ByteBuffer.allocate(len + 4)
|
||||
.order(ByteOrder.LITTLE_ENDIAN)
|
||||
.putInt(len)
|
||||
@@ -128,14 +126,15 @@ class TCP_Android_Command_Server {
|
||||
*/
|
||||
private fun process_command(key: String, cmd: String, cb: Consumer<String>) {
|
||||
Logger.info { "Command from $key : $cmd" }
|
||||
val parts = cmd.split(";").map { it.trim() }.filter { it.isNotBlank() }.map { it.uppercase() }
|
||||
val parts = cmd.split(";").map { it.trim() }.filter { it.isNotBlank() }
|
||||
when (parts[0]) {
|
||||
"GETLOGIN" -> {
|
||||
// Android login request
|
||||
val username = parts.getOrElse(1) { "" }
|
||||
val password = parts.getOrElse(2) { "" }
|
||||
if (ValidString(username) && ValidString(password)) {
|
||||
if (db.userDB.List.any{it.username==username && it.password==password}) {
|
||||
if (db.userDB.List.any{
|
||||
it.username==username && it.password==password}) {
|
||||
val existing = listUserLogin.find { it.ip == key}
|
||||
if (existing!=null){
|
||||
existing.username = username
|
||||
@@ -236,10 +235,14 @@ class TCP_Android_Command_Server {
|
||||
// pengiriman variabel ke Android
|
||||
val username = parts.getOrElse(1) { "" }
|
||||
if (ValidString(username)){
|
||||
println("Initialize request from $key with username $username")
|
||||
val userlogin = listUserLogin.find { it.username == username }
|
||||
if (userlogin != null){
|
||||
println("User $username found in listUserLogin")
|
||||
val userdb = db.userDB.List.find { it.username == username }
|
||||
if (userdb != null){
|
||||
println("User $username found in userDB")
|
||||
println(userdb)
|
||||
val result = StringBuilder()
|
||||
result.append("ZONE")
|
||||
userdb.broadcastzones.split(";").map { it.trim() }.filter { it.isNotBlank() }.forEach {
|
||||
@@ -268,56 +271,59 @@ class TCP_Android_Command_Server {
|
||||
result.append("MSGTOTAL;").append(VARMESSAGES.size).append("@")
|
||||
// VAR AP TOTAL
|
||||
val VARAPTOTAL = mutableListOf<Soundbank>()
|
||||
val sb_split = userdb.soundbank_tags.split(";").map { it.trim() }.filter { it.isNotBlank() }
|
||||
sb_split.forEach {
|
||||
val al_split = userdb.airline_tags.split(";").map { it.trim() }.filter { it.isNotBlank() }
|
||||
al_split.forEach {
|
||||
val sb = db.Find_Soundbank_AirplaneName(it).firstOrNull()
|
||||
if (sb != null) VARAPTOTAL.add(sb)
|
||||
}
|
||||
result.append("VARAPTOTAL;").append(VARAPTOTAL.size).append("@")
|
||||
// VAR CITY TOTAL
|
||||
val VARCITYTOTAL = mutableListOf<Soundbank>()
|
||||
sb_split.forEach {
|
||||
val ct_split = userdb.city_tags.split(";").map { it.trim() }.filter { it.isNotBlank() }
|
||||
ct_split.forEach {
|
||||
val sb = db.Find_Soundbank_City(it).firstOrNull()
|
||||
if (sb != null) VARCITYTOTAL.add(sb)
|
||||
}
|
||||
result.append("VARCITYTOTAL;").append(VARCITYTOTAL.size).append("@")
|
||||
// VAR PLACES TOTAL
|
||||
val VARPLACESTOTAL = mutableListOf<Soundbank>()
|
||||
sb_split.forEach {
|
||||
val sb = db.Find_Soundbank_Places(it).firstOrNull()
|
||||
if (sb != null) VARPLACESTOTAL.add(sb)
|
||||
}
|
||||
// sb_split.forEach {
|
||||
// val sb = db.Find_Soundbank_Places(it).firstOrNull()
|
||||
// if (sb != null) VARPLACESTOTAL.add(sb)
|
||||
// }
|
||||
result.append("VARPLACESTOTAL;").append(VARPLACESTOTAL.size).append("@")
|
||||
// VAR SHALAT TOTAL
|
||||
val VARSHALATTOTAL = mutableListOf<Soundbank>()
|
||||
sb_split.forEach {
|
||||
val sb = db.Find_Soundbank_Shalat(it).firstOrNull()
|
||||
if (sb != null) VARSHALATTOTAL.add(sb)
|
||||
}
|
||||
// sb_split.forEach {
|
||||
// val sb = db.Find_Soundbank_Shalat(it).firstOrNull()
|
||||
// if (sb != null) VARSHALATTOTAL.add(sb)
|
||||
// }
|
||||
result.append("VARSHALATTOTAL;").append(VARSHALATTOTAL.size).append("@")
|
||||
// VAR SEQUENCE TOTAL
|
||||
val VARSEQUENCETOTAL = mutableListOf<Soundbank>()
|
||||
sb_split.forEach {
|
||||
val sb = db.Find_Soundbank_Sequence(it).firstOrNull()
|
||||
if (sb != null) VARSEQUENCETOTAL.add(sb)
|
||||
}
|
||||
// sb_split.forEach {
|
||||
// val sb = db.Find_Soundbank_Sequence(it).firstOrNull()
|
||||
// if (sb != null) VARSEQUENCETOTAL.add(sb)
|
||||
// }
|
||||
// VAR REASON TOTAL
|
||||
val VARREASONTOTAL = mutableListOf<Soundbank>()
|
||||
sb_split.forEach {
|
||||
val sb = db.Find_Soundbank_Reason(it).firstOrNull()
|
||||
if (sb != null) VARREASONTOTAL.add(sb)
|
||||
}
|
||||
// sb_split.forEach {
|
||||
// val sb = db.Find_Soundbank_Reason(it).firstOrNull()
|
||||
// if (sb != null) VARREASONTOTAL.add(sb)
|
||||
// }
|
||||
result.append("VARREASONTOTAL;").append(VARREASONTOTAL.size).append("@")
|
||||
// VAR PROCEDURE TOTAL
|
||||
val VARPROCEDURETOTAL = mutableListOf<Soundbank>()
|
||||
sb_split.forEach {
|
||||
val sb = db.Find_Soundbank_Procedure(it).firstOrNull()
|
||||
if (sb != null) VARPROCEDURETOTAL.add(sb)
|
||||
}
|
||||
// sb_split.forEach {
|
||||
// val sb = db.Find_Soundbank_Procedure(it).firstOrNull()
|
||||
// if (sb != null) VARPROCEDURETOTAL.add(sb)
|
||||
// }
|
||||
result.append("VARPROCEDURETOTAL;").append(VARPROCEDURETOTAL.size).append("@")
|
||||
// send to sender
|
||||
cb.accept(result.toString())
|
||||
|
||||
println("Result so far: $result")
|
||||
println("Result size: ${result.length} bytes")
|
||||
result.clear()
|
||||
|
||||
//Append MSG, for Android only Indonesia and English
|
||||
@@ -359,6 +365,8 @@ class TCP_Android_Command_Server {
|
||||
result.append("VARPROCEDURE;").append(index).append(";").append(soundbank.TAG).append(";").append(soundbank.Description).append("@")
|
||||
}
|
||||
// send to sender
|
||||
println("Final Result: $result")
|
||||
println("Final Result size: ${result.length} bytes")
|
||||
cb.accept(result.toString())
|
||||
logcb.accept("All variables sent to $key with username $username")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user