陈建华的博客
专注web开发
【chrome扩展】其他接口(第十章)
2014-11-30 12:06:20   阅读6275次

除上述接口外Chrome应用还有其他各类丰富的接口,在本章将对其他的接口做以介绍。


10.1操作USB设备

通过usb接口可以与USB设备进行交互,这能让Chrome应用作为USB设备的驱动程序。要使用usb接口需要在Manifest中声明usb权限:

"permissions": [
    "usb"
]

本章内容参考自https://crxdoc-zh.appspot.com/apps/usb。

10.2发现设备

列出指定的USB设备:

var options = {
    vendorId: 0x05ac,  //Apple, Inc.
    productId: 0x12a0  //iPhone 4s
};
chrome.usb.getDevices(options, function(deviceArray){
    //do something with deviceArray;
});

请求访问操作系统占用的设备(仅限Chrome OS):

chrome.usb.requestAccess(device, interfaceId, function(sucess){
    //sucess is boolean
});

其中interfaceId为接口标识符。

打开设备:

chrome.usb.openDevice(device, function(ConnectionHandle){
    //do something with handle
});

ConnectionHandle为连接句柄,包括三个属性,handle、vendorId和productId,其中handle为连接句柄的标识符。

寻找指定的USB设备(如果权限允许的话同时打开设备以便使用):

var options = {
    vendorId: 0x05ac,  //Apple, Inc.
    productId: 0x12a0  //iPhone 4s
    interfaceId: null  //only for Chrome OS
};
chrome.usb.findDevices(options, function(ConnectionHandleArray){
    //do something with ConnectionHandleArray
});

关闭连接句柄:

chrome.usb.closeDevice(ConnectionHandle, function(){
    //do something after close a device
});

重置USB设备:

chrome.usb.resetDevice(ConnectionHandle, function(result){
    //result is boolean
});


10.1.2操作接口

列举USB设备上的所有接口:

chrome.usb.listInterfaces(ConnectionHandle, function(descriptorsArray){
    //do something with descriptorsArray
});

descriptorsArray是一个包含多个descriptors对象的数组,descriptors包含的属性有interfaceNumber、alternateSetting、interfaceClass、interfaceSubclass、interfaceProtocol、description和endpoints。endpoints也是一个数组,每个对象包含的属性有address、type、direction、maximumPacketSize、synchronization、usage和pollingInterval。

在指定USB设备上获取接口:

chrome.usb.claimInterface(ConnectionHandle, interfaceNumber, function(){
    //do something after the interface is claimed
});

释放在提供的设备上获取的接口:

chrome.usb.releaseInterface(ConnectionHandle, interfaceNumber, function(){
    //do something after the interface is released
});

在之前获取的设备接口上选择替代的设置:

chrome.usb.setInterfaceAlternateSetting(ConnectionHandle, interfaceNumber, alternateSetting, function(){
    //do something after the interface setting is set
});

alternateSetting为要设置的替代设置。

10.1.3操作传输

在指定设备上进行控制传输:

chrome.usb.controlTransfer(ConnectionHandle, transferInfo, function(info){
    //do something with info
});

其中transferInfo为对象,包含的属性有direction、recipient、requestType、request、value、index、length和data。如果输出数据,transferInfo.data必须指定,值的类型为ArrayBuffer。

info为对象,包含的属性有resultCode和data,resultCode为0时表示成功,data为传入数据,类型为ArrayBuffer。

在指定设备上进行大块传输:

chrome.usb.bulkTransfer(ConnectionHandle, transferInfo, function(info){
    //do something with info
});

transferInfo为对象,包含的属性有direction、endpoint、length和data。此方法返回的info类型与controlTransfer相同。

在指定设备上进行中断传输:

chrome.usb.interruptTransfer(ConnectionHandle, transferInfo, function(info){
    //do something with info
});

此方法各参数类型与bulkTransfer相同。

在指定设备上进行同步传输:

