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
Section titled “USB Aktarım Türleri”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ür | Yöntem | Tipik boyut | Kullanım durumu |
|---|---|---|---|
| Interrupt | device.write() / device.read() | 3–64 bayt | RGB verisi, küçük komutlar, klavye/fare girişi |
| Bulk | device.write() / device.read() | 64–1025 bayt | LCD görselleri, ürün yazılımı güncellemeleri, büyük yapılandırma blokları |
| Control | device.send_report() / device.get_report() / device.control_transfer() | 32–192 bayt | Kimlik 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 Rapor Yöntemleri
Section titled “HID Rapor Yöntemleri”device.input_report()
Section titled “device.input_report()”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.
| Parametre | Tür | Açıklama | Örnek |
|---|---|---|---|
| DataArray | 1D Dizi | Rapor istek verisi | [0x01] |
| Length | Int | Beklenen rapor boyutu (bayt) | 64 |
| Döndürülen | Tür | Açıklama |
|---|---|---|
| DataArray | 1D Dizi | Cihazdan alınan baytlar |
var inputData = device.input_report([0x01], 64);Ham USB Yöntemleri
Section titled “Ham USB Yöntemleri”device.bulk_transfer()
Section titled “device.bulk_transfer()”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.
0x80veya 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.
| Parametre | Tür | Açıklama | Örnek |
|---|---|---|---|
| Endpoint | Hex | USB uç nokta adresi | 0x81 |
| DataArray | 1D Dizi | Gönderilecek veri (OUT) veya boş dizi (IN) | [0x01, 0x02] |
| Length | Int | Aktarım boyutu (bayt) | 64 |
| Timeout | Int | Vazgeçmeden önce milisaniye | 100 |
| Döndürülen | Tür | Açıklama |
|---|---|---|
| DataArray | 1D Dizi | Alınan baytlar (IN aktarımlar) veya boş |
// 0x01 uç noktasına yazdevice.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// 0x81 uç noktasından okuvar response = device.bulk_transfer(0x81, [], 64, 100);
// Büyük bulk yazma (örn. LCD görsel verisi)device.bulk_transfer(0x02, imageData, 1024, 500);device.control_transfer()
Section titled “device.control_transfer()”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.
| Parametre | Tür | Açıklama | Örnek |
|---|---|---|---|
| RequestType | Hex | USB istek türü bit eşlemi (yön, tür, alıcı) | 0xA1 |
| Request | Hex | İstek kodu (cihaza özgü) | 0x01 |
| Value | Hex | Değer alanı | 0x0100 |
| Index | Int | Arayüz veya uç nokta dizini | 0x00 |
| DataArray | 1D Dizi | Gönderilecek veri (host’tan cihaza) veya boş | [] |
| Length | Int | Beklenen yanıt uzunluğu (cihazdan host’a) | 192 |
| Timeout | Int | Vazgeçmeden önce milisaniye | 1000 |
| Döndürülen | Tür | Açıklama |
|---|---|---|
| DataArray | 1D Dizi | Alınan baytlar (cihazdan host’a aktarımlar) |
Yaygın RequestType değerleri:
| Değer | Yön | Tür | Alıcı | Kullanım durumu |
|---|---|---|---|---|
0x21 | Host → Cihaz | Sınıf | Arayüz | HID SET_REPORT |
0xA1 | Cihaz → Host | Sınıf | Arayüz | HID GET_REPORT |
0x80 | Cihaz → Host | Standart | Cihaz | Tanımlayıcı okumaları |
0x00 | Host → Cihaz | Standart | Cihaz | Standart 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 İletişim
Section titled “Seri İletişim”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"; }Bağlantı Seçenekleri
Section titled “Bağlantı Seçenekleri”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"});Seri Yöntemler
Section titled “Seri Yöntemler”| Yöntem | Açıklama | Döndürülen |
|---|---|---|
serial.connect(options?) | Seri portu aç | bool |
serial.disconnect() | Seri portu kapat | void |
serial.isConnected() | Bağlantı durumunu kontrol et | bool |
serial.write(data) | Veri gönder | yazı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 oku | bayt dizisi |
serial.availablePorts() | Mevcut COM portlarını listele | dizi |
serial.getPortName() | Mevcut port adı | string |
serial.getBaudRate() | Mevcut baud hızı | number |
serial.getDeviceInfo() | VID, PID vb. ile port bilgisi | nesne |
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ğ İletişimi (TCP / UDP)
Section titled “Ağ İletişimi (TCP / UDP)”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öntem | Açı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öntem | Açı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"
DTLS (Şifreli UDP)
Section titled “DTLS (Şifreli UDP)”Ş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öntem | Açı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 |