背景:最近项目需要接入电子秤,老的方案只能在火狐浏览器里面使用而且只支持特定版本有点坑。而且电子秤在使用usb转接之后浏览器插件会是浏览器直接崩溃。记录下这次接入过程:
网上调研了几种方案:
1.公司以前的方案,github开源插件https://github.com/billhsu/jUART。这个插件好几年了,没有最新的编译版本不支持usb serial ctroller转接。
2.基于objectX控件的方案,这种方法好像只适用用ie浏览器,果断抛弃。
3.nodejs的serial服务,这种方案需要在客户端电脑部署nodejs环境,安装node-serial服务操作比较麻烦,而且对于大多数小白客户来讲就是天方夜谭。
4.基于chrome的chrome-serial访问方式,从github上找了一个开源的接入方案https://github.com/DavideMalvezzi/ChromeSerialPortExtension,安装chrome app解决。
下载开源代码,chrome使用开发模式加载进浏览器,然后在自己的网站上面直接调用js访问串口。
安装谷歌usb串口读取插件ChromeSerialPortExtension.crx(),安装方法如下:
web应用接入方法:
注意修改serial_port.js里面的extensionId,这个id就是你安装的ChromeSerialPortExtension.crx 在chrome下面的id。
下面举个postman的例子
var serialPort = new SerialPort;if (serialPort && serialPort.setOnDataReceivedCallback) { serialPort.setOnDataReceivedCallback(onNewData);}var tempWeight1 = '';var tempWeight2 = '';function onNewData(data) { var str = ""; var dv = new DataView(data); for (var i = 0; i < dv.byteLength; i++) { str = str.concat(String.fromCharCode(dv.getUint8(i, true))); } tempWeight1 += str; if (str.endsWith('')) { tempWeight2 = tempWeight1; tempWeight1 = ''; }}function openSerialPort() { if (!serialPort || undefined == serialPort.isOpen) { return; } if (serialPort.isOpen()) { serialPort.closePort( function (response) { } ); } serialPort.openPort( { portName: 'COM1', bitrate: 9600, dataBits: "eight", parityBit: "no", stopBits: "one" }, function (response) { // console.log(response); if (response.result === "ok") { //Do something window.setInterval(function () { if (tempWeight2) { currentWeight = tempWeight2.split("kg")[0].split(' ')[1]; $("[sx-tab-id='obd-review'] #weight").val(currentWeight); } }, 200); } else { // Popup.alert(response.error); } } );}function closeSerialListener() { if (!serialPort) { return; } serialPort.closePort( function (response) { if (response.result === "ok") { //Do something } else { Popup.alert(response.error); } } );}//窗口重新加载事件window.onbeforeunload = function () { if (!serialPort) { return; } if (serialPort.isOpen && serialPort.isOpen()) { serialPort.closePort( function (response) { if (response.result === "ok") { return null; } else { Popup.alert(response.error); return false; } } ); } return null;}