chrome.usb.isochronousTransfer(ConnectionHandle, transferInfo, function(info){
    //do something with info
});

此方法各参数类型与bulkTransfer相同。

10.2串口通信

通过serial接口可以使Chrome应用进行串口通信。使用serial接口需要在Manifest中声明serial权限:

"permissions": [
    "serial"
]

本章内容参考自https://crxdoc-zh.appspot.com/apps/serial。


10.2.1建立连接

获取系统中可用串行设备的有关信息:

chrome.serial.getDevices(function(portsArray){
    //do something with portsArray
});

portsArray为包含多个ports的数组。每个ports是一个包含多个属性的对象,其属性有path、vendorId、productId和displayName。

连接到指定的串行端口:

chrome.serial.connect(path, options, function(connectionInfo){
    //do something with connectionInfo
});

其中options为端口配置选项,完整的结构如下:

{
    persistent: 应用关闭时连接是否保持打开状态,
    name: 与连接相关联的字符串,
    bufferSize: 用于接收数据的缓冲区大小,
    bitrate: 打开连接时请求的比特率,
    dataBits: 默认为"eight",
    parityBit: 默认为"no",
    stopBits: 默认为"one",
    ctsFlowControl: 是否启用RTS/CTS硬件流控制,
    receiveTimeout: 等待新数据的最长时间,以毫秒为单位,
    sendTimeout: 等待send操作完成的最长时间,以毫秒为单位
}

更新打开的串行端口连接的选项设置:

chrome.serial.update(connectionId, options, function(result){
    //result is boolean
});

断开串行端口连接:

chrome.serial.disconnect(connectionId, function(result){
    //result is boolean
});

暂停或恢复打开的连接:

chrome.serial.setPaused(connectionId, paused, function(){
    //do something after pause a connection
});

10.2.2发送和接收数据

向指定连接写入数据:

chrome.serial.send(connectionId, data, function(sendInfo){
    //do something with sendInfo
});

sendInfo为一个包含两个属性的对象,分别为bytesSent和error。

清除指定连接输入输出缓存中的所有内容:

chrome.serial.flush(connectionId, function(result){
    //result is boolean
});

当接收到数据时,会触发onReceive事件:

chrome.serial.onReceive.addListener(function(info){
    //do something with info
});

info是一个包含两个属性的对象,分别是connectionId和data。

当发生错误时,会触发onReceiveError事件:

chrome.serial.onReceiveError.addListener(function(info){
    //do something with info
});

info为一个包含两个属性的对象,分别为connectionId和error。

10.2.3获取连接及状态

获取指定连接的状态:

chrome.serial.getInfo(connectionId, function(connectionInfo){
    //do something with connectionInfo
});

获取当前应用拥有并打开的串行端口连接列表:

chrome.serial.getConnections(function(connectionInfoArray){
    //do something with connectionInfoArray
});

获取指定连接上控制信号的状态:

chrome.serial.getControlSignals(connectionId, function(signals){
    //do something with signals
});

signals是一个包含4个属性的对象,分别是dcd、cts、ri和dsr。

设置指定连接上控制信号的状态:

chrome.serial.setControlSignals(connectionId, signals, function(result){
    //result is boolean
});

signals参数为一个包含两个属性的对象,分别是dtr和rts。

10.3文字转语音

使用tts接口可以将文字转换为语音,tts接口可以使用不同语速、音调阅读文字。文字转语音对视力不佳的用户来说非常重要。

要在应用中使用tts接口,需要在Manifest的permissions中声明tts权限:

"permissions": [
    "tts"
]



10.3.1朗读文字

使用speak方法来朗读文字:

chrome.tts.speak('Hello, world.');

speak方法还可以指定朗读参数和回调函数:

chrome.tts.speak(utterance, options, callback);

回调函数callback会在speak方法调用成功后立刻执行,这意味着不会等到朗读结束后才调用callback。options指定了朗读时所采用的语调、语速、音量等等,options完整的结构如下所示:

