背景:最近項目須要接入電子秤,老的方案只能在火狐瀏覽器裏面使用並且只支持特定版本有點坑。並且電子秤在使用usb轉接以後瀏覽器插件會是瀏覽器直接崩潰。記錄下此次接入過程:node
網上調研了幾種方案:git
1.公司之前的方案,github開源插件https://github.com/billhsu/jUART。這個插件好幾年了,沒有最新的編譯版本不支持usb serial ctroller轉接。github
2.基於objectX控件的方案,這種方法好像只適用用ie瀏覽器,果斷拋棄。web
3.nodejs的serial服務,這種方案須要在客戶端電腦部署nodejs環境,安裝node-serial服務操做比較麻煩,並且對於大多數小白客戶來說就是天方夜譚。chrome
4.基於chrome的chrome-serial訪問方式,從github上找了一個開源的接入方案https://github.com/DavideMalvezzi/ChromeSerialPortExtension,安裝chrome app解決。瀏覽器
下載開源代碼,chrome使用開發模式加載進瀏覽器,而後在本身的網站上面直接調用js訪問串口。app
安裝谷歌usb串口讀取插件ChromeSerialPortExtension.crx(百度網盤下載地址),安裝方法以下:ide
web應用接入方法:post
<script src="js/lib/serial_port.js"></script>
注意修改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; }