Files
tauri-plugin-bluclas/android/src/main/java/BluclasPlugin.kt
T

114 lines
3.0 KiB
Kotlin

package com.plugin.bluclas
import android.Manifest
import android.app.Activity
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothManager
import android.bluetooth.BluetoothSocket
import app.tauri.annotation.Command
import app.tauri.annotation.InvokeArg
import app.tauri.annotation.Permission
import app.tauri.annotation.TauriPlugin
import app.tauri.plugin.Invoke
import app.tauri.plugin.JSArray
import app.tauri.plugin.JSObject
import app.tauri.plugin.Plugin
import java.io.OutputStream
import java.util.*
@InvokeArg
class KirimArgs {
var alamat: String? = null
var data: ByteArray? = null
}
@TauriPlugin(
permissions = [
Permission(
strings = [
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_ADVERTISE
],
alias = "bluetooth"
)
]
)
class BluclasPlugin(private val activity: Activity) : Plugin(activity) {
private val uuidSpp: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
private val adapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter()
private var soket: BluetoothSocket? = null
private var keluaran: OutputStream? = null
@Command
override fun checkPermissions(invoke: Invoke) {
super.checkPermissions(invoke)
}
@Command
override fun requestPermissions(invoke: Invoke) {
super.requestPermissions(invoke)
}
@Command
fun daftarPerangkat(invoke: Invoke) {
if (adapter == null) {
invoke.reject("Bluetooth tidak didukung")
return
}
val daftarRes = JSArray()
adapter.bondedDevices.map { i ->
val res = JSObject()
res.put("nama", i.name ?: "Unknown")
res.put("alamat", i.address)
daftarRes.put(res)
}
val objekDaftarRes = JSObject()
objekDaftarRes.put("data", daftarRes)
invoke.resolve(objekDaftarRes)
}
fun menghubungkanKoneksi(alamat: String) {
val perangkat: BluetoothDevice = adapter!!.getRemoteDevice(alamat)
soket = perangkat.createInsecureRfcommSocketToServiceRecord(uuidSpp)
soket!!.connect()
keluaran = soket!!.outputStream
}
fun memutusKoneksi() {
keluaran?.close()
keluaran = null
soket?.close()
soket = null
}
@Command
fun kirim(invoke: Invoke) {
val args = invoke.parseArgs(KirimArgs::class.java)
try {
menghubungkanKoneksi(args.alamat ?: "")
if (keluaran == null) {
throw Exception("Tidak ada perangkat yang terhubung")
}
keluaran!!.write(args.data)
keluaran!!.flush()
} catch (e: Exception) {
memutusKoneksi()
invoke.reject("Mengirim data ke perangkat gagal: ${e.message}")
return
}
memutusKoneksi()
invoke.resolve()
}
}