一、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;
});
});
1)chrome.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日星期六