最近一段时间一直在调试蓝牙设备,论坛里面关于这方面资料的太少,特别是关于蓝牙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);
}
目前暂时就这些,后面在慢慢补充吧。
3 个评论
要回复文章请先登录或注册
太2真人
x***@126.com
kaifazhe1