黑槿
黑槿
  • 发布:2016-10-09 12:22
  • 更新:2019-11-26 09:36
  • 阅读:11362

关于蓝牙设备搜索和Ble设备的搜索的简单调用方法

分类:Native.js

最近一段时间一直在调试蓝牙设备,论坛里面关于这方面资料的太少,特别是关于蓝牙4.0的案例,基本上没有,也只好摸石头过河了。目前的代码也就勉强能用,我希望在此抛砖引玉,大家一起来完善这一部分。

说明一下,蓝牙和蓝牙4.0调用的方法是不同的,我最开始没注意到这点,浪费了好多时间。

普通蓝牙搜索(安卓版)

var bArray = [];  
function scanBluetoothDevice(callback){  
    //获取android应用Activity对象  
    var main = plus.android.runtimeMainActivity();  
    //过滤器  
    var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
    //蓝牙设备  
    var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");  
    //蓝牙适配器  
    var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  

    var filter = new IntentFilter();  
    var BDevice = new BluetoothDevice();  
    //蓝牙本地适配器  
    var BAdapter = BluetoothAdapter.getDefaultAdapter();  

    // 判断是否开启蓝牙  
    if(!BAdapter.isEnabled()) {  
        BAdapter.enable(); //启动蓝牙  
    }  
    BAdapter.startDiscovery(); //开启搜索  

    var receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {  
        onReceive: function(context, intent) { //回调  
            try {                 
                plus.android.importClass(intent); //通过intent实例引入intent类  
                if(intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {  
                    main.unregisterReceiver(receiver); //取消监听     
                } else {  
                    //从Intent中获取设备对象  
                    BDevice= intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  

                    if(BDevice == null) {  
                        main.unregisterReceiver(receiver); //取消监听  
                        return;  
                    }  

                    var name=BDevice.getAddress()+BDevice.getName();  
                    if(bArray.indexOf(name) == -1){     //去重  
                        bArray.push(name);  
                        callback({  
                            "name": BDevice.getName(),  
                            "SN": BDevice.getAddress()  
                        });   
                    }  

                }  
            } catch(e) {  
                console.error(e);  
            }  
        }  
    });  

    //main.unregisterReceiver(receiver); //取消监听,这一步可以不需要  

    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); //注册监听   
}  

蓝牙4.0这部分,在安卓系统5.0及以上版本,需要使用新的api,之前的api无法使用,所以需要判断当前系统,分别使用不同的api来实现。IOS部分目前没有实现。

Ble设备搜索

function Ble() {  
    switch(plus.os.name) {  
        case "Android":  
            bleAndroid();  
            break;  
        case "iOS":  
            bleIOS();    //暂未实现  
            break;  
        default:  
            // 其它平台  
            plus.nativeUI.alert("暂不支持该系统");  
            break;  
    }  
}  

function bleAndroid(){  
    var main = plus.android.runtimeMainActivity();  
    var Intent = plus.android.importClass("android.content.Intent");  
    //蓝牙适配器  
    var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  
    var BAdapter = BluetoothAdapter.getDefaultAdapter();  

    var REQUEST_ENABLE_BT = 1;  
    // 判断是否开启蓝牙  
    if(!BAdapter.isEnabled()) {  
        var enableBtIntent = new Intent(BAdapter.ACTION_REQUEST_ENABLE);  
        main.startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);  
        return ;  
    }  

    //此判断当前android系统版本高于5.0  
    if(parseInt(plus.os.version) >= 5) {  
        bleAndroid5(BAdapter);    //Native.js无法反射抽象类,目前无法找到解决方法  
    } else {  
        bleAndroid4(BAdapter);  
    }  
}  

function bleAndroid4(BAdapter){  
    //蓝牙搜索回调  
    var mLeScanCallback = plus.android.implements("android.bluetooth.BluetoothAdapter$LeScanCallback", {  
        "onLeScan": function(device, rssi, scanRecord) {  
            // 可通过 scanRecord 获取Ble设备的uuid,major,minor  
        }  
    });  

    BAdapter.startLeScan(mLeScanCallback);  
    console.log("scan start!");  

    setTimeout(function() {  
        BAdapter.stopLeScan(mLeScanCallback);  
        console.log("scan end!");  
    },5000);  
}  

目前暂时就这些,后面在慢慢补充吧。

7 关注 分享
4***@qq.com levonxu 4***@qq.com 4***@qq.com 青椒茄子 3***@qq.com y***@163.com

要回复文章请先登录注册

太2真人

太2真人

楼主ios版本的蓝牙有吗
2019-11-26 09:36
x***@126.com

x***@126.com

请问苹果版的蓝牙设备搜索研究出来了吗?
2018-04-09 10:26
kaifazhe1

kaifazhe1

如何获取信号强度
2017-05-18 10:30