Compare commits

..

10 Commits

7 changed files with 53 additions and 65 deletions
+3 -3
View File
@@ -1,10 +1,10 @@
[package] [package]
name = "tauri-plugin-bluclas" name = "tauri-plugin-bluclas"
version = "0.1.0" version = "0.1.0"
authors = [ "You" ] authors = [ "Rizky Denianto" ]
description = "" description = ""
edition = "2021" edition = "2024"
rust-version = "1.77.2" rust-version = "1.94.1"
exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"] exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"]
links = "tauri-plugin-bluclas" links = "tauri-plugin-bluclas"
+30 -43
View File
@@ -11,6 +11,7 @@ import app.tauri.annotation.InvokeArg
import app.tauri.annotation.Permission import app.tauri.annotation.Permission
import app.tauri.annotation.TauriPlugin import app.tauri.annotation.TauriPlugin
import app.tauri.plugin.Invoke import app.tauri.plugin.Invoke
import app.tauri.plugin.JSArray
import app.tauri.plugin.JSObject import app.tauri.plugin.JSObject
import app.tauri.plugin.Plugin import app.tauri.plugin.Plugin
import java.io.OutputStream import java.io.OutputStream
@@ -32,7 +33,7 @@ class KirimArgs {
] ]
) )
class BluclasPlugin(private val activity: Activity) : Plugin(activity) { class BluclasPlugin(private val activity: Activity) : Plugin(activity) {
private val SPP_UUID: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB") private val uuidSpp: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
private val adapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter() private val adapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter()
private var soket: BluetoothSocket? = null private var soket: BluetoothSocket? = null
@@ -45,68 +46,54 @@ class BluclasPlugin(private val activity: Activity) : Plugin(activity) {
return return
} }
println("KOTLIN") val daftarRes = JSArray()
val daftar_res = adapter.bondedDevices.map { i -> adapter.bondedDevices.map { i ->
mapOf( val res = JSObject()
"nama" to (i.name ?: "Unknown"), res.put("nama", i.name ?: "Unknown")
"alamat" to i.address res.put("alamat", i.address)
) daftarRes.put(res)
} }
val objek_daftar_res = JSObject() val objekDaftarRes = JSObject()
objek_daftar_res.put("data", daftar_res) objekDaftarRes.put("data", daftarRes)
invoke.resolve(objek_daftar_res) invoke.resolve(objekDaftarRes)
} }
fun menghubungkanKoneksi(invoke: Invoke, alamat: String) { fun menghubungkanKoneksi(alamat: String) {
try { val perangkat: BluetoothDevice = adapter!!.getRemoteDevice(alamat)
val perangkat: BluetoothDevice = adapter!!.getRemoteDevice(alamat) soket = perangkat.createInsecureRfcommSocketToServiceRecord(uuidSpp)
soket!!.connect()
soket = perangkat.createRfcommSocketToServiceRecord(SPP_UUID) keluaran = soket!!.outputStream
soket!!.connect()
keluaran = soket!!.outputStream
} catch (e: Exception) {
invoke.reject("Koneksi dengan perangkat gagal: ${e.message}")
}
invoke.resolve()
} }
fun memutusKoneksi(invoke: Invoke) { fun memutusKoneksi() {
try { keluaran?.close()
keluaran?.close() keluaran = null
keluaran = null soket?.close()
soket?.close() soket = null
soket = null
} catch (e: Exception) {
invoke.reject("Memutus koneksi perangkat gagal")
}
invoke.resolve()
} }
@Command @Command
fun kirim(invoke: Invoke) { fun kirim(invoke: Invoke) {
val args = invoke.parseArgs(KirimArgs::class.java) val args = invoke.parseArgs(KirimArgs::class.java)
menghubungkanKoneksi(invoke, args.alamat ?: "")
if (keluaran == null) {
invoke.reject("Tidak ada perangkat yang terhubung")
return
}
try { try {
menghubungkanKoneksi(args.alamat ?: "")
if (keluaran == null) {
throw Exception("Tidak ada perangkat yang terhubung")
}
keluaran!!.write(args.data) keluaran!!.write(args.data)
keluaran!!.flush() keluaran!!.flush()
} catch (e: Exception) { } catch (e: Exception) {
memutusKoneksi(invoke) memutusKoneksi()
invoke.reject("Mengirim data ke perangkat gagal: ${e.message}") invoke.reject("Mengirim data ke perangkat gagal: ${e.message}")
return
} }
memutusKoneksi(invoke) memutusKoneksi()
invoke.resolve() invoke.resolve()
} }
} }
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "tauri-plugin-bluclas-api", "name": "tauri-plugin-bluclas-api",
"version": "0.1.0", "version": "0.1.0",
"author": "You", "author": "Rizky Denianto",
"description": "", "description": "",
"type": "module", "type": "module",
"types": "./dist-js/index.d.ts", "types": "./dist-js/index.d.ts",
+4 -4
View File
@@ -1,20 +1,20 @@
use tauri::{command, AppHandle, Runtime}; use tauri::{AppHandle, Runtime, command};
use crate::models::*;
use crate::BluclasExt; use crate::BluclasExt;
use crate::Result; use crate::Result;
use crate::models::*;
#[command] #[command]
pub(crate) async fn daftar_perangkat<R: Runtime>( pub(crate) async fn daftar_perangkat<R: Runtime>(
app: AppHandle<R>, app: AppHandle<R>,
) -> Result<Vec<SBluetoothClassicResponPerangkat>> { ) -> Result<SBlueclasResponDaftarPerangkat> {
return app.bluclas().daftar_perangkat(); return app.bluclas().daftar_perangkat();
} }
#[command] #[command]
pub(crate) async fn kirim<R: Runtime>( pub(crate) async fn kirim<R: Runtime>(
app: AppHandle<R>, app: AppHandle<R>,
payload: SBluetoothClassicMuatanKirim, payload: SBlueclasMuatanKirim,
) -> Result<()> { ) -> Result<()> {
return app.bluclas().kirim(payload); return app.bluclas().kirim(payload);
} }
+4 -9
View File
@@ -1,5 +1,5 @@
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use tauri::{plugin::PluginApi, AppHandle, Runtime}; use tauri::{AppHandle, Runtime, plugin::PluginApi};
use crate::models::*; use crate::models::*;
@@ -14,16 +14,11 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
pub struct Bluclas<R: Runtime>(AppHandle<R>); pub struct Bluclas<R: Runtime>(AppHandle<R>);
impl<R: Runtime> Bluclas<R> { impl<R: Runtime> Bluclas<R> {
pub fn daftar_perangkat(&self) -> crate::Result<Vec<SBluetoothClassicResponPerangkat>> { pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
let daftar_res: Vec<SBluetoothClassicResponPerangkat> = return Ok(SBlueclasResponDaftarPerangkat { data: vec![] });
vec![SBluetoothClassicResponPerangkat {
nama: String::new(),
alamat: String::new(),
}];
return Ok(daftar_res);
} }
pub fn kirim(&self, _: SBluetoothClassicMuatanKirim) -> crate::Result<()> { pub fn kirim(&self, _: SBlueclasMuatanKirim) -> crate::Result<()> {
return Ok(()); return Ok(());
} }
} }
+3 -3
View File
@@ -1,7 +1,7 @@
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use tauri::{ use tauri::{
plugin::{PluginApi, PluginHandle},
AppHandle, Runtime, AppHandle, Runtime,
plugin::{PluginApi, PluginHandle},
}; };
use crate::models::*; use crate::models::*;
@@ -25,14 +25,14 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
pub struct Bluclas<R: Runtime>(PluginHandle<R>); pub struct Bluclas<R: Runtime>(PluginHandle<R>);
impl<R: Runtime> Bluclas<R> { impl<R: Runtime> Bluclas<R> {
pub fn daftar_perangkat(&self) -> crate::Result<Vec<SBluetoothClassicResponPerangkat>> { pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
return self return self
.0 .0
.run_mobile_plugin("daftarPerangkat", ()) .run_mobile_plugin("daftarPerangkat", ())
.map_err(Into::into); .map_err(Into::into);
} }
pub fn kirim(&self, payload: SBluetoothClassicMuatanKirim) -> crate::Result<()> { pub fn kirim(&self, payload: SBlueclasMuatanKirim) -> crate::Result<()> {
return self return self
.0 .0
.run_mobile_plugin("kirim", payload) .run_mobile_plugin("kirim", payload)
+8 -2
View File
@@ -2,14 +2,20 @@ use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize)] #[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct SBluetoothClassicResponPerangkat { pub struct SDaftarPerangkatBlueclasResponDaftarPerangkat {
pub nama: String, pub nama: String,
pub alamat: String, pub alamat: String,
} }
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SBlueclasResponDaftarPerangkat {
pub data: Vec<SDaftarPerangkatBlueclasResponDaftarPerangkat>,
}
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct SBluetoothClassicMuatanKirim { pub struct SBlueclasMuatanKirim {
pub alamat: String, pub alamat: String,
pub data: Vec<u8>, pub data: Vec<u8>,
} }