İçeriğe geç

Gelişmiş İletişim

Bu sayfa gelişmiş USB iletişim yöntemlerini, seri portları ve ağ soketlerini kapsar. Temel okuma ve yazmalar için Yazma ve Okuma sayfasına bakın.

USB aktarım türleri arasındaki farkı anlamak, doğru yöntemi seçmenize ve beklenmedik hataları ayıklamanıza yardımcı olur.

TürYöntemTipik boyutKullanım durumu
Interruptdevice.write() / device.read()3–64 baytRGB verisi, küçük komutlar, klavye/fare girişi
Bulkdevice.write() / device.read()64–1025 baytLCD görselleri, ürün yazılımı güncellemeleri, büyük yapılandırma blokları
Controldevice.send_report() / device.get_report() / device.control_transfer()32–192 baytKimlik doğrulama, HID özellik raporları, cihaz yapılandırması

Aynı device.write() ve device.read() fonksiyonları hem interrupt hem de bulk aktarımlar için kullanılır — USB sürücüsü türü uç noktadan ve paket boyutundan belirler.


HID GET_INPUT_REPORT kontrol aktarımı gönderir. device.get_report()’a benzer ancak özellikle bir Özellik raporu yerine Girdi raporu talep eder. Cihaz Girdi ve Özellik rapor türlerini ayırt ettiğinden get_report() yanlış veri döndürdüğünde bunu kullanın.

ParametreTürAçıklamaÖrnek
DataArray1D DiziRapor istek verisi[0x01]
LengthIntBeklenen rapor boyutu (bayt)64
DöndürülenTürAçıklama
DataArray1D DiziCihazdan alınan baytlar
var inputData = device.input_report([0x01], 64);

Belirli bir USB uç noktasına doğrudan bulk veya interrupt aktarımı gerçekleştirir. device.set_endpoint() ile seçilen uç noktayı kullanan device.write() ve device.read()’den farklı olarak bu, herhangi bir uç noktayı adrese göre hedeflemenizi sağlar.

  • 0x80 veya daha yüksek adreste biten uç noktalar IN (cihaz → host, okuma) yönündedir.
  • 0x80’in altındaki uç nokta adresleri OUT (host → cihaz, yazma) yönündedir.
ParametreTürAçıklamaÖrnek
EndpointHexUSB uç nokta adresi0x81
DataArray1D DiziGönderilecek veri (OUT) veya boş dizi (IN)[0x01, 0x02]
LengthIntAktarım boyutu (bayt)64
TimeoutIntVazgeçmeden önce milisaniye100
DöndürülenTürAçıklama
DataArray1D DiziAlınan baytlar (IN aktarımlar) veya boş
// 0x01 uç noktasına yaz
device.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// 0x81 uç noktasından oku
var response = device.bulk_transfer(0x81, [], 64, 100);
// Büyük bulk yazma (örn. LCD görsel verisi)
device.bulk_transfer(0x02, imageData, 1024, 500);

Düşük seviyeli USB kontrol aktarımı. Kimlik doğrulama el sıkışmaları, satıcıya özgü protokoller ve HID yöntemlerinin yeterli olmadığı durumlar için kullanılır. Bu bir kontrol aktarımıdır, bulk aktarım değildir.

ParametreTürAçıklamaÖrnek
RequestTypeHexUSB istek türü bit eşlemi (yön, tür, alıcı)0xA1
RequestHexİstek kodu (cihaza özgü)0x01
ValueHexDeğer alanı0x0100
IndexIntArayüz veya uç nokta dizini0x00
DataArray1D DiziGönderilecek veri (host’tan cihaza) veya boş[]
LengthIntBeklenen yanıt uzunluğu (cihazdan host’a)192
TimeoutIntVazgeçmeden önce milisaniye1000
DöndürülenTürAçıklama
DataArray1D DiziAlınan baytlar (cihazdan host’a aktarımlar)

Yaygın RequestType değerleri:

DeğerYönTürAlıcıKullanım durumu
0x21Host → CihazSınıfArayüzHID SET_REPORT
0xA1Cihaz → HostSınıfArayüzHID GET_REPORT
0x80Cihaz → HostStandartCihazTanımlayıcı okumaları
0x00Host → CihazStandartCihazStandart komutlar
// Kimlik doğrulama token'ı oku (cihaz → host, sınıf, arayüz)
var token = device.control_transfer(
0xA1, // Cihazdan host'a, sınıf, arayüz
0x01, // GET_REPORT
0x0100, // Rapor türü (Özellik) + rapor kimliği
0x00, // Arayüz 0
[], // Giden veri yok
192, // 192 bayt bekleniyor
1000 // 1 saniyelik zaman aşımı
);
// Özellik raporu gönder (host → cihaz)
device.control_transfer(0x21, 0x09, 0x0300, 0, [0x03, 0x08, 0x32], 0, 500);

