Lewati ke konten

Advanced Communication

Halaman ini mencakup metode komunikasi USB lanjutan, port serial, dan socket jaringan. Untuk read dan write dasar, lihat Writes and Reads.

Memahami perbedaan antara tipe transfer USB akan membantu Anda memilih metode yang tepat dan men-debug error yang tidak terduga.

TipeMetodeUkuran TipikalKasus Penggunaan
Interruptdevice.write() / device.read()3–64 byteData RGB, perintah kecil, input keyboard/mouse
Bulkdevice.write() / device.read()64–1025 byteGambar LCD, pembaruan firmware, blok konfigurasi besar
Controldevice.send_report() / device.get_report() / device.control_transfer()32–192 byteAutentikasi, laporan fitur HID, konfigurasi perangkat

Fungsi device.write() dan device.read() yang sama digunakan untuk transfer interrupt dan bulk — driver USB menentukan tipe dari endpoint dan ukuran paket.


Mengirim transfer kontrol HID GET_INPUT_REPORT. Mirip dengan device.get_report() tetapi secara khusus meminta laporan Input daripada laporan Feature. Gunakan ini ketika get_report() mengembalikan data yang salah karena perangkat memisahkan tipe laporan Input dan Feature-nya.

ParameterTipeDeskripsiContoh
DataArray1D ArrayData permintaan laporan[0x01]
LengthIntUkuran laporan yang diharapkan dalam byte64
ReturnTipeDeskripsi
DataArray1D ArrayByte yang diterima dari perangkat
var inputData = device.input_report([0x01], 64);

Melakukan transfer bulk atau interrupt langsung ke endpoint USB tertentu. Tidak seperti device.write() dan device.read() yang menggunakan endpoint yang dipilih oleh device.set_endpoint(), ini memungkinkan Anda menarget endpoint mana pun berdasarkan alamatnya.

  • Alamat endpoint yang berakhiran 0x80 atau lebih tinggi adalah IN (perangkat → host, baca).
  • Alamat endpoint di bawah 0x80 adalah OUT (host → perangkat, tulis).
ParameterTipeDeskripsiContoh
EndpointHexAlamat endpoint USB0x81
DataArray1D ArrayData yang dikirim (OUT), atau array kosong (IN)[0x01, 0x02]
LengthIntUkuran transfer dalam byte64
TimeoutIntMilidetik sebelum menyerah100
ReturnTipeDeskripsi
DataArray1D ArrayByte yang diterima (transfer IN), atau kosong
// Write to endpoint 0x01
device.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// Read from endpoint 0x81
var response = device.bulk_transfer(0x81, [], 64, 100);
// Large bulk write (e.g. LCD image data)
device.bulk_transfer(0x02, imageData, 1024, 500);

Transfer kontrol USB tingkat rendah. Digunakan untuk handshake autentikasi, protokol vendor-specific, dan kasus di mana metode HID tidak cukup. Ini adalah transfer kontrol, bukan transfer bulk.

ParameterTipeDeskripsiContoh
RequestTypeHexBitmap tipe permintaan USB (arah, tipe, penerima)0xA1
RequestHexKode permintaan (spesifik perangkat)0x01
ValueHexField nilai0x0100
IndexIntIndeks antarmuka atau endpoint0x00
DataArray1D ArrayData yang dikirim (host-ke-perangkat), atau kosong[]
LengthIntPanjang respons yang diharapkan (perangkat-ke-host)192
TimeoutIntMilidetik sebelum menyerah1000
ReturnTipeDeskripsi
DataArray1D ArrayByte yang diterima (transfer perangkat-ke-host)

Nilai RequestType umum:

NilaiArahTipePenerimaKasus Penggunaan
0x21Host → PerangkatClassInterfaceHID SET_REPORT
0xA1Perangkat → HostClassInterfaceHID GET_REPORT
0x80Perangkat → HostStandardPerangkatPembacaan deskriptor
0x00Host → PerangkatStandardPerangkatPerintah standar
// Read authentication token (device → host, class, interface)
var token = device.control_transfer(
0xA1, // Device-to-host, class, interface
0x01, // GET_REPORT
0x0100, // Report type (Feature) + report ID
0x00, // Interface 0
[], // No outbound data
192, // Expect 192 bytes back
1000 // 1 second timeout
);
// Send a feature report (host → device)
device.control_transfer(0x21, 0x09, 0x0300, 0, [0x03, 0x08, 0x32], 0, 500);

Untuk perangkat serial/COM port, impor modul serial dan atur Type() plugin Anda ke "serial".