{
    enqueue: 是否将朗读任务放入队列,如果为true,此朗读任务将在之前的任务结束后才开始,
    voiceName: 朗读所使用的声音名称,
    extensionId: 为朗读提供声音引擎扩展的id,
    lang: 所朗读文字的语言,
    gender: 朗读声音所使用的性别,male或female,
    rate: 朗读语速,默认值为1.0,允许的值为0.1到10.0,但具体范围还要结合具体使用的声音,值越大速度越快,
    pitch: 朗读语调,默认值为1.0,允许的值为0到2.0,
    volume: 朗读音量,默认值为1.0,允许的值为0到1.0,
    requiredEventTypes: 声音必须支持的事件,
    desiredEventTypes: 需要监听的事件,如未指定则监听全部事件,
    onEvent: 用于监听事件的函数
}

如下面的例子,用美式英文以正常语速的2倍阅读“Hello, world.”:

chrome.tts.speak('Hello, world.', {lang: 'en-US', rate: 2.0});

而下一个例子会在“Speak this first.”阅读完毕后才阅读“Speak this next, when the first sentence is done.”:

chrome.tts.speak('Speak this first.');
chrome.tts.speak('Speak this next, when the first sentence is done.', {enqueue: true});

使用chrome.runtime.lastError来抓取tts接口使用中可能发生的错误:

chrome.tts.speak(utterance, options, function() {
    if (chrome.runtime.lastError) {
        console.log('Error: ' + chrome.runtime.lastError.message);
    }
});

使用stop方法可以随时停止正在进行的朗读任务:

chrome.tts.stop();

使用pause方法可以随时暂停正在进行的朗读任务:

chrome.tts.pause();


使用resume方法可以随时恢复被暂停的朗读任务:

chrome.tts.resume();

10.3.2获取声音

通过getVoices方法可以获取到目前计算机中提供的声音:

chrome.tts.getVoices(function(voices){
    //do something with voices
});

返回的结果voices是一个包含多个声音对象的数组。声音对象包含6个属性,分别是voiceName、lang、gender、remote、extensionId和eventTypes,其中remote属性表示此声音是否为网络资源,eventTypes为此声音支持的全部事件。

如下面为一个声音对象的实例:

{
    "eventTypes": [
        "start",
        "end",
        "interrupted",
        "cancelled",
        "error"
    ],
    "extensionId": "neajdppkdcdipfabeoofebfddakdcjhd",
    "gender": "female",
    "lang": "en-GB",
    "remote": true,
    "voiceName": "Google UK English Female"
}

获取到声音对象后,通过指定speak方法中的相应参数来应用声音,如:

chrome.tts.speak(utterance, {
    voiceName: 'Google UK English Female',
    lang: 'en-GB'
}, callback);

10.3.3获取朗读状态及监听事件

如果当前应用正在朗读文本,执行一个新的朗读任务会立即停止之前的朗读任务。为了避免打断正在进行的朗读任务,可以通过isSpeaking方法获取当前的朗读状态:

chrome.tts.isSpeaking(function(isSpeaking){
    //isSpeaking is boolean
});

在10.3.1中提到speak参数的onEvent属性用来监听朗读事件:

chrome.tts.speak(utterance,{
    onEvent: function(event) {
        console.log('Event ' + event.type ' at position ' + event.charIndex);
        if (event.type == 'error') {
            console.log('Error: ' + event.errorMessage);
        }
    }
}, callback);

其中event对象包含三个属性,分别是type、charIndex和errorMessage。type为事件类型,可能的值包括start、end、word、sentence、marker、interrupted、cancelled、error、pause和resume。

朗读任务一开始就会监听到start类型事件,当朗读到一个新的词语时会监听到word类型事件,朗读完一个句子时会监听到sentence类型事件,当朗读任务被中断会监听到interrupted类型事件,而如果朗读任务尚未开始即被移除会监听到cancelled类型事件,error、pause和resume类型事件分别会在朗读过程中遇到错误、被暂停和被恢复时接收到。

