第69篇Chrome扩展USB开发(五)及php

来源:互联网 发布:怎么切换mac系统 编辑:程序博客网 时间:2024/05/22 13:05


一、USB插件

1.1 用外部连接监听信息并发送USB数据

//1 发送消息

chrome.runtime.onConnectExternal.addListener(function(port){

 console.log('11111111111111111');

 port.onMessage.addListener(function(msg) {

   console.log(msg);  //查看返回的监听消息

     _sender = port; //把发送消息的port赋予_sender

 

     if(!_connectionId){

         connectDevice(devicePoll);

   }else{

       _sender.postMessage({statues:'ok'});

       devicePoll();

    }

  });

 port.onDisconnect.addListener(function(){

     _sender = null;

  });

});

1chrome.runtime.onConnectExternal.addListener是监听接口,如果成功,则用一个函数返回监听消息。本文返回的如下:

2_sender= port;输出_sender如下:

注:这是要连接的用于传数据的url,下面判断是否连接。

 3     if(!_connectionId){

         connectDevice(devicePoll);

   }else{

       _sender.postMessage({statues:'ok'});

       devicePoll();

}

上面程序表示判断是否连接,如果连接,则_sender.postMessage({statues:'ok'}),devicePoll();否则,要先进行连接connectDevice(devicePoll);下面分析一下connectDevice函数,如下:

先做个注释:仅有下面几行代码,就能获取设备的一些信息,代码如下:

运行结果如下:

也就是说,仅知道VID及PID,就能用chrome.hid.getDevices()接口获得设备信息。接着分析上面的那个函数:

chrome.hid.getDevices(DEVICE_INFO,function(devices) {这一句表示根据设备VID,PID获取设备基本信息;

if (!devices || !devices.length){这一句表示如果设备信息未能获取到,则执行if语句中的内容;

_sender.postMessage({statues:9999});//此时,给网页端发的内容是9999

网页端据此,给出未找到驱动的信息,不再往下执行,截图如下:

接着向下看:

_deviceId =devices[0].deviceId;这一句用于获取设备id,由上面的分析知,获取得是8.

chrome.hid.connect(_deviceId,function(connection) {这一句的意思是把设备id作为参数输进去,可获取连接信息;打印一下连接信息都有哪些,如下:


_connectionId =connection.connectionId;这一句表示,把得到的connection.id赋予_connectionid。

 if(_sender){_sender.postMessage({statues:'ok'});}这一句表示,如果_sender存在,就是说现在还在进行连接(_sender就是发送消息用的管道port):

由上面截图可知,还在进行连接,管道还存在,因为能进入if(_sender)语句;管道存在,发送一个消息:statues:’ok’。对方(网页端内容脚本)当然也能收到:

 if(devicePoll){ devicePoll();} 这句话的意思是调用devicePoll()函数用于传数据。下面分析下devicePoll()函数。

这个函数主要用于传送数据,具体分析如下:

if(_connectionId && _sender){这句话表示能获得设备并且通道存在的情况下,执行if语句。

chrome.hid.receive(_connectionId,function(reportId,data) {这一句的意思是:调用chrome接收数据接口,输入参数是设备连接ID:8。打印下返回数据如下:

由图可知,打印的是ArrayBuffer数据。

         if (data) {

            var xy = postData(data);

            setTimeout(devicePoll, 10);

         }

以上几句,主要对data数据进行处理,var xy = postData(data);表示对获取的data数据,调用一个postData()函数进行处理,setTimeout(devicePoll,10);表示每隔0.01秒调用一次devicePoll函数进行数据获取,因为数据的到来是一个连续实时的过程。下面分析一下postData()函数。

var bytes = new Uint8Array(buffer);表示把获取的数据转化为8位的无符号的10进制数。

var bytes1 = new Int16Array(buffer);表示把获取的数据转化为16位的有符号16进制数。

  for(var i=0; i<10; i++){

   if(bytes[i*6+1]==0){

     continue;

     }

以上几句的意思是把无效点(6个是一组,等于0表示无效点)清除,6个数一组分别的含义如下:

64,           1,            50,            7,           61,            14

第一位(64)表示电量,第二位(1):1表示书写,8表示笔抬起,0表示无效点。50表示x的高位,7表示x的低位;61表示y的高位,14表示y的低位。

_sender.postMessage({a:bytes[i*6+1],x:bytes1[i*3+1],y:bytes1[i*3+2]});这句话的意思是:定位到标志位,x位,y位。

人家厂家说,x有正负,y没有正负;bytes[i*6+1]表示第二位(因为数组是从0开始的,i=0时,bytes[i*6+1]= bytes[1]正好是第2位。)

二、php

2.1变量的作用范围

看个例子:

运行结果:

say()函数中的变量只在say()函数中生效,不能作用到外面。而外部变量$bbs由于say()函数没有传参进来,也不会作用到里面。

2.2全局变量

  为了使一个变量在所有地方都惟一,可以定义一个全局变量。看个例子:

运行结果:

这就说明在函数内部定义了全局变量,它会影响外部的输出,但在函数外部定义的全局变量不会影响到函数内部的输出。

2.3 unset()

unset是卸载变量,也就是清空变量。

运行结果如下:

这说明,卸载只发生在函数内部,没有影响到函数外部的使用;但它确实能影响函数内部的使用。看下面的的例子:

运行结果:

在14行报了一个错误,说是变量未定义,可见,卸载之后,在函数内部就不存在了。所以显示未定义。重新定义运行,程序如下:

由图可知,虽然定义了,但只是个局部变量,不会影响到外部的输出。

2.4 静态变量

  静态变量的值,只调用一次,就失效;它的值被记成函数计算后的值。看个例子:

运行结果:

这个例子说明:静态变量i,开始值是1,经过函数一算,值变为2,i的值就存为2,下次存为3,依次类推。

2016年10月15日星期六


 

 

 

 

1 0
原创粉丝点击