1. 程式人生 > >第64篇Chrome擴充套件藍芽及USB開發(四)

第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資料, ArrayBufferhttp://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不下載客戶端(西瓜影音等)也能看電影

點進去一個,比如:

把滑鼠放在上方的連結上,右鍵“審查元素”:

複製上面這一段就可以在迅雷裡下載了。

20161010日星期一