7***@qq.com
7***@qq.com
  • 发布:2024-07-09 16:54
  • 更新:2024-07-09 16:54
  • 阅读:125

H5项目使用native.js连接蓝牙打印机,报错,怎么解决?求大佬帮助

分类:Native.js

Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1

<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <title>打印机配对</title>  
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">  
        <meta name="apple-mobile-web-app-capable" content="yes">  
        <meta name="apple-mobile-web-app-status-bar-style" content="black">  
        <link href="./css/mui.min.css" rel="stylesheet" />  
        <style>  
            .title {  
                margin: 20px 15px 7px;  
                color: #6d6d72;  
                font-size: 15px;  
            }  

            .mui-bar-nav {  
                background: #004A86;  
            }  

            .mui-icon-back:before,  
            .mui-icon-left-nav:before,  
            .mui-bar .mui-title {  
                color: #ffffff;  
            }  

            .mui-content>.mui-table-view:first-child {  
                margin-top: 0px;  
            }  

            .mui-btn {  
                padding: 1px 1px;  
            }  
            /*.mui-btn-primary{ border: 1px solid #004A86; background: #004A86;}*/  

            .mui-icon-search:before {  
                font-size: 16px;  
            }  
            .mui-table-view-cell{  
                height: 40px;  
                margin-top: 10px;  
                background-color: orange;  
            }  
        </style>  
    </head>  

    <body>  
        <div id="app" class="mui-off-canvas-wrap mui-slide-in">  
            <header id="header" class="mui-bar mui-bar-nav" style="height: 44px;">  
                <a class="mui-action-back mui-icon mui-icon-back mui-pull-left"></a>  
                <h1 class="mui-title">打印机配对</h1>  

            </header>  
            <div class="mui-content">  
                <ul class="mui-table-view">  
                    <li class="mui-table-view-cell" style=" height: 45px;">  
                        <span>搜索设备</span>  
                        <div class="mui-btn">  
                            <input id="bt1" class="mui-icon mui-icon-search" type="button" value="搜索设备" onclick="searchDevices('a')">  
                            <!--<span class="mui-icon mui-icon-search"> 搜索</span>-->  
                        </div>  
                    </li>  
                </ul>  

                <div class="title">未配对蓝牙设备</div>  
                <ul class="mui-table-view" id="list1">  
                    <li class="mui-table-view-cell">无</li>  
                    <!--<li class="mui-table-view-cell">Item 2</li>  
                     <li class="mui-table-view-cell">Item 3</li>-->  
                </ul>  
                <div class="title">已配对蓝牙设备</div>  
                <ul class="mui-table-view" id="list2">  
                    <li class="mui-table-view-cell">无</li>  
                    <!--<li class="mui-table-view-cell">Item 2</li>  
                     <li class="mui-table-view-cell">Item 3</li>-->  
                </ul>  

            </div>  
            <!--<header id="header" class="mui-bar mui-bar-nav" style="height: 44px;">  
                <a class="mui-action-back mui-icon mui-icon-back mui-pull-left"></a>  
                <h1 class="mui-title">物料清单.</h1>  

            </header>  

            <div id="pullrefresh" class="mui-content">  
                <a href="new_file.html">其他测试</a>  
                <p><input id="bt1" type="button" value="搜索设备" onclick="searchDevices('a')"></p>  
                </button>  
            </div>  
            <div>  
                未配对蓝牙设备  
                <ul id="list1">  
                </ul>  
            </div>  
            <div>  
                已配对蓝牙设备  

                <ul id="list2">  

                </ul>  
            </div>-->  

        </div>  

    </body>  
    <script type="text/javascript" src="./js/mui.min.js"></script>  
<!--    <script type="text/javascript" src="../js/common/config.js"></script>  
    <script type="text/javascript" src="../js/common/global.js"></script>  
    <script src="../js/cgn/mui.mkey.js"></script>  
    <script src="../js/cgn/cgnpc.js"></script> -->  
    <script type="application/javascript">  
