电子秤示数读取方案

本文探讨了多种电子秤接入方案,包括过时的插件、仅限IE的objectX控件、需部署NodeJS环境的nodejs串口服务及最终采用的Chrome-serial访问方式。通过GitHub开源项目ChromeSerialPortExtension,实现chrome app调用JS访问串口,解决了跨浏览器兼容性和小白用户操作难题。

背景:最近项目需要接入电子秤,老的方案只能在火狐浏览器里面使用而且只支持特定版本有点坑。而且电子秤在使用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应用接入方法:

<script src="js/lib/serial_port.js"></script>

注意修改serial_port.js里面的extensionId,这个id就是你安装的ChromeSerialPortExtension.crx 在chrome下面的id。

下面举个postman的例子

1c8ad026b18ef402f1c23501cfc21196ddf.jpg

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;
}

转载于:https://my.oschina.net/u/2485283/blog/2978991

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值