Compare commits

...
59 Commits
Author SHA1 Message Date
rizky_denianto f7cd4603c7 Ubah ke .yaml 2026-09-17 23:45:52 +07:00
rizky_denianto 24c5d3e1f2 Mengubah urutan rilis agar cargo tidak komplen
Penerbitan Plugin / persiapan (pull_request) Successful in 7s
Penerbitan Plugin / penerbitan (pull_request) Successful in 4m13s
2026-09-12 22:06:17 +07:00
rizky_denianto de72fa5e3e Menyederhanakan cara meminta izin untuk menggunakan plugin
Penerbitan Plugin / persiapan (pull_request) Successful in 6s
Penerbitan Plugin / penerbitan (pull_request) Failing after 4m17s
2026-09-12 21:44:37 +07:00
rizky_denianto 00aa5a8526 Coba memperbaiki tipe data yang tidak terdeteksi di js
Penerbitan Plugin / persiapan (pull_request) Successful in 35s
Penerbitan Plugin / penerbitan (pull_request) Successful in 4m4s
2026-09-06 11:38:43 +07:00
rizky_denianto 432a34540d Menggunakan nama variabel sesuai dengan nama kelas
Penerbitan Plugin / persiapan (pull_request) Successful in 5s
Penerbitan Plugin / penerbitan (pull_request) Successful in 3m47s
2026-09-05 16:00:59 +07:00
rizky_denianto 923540934e Melakukan pembangunan citra terlebih dahulu sebelum diterbitkan
Penerbitan Plugin / persiapan (pull_request) Successful in 5s
Penerbitan Plugin / penerbitan (pull_request) Successful in 3m28s
2026-09-04 01:38:26 +07:00
rizky_denianto 30120dacb2 Mengubah payload menjadi muatan 2026-09-04 01:18:49 +07:00
rizky_denianto f0b237d2a2 Menambah deskripsi di README.md
Penerbitan Plugin / persiapan (pull_request) Successful in 5s
Penerbitan Plugin / penerbitan (pull_request) Successful in 4m29s
2026-09-04 00:29:13 +07:00
rizky_denianto cd139ab7c7 Meletakkan argumen alamat ke variabel alamat
Penerbitan Plugin / persiapan (pull_request) Successful in 5s
Penerbitan Plugin / penerbitan (pull_request) Successful in 3m51s
2026-09-03 23:06:13 +07:00
rizky_denianto 0bf140dff2 Sedikit merapihkan kode
Penerbitan Plugin / persiapan (pull_request) Successful in 4s
Penerbitan Plugin / penerbitan (pull_request) Successful in 4m58s
2026-09-02 23:11:58 +07:00
rizky_denianto 9787d1619e Menambah keterangan sistem operasi yang didukung 2026-09-02 21:44:28 +07:00
rizky_denianto 6553e7ead7 Menaikkan versi aplikasi
Penerbitan Plugin / persiapan (pull_request) Successful in 5s
Penerbitan Plugin / penerbitan (pull_request) Successful in 4m17s
2026-09-02 01:03:45 +07:00
rizky_denianto beb7264180 Menambah paket libudev-dev
Penerbitan Plugin / persiapan (pull_request) Successful in 5s
Penerbitan Plugin / penerbitan (pull_request) Failing after 2m17s
2026-09-02 00:59:19 +07:00
rizky_denianto 84d630dd38 Mengunduh paket untuk membangun citra tauri
Penerbitan Plugin / persiapan (pull_request) Successful in 5s
Penerbitan Plugin / penerbitan (pull_request) Failing after 3m37s
2026-09-02 00:53:25 +07:00
rizky_denianto d41a34ab1d Menghapus berkas sisa penerbitan paket npm
Penerbitan Plugin / persiapan (pull_request) Successful in 4s
Penerbitan Plugin / penerbitan (pull_request) Failing after 1m33s
2026-09-02 00:35:18 +07:00
rizky_denianto 55a36875c8 Menyamakan versi plugin
Penerbitan Plugin / persiapan (pull_request) Successful in 4s
Penerbitan Plugin / penerbitan (pull_request) Failing after 1m26s
2026-09-02 00:28:00 +07:00
rizky_denianto 32562daf27 Menambah pengunduhan Rust
Penerbitan Plugin / persiapan (pull_request) Successful in 4s
Penerbitan Plugin / penerbitan (pull_request) Failing after 1m20s
2026-09-02 00:24:39 +07:00
rizky_denianto 98ae6c5e28 Menggunakan kembali kunci penerbitan
Penerbitan Plugin / persiapan (pull_request) Successful in 4s
Penerbitan Plugin / penerbitan (pull_request) Failing after 1m4s
2026-09-02 00:19:42 +07:00
rizky_denianto 6cd1a44b19 Menambah versi pnpm
Penerbitan Plugin / persiapan (pull_request) Successful in 6s
Penerbitan Plugin / penerbitan (pull_request) Failing after 35s
2026-09-02 00:17:10 +07:00
rizky_denianto a4cb3a1ede Memperbarui paket dan mencoba menerbitkan peti cargo
Penerbitan Plugin / persiapan (pull_request) Successful in 20s
Penerbitan Plugin / penerbitan (pull_request) Failing after 17s
2026-09-01 23:08:57 +07:00
rizky_denianto 13d99a25c2 Pembaruan paket
Penerbitan Plugin / persiapan (pull_request) Successful in 14s
Penerbitan Plugin / penerbitan (pull_request) Successful in 30s
2026-08-11 00:56:07 +07:00
rizky_denianto 028cb90bff Menaikkan versi program
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Successful in 31s
2026-08-11 00:52:06 +07:00
rizky_denianto 14215a615e Memperbaiki payload untuk fungsi kirim 2026-08-11 00:50:47 +07:00
rizky_denianto 6fe02acd86 Memperbaiki tipe data respon daftar perangkat
Penerbitan Plugin / persiapan (pull_request) Successful in 14s
Penerbitan Plugin / penerbitan (pull_request) Successful in 29s
2026-07-18 01:27:20 +07:00
rizky_denianto 0617c1eb83 Memindahkan model guest-js ke index
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Successful in 29s
2026-07-18 01:20:29 +07:00
rizky_denianto 05d845521f Menaikkan versi plugin
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Successful in 29s
2026-07-18 01:11:32 +07:00
rizky_denianto 9acba79ec4 Memindahkan fungsi komputer meja ke sini
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Failing after 34s
2026-07-18 01:09:08 +07:00
rizky_denianto f2dcab4ca4 Menambah izin dan coba menggunakan program kotlin lama
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Successful in 30s
2026-07-16 23:04:04 +07:00
rizky_denianto 2777aaea84 Menaikkan versi
Penerbitan Plugin / persiapan (pull_request) Successful in 19s
Penerbitan Plugin / penerbitan (pull_request) Successful in 30s
2026-07-16 22:57:15 +07:00
rizky_denianto f881c09475 Mengubah cara mengecek dan meminta izin
Penerbitan Plugin / persiapan (pull_request) Successful in 14s
Penerbitan Plugin / penerbitan (pull_request) Failing after 40s
2026-07-16 22:56:47 +07:00
rizky_denianto c195d2bc99 Menghapus cek izin dan minta izin
Penerbitan Plugin / persiapan (pull_request) Successful in 14s
Penerbitan Plugin / penerbitan (pull_request) Successful in 30s
2026-07-16 22:46:59 +07:00
rizky_denianto f98cd2169a Memperbaiki fungsi invoke
Penerbitan Plugin / persiapan (pull_request) Successful in 14s
Penerbitan Plugin / penerbitan (pull_request) Successful in 29s
2026-07-16 22:24:34 +07:00
rizky_denianto 2185c6e6fb Memperbaiki tipe data respon cek izin
Penerbitan Plugin / persiapan (pull_request) Successful in 14s
Penerbitan Plugin / penerbitan (pull_request) Successful in 34s
2026-07-16 21:39:04 +07:00
rizky_denianto 16e8128f5a Menaikkan versi aplikasi 2026-07-16 21:30:47 +07:00
rizky_denianto 0a411e3112 Menghapus if dari penerbitan
Penerbitan Plugin / persiapan (pull_request) Successful in 14s
Penerbitan Plugin / penerbitan (pull_request) Failing after 34s
2026-07-16 21:26:09 +07:00
rizky_denianto 20bc8a4307 Mengubah kunci pengunggahan ke kunci penerbitan
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Successful in 30s
2026-07-16 21:22:48 +07:00
rizky_denianto 238ab0703a Coba mengembalikan versi typescript
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Failing after 29s
2026-07-16 21:14:56 +07:00
rizky_denianto 3cede80578 Menggunakan pnpm kembali
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Failing after 28s
2026-07-16 21:10:31 +07:00
rizky_denianto 0ef8f9b89e Menghapus pnpm untuk menggunakan npm
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Failing after 22s
2026-07-16 21:08:50 +07:00
rizky_denianto 4c0a3c1efa Menambah versi di pengunduhan pnpm
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Failing after 26s
2026-07-16 21:04:30 +07:00
rizky_denianto 8cdfa1a2ce Tambah langkah untuk mengunduh pnpm
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Failing after 29s
2026-07-16 21:01:56 +07:00
rizky_denianto 00aecd37e8 Memperbaiki lokasi berkas penerbitan
Penerbitan Plugin / persiapan (pull_request) Successful in 15s
Penerbitan Plugin / penerbitan (pull_request) Failing after 29s
2026-07-16 20:55:17 +07:00
rizky_denianto 77f0aefe88 Menambah langkah penerbitan paket 2026-07-16 20:53:23 +07:00
rizky_denianto b13110616c Pembaruan paket 2026-07-16 20:10:52 +07:00
rizky_denianto 3de38cbe31 Mengubah izin default 2026-07-16 19:50:24 +07:00
rizky_denianto 982656b71a Menyesuaikan guest-js 2026-07-16 19:38:10 +07:00
rizky_denianto c72c86c984 Menambah izin per perintah atau per fungsi 2026-07-16 00:32:16 +07:00
rizky_denianto b7ceeccb52 Menambah fungsi untuk cek dan minta izin 2026-07-15 23:46:04 +07:00
rizky_denianto 44cc5a3fb3 Pembaruan peti 2026-07-15 23:45:47 +07:00
rizky_denianto aad5a0ca78 Pembaruan peti 2026-05-18 19:00:19 +07:00
rizky_denianto 1afbd8817c Memperbaiki program kirim data 2026-04-15 01:32:16 +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 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 681087d338 Menyesuaikan nama kelas dengan plugin 2026-04-14 19:33:57 +07:00
rizky_denianto 9e30bf0a16 Menghubungkan kotlin dengan rust 2026-04-14 19:02:16 +07:00
24 changed files with 480 additions and 132 deletions

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
[registry]
default = "gitea"
[registries.gitea]
index = "sparse+https://git.segubi.com/api/packages/segubi/cargo/"
+67
View File
@@ -0,0 +1,67 @@
name: Penerbitan Plugin
on:
pull_request:
branches: ["main"]
types: ["opened", "synchronize"]
jobs:
persiapan:
runs-on: ubuntu-latest
outputs:
organisasi: ${{ steps.var.outputs.organisasi }}
steps:
- name: Persiapan variabel
id: var
run: |
echo "organisasi=$(echo '${{ gitea.repository }}' | cut -d'/' -f1)" \
>> $GITEA_OUTPUT
penerbitan:
runs-on: ubuntu-latest
needs: persiapan
steps:
- name: Unduh paket untuk membangun citra
run: |
apt update -y
sudo apt install -y libwebkit2gtk-4.1-dev \
build-essential \
curl \
wget \
file \
libxdo-dev \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libudev-dev
apt clean -y
- name: Unduh program
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Unduh Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
rustflags: "-A warnings"
- name: Penerbitan peti Cargo
run: |
cargo publish
env:
CARGO_REGISTRIES_GITEA_TOKEN: Bearer ${{ secrets.KUNCI_PENERBITAN }}
- name: Unduh pnpm
uses: pnpm/setup@v2
with:
version: 11
- name: Penerbitan paket NPM
run: |
pnpm i
npm config set @${{ needs.persiapan.outputs.organisasi }}:registry=https://${{ vars.ALAMAT_GITEA }}/api/packages/${{ needs.persiapan.outputs.organisasi }}/npm/
npm config set -- '//${{ vars.ALAMAT_GITEA }}/api/packages/${{ needs.persiapan.outputs.organisasi }}/npm/:_authToken' "${{ secrets.KUNCI_PENERBITAN }}"
npm publish
rm -rf pnpm-lock.yaml .pnpm-store/
+24 -7
View File
@@ -1,17 +1,34 @@
[package] [package]
name = "tauri-plugin-bluclas" name = "tauri-plugin-bluclas"
version = "0.1.0" version = "0.1.23"
authors = [ "You" ] authors = [ "Rizky Denianto" ]
description = "" description = "Program sederhana untuk interaksi dengan bluetooth classic"
edition = "2021" edition = "2024"
rust-version = "1.77.2" rust-version = "1.98.0"
exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"] exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"]
links = "tauri-plugin-bluclas" links = "tauri-plugin-bluclas"
[profile.release]
lto = "fat"
codegen-units = 1
opt-level = 3
panic = "abort"
incremental = false
strip = "symbols"
debug = false
[package.metadata.platforms.support]
windows = { level = "full" }
linux = { level = "full" }
macos = { level = "none" }
android = { level = "full" }
ios = { level = "none" }
[dependencies] [dependencies]
tauri = { version = "2.10.3" } tauri = { version = "2.11.5" }
serde = "1.0" serde = "1.0"
thiserror = "2" thiserror = "2"
serialport = "4.10.1"
[build-dependencies] [build-dependencies]
tauri-plugin = { version = "2.5.4", features = ["build"] } tauri-plugin = { version = "2.6.3", features = ["build"] }
+2
View File
@@ -1 +1,3 @@
# Tauri Plugin bluclas # Tauri Plugin bluclas
Program sederhana untuk interaksi dengan bluetooth classic
+1
View File
@@ -1,2 +1,3 @@
/build /build
/.tauri /.tauri
/.gradle
+5
View File
@@ -1,3 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
</manifest> </manifest>
+59 -52
View File
@@ -1,4 +1,4 @@
package com.plugin.bluetooth_classic package com.plugin.bluclas
import android.Manifest import android.Manifest
import android.app.Activity import android.app.Activity
@@ -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
@@ -26,86 +27,92 @@ class KirimArgs {
@TauriPlugin( @TauriPlugin(
permissions = [ permissions = [
Permission( Permission(
strings = [Manifest.permission.BLUETOOTH_CONNECT], strings = [
alias = "bluetoothConnect" Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_ADVERTISE
],
alias = "bluetooth"
) )
] ]
) )
class BluetoothClassicPlugin(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 uuid: UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
private val adapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter() private val bluetoothAdapter: BluetoothAdapter? = this.activity.getSystemService(BluetoothManager::class.java).getAdapter()
private var soket: BluetoothSocket? = null private var bluetoothSocket: BluetoothSocket? = null
private var keluaran: OutputStream? = null private var outputStream: OutputStream? = null
@Command
override fun checkPermissions(invoke: Invoke) {
super.checkPermissions(invoke)
}
@Command
override fun requestPermissions(invoke: Invoke) {
super.requestPermissions(invoke)
}
@Command @Command
fun daftarPerangkat(invoke: Invoke) { fun daftarPerangkat(invoke: Invoke) {
if (adapter == null) { if (bluetoothAdapter == null) {
invoke.reject("Bluetooth tidak didukung") invoke.reject("Bluetooth tidak didukung")
return return
} }
val daftar_res = adapter.bondedDevices.map { i -> val daftarRes = JSArray()
mapOf( bluetoothAdapter.bondedDevices.map { i ->
"nama" to (i.name ?: "Unknown"), val res = JSObject()
"alamat" to i.address res.put("nama", i.name ?: "Unknown")
) 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 bluetoothDevice: BluetoothDevice = bluetoothAdapter!!.getRemoteDevice(alamat)
val perangkat: BluetoothDevice = adapter!!.getRemoteDevice(alamat) bluetoothSocket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid)
bluetoothSocket!!.connect()
soket = perangkat.createRfcommSocketToServiceRecord(SPP_UUID) outputStream = bluetoothSocket!!.outputStream
soket!!.connect()
keluaran = soket!!.outputStream
} catch (e: Exception) {
invoke.reject("Koneksi dengan perangkat gagal: ${e.message}")
} }
invoke.resolve() fun memutusKoneksi() {
} outputStream?.close()
outputStream = null
fun memutusKoneksi(invoke: Invoke) { bluetoothSocket?.close()
try { bluetoothSocket = null
keluaran?.close()
keluaran = null
soket?.close()
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)
val alamat = args.alamat
menghubungkanKoneksi(invoke, args.alamat ?: "") if (alamat.isNullOrEmpty()) {
if (keluaran == null) { invoke.resolve()
invoke.reject("Tidak ada perangkat yang terhubung")
return return
} }
try { try {
keluaran!!.write(args.data) menghubungkanKoneksi(alamat)
keluaran!!.flush()
} catch (e: Exception) { if (outputStream == null) {
memutusKoneksi(invoke) throw Exception("Tidak ada perangkat yang terhubung")
invoke.reject("Mengirim data ke perangkat gagal: ${e.message}")
} }
memutusKoneksi(invoke) outputStream!!.write(args.data)
outputStream!!.flush()
} catch (e: Exception) {
memutusKoneksi()
invoke.reject("Mengirim data ke perangkat gagal: ${e.message}")
return
}
memutusKoneksi()
invoke.resolve() invoke.resolve()
} }
} }
+6 -1
View File
@@ -1,4 +1,9 @@
const COMMANDS: &[&str] = &["ping"]; const COMMANDS: &[&str] = &[
"check_permissions",
"request_permissions",
"daftar_perangkat",
"kirim",
];
fn main() { fn main() {
tauri_plugin::Builder::new(COMMANDS) tauri_plugin::Builder::new(COMMANDS)
+40 -7
View File
@@ -1,9 +1,42 @@
import { invoke } from '@tauri-apps/api/core' import {
checkPermissions as checkPermissions_,
invoke,
PermissionState,
requestPermissions as requestPermissions_,
} from "@tauri-apps/api/core";
export async function ping(value: string): Promise<string | null> { export async function checkPermissions(): Promise<PermissionState> {
return await invoke<{value?: string}>('plugin:bluclas|ping', { return await checkPermissions_<{ bluetooth: PermissionState }>(
payload: { "bluclas",
value, ).then((e) => e.bluetooth);
}, }
}).then((r) => (r.value ? r.value : null));
export async function requestPermissions(): Promise<PermissionState> {
return await requestPermissions_<{ bluetooth: PermissionState }>(
"bluclas",
).then((e) => e.bluetooth);
}
export type SDaftarPerangkatBlueclasResponDaftarPerangkat = {
nama: string;
alamat: string;
};
export type SBlueclasResponDaftarPerangkat = {
data: SDaftarPerangkatBlueclasResponDaftarPerangkat[];
};
export async function daftarPerangkat(): Promise<SBlueclasResponDaftarPerangkat> {
return await invoke<SBlueclasResponDaftarPerangkat>(
"plugin:bluclas|daftar_perangkat",
).then((res: SBlueclasResponDaftarPerangkat) => res);
}
export type SBlueclasMuatanKirim = {
alamat: string;
data: number[];
};
export async function kirim(muatan: SBlueclasMuatanKirim): Promise<null> {
return await invoke<null>("plugin:bluclas|kirim", { muatan: muatan });
} }
+9 -9
View File
@@ -1,8 +1,8 @@
{ {
"name": "tauri-plugin-bluclas-api", "name": "@segubi/tauri-plugin-bluclas-api",
"version": "0.1.0", "version": "0.1.23",
"author": "You", "author": "Rizky Denianto",
"description": "", "description": "Program sederhana untuk interaksi dengan bluetooth classic",
"type": "module", "type": "module",
"types": "./dist-js/index.d.ts", "types": "./dist-js/index.d.ts",
"main": "./dist-js/index.cjs", "main": "./dist-js/index.cjs",
@@ -22,12 +22,12 @@
"pretest": "pnpm build" "pretest": "pnpm build"
}, },
"dependencies": { "dependencies": {
"@tauri-apps/api": "^2.0.0" "@tauri-apps/api": "^2.11.1"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-typescript": "^12.0.0", "@rollup/plugin-typescript": "^12.3.0",
"rollup": "^4.9.6", "rollup": "^4.63.2",
"typescript": "^5.3.3", "typescript": "^6.0.3",
"tslib": "^2.6.2" "tslib": "^2.8.1"
} }
} }
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-check-permissions"
description = "Enables the check_permissions command without any pre-configured scope."
commands.allow = ["check_permissions"]
[[permission]]
identifier = "deny-check-permissions"
description = "Denies the check_permissions command without any pre-configured scope."
commands.deny = ["check_permissions"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-daftar-perangkat"
description = "Enables the daftar_perangkat command without any pre-configured scope."
commands.allow = ["daftar_perangkat"]
[[permission]]
identifier = "deny-daftar-perangkat"
description = "Denies the daftar_perangkat command without any pre-configured scope."
commands.deny = ["daftar_perangkat"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-kirim"
description = "Enables the kirim command without any pre-configured scope."
commands.allow = ["kirim"]
[[permission]]
identifier = "deny-kirim"
description = "Denies the kirim command without any pre-configured scope."
commands.deny = ["kirim"]
@@ -1,13 +0,0 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-ping"
description = "Enables the ping command without any pre-configured scope."
commands.allow = ["ping"]
[[permission]]
identifier = "deny-ping"
description = "Denies the ping command without any pre-configured scope."
commands.deny = ["ping"]
@@ -0,0 +1,13 @@
# Automatically generated - DO NOT EDIT!
"$schema" = "../../schemas/schema.json"
[[permission]]
identifier = "allow-request-permissions"
description = "Enables the request_permissions command without any pre-configured scope."
commands.allow = ["request_permissions"]
[[permission]]
identifier = "deny-request-permissions"
description = "Denies the request_permissions command without any pre-configured scope."
commands.deny = ["request_permissions"]
+86 -5
View File
@@ -4,7 +4,10 @@ Default permissions for the plugin
#### This default permission set includes the following: #### This default permission set includes the following:
- `allow-ping` - `allow-check-permissions`
- `allow-request-permissions`
- `allow-daftar-perangkat`
- `allow-kirim`
## Permission Table ## Permission Table
@@ -18,12 +21,12 @@ Default permissions for the plugin
<tr> <tr>
<td> <td>
`bluclas:allow-ping` `bluclas:allow-check-permissions`
</td> </td>
<td> <td>
Enables the ping command without any pre-configured scope. Enables the check_permissions command without any pre-configured scope.
</td> </td>
</tr> </tr>
@@ -31,12 +34,90 @@ Enables the ping command without any pre-configured scope.
<tr> <tr>
<td> <td>
`bluclas:deny-ping` `bluclas:deny-check-permissions`
</td> </td>
<td> <td>
Denies the ping command without any pre-configured scope. Denies the check_permissions command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`bluclas:allow-daftar-perangkat`
</td>
<td>
Enables the daftar_perangkat command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`bluclas:deny-daftar-perangkat`
</td>
<td>
Denies the daftar_perangkat command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`bluclas:allow-kirim`
</td>
<td>
Enables the kirim command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`bluclas:deny-kirim`
</td>
<td>
Denies the kirim command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`bluclas:allow-request-permissions`
</td>
<td>
Enables the request_permissions command without any pre-configured scope.
</td>
</tr>
<tr>
<td>
`bluclas:deny-request-permissions`
</td>
<td>
Denies the request_permissions command without any pre-configured scope.
</td> </td>
</tr> </tr>
+6 -1
View File
@@ -1,3 +1,8 @@
[default] [default]
description = "Default permissions for the plugin" description = "Default permissions for the plugin"
permissions = ["allow-ping"] permissions = [
"allow-check-permissions",
"allow-request-permissions",
"allow-daftar-perangkat",
"allow-kirim"
]
+44 -8
View File
@@ -295,22 +295,58 @@
"type": "string", "type": "string",
"oneOf": [ "oneOf": [
{ {
"description": "Enables the ping command without any pre-configured scope.", "description": "Enables the check_permissions command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "allow-ping", "const": "allow-check-permissions",
"markdownDescription": "Enables the ping command without any pre-configured scope." "markdownDescription": "Enables the check_permissions command without any pre-configured scope."
}, },
{ {
"description": "Denies the ping command without any pre-configured scope.", "description": "Denies the check_permissions command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "deny-ping", "const": "deny-check-permissions",
"markdownDescription": "Denies the ping command without any pre-configured scope." "markdownDescription": "Denies the check_permissions command without any pre-configured scope."
}, },
{ {
"description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-ping`", "description": "Enables the daftar_perangkat command without any pre-configured scope.",
"type": "string",
"const": "allow-daftar-perangkat",
"markdownDescription": "Enables the daftar_perangkat command without any pre-configured scope."
},
{
"description": "Denies the daftar_perangkat command without any pre-configured scope.",
"type": "string",
"const": "deny-daftar-perangkat",
"markdownDescription": "Denies the daftar_perangkat command without any pre-configured scope."
},
{
"description": "Enables the kirim command without any pre-configured scope.",
"type": "string",
"const": "allow-kirim",
"markdownDescription": "Enables the kirim command without any pre-configured scope."
},
{
"description": "Denies the kirim command without any pre-configured scope.",
"type": "string",
"const": "deny-kirim",
"markdownDescription": "Denies the kirim command without any pre-configured scope."
},
{
"description": "Enables the request_permissions command without any pre-configured scope.",
"type": "string",
"const": "allow-request-permissions",
"markdownDescription": "Enables the request_permissions command without any pre-configured scope."
},
{
"description": "Denies the request_permissions command without any pre-configured scope.",
"type": "string",
"const": "deny-request-permissions",
"markdownDescription": "Denies the request_permissions command without any pre-configured scope."
},
{
"description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-daftar-perangkat`\n- `allow-kirim`",
"type": "string", "type": "string",
"const": "default", "const": "default",
"markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-ping`" "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-check-permissions`\n- `allow-request-permissions`\n- `allow-daftar-perangkat`\n- `allow-kirim`"
} }
] ]
} }
+2 -1
View File
@@ -20,7 +20,8 @@ export default {
plugins: [ plugins: [
typescript({ typescript({
declaration: true, declaration: true,
declarationDir: dirname(pkg.exports.import) declarationDir: dirname(pkg.exports.import),
rootDir: 'guest-js'
}) })
], ],
external: [ external: [
+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::BluclasExt;
use crate::Result;
use crate::models::*;
#[command] #[command]
pub(crate) async fn ping<R: Runtime>( pub(crate) async fn daftar_perangkat<R: Runtime>(
app: AppHandle<R>, app: AppHandle<R>,
payload: PingRequest, ) -> Result<SBlueclasResponDaftarPerangkat> {
) -> Result<PingResponse> { return app.bluclas().daftar_perangkat();
app.bluclas().ping(payload) }
#[command]
pub(crate) async fn kirim<R: Runtime>(
app: AppHandle<R>,
muatan: SBlueclasMuatanKirim,
) -> Result<()> {
return app.bluclas().kirim(muatan);
} }
+27 -5
View File
@@ -1,5 +1,7 @@
use std::{mem, time::Duration};
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,9 +16,29 @@ 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 ping(&self, payload: PingRequest) -> crate::Result<PingResponse> { pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
Ok(PingResponse { let port = serialport::available_ports().unwrap_or(Vec::new());
value: payload.value, let mut daftar_res: Vec<SDaftarPerangkatBlueclasResponDaftarPerangkat> = Vec::new();
}) for i in port {
let res = SDaftarPerangkatBlueclasResponDaftarPerangkat {
nama: i.port_name.clone(),
alamat: i.port_name,
};
daftar_res.push(res);
}
return Ok(SBlueclasResponDaftarPerangkat { data: daftar_res });
}
pub fn kirim(&self, muatan: SBlueclasMuatanKirim) -> crate::Result<()> {
let mut pencetak = match serialport::new(&muatan.alamat, 9600)
.timeout(Duration::from_secs(4))
.open()
{
Ok(it) => it,
Err(_) => return Ok(()),
};
pencetak.write(&muatan.data).unwrap();
mem::drop(pencetak);
return Ok(());
} }
} }
+4 -4
View File
@@ -1,10 +1,8 @@
use tauri::{ use tauri::{
plugin::{Builder, TauriPlugin},
Manager, Runtime, Manager, Runtime,
plugin::{Builder, TauriPlugin},
}; };
pub use models::*;
#[cfg(desktop)] #[cfg(desktop)]
mod desktop; mod desktop;
#[cfg(mobile)] #[cfg(mobile)]
@@ -21,6 +19,8 @@ use desktop::Bluclas;
#[cfg(mobile)] #[cfg(mobile)]
use mobile::Bluclas; use mobile::Bluclas;
use crate::commands::{daftar_perangkat, kirim};
/// Extensions to [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`] to access the bluclas APIs. /// Extensions to [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`] to access the bluclas APIs.
pub trait BluclasExt<R: Runtime> { pub trait BluclasExt<R: Runtime> {
fn bluclas(&self) -> &Bluclas<R>; fn bluclas(&self) -> &Bluclas<R>;
@@ -35,7 +35,7 @@ impl<R: Runtime, T: Manager<R>> crate::BluclasExt<R> for T {
/// Initializes the plugin. /// Initializes the plugin.
pub fn init<R: Runtime>() -> TauriPlugin<R> { pub fn init<R: Runtime>() -> TauriPlugin<R> {
Builder::new("bluclas") Builder::new("bluclas")
.invoke_handler(tauri::generate_handler![commands::ping]) .invoke_handler(tauri::generate_handler![daftar_perangkat, kirim])
.setup(|app, api| { .setup(|app, api| {
#[cfg(mobile)] #[cfg(mobile)]
let bluclas = mobile::init(app, api)?; let bluclas = mobile::init(app, api)?;
+13 -6
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::*;
@@ -15,7 +15,7 @@ pub fn init<R: Runtime, C: DeserializeOwned>(
api: PluginApi<R, C>, api: PluginApi<R, C>,
) -> crate::Result<Bluclas<R>> { ) -> crate::Result<Bluclas<R>> {
#[cfg(target_os = "android")] #[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")] #[cfg(target_os = "ios")]
let handle = api.register_ios_plugin(init_plugin_bluclas)?; let handle = api.register_ios_plugin(init_plugin_bluclas)?;
Ok(Bluclas(handle)) Ok(Bluclas(handle))
@@ -25,10 +25,17 @@ 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 ping(&self, payload: PingRequest) -> crate::Result<PingResponse> { pub fn daftar_perangkat(&self) -> crate::Result<SBlueclasResponDaftarPerangkat> {
self return self
.0 .0
.run_mobile_plugin("ping", payload) .run_mobile_plugin("daftarPerangkat", ())
.map_err(Into::into) .map_err(Into::into);
}
pub fn kirim(&self, muatan: SBlueclasMuatanKirim) -> crate::Result<()> {
return self
.0
.run_mobile_plugin("kirim", muatan)
.map_err(Into::into);
} }
} }
+14 -6
View File
@@ -1,13 +1,21 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)] #[derive(Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct PingRequest { pub struct SDaftarPerangkatBlueclasResponDaftarPerangkat {
pub value: Option<String>, pub nama: String,
pub alamat: String,
} }
#[derive(Debug, Clone, Default, Deserialize, Serialize)] #[derive(Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct PingResponse { pub struct SBlueclasResponDaftarPerangkat {
pub value: Option<String>, pub data: Vec<SDaftarPerangkatBlueclasResponDaftarPerangkat>,
}
#[derive(Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SBlueclasMuatanKirim {
pub alamat: String,
pub data: Vec<u8>,
} }