对于marker类型事件,它是在朗读任务到达SSML标记时触发的,有关SSML的详细介绍请读者自行参考http://www.w3.org/TR/speech-synthesis/,此处不做详细介绍。

不过实际能接收到的类型事件需要根据具体选择的声音的支持情况,在10.3.2中获取到的声音对象eventTypes属性列出了相应声音支持的全部事件类型。

10.4系统信息

在讲解Chrome扩展时我们提到过获取CPU、内存和存储设备信息的方法,具体可以参见5.4节。Chrome应用也可以获取到系统信息,并且与Chrome扩展类似。

Chrome应用可以获取到的系统信息包括CPU、内存、存储设备、显示器和网卡。要获取信息,需要在Manifest中声明相应权限:

"permissions": [
    "system.cpu",
    "system.memory",
    "system.storage",
    "system.display",
    "system.network"
]

由于CPU、内存和存储设备相关的内容已经在5.4节讲过了,所以本节只讲解显示器和网卡的内容。

通过chrome.system.display.getInfo方法可以获取到显示器相关信息:

chrome.system.display.getInfo(function(displayInfoArray){
    //do something with displayInfoArray
});

displayInfoArray是一个包含多个displayInfo对象的数组。displayInfo对象的完整结构如下:

{
    id: 显示器的唯一id,
    name: 显示器名称,如HP LCD monitor,
    mirroringSourceId: 镜像的显示器id,目前只支持Chrome OS平台,
    isPrimary: 是否为主显示器,
    isInternal: 是否为笔记本的自带显示器,
    isEnabled: 是否被启用,
    dpiX: 显示器水平DPI,
    dpiY: 显示器垂直DPI,
    rotation: 显示器旋转角度,目前只支持Chrome OS平台,
    bounds: {
        left: 显示器逻辑范围左上角横坐标,
        top: 显示器逻辑范围左上角纵坐标,
        width: 显示器逻辑范围像素宽度,
        height: 显示器逻辑范围像素高度
    },
    overscan: {
        left: 显示范围距左边框的距离,
        top: 显示范围距上边框的距离,
        right: 显示范围距右边框的距离,
        bottom: 显示范围距下边框的距离
    },
    workArea: {
        left: 工作区范围左上角横坐标,
        top: 工作区范围左上角纵坐标,
        width: 工作区范围像素宽度,
        height: 工作区范围像素高度
    }
}

其中overscan属性目前只在Chrome OS平台有效,workArea的范围不包括系统占用部分,如任务栏等。

通过chrome.system.display.setDisplayProperties方法可以更改显示器设置,支持更改的属性包括mirroringSourceId、isPrimary、overscan、rotation、boundsOriginX和boundsOriginY。boundsOriginX和boundsOriginY对应于bounds.left和bounds.top,即显示器逻辑范围的原点坐标。

chrome.system.display.setDisplayProperties(id, info, function(){
    //do something after set display properties
});

通过chrome.system.display.onDisplayChanged监听显示器设置更改事件:

chrome.system.display.onDisplayChanged.addListener(function(){
    //do something after display properties are changed
});

通过chrome.system.network.getNetworkInterfaces方法可以获取到网卡信息:

chrome.system.network.getNetworkInterfaces(function(networkInterfaces){
    //do something with networkInterfaces
    console.log(networkInterfaces);
});

networkInterfaces是一个包含多个networkInterface对象的数组,networkInterface对象包含3个属性,分别是name、address和prefixLength。name为网卡的名称,在*nix系统上通常是eth0或wlan0等。address为网卡可用的IPv4或IPv6地址。prefixLength为前缀长度。




-----------------------------------------------------
转载请注明来源此处
原地址:#

-----网友评论----
暂无评论
-----发表评论----
微网聚博客乐园 ©2014 blog.mn886.net 鲁ICP备14012923号   网站导航