Compare commits

..

14 Commits

Author SHA1 Message Date
rizky_denianto bc3ac09f0c Merge pull request 'Memperbaiki program kirim data' (#5) from pengembangan into main
Reviewed-on: #5
2026-04-15 01:39:24 +07:00
rizky_denianto 1afbd8817c Memperbaiki program kirim data 2026-04-15 01:32:16 +07:00
rizky_denianto df87a5e811 Merge pull request 'Memperbaiki penamaan struktur' (#4) from pengembangan into main
Reviewed-on: #4
2026-04-14 23:37:59 +07:00
rizky_denianto d16127348c Memperbaiki penamaan struktur 2026-04-14 23:35:45 +07:00
rizky_denianto bb1fee0c68 Memperbarui deskripsi 2026-04-14 23:32:11 +07:00
rizky_denianto 62e1a286a7 Merge pull request 'Mengubah daftar respon dari map ke jsarray' (#3) from pengembangan into main
Reviewed-on: #3
2026-04-14 23:26:00 +07:00
rizky_denianto 00c3ba9b4c Mengubah daftar respon dari map ke jsarray 2026-04-14 23:23:47 +07:00
rizky_denianto 38c39ab8d7 Memperbaiki struktur data muatan kirim 2026-04-14 20:11:54 +07:00
rizky_denianto 25ce630e0d Memperbaiki struktur respon daftar perangkat 2026-04-14 20:10:20 +07:00
rizky_denianto 79b4fa56f6 Menghapus println dan mengubah bentuk variabel agar sesuai dengan kotlin 2026-04-14 19:54:08 +07:00
rizky_denianto 43ad1645b2 Merge pull request 'Menyesuaikan nama kelas dengan plugin' (#2) from pengembangan into main
Reviewed-on: #2
2026-04-14 19:36:01 +07:00
rizky_denianto 681087d338 Menyesuaikan nama kelas dengan plugin 2026-04-14 19:33:57 +07:00
rizky_denianto da50a0f466 Merge pull request 'Membuat program android untuk menghubungkan tauri dengan perangkat bluetooth classic' (#1) from pengembangan into main
Reviewed-on: #1
2026-04-14 19:05:15 +07:00
rizky_denianto 9e30bf0a16 Menghubungkan kotlin dengan rust 2026-04-14 19:02:16 +07:00
8 changed files with 116 additions and 101 deletions
+3 -3
View File
@@ -1,10 +1,10 @@
[package]
name = "tauri-plugin-bluclas"
version = "0.1.0"
authors = [ "You" ]
authors = [ "Rizky Denianto" ]
description = ""
edition = "2021"
rust-version = "1.77.2"
edition = "2024"
rust-version = "1.94.1"
exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"]
links = "tauri-plugin-bluclas"
+23 -35
View File
@@ -1,4 +1,4 @@
package com.plugin.bluetooth_classic
package com.plugin.bluclas
import android.Manifest
import android.app.Activity
@@ -11,6 +11,7 @@ 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
@@ -31,8 +32,8 @@ class KirimArgs {
)
]
)
class BluetoothClassicPlugin(private val activity: Activity) : Plugin(activity) {
private val SPP_UUID: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
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
@@ -45,67 +46,54 @@ class BluetoothClassicPlugin(private val activity: Activity) : Plugin(activity)
return
}
val daftar_res = adapter.bondedDevices.map { i ->
mapOf(
"nama" to (i.name ?: "Unknown"),
"alamat" to i.address
)
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 objek_daftar_res = JSObject()
objek_daftar_res.put("data", daftar_res)
invoke.resolve(objek_daftar_res)
val objekDaftarRes = JSObject()
objekDaftarRes.put("data", daftarRes)
invoke.resolve(objekDaftarRes)
}
fun menghubungkanKoneksi(invoke: Invoke, alamat: String) {
try {
fun menghubungkanKoneksi(alamat: String) {
val perangkat: BluetoothDevice = adapter!!.getRemoteDevice(alamat)
soket = perangkat.createRfcommSocketToServiceRecord(SPP_UUID)
soket = perangkat.createInsecureRfcommSocketToServiceRecord(uuidSpp)
soket!!.connect()
keluaran = soket!!.outputStream
} catch (e: Exception) {
invoke.reject("Koneksi dengan perangkat gagal: ${e.message}")
}
invoke.resolve()
}
fun memutusKoneksi(invoke: Invoke) {
try {
fun memutusKoneksi() {
keluaran?.close()
keluaran = null
soket?.close()
soket = null
} catch (e: Exception) {
invoke.reject("Memutus koneksi perangkat gagal")
}
invoke.resolve()
}
@Command
fun kirim(invoke: Invoke) {
val args = invoke.parseArgs(KirimArgs::class.java)
menghubungkanKoneksi(invoke, args.alamat ?: "")
try {
menghubungkanKoneksi(args.alamat ?: "")
if (keluaran == null) {
invoke.reject("Tidak ada perangkat yang terhubung")
return
throw Exception("Tidak ada perangkat yang terhubung")
}
try {
keluaran!!.write(args.data)
keluaran!!.flush()
} catch (e: Exception) {
memutusKoneksi(invoke)
memutusKoneksi()
invoke.reject("Mengirim data ke perangkat gagal: ${e.message}")
return
}
memutusKoneksi(invoke)
memutusKoneksi()
invoke.resolve()
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "tauri-plugin-bluclas-api",
"version": "0.1.0",
"author": "You",
"author": "Rizky Denianto",
"description": "",
"type": "module",
"types": "./dist-js/index.d.ts",
+14 -7
View File
@@ -1,13 +1,20 @@
use tauri::{AppHandle, command, Runtime};
use tauri::{AppHandle, Runtime, command};
use crate::models::*;
use crate::Result;
use crate::BluclasExt;
use crate::Result;
use crate::models::*;
#[command]
pub(crate) async fn ping<R: Runtime>(
pub(crate) async fn daftar_perangkat<R: Runtime>(
app: AppHandle<R>,
payload: PingRequest,
) -> Result<PingResponse> {
app.bluclas().ping(payload)
) -> Result<SBlueclasResponDaftarPerangkat> {
return app.bluclas().daftar_perangkat();
}
#[command]
pub(crate) async fn kirim<R: Runtime>(
app: AppHandle<R>,
payload: SBlueclasMuatanKirim,
) -> Result<()> {
return app.bluclas().kirim(payload);
}
+7 -5
View File
@@ -1,5 +1,5 @@
use serde::de::DeserializeOwned;
use tauri::{plugin::PluginApi, AppHandle, Runtime};
use tauri::{AppHandle, Runtime, plugin::PluginApi};
use crate::models::*;
@@ -14,9 +14,11 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
pub struct Bluclas<R: Runtime>(AppHandle<R>);
impl<R: Runtime> Bluclas<R> {
pub fn ping(&self, payload: PingRequest) -> crate::Result<PingResponse> {
Ok(PingResponse {
value: payload.value,
})
pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
return Ok(SBlueclasResponDaftarPerangkat { data: vec![] });
}
pub fn kirim(&self, _: SBlueclasMuatanKirim) -> crate::Result<()> {
return Ok(());
}
}
+4 -1
View File
@@ -35,7 +35,10 @@ impl<R: Runtime, T: Manager<R>> crate::BluclasExt<R> for T {
/// Initializes the plugin.
pub fn init<R: Runtime>() -> TauriPlugin<R> {
Builder::new("bluclas")
.invoke_handler(tauri::generate_handler![commands::ping])
.invoke_handler(tauri::generate_handler![
commands::daftar_perangkat,
commands::kirim
])
.setup(|app, api| {
#[cfg(mobile)]
let bluclas = mobile::init(app, api)?;
+13 -6
View File
@@ -1,7 +1,7 @@
use serde::de::DeserializeOwned;
use tauri::{
plugin::{PluginApi, PluginHandle},
AppHandle, Runtime,
plugin::{PluginApi, PluginHandle},
};
use crate::models::*;
@@ -15,7 +15,7 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
api: PluginApi<R, C>,
) -> crate::Result<Bluclas<R>> {
#[cfg(target_os = "android")]
let handle = api.register_android_plugin("", "ExamplePlugin")?;
let handle = api.register_android_plugin("com.plugin.bluclas", "BluclasPlugin")?;
#[cfg(target_os = "ios")]
let handle = api.register_ios_plugin(init_plugin_bluclas)?;
Ok(Bluclas(handle))
@@ -25,10 +25,17 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
pub struct Bluclas<R: Runtime>(PluginHandle<R>);
impl<R: Runtime> Bluclas<R> {
pub fn ping(&self, payload: PingRequest) -> crate::Result<PingResponse> {
self
pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
return self
.0
.run_mobile_plugin("ping", payload)
.map_err(Into::into)
.run_mobile_plugin("daftarPerangkat", ())
.map_err(Into::into);
}
pub fn kirim(&self, payload: SBlueclasMuatanKirim) -> crate::Result<()> {
return self
.0
.run_mobile_plugin("kirim", payload)
.map_err(Into::into);
}
}
+13 -5
View File
@@ -1,13 +1,21 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PingRequest {
pub value: Option<String>,
pub struct SDaftarPerangkatBlueclasResponDaftarPerangkat {
pub nama: String,
pub alamat: String,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PingResponse {
pub value: Option<String>,
pub struct SBlueclasResponDaftarPerangkat {
pub data: Vec<SDaftarPerangkatBlueclasResponDaftarPerangkat>,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SBlueclasMuatanKirim {
pub alamat: String,
pub data: Vec<u8>,
}