import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
serial.connect({
baudRate: 115200, // Default: 115200
parity: "None", // "None", "Even", "Odd", "Space", "Mark"
dataBits: 8, // 5, 6, 7, or 8
stopBits: "One" // "One", "OneAndHalf", "Two"
});
MetodeDeskripsiReturn
serial.connect(options?)Buka port serialbool
serial.disconnect()Tutup port serialvoid
serial.isConnected()Periksa status koneksibool
serial.write(data)Kirim databyte yang ditulis
serial.read(maxBytes?, timeoutMs?)Baca byte yang tersedia (default: semua, timeout 1000ms)array byte
serial.readAll()Baca semua byte yang tersedia segeraarray byte
serial.availablePorts()Daftar port COM yang tersediaarray
serial.getPortName()Nama port saat inistring
serial.getBaudRate()Baud rate saat ininumber
serial.getDeviceInfo()Info port dengan VID, PID, dll.object
import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
export function Initialize() {
if (!serial.connect()) {
device.log("Failed to connect to serial port");
return;
}
device.log(`Connected on ${serial.getPortName()} at ${serial.getBaudRate()} baud`);
}
export function Render() {
serial.write([0xFF, ...RGBData]);
}
export function Shutdown() {
serial.disconnect();
}

Untuk perangkat yang terhubung ke jaringan, impor modul TCP atau UDP dan atur Type() ke "network". Kedua modul menggunakan model callback berbasis event.

import { tcp } from "@SignalRGB/tcp";
import { udp } from "@SignalRGB/udp";
export function Type() { return "network"; }
import { tcp } from "@SignalRGB/tcp";
let socket;
export function Initialize() {
socket = tcp.createSocket();
socket.on("connected", () => {
device.log("Connected");
socket.send([0x01, 0x02, 0x03]);
});
socket.on("message", (data) => {
device.log(`Received: ${data}`);
});
socket.on("error", (err) => {
device.log(`Error: ${err}`);
});
socket.connect("192.168.1.100", 8080);
}
export function Render() {
if (socket.state === socket.ConnectedState) {
socket.send(RGBData);
}
}
export function Shutdown() {
socket.close();
}

Metode TCP:

MetodeDeskripsi
tcp.createSocket()Buat socket TCP baru
socket.connect(address, port)Hubungkan ke host
socket.send(data)Kirim string atau array byte
socket.bind(port)Ikat ke port lokal
socket.close()Tutup socket
socket.on(event, callback)Daftarkan handler event

Event TCP: "connected", "disconnected", "message", "error"


import { udp } from "@SignalRGB/udp";
let socket;
export function Initialize() {
socket = udp.createSocket();
socket.on("message", (data) => {
device.log(`Received: ${data}`);
});
socket.connect("192.168.1.100", 21324);
}
export function Render() {
socket.send(RGBData);
}
export function Shutdown() {
socket.close();
}

Metode UDP:

MetodeDeskripsi
udp.createSocket()Buat socket UDP baru
socket.connect(address, port)Tetapkan tujuan pengiriman default
socket.send(data)Kirim ke alamat yang terhubung
socket.write(data, address, port)Kirim ke alamat tertentu tanpa memanggil connect() terlebih dahulu
socket.bind(port)Ikat ke port lokal untuk menerima
socket.close()Tutup socket
socket.on(event, callback)Daftarkan handler event

Event UDP: "connected", "disconnected", "message", "error"


Untuk perangkat yang memerlukan komunikasi terenkripsi (misalnya Philips Hue), gunakan fitur dtls. Ini menyediakan UDP terenkripsi DTLS menggunakan Pre-Shared Key (PSK).

export function Initialize() {
device.addFeature("dtls");
dtls.onConnectionEstablished(() => { device.log("DTLS connected"); });
dtls.onConnectionClosed(() => { device.log("DTLS closed"); });
dtls.onConnectionError(() => { device.log("DTLS error"); });
dtls.createConnection("192.168.1.50", 2100, authIdentity, authKey);
}
export function Render() {
if (dtls.hasEncryptedConnection()) {
dtls.send(RGBData);
}
}
export function Shutdown() {
dtls.CloseConnection();
}

Metode DTLS:

MetodeDeskripsi
dtls.createConnection(host, port, identity, key)Buka koneksi terenkripsi menggunakan PSK
dtls.send(data, endianness?)Kirim data terenkripsi (0 = little-endian, 1 = big-endian)
dtls.hasEncryptedConnection()Mengembalikan true jika koneksi sudah terjalin
dtls.CloseConnection()Tutup koneksi
dtls.onConnectionEstablished(cb)Callback saat koneksi berhasil
dtls.onConnectionClosed(cb)Callback saat koneksi ditutup
dtls.onConnectionError(cb)Callback saat error