Bu dokümanda, USB cihazlarıyla iletişim kurmak için USB API'sinin nasıl kullanılacağı açıklanmaktadır. Bazı cihazlar USB API üzerinden erişilebilir değil (ayrıntılar için aşağıdaki Uyarılar bölümüne bakın). Chrome Uygulamaları seri ve Bluetooth cihazlara da bağlanabilir.
USB hakkında arka plan bilgileri için resmi USB teknik özelliklerine bakın. NutShell'de USB işinize yarayabilecek makul bir hızlandırılmış kurstur.
Manifest şartı
USB API için "usb" gereklidir izni:
"permissions": [
"usb"
]
Ayrıca, parmak izi kullanılmasını önlemek için, kullandığınız tüm cihaz türlerini manifest dosyasındaki bilgilere ulaşabilirsiniz. Her USB cihaz türü, tedarikçi firma kimliğine/ürün kimliğine karşılık gelir. (VID/PID) çiftinin değeri. Cihazları VID/PID çiftlerine göre numaralandırmak için usb.getDevices öğesini kullanabilirsiniz.
Kullanmak istediğiniz her cihaz türü için VID/PID çiftlerini usbDevices
kapsamında beyan etmeniz gerekir.
aşağıdaki örnekte gösterildiği gibi izin verilenler listesine eklenmiş olmalıdır:
"permissions": [
{
"usbDevices": [
{
"vendorId": 123,
"productId": 456
}
]
}
]
.
Chrome 57 sürümünden itibaren, uygulama manifest dosyasında tüm cihaz türlerinin beyan edilmesi için gereken şart:
ChromeOS kiosk uygulamaları olarak çalışan uygulamalar için rahat. Kiosk uygulamaları için
interfaceClass
izin mülkü, şu USB cihazlarına erişim izni istemek için kullanılır:
- belirli bir arayüz sınıfının USB arayüzünü uygula
- belirli bir USB cihaz sınıfına sahip olma
Örneğin, aşağıdaki usbDevices
izni bir uygulamanın
bir yazıcı arayüzü (arayüz sınıf kodu 7) ve USB hub cihazlarına (cihaz sınıf kodu) uygulama
9):
"permissions": [
{
"usbDevices": [
{"interfaceClass": 7},
{"interfaceClass": 9}
]
}
]
Kabul edilebilir interfaceClass
değerlerinin listesi için USB Sınıf Kodları bölümüne bakın.
interfaceClass
özelliği, yalnızca USB'ye erişim elde etmek için vendorId
özelliğiyle birleştirilebilir.
cihaz satın almayı düşünebilirsiniz:
"permissions": [
{
"usbDevices": [
{
"vendorId": 123,
"interfaceClass": 7
}
]
}
]
.
Cihaz bulma
Bir kullanıcının sistemine belirli bir veya daha fazla cihaz bağlı olup olmadığını belirlemek için usb.getDevices yöntemi:
chrome.usb.getDevices(enumerateDevicesOptions, callback);
Parametre (tür) | Açıklama |
---|---|
EnumerateDevicesOptions (nesne) | Veri yolu üzerinde doğru cihaz türünün bulunması için kullanılan, vendorId (uzun) ve productId (uzun) değerlerini belirten bir nesne. Manifest'inizde, uygulamanızın erişmek istediği tüm vendorId ve deviceId çiftlerini listeleyen usbDevices izin bölümü beyan edilmelidir. |
geri çağırma (işlev) | Cihaz numaralandırması tamamlandığında çağrılır. Geri çağırma, şu üç özelliğe sahip Device nesnelerinden oluşan bir dizi olan tek bir parametreyle yürütülür: device , vendorId , productId . Cihaz özelliği, bağlı bir cihaz için sabit bir tanımlayıcıdır. Cihaz fişe takılıncaya kadar değişmez. Tanımlayıcının ayrıntısı opaktır ve değişebilir. Geçerli türüne güvenmeyin.Cihaz bulunamazsa dizi boş olur. |
Örnek:
function onDeviceFound(devices) {
this.devices=devices;
if (devices) {
if (devices.length > 0) {
console.log("Device(s) found: "+devices.length);
} else {
console.log("Device could not be found");
}
} else {
console.log("Permission denied.");
}
}
chrome.usb.getDevices({"vendorId": vendorId, "productId": productId}, onDeviceFound);
Bir cihazı açma
Device
nesneleri döndürüldüğünde, bir cihazı almak için usb.openDevice kullanarak bir
bağlantı noktası. USB cihazlarıyla yalnızca bağlantı tutma yerlerini kullanarak iletişim kurabilirsiniz.
Özellik | Açıklama |
---|---|
cihaz | usb.getDevices geri çağırmasında nesne alındı. |
veri (dizi arabelleği) | Aktarım yapılmışsa cihaz tarafından gönderilen verileri içerir. |
Örnek:
var usbConnection = null;
var onOpenCallback = function(connection) {
if (connection) {
usbConnection = connection;
console.log("Device opened.");
} else {
console.log("Device failed to open.");
}
};
chrome.usb.openDevice(device, onOpenCallback);
.
Açma işlemini basitleştirmek için usb.findDevices yöntemini kullanabilirsiniz. erişim izni ister ve cihazları tek bir görüşmede açar:
chrome.usb.findDevices({"vendorId": vendorId, "productId": productId, "interfaceId": interfaceId}, callback);
Bu, şuna eşdeğerdir:
chrome.usb.getDevices({"vendorId": vendorId, "productId": productId}, function (devices) {
if (!devices) {
console.log("Error enumerating devices.");
callback();
return;
}
var connections = [], pendingAccessRequests = devices.length;
devices.forEach(function (device) {
chrome.usb.requestAccess(interfaceId, function () {
// No need to check for errors at this point.
// Nothing can be done if an error occurs anyway. You should always try
// to open the device.
chrome.usb.openDevices(device, function (connection) {
if (connection) connections.push(connection);
pendingAccessRequests--;
if (pendingAccessRequests == 0) {
callback(connections);
}
});
});
})
});
USB aktarımları ve bir cihazdan veri alma
USB protokolü dört aktarım türünü tanımlar: kontrol, toplu, iki kronik ve kesin. Bu aktarımlar aşağıda açıklanmıştır.
Aktarımlar iki yönde de gerçekleşebilir: cihazdan ana makineye (gelen) ve ana makineden cihaza (giden). Teslim tarihi USB protokolünün yapısı gereği, hem gelen hem de giden iletilerin ana makine tarafından başlatılması gerekir. (Chrome uygulamasını çalıştıran bilgisayar). Gelen (cihazdan ana makineye) iletilerde, (JavaScript kodunuz tarafından) "gelen" olarak işaretlenmiş bir ileti gönderdiğinde ekleyebilirsiniz. mesajı cihaza göre değişir ancak genellikle ne istediğinize dair bazı tanımlamalar bulunur bazı ipuçları vereceğim. Cihaz, istenen verilerle yanıt verir. Cihazın yanıtı aktarım yönteminde belirttiğiniz geri çağırmaya eşzamansız olarak yayınlanır. Giden (ana makineden cihaza) mesajı benzerdir ancak yanıt, cihazdan döndürülen verileri içermez.
Cihazdan gelen her mesaj için belirtilen geri çağırma, şu özellikleri kullanın:
Özellik | Açıklama |
---|---|
resultCode (tam sayı) | 0 başarı anlamına gelir. diğer değerler başarısız olduğunu gösterir. Hata belirtildiğinde bir hata dizesichrome.extension.lastError konumundan okunabilir. |
veri (dizi arabelleği) | Aktarım yapılmışsa cihaz tarafından gönderilen verileri içerir. |
Örnek:
var onTransferCallback = function(event) {
if (event && event.resultCode === 0 && event.data) {
console.log("got " + event.data.byteLength + " bytes");
}
};
chrome.usb.bulkTransfer(connectionHandle, transferInfo, onTransferCallback);
Control aktarımları
Kontrol aktarımları genellikle bir USB cihazına yapılandırma veya komut parametrelerini göndermek veya almak için kullanılır olanak tanır. checkTransfer yöntemi her zaman uç nokta 0'a veri gönderir/0'dan okur ve hiç requestInterface gereklidir. Yöntem basittir ve üç parametre alır:
chrome.usb.controlTransfer(connectionHandle, transferInfo, transferCallback)
Parametre (türler) | Açıklama |
---|---|
connectionHandle | usb.openDevice geri çağırmasında nesne alındı. |
transferInfo | Aşağıdaki tabloda yer alan değerlere sahip parametre nesnesi. Ayrıntılar için USB cihazınızın protokol özelliklerini kontrol edin. |
transferCallback() | Aktarım tamamlandığında çağrı yapılır. |
transferInfo
nesnesinin değerleri:
Değer | Açıklama |
---|---|
requestType (dize) | "tedarikçi firma", "standart", "sınıf" "ayırtılmış" olarak da bilinir. |
alıcı (dize) | "cihaz", "arayüz", "uç nokta" veya "diğer" olarak görünür. |
yön (dize) | "in" olduğunu unutmayın. "İçinde" yön, cihaza bilgi göndermesi gerektiğini bildirmek için kullanılır. USB yoluyla tüm iletişimler ana makine tarafından başlatılır, bu nedenle "in" aktarım izni vermek için verileri aktarın. |
istek (tam sayı) | Cihazınızın protokolüyle tanımlanır. |
değer (tam sayı) | Cihazınızın protokolüyle tanımlanır. |
dizin (tam sayı) | Cihazınızın protokolüyle tanımlanır. |
uzunluk (tam sayı) | Yalnızca yön "in" olduğunda kullanılır. Cihaza, ana makinenin yanıt olarak beklediği veri miktarını bildirir. |
veri (dizi arabelleği) | Cihazınızın protokolüne göre tanımlanır, yön "dışı" olduğunda gereklidir. |
Örnek:
var transferInfo = {
"requestType": "vendor",
"recipient": "device",
"direction": "out",
"request": 0x31,
"value": 120,
"index": 0,
// Note that the ArrayBuffer, not the TypedArray itself is used.
"data": new Uint8Array([4, 8, 15, 16, 23, 42]).buffer
};
chrome.usb.controlTransfer(connectionHandle, transferInfo, optionalCallback);
ISOCHRONOUS aktarımlar
İki kronimli aktarımlar en karmaşık USB aktarımı türüdür. Genellikle canlı yayınlarda kullanılır farklı veri türlerini (ör. video ve ses) Eşzamanlı bir aktarım (gelen ve giden) başlatmak için usb.isochronousTransfer yöntemini kullanmalıdır:
chrome.usb.isochronousTransfer(connectionHandle, isochronousTransferInfo, transferCallback)
Parametre | Açıklama |
---|---|
connectionHandle | usb.openDevice geri çağırmasında nesne alındı. |
isochronousTransferInfo | Aşağıdaki tabloda yer alan değerlere sahip parametre nesnesi. |
transferCallback() | Aktarım tamamlandığında çağrı yapılır. |
isochronousTransferInfo
nesnesinin değerleri:
Değer | Açıklama |
---|---|
transferInfo (nesne) | Şu özelliklere sahip bir nesne: direction (string): "in" veya "out". uç nokta (tam sayı): cihazınız tarafından tanımlanır. Genellikle lsusb -v uzunluk (tam sayı) gibi USB inceleme aracına bakılarak bulunabilir. Yalnızca yön "in" olduğunda kullanılır. Cihaza, ana makinenin yanıt olarak beklediği veri miktarını bildirir. EN AZ packets × packetLength olmalıdır.veriler (dizi arabelleği): cihazınızın protokolü tarafından tanımlanır; yalnızca yön "out" (kapalı) olduğunda kullanılır. |
paketler (tam sayı) | Bu aktarımda beklenen toplam paket sayısı. |
paket Uzunluğu (tam sayı) | Bu aktarımdaki her paketin beklenen uzunluğu. |
Örnek:
var transferInfo = {
"direction": "in",
"endpoint": 1,
"length": 2560
};
var isoTransferInfo = {
"transferInfo": transferInfo,
"packets": 20,
"packetLength": 128
};
chrome.usb.isochronousTransfer(connectionHandle, isoTransferInfo, optionalCallback);
.
TOPK aktarımlar
Toplu aktarımlar genellikle, zamana duyarlı olmayan büyük miktarda veriyi güvenilir bir sağlar. usb.bulkTransfer üç parametreye sahiptir:
chrome.usb.bulkTransfer(connectionHandle, transferInfo, transferCallback);
Parametre | Açıklama |
---|---|
connectionHandle | usb.openDevice geri çağırmasında nesne alındı. |
transferInfo | Aşağıdaki tabloda yer alan değerlere sahip parametre nesnesi. |
transferCallback | Aktarım tamamlandığında çağrı yapılır. |
transferInfo
nesnesinin değerleri:
Değer | Açıklama |
---|---|
yön (dize) | "in" olduğunu unutmayın. |
uç nokta (tam sayı) | Cihazınızın protokolüyle tanımlanır. |
uzunluk (tam sayı) | Yalnızca yön "in" olduğunda kullanılır. Cihaza, ana makinenin yanıt olarak beklediği veri miktarını bildirir. |
veri (ArrayBuffer) | Cihazınızın protokolüne göre tanımlanmıştır; yalnızca yön "out" (kapalı) olduğunda kullanılır. |
Örnek:
var transferInfo = {
"direction": "out",
"endpoint": 1,
"data": new Uint8Array([4, 8, 15, 16, 23, 42]).buffer
};
AKTARIMI KESME
Kesme aktarımları, zamana duyarlı az miktarda verilere kullanılır. Tüm USB iletişimleri tarafından başlatılır. Ana makine kodu genellikle düzenli aralıklarla cihazı yoklar ve kesintiyi gönderir. kesme sırasında bir şey olduğunda cihazın veri göndermesini sağlayan aktarımlar (cihaz tarafından sağlanır). usb.interruptTransfer üç parametresi vardır:
chrome.usb.interruptTransfer(connectionHandle, transferInfo, transferCallback);
Parametre | Açıklama |
---|---|
connectionHandle | usb.openDevice geri çağırmasında nesne alındı. |
transferInfo | Aşağıdaki tabloda yer alan değerlere sahip parametre nesnesi. |
transferCallback | Aktarım tamamlandığında çağrı yapılır. Bu geri çağırmanın cihazın yanıtını içermediğine dikkat edin. Geri çağırmanın amacı, yalnızca kodunuza eşzamansız aktarım isteklerinin işlendiğini bildirmektir. |
transferInfo
nesnesinin değerleri:
Değer | Açıklama |
---|---|
yön (dize) | "in" olduğunu unutmayın. |
uç nokta (tam sayı) | Cihazınızın protokolüyle tanımlanır. |
uzunluk (tam sayı) | Yalnızca yön "in" olduğunda kullanılır. Cihaza, ana makinenin yanıt olarak beklediği veri miktarını bildirir. |
veri (ArrayBuffer) | Cihazınızın protokolüne göre tanımlanmıştır; yalnızca yön "out" (kapalı) olduğunda kullanılır. |
Örnek:
var transferInfo = {
"direction": "in",
"endpoint": 1,
"length": 2
};
chrome.usb.interruptTransfer(connectionHandle, transferInfo, optionalCallback);
Uyarılar
USB API üzerinden tüm cihazlara erişilemez. Genel olarak cihazlar şu nedenlerle erişilebilir değildir: ya da yerel bir sürücü bunları kullanıcı alan kodundan engeller. Biraz Örnek olarak OSX sistemlerinde HID profili olan cihazlar ve USB kalem sürücüler verilebilir.
Çoğu Linux sisteminde, USB cihazları varsayılan olarak salt okunur izinlerle eşlenir. Bir
kullanıyorsanız kullanıcınızın da cihaza yazma erişiminin olması gerekir. Basit bir çözüm
udev kuralı oluşturun. Aşağıdakilere sahip bir /etc/udev/rules.d/50-yourdevicename.rules
dosyası oluşturun:
içerik:
SUBSYSTEM=="usb", ATTR{idVendor}=="[yourdevicevendor]", MODE="0664", GROUP="plugdev"
Ardından udev arka plan programını yeniden başlatın: service udev restart
. Cihaz izinlerinin geçerli olup olmadığını kontrol edebilirsiniz.
doğru şekilde ayarlamak için şu adımları uygulayın:
- Otobüs ve cihaz numaralarını bulmak için
lsusb
komutunu çalıştırın. ls -al /dev/bus/usb/[bus]/[device]
çalıştır. Bu dosya, "plugdev" grubuna ait olmalıdır ve grup yazma izinleri.
Bu prosedür kök erişimi gerektirdiğinden uygulamanız bu işlemi otomatik olarak yapamaz. Önerilerimiz: son kullanıcılara talimatlar sağladığınız ve bu sayfadaki Uyarılar açıklama.
ChromeOS'te usb.requestAccess'i çağırmanız yeterlidir. İzin aracısı bunu sizin için yapar.