//address=""搜索蓝牙//address=设备mac地址,自动配对给出mac地址的设备    
function searchDevices(address) {    
    //注册类    
    var main = plus.android.runtimeMainActivity();    
    var IntentFilter = plus.android.importClass('android.content.IntentFilter');    
    var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");    
    var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");    
    var BAdapter = BluetoothAdapter.getDefaultAdapter();    
    console.log("开始搜索设备");    
    var filter = new IntentFilter();    
    var bdevice = new BluetoothDevice();    
    var on = null;    
    var un = null;    
    var vlist1 = document.getElementById('list1'); //注册容器用来显示未配对设备    
    vlist1.innerHTML = ''; //清空容器    
    var vlist2 = document.getElementById('list2'); //注册容器用来显示未配对设备    
    vlist2.innerHTML = ''; //清空容器    
    var button1 = document.getElementById('bt1');    
    button1.disabled=true;    
    button1.value='正在搜索请稍候';    
    if (BAdapter == null) {  
        alert('设备不支持蓝牙')  
    } else {  
        if (!BAdapter.isEnabled()) {  
            alert('蓝牙未打开,启用蓝牙')  
        } else {  
            alert('蓝牙已打开,尝试发现设备')  
            BAdapter.startDiscovery();  
        }  
    }  
    // BAdapter.startDiscovery(); //开启搜索    
    var receiver;    
    receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {    
        onReceive: function(context, intent) { //实现onReceiver回调函数    
            plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作    
            console.log(intent.getAction()); //获取action    
            if(intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED"){    
                main.unregisterReceiver(receiver);//取消监听    
                button1.disabled=false;    
                button1.value='搜索设备';    
                mui.toast("搜索结束")    
            }else{    
            BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);    
            //判断是否配对    
            if (BleDevice.getBondState() == bdevice.BOND_NONE) {    
                console.log("未配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());    
                //参数如果跟取得的mac地址一样就配对    
                if (address == BleDevice.getAddress()) {    
                    if (BleDevice.createBond()) { //配对命令.createBond()    
                        console.log("配对成功");    
                        var li2 = document.createElement('li'); //注册    
                        li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址    
                        li2.setAttribute('onclick', 'print(id)'); //注册click点击列表进行打印    
                        li2.innerText = BleDevice.getName();    
                        vlist2.appendChild(li2);    
                    }    

                } else {    
                    if(BleDevice.getName() != on ){ //判断防止重复添加    
                    var li1 = document.createElement('li'); //注册    
                    li1.setAttribute('id', BleDevice.getAddress()); //打印机mac地址    
                    li1.setAttribute('onclick', 'searchDevices(id)'); //注册click点击列表进行配对    
                    on = BleDevice.getName();    
                    li1.innerText = on;    
                    vlist1.appendChild(li1);    

                    }    

                }    
            } else {    
                if(BleDevice.getName() != un ){ //判断防止重复添加    
                console.log("已配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());    
                var li2 = document.createElement('li'); //注册    
                li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址    
                li2.setAttribute('onclick', 'print(id)'); //注册click点击列表进行打印    
                un = BleDevice.getName();                   
                li2.innerText = un;    
                vlist2.appendChild(li2);}    
            }}    

        }    
    });    

    filter.addAction(bdevice.ACTION_FOUND);    
    filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);    
    filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);    
    filter.addAction(BAdapter.ACTION_STATE_CHANGED);    

    main.registerReceiver(receiver, filter); //注册监听    
}    

var device = null,    
    BAdapter = null,    
    BluetoothAdapter = null,    
    uuid = null,    
    main = null,    
    bluetoothSocket = null;    

function print(mac_address) {    
    if (!mac_address) {    
        mui.toast('请选择蓝牙打印机');    
        return;    
    }      
    localStorage.setItem("macaddress", mac_address);   
    main = plus.android.runtimeMainActivity();    
    BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");    
    UUID = plus.android.importClass("java.util.UUID");    
    uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");    
    BAdapter = BluetoothAdapter.getDefaultAdapter();    
    device = BAdapter.getRemoteDevice(mac_address);    
    plus.android.importClass(device);    
    bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);    
    plus.android.importClass(bluetoothSocket);   
    try {  

        if (!bluetoothSocket.isConnected()) {    
            mui.toast('检测到设备未连接,尝试连接....');    
            bluetoothSocket.connect();    
        }    

        if (bluetoothSocket.isConnected()) {    
            mui.toast('设备已连接');    
            let outputStream = bluetoothSocket.getOutputStream();    
             plus.android.importClass(outputStream);  
            let string = "打印测试\r\n";  
            let bytes = plus.android.invoke(string,'getBytes','gbk')  
             mui.toast('1');  
            //执行到这里开始报错,Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1  
            outputStream.write(bytes);    
            mui.toast('2');  
            outputStream.flush();    
            mui.toast('3');  
            bluetoothSocket.close();  // 关闭蓝牙连接  

            mui.toast('打印完成');  
        }    
    } catch (e) {  
        mui.toast(e);  
    } finally {  
        device = null; // 释放设备对象  
    }  
}  

    </script>  

</html>  
2024-07-09 16:54 负责人:无 分享
已邀请:

要回复问题请先登录注册