Seri/COM port cihazları için seri modülü içe aktarın ve eklentinizin Type() fonksiyonunu "serial" olarak ayarlayın.

import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
serial.connect({
baudRate: 115200, // Varsayılan: 115200
parity: "None", // "None", "Even", "Odd", "Space", "Mark"
dataBits: 8, // 5, 6, 7 veya 8
stopBits: "One" // "One", "OneAndHalf", "Two"
});
YöntemAçıklamaDöndürülen
serial.connect(options?)Seri portu açbool
serial.disconnect()Seri portu kapatvoid
serial.isConnected()Bağlantı durumunu kontrol etbool
serial.write(data)Veri gönderyazılan baytlar
serial.read(maxBytes?, timeoutMs?)Mevcut baytları oku (varsayılan: tümü, 1000ms zaman aşımı)bayt dizisi
serial.readAll()Mevcut tüm baytları hemen okubayt dizisi
serial.availablePorts()Mevcut COM portlarını listeledizi
serial.getPortName()Mevcut port adıstring
serial.getBaudRate()Mevcut baud hızınumber
serial.getDeviceInfo()VID, PID vb. ile port bilgisinesne
import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
export function Initialize() {
if (!serial.connect()) {
device.log("Seri porta bağlanılamadı");
return;
}
device.log(`${serial.getPortName()} üzerinde ${serial.getBaudRate()} baud ile bağlandı`);
}
export function Render() {
serial.write([0xFF, ...RGBData]);
}
export function Shutdown() {
serial.disconnect();
}

Ağa bağlı cihazlar için TCP veya UDP modülü içe aktarın ve Type() fonksiyonunu "network" olarak ayarlayın. Her iki modül de olay tabanlı geri çağırma modeli kullanır.

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("Bağlandı");
socket.send([0x01, 0x02, 0x03]);
});
socket.on("message", (data) => {
device.log(`Alındı: ${data}`);
});
socket.on("error", (err) => {
device.log(`Hata: ${err}`);
});
socket.connect("192.168.1.100", 8080);
}
export function Render() {
if (socket.state === socket.ConnectedState) {
socket.send(RGBData);
}
}
export function Shutdown() {
socket.close();
}

TCP Yöntemleri:

YöntemAçıklama
tcp.createSocket()Yeni TCP soketi oluştur
socket.connect(address, port)Bir host’a bağlan
socket.send(data)String veya bayt dizisi gönder
socket.bind(port)Yerel porta bağla
socket.close()Soketi kapat
socket.on(event, callback)Olay işleyici kaydet

TCP Olayları: "connected", "disconnected", "message", "error"


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

UDP Yöntemleri:

YöntemAçıklama
udp.createSocket()Yeni UDP soketi oluştur
socket.connect(address, port)Varsayılan gönderme hedefini ayarla
socket.send(data)Bağlı adrese gönder
socket.write(data, address, port)Önce connect() çağırmadan belirli bir adrese gönder
socket.bind(port)Almak için yerel porta bağla
socket.close()Soketi kapat
socket.on(event, callback)Olay işleyici kaydet

UDP Olayları: "connected", "disconnected", "message", "error"


Şifreli iletişim gerektiren cihazlar için (örn. Philips Hue) dtls özelliğini kullanın. Önceden Paylaşılan Anahtar (PSK) kullanarak DTLS ile şifrelenmiş UDP sağlar.

export function Initialize() {
device.addFeature("dtls");
dtls.onConnectionEstablished(() => { device.log("DTLS bağlandı"); });
dtls.onConnectionClosed(() => { device.log("DTLS kapatıldı"); });
dtls.onConnectionError(() => { device.log("DTLS hatası"); });
dtls.createConnection("192.168.1.50", 2100, authIdentity, authKey);
}
export function Render() {
if (dtls.hasEncryptedConnection()) {
dtls.send(RGBData);
}
}
export function Shutdown() {
dtls.CloseConnection();
}

DTLS Yöntemleri:

YöntemAçıklama
dtls.createConnection(host, port, identity, key)PSK kullanarak şifreli bağlantı aç
dtls.send(data, endianness?)Şifreli veri gönder (0 = little-endian, 1 = big-endian)
dtls.hasEncryptedConnection()Bağlantı kurulduysa true döndürür
dtls.CloseConnection()Bağlantıyı kapat
dtls.onConnectionEstablished(cb)Bağlantı başarılı olduğunda geri çağırma
dtls.onConnectionClosed(cb)Bağlantı kapandığında geri çağırma
dtls.onConnectionError(cb)Hata durumunda geri çağırma