huyong1978
huyong1978
  • 发布:2015-09-05 16:20
  • 更新:2018-03-26 13:42
  • 阅读:10107

蓝牙设备连接失败,只有首次运行能连接成功??

分类:Native.js

bluetoothSocket.connect();首次执行,可以成功连接,之后就一直连接不上。

<!DOCTYPE html>  
<html>  
    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <title></title>  
        <script src="js/mui.min.js"></script>  
        <link href="http://ask.dcloud.net.cn/css/mui.min.css" rel="stylesheet" />  
    </head>  
    <body>  
        <header class="mui-bar mui-bar-nav">  
            <h1 class="mui-title">打印</h1>  
        </header>  
        <footer id="footer" class="mui-bar mui-bar-footer">  
            <h1 class="mui-title" id='search'>  
                <span class="mui-icon mui-icon-search"></span>  
                <span style="font-size:16px;">搜索蓝牙设备</span>  
            </h1>  
        </footer>  
        <div class="mui-content mui-content-padded">  
            <h5 class="mui-content-padded">点击设备开始打印</h5>  
            <ul id="list" class="mui-table-view mui-table-view-chevron">  
            </ul>  
        </div>  

        <script type="text/javascript" charset="utf-8">  
            mui.init();  
            mui.plusReady(function(){  
                scan();  
            })  

            //获取已配对的蓝牙设备列表  
            function scan() {  
                var main = plus.android.runtimeMainActivity();  
                var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  
                var BAdapter = BluetoothAdapter.getDefaultAdapter(); //获得本机蓝牙适配器  

                if (!BAdapter.isEnabled()) {  
                    console.log('检测到未打开蓝牙,尝试打开中....');  
                    BAdapter.enable();  
                }  

                var lists = BAdapter.getBondedDevices();//获取配对的设备列表  
                plus.android.importClass(lists);  
                var iterator = lists.iterator();  
                plus.android.importClass(iterator);  
                var ul = document.getElementById('list');  
                ul.innerHTML = '';  
                while (iterator.hasNext()) {  
                    var d = iterator.next();  
                    plus.android.importClass(d);  
                    var li = document.createElement('li');  
                    li.setAttribute('id', d.getAddress());  
                    li.className = 'mui-table-view-cell';  
                    var a = document.createElement('a');  
                    a.setAttribute('class', 'mui-navigate-right')  
                    a.innerText = d.getName();  
                    li.appendChild(a);  
                    ul.appendChild(li);  
                }  
            }  

            //mac_address:打印机的mac地址  
            function print(mac_address) {  
                if (!mac_address) {  
                    mui.toast('请选择蓝牙打印机');  
                    return;  
                }  
                var main = plus.android.runtimeMainActivity();  
                var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  
                var UUID = plus.android.importClass("java.util.UUID");  
                var uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");  
                var BAdapter = BluetoothAdapter.getDefaultAdapter();  

                var device = BAdapter.getRemoteDevice(mac_address);  
                plus.android.importClass(device);  

                var bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);  
                plus.android.importClass(bluetoothSocket);  

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

                console.log('bluetoothSocket.isConnected()='   bluetoothSocket.isConnected());  

                //为什么只能是首次连接成功,之后就一直是未连接  
                if (bluetoothSocket.isConnected()) {  
                    var outputStream = bluetoothSocket.getOutputStream();  
                    plus.android.importClass(outputStream);  
                    var string ='测试测试\r\n\r\n\r\n';  
                    var bytes = plus.android.invoke(string, 'getBytes', 'gbk');  
                    outputStream.write(bytes);  
                    outputStream.flush();  
                }  
            }  

            mui('#list').on('tap', 'li', function() {  
                print(this.id);  
                //localStorage.setItem('mac_address',this.id);  
            })  

            document.getElementById("search").addEventListener('tap',scan);  

        </script>  
    </body>  

</html>
2015-09-05 16:20 1 条评论 负责人:无 分享
已邀请:
huyong1978

huyong1978 (作者)

找到原因了,打印的那几个对象不能重复初始化,下面这样写就OK了

            var device = null,  
                BAdapter = null,  
                BluetoothAdapter = null,  
                uuid=null,  
                main=null,  
                bluetoothSocket=null;  
             //mac_address:打印机的mac地址  
            function print(mac_address,str) {  
                if (!mac_address) {  
                    mui.toast('请选择蓝牙打印机');  
                    return;  
                }  

                if (device == null) {  
                    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);  
                }  
  • blk

    00001101-0000-1000-8000-00805F9B34FB 这个uuid是写死的 还是在别处也需要定义一个??

    2015-12-01 14:03

  • huyong1978 (作者)

    蓝牙服务 uuid固定值

    2015-12-02 11:47

  • zyimm

    还是 不成功 望楼主 告知详细代码

    2016-05-12 21:51

  • a***@qq.com

    中文乱码能怎么解决下

    2017-10-19 12:59

8***@qq.com

8***@qq.com

楼主有没有试过两台Android手机连接?我测试过程中一直报错: Uncaught java.io.IOException: read failed, socket might closed or timeout, read ret: -1;at android.bluetooth.BluetoothSocket.connect at index.html:1。连接不上,不知道为啥!能否帮忙解答一下,先感谢了

  • 8***@qq.com

    我把你这代码复制过来,也是报同样的错!

    2016-07-04 15:13

  • s***@163.com

    请问您解决了没有啊,如果解决了,能不能共享一下方法?谢谢

    2016-12-13 11:23

  • witt

    一样的错误啊 就是只能打印成功一次到两次 再之后就一直报这个错

    2017-04-12 15:08

  • 喜洋洋liugp

    两台安卓手机连接的话必须要有客户端发送连接

    和服务端接收连接

    2018-05-25 13:37

莫回首

莫回首

感谢你的分享,我用了一下你的代码但是出现这个
Uncaught TypeError: Object #<h> has no method 'isConnected' at blue.html:90
为什么呢?
我百度了一下那个bluetoothSocket对象是有这个方法的

  • blk

    bluetoothSocket.isConnected()一直为false 我是两个小米手机用蓝夜连接的 不知道为什么啊???

    2015-12-01 13:52

  • blk

    00001101-0000-1000-8000-00805F9B34FB 这个uuid是写死的 还是在别处也需要定义一个??

    2015-12-01 14:01

莫回首

莫回首

终于解决了

bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);  
//在这下面加上一句  
plus.android.importClass(bluetoothSocket);

就可以了

  • zyimm

    不可能吧 我没有成功过

    2016-05-12 23:24

  • huyong1978 (作者)

    如果是打印成功了一次,后面不能再打印,请检查一下,套接字是否重复初始化了

    2016-05-15 18:43

蛋蛋

蛋蛋 - 穷怎么了?穷就应该被嘲笑吗?抬头!挺胸!让大家看看,你不仅穷,而且还丑。

楼主以上代码使用的前提是蓝牙要 已经与设备配对了吧?

  • huyong1978 (作者)

    是的,要先配对

    2016-05-15 18:42

天天天晴

天天天晴

我链接过两次之后就没有链接成功了
一直是 Service discovery failed

4***@qq.com

4***@qq.com - 天天

可以打印图片吗

该问题目前已经被锁定, 无法添加新回复