浏览器不能直接访问硬件接口,微软采用Active插件的方式进行访问,而插件只支持IE浏览器,IE浏览器已经不进行更新了,慢慢退出主流浏览器。
通过上网查询“浏览器串口通信”,找到一个非常好的实现方案。demo地址如下:http://d.iyanhong.com/demos/TComm/commt2.html。
这套方案的原理是:实现一个Windows服务负责串口通信,通过浏览器对该服务的HTTP调用实现浏览器对串口的数据传输。串口对浏览器的传输是通过浏览器对该服务进行HTTP轮训实现的。(其实采用websocket更好,但是为了兼容更多的浏览器,作者采用了HTTP轮询的方案)。作者封装了JavaScript的库进行交互,调用类库的方法,仿佛浏览器天生支持了串口通信一般。使用上面的demo地址,配合串口虚拟串口Virtual Serial Port Driver和串口调试工具ComAssistant 调通了浏览器和串口的数据交互。
但是,当将JavaScript集成到前端项目时出现了问题。原来该程序并非免费服务,于是我加了开发者的QQ,询问如何收费的。作者告诉我,需要支付一定费用,我提供域名,给我重新生成一个安装包即可。
通过收费方式,对权限验证的方法大致有了了解,肯定是通过HTTP头里的Referer进行判断的,demo里下载的安装包配置的合法hosts就是http://d.iyanhong.com,只要访问接口时,Referer是http://d.iyanhong.com就能使用demo提供的服务进行开发了。
该服务对外提供服务的端口是8132,而浏览器访问HTTP时,并不能通过修改访问使用的Hosts。于是我想到了HTTP转发的方案,让浏览器请求转发服务8133,转发服务器修改Header里的Referer属性后将请求转发给8132服务即可。这样的话8132端口对应的服务接收到的Referer便是修改后的Referer,从而欺骗权限验证逻辑,达到正常提供服务的目的。
这套方案需要三步:
1.修改JavaScript类库,将8132的请求全部改为8133的请求。
首先,将min.js进行解压,获得正常格式的js文件,然后找到所有的http请求,在发起请求前对URL进行字符串替换,将:8132替换为:8133,替换代码如下:
pq.url = pq.url.replace(":8132",":8133");
2.实现8133到8132的转发服务。
这里我们使用go语言开发,go语言开发的代码可以直接打包成exe文件,exe是Windows系统原生的可运行文件,为下一步配置Windows服务提供方便。转发代码使用go语言提供http类库,逻辑非常简单,代码如下:
package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
type handle struct {
host string
port string
}
func (this *handle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
remote, err := url.Parse("http://" + this.host + ":" + this.port)
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
r.Header.Set("Referer","http://w.want.com/demo.html")
proxy.ServeHTTP(w, r)
}
func startServer() {
//被代理的服务器host和port
h := &handle{host: "127.0.0.1", port: "8132"}
err := http.ListenAndServe(":8133", h)
if err != nil {
log.Fatalln("ListenAndServe: ", err)
}
}
func main() {
startServer()
}
3.将转发服务配置成开机自启,避免每次都要手动启动的麻烦。
开机自启动使用Windows Service Wrapper小工具即可。https://github.com/winsw/winsw/releases
配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>CrackTcom</id>
<name>CrackTcom</name>
<description>CrackTcom</description>
<executable>D:\commt2\CrackTcom.exe</executable>
<logmode>none</logmode>
</service>
全套方案实现后的预备工作如下:
/**********安装串口插件***********/
1.安装TComm2.exe(安装时需要关闭各种安全卫士)。
2.浏览器输入http://127.0.0.1:8132/验证。
/**********安装破解串口插件***********/
1.cmd进入当前目录。
2.执行 start reg.exe install。
3.重启电脑。
4.浏览器输入http://127.0.0.1:8133/验证。
上面工作完成后,就可以根据JavaScript提供的类库进行串口通信开发了。
这套浏览器串口通信方案基于HTTP实现,支持Windows下的全部浏览器。