第64篇Chrome擴充套件藍芽及USB開發(四)
一、Chrome擴充套件藍芽開發
1.1 難點
經過這一段的研究,基本掌握了chrome怎麼獲取藍芽裝置基本資訊,狀態資訊等,現在的難點是怎麼檢測與接收藍芽傳過來的資料。首當其衝的是建立與藍芽之間的連線。
1.2建立與藍芽的連線
寫了個函式,獲取裝置地址,程式碼如下:
執行結果如下:
1.2 列舉已知裝置
程式如下:
執行結果如下:
1.3接收裝置
程式碼如下:
執行結果如下:
二、chrome外掛USB開發
2.1 解析一個demo,能檢測到資料的demo
2.2 knob_j.js
1)以下三句定義了四個變數,分別是:供應商ID,產品ID,裝置資訊、連線ID。
var MY_HID_VENDOR_ID = 0x0e20; // 32825 in hexadecimal!
var MY_HID_PRODUCT_ID = 0x0101;
var DEVICE_INFO = {"vendorId":MY_HID_VENDOR_ID, "productId": MY_HID_PRODUCT_ID };
var connectionId = null;//用於監控是否連線上
注:第三個變數用到了前兩個變數。
function initializeHid(pollHid) {
// Try to open the USB HID device:嘗試開啟USB HID裝置
if (!devices || !devices.length) {
console.log('device not found');
return;
}
console.log('device list :',devices);
console.log('Found device num:'+devices.length);
console.log('Found device: ' + devices[0].deviceId);
console.log('device reportDescriptor: '+arrayBufferToString(devices[0].reportDescriptor));
myHidDevice = devices[0].deviceId;
// Connect to the HID device
chrome.hid.connect(myHidDevice,function(connection) {
console.log('Connected to the HID device!',connection);
connectionId = connection.connectionId;
// Poll the USB HID Interrupt pipe
pollHid();
});
});
}
2.3 chrome.hid
使用 chrome.hidAPI 與連線的 HID 裝置互動。使用該 API 您可以在應用中進行 HID 操作,應用可以作為硬體裝置的驅動程式使用。
HID 裝置:HID是Human Interface Device的縮寫,由其名稱可以瞭解HID裝置是直接與人互動的裝置,例如鍵盤、滑鼠與遊戲杆等。不過HID裝置並不一定要有人機介面,只要符合HID類別規範的裝置都是HID裝置。
交換的資料儲存在稱為報表(report)的結構內,裝置的韌體必須支援HID報表的格式。主機在控制與中斷傳輸中傳送與要求報表,來傳送與接收資料。報表的格式非常有彈性,可以處理任何類別的資料。
1) chrome.hid.connect(integerdeviceId, function callback)的規範:
用於連線到 HID 裝置進行通訊,引數要求如下:
使用例子:
2) chrome.hid.receive----接收資料介面
chrome.hid.receive(integer connectionId, functioncallback) ,從 HID 裝置接收報告。輸入報告通過INTERRUPT IN(中斷輸入)端點返回給主機。
解析:這個函式需要兩個引數connectionId和一個函式function.但這兩個引數並不是一定都要輸入,connectionId是必須要輸入的,而function是返回函式,比如返回一個數組。裡面的資料格式為:reportId+data,知道怎麼請求出來就成,看下面的應用:
執行結果一(沒資料進來):
注:我用USB連線的是一個輸入筆,當我不寫時,上面connectionId和data都為空。當我寫時,再看:
connectionId和data都出來了,connectionId需要自己設定,而data不需要自己設定,是輸入資料自己帶的。每次重新載入外掛還會發生變化。
connectionId的設定在呼叫之前要完成,程式如下:
這個介面,接收的是ArrayBuffer資料, ArrayBuffer(http://www.jb51.net/article/58281.htm)是最基礎的資料型別,甚至不能稱之為資料型別,它是一個數據容器,需要通過其他方式來讀寫。它是二進位制資料的原始緩衝區,該緩衝區用於儲存各種型別化陣列的資料。無法直接讀取或寫入 ArrayBuffer,但可根據需要將其傳遞到型別化陣列或 DataView 物件來解釋原始緩衝區。通過 ArrayBuffer 這個建構函式可以建立一個原始緩衝區:
從 chrome 控制檯可以看到:
buffer 例項擁有一個 byteLength 的屬性,用於獲取 buffer 的 size,一個只有 IE11+ 以及 ios6+ 支援的 slice 方法,用於對 buffer 長度進行擷取操作。
可以測試這個 DEMO:
資料化陣列
型別化陣列型別表示可編制索引和操縱的 ArrayBuffer 物件的各種檢視。所有陣列型別的長度均固定。
Int就是整型,Uint 為無符號整形,Float 為浮點型,這些是 C 語言中的基本概念,我就不具體解釋了。由於這些檢視化結構都是大同小異,本文只對Float32Array 型別作說明,讀者可以舉一反三。
Float32Array 跟 Array 是十分類似的,只不過他每一個元素都是都是一個 32位(4位元組)的浮點型資料。Float32Array 一旦建立其大小不能再修改。
我們可以直接建立一個 Float32Array:
需要有這麼一個概念,他依然是一個數組,只不過該陣列中的每個元素都是 Float 32 位的資料型別,再如:
我們把一個數組的值直接賦給了 x 這個 Float32Array 物件,那麼在儲存之前會將它轉換成一個 32位浮點數。
由於該類陣列的每個元素都是同一型別,所以在堆疊模型中,他們全部會被壓入到棧之中,因此資料化陣列都是值型別,他並不是引用型別!這個要引起注意,從下面的例子中也可以反映出來:
三、小知識
3.1不下載客戶端(西瓜影音等)也能看電影
點進去一個,比如:
把滑鼠放在上方的連結上,右鍵“審查元素”:
複製上面這一段就可以在迅雷裡下載了。
2016年10月10日星期一