電子秤示數讀取方案

背景:最近項目須要接入電子秤,老的方案只能在火狐瀏覽器裏面使用並且只支持特定版本有點坑。並且電子秤在使用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;
}
相關文章
相關標籤/搜索