最近做的蓝牙(plus.bluetooth)项目整理2

1,243 阅读1分钟

1、安卓机接受不到特征值,苹果手机可以

解决:安卓订阅之前要设置最大传输单元 255

var u = navigator.userAgent, app = navigator.appVersion;
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; // Android
if(isAndroid){
  plus.bluetooth.setBLEMTU({
    deviceId:deviceId,
    mtu:255,
    success:function(e){
      0 && console.log('set MTU success: '+JSON.stringify(e));
    },
    fail:function(e){
      console.log('set MTU failed: '+JSON.stringify(e));
    }
  });
}

www.html5plus.org/doc/zh_cn/b…

2、当监测到安卓手机有来电时,发送命令给设备,设备进行灯光闪烁提示并伴随马达震动。安卓手机如何监测手机有来电提醒?

解决:

document.addEventListener('plusready', function() {
  var receiver, main, context, TelephonyManager;
  context = plus.android.importClass('android.content.Context');
  TelephonyManager = plus.android.importClass('android.telephony.TelephonyManager'); //通话管理  
  main = plus.android.runtimeMainActivity(); //获取activity  
  receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
    onReceive: doReceive //实现onReceiver回调函数  
  });

  var IntentFilter = plus.android.importClass('android.content.IntentFilter');
  var Intent = plus.android.importClass('android.content.Intent');
  var filter = new IntentFilter();
  //filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); //监听飞行模式  
  filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); //监听电话状态  
  main.registerReceiver(receiver, filter); //注册监听  

  function doReceive(context, intent) {
    plus.android.importClass(intent);

    var phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER),
        telephony = context.getSystemService(context.TELEPHONY_SERVICE),
        state = telephony.getCallState();
    switch (state) {
        // 等待接听电话
      case TelephonyManager.CALL_STATE_RINGING:
        console.log("[Broadcast]等待接电话=" + phoneNumber);
        break;
      case TelephonyManager.CALL_STATE_IDLE:
        console.log("[Broadcast]电话挂断=" + phoneNumber);
        break;
      case TelephonyManager.CALL_STATE_OFFHOOK:
        console.log("[Broadcast]通话中=" + phoneNumber);
        break;
    }
    console.log(intent.getAction());
  }

});

3、首次进入,获取不到服务,导致订阅失败。

解决:安卓机要延时1000毫秒订阅

setTimeout(function() {
    // 获取蓝牙设备的所有服务
    plus.bluetooth.getBLEDeviceServices({
        deviceId:deviceId,
        success:function(e){
            var services = e.services;
            console.log('get services success: '+services.length);
            for(var i in services){
                    console.log(i+': '+JSON.stringify(services[i]));
            }
        },
        fail:function(e){
            console.log('get services failed: '+JSON.stringify(e));
        }
    });	
  // 启用notify功能
  plus.bluetooth.notifyBLECharacteristicValueChange({
    deviceId: deviceId,
    serviceId: serviceId,
    state:true,
    characteristicId: characteristic.notify,
    success: function(e) {

    },
    fail: function(e) {
      console.log('notify characteristics failed');
    }
  });
}, 1000);

4、安卓手机,app连接蓝牙设备成功之后,接收不到订阅的值,在连接的状态下再次进入页面就能接收到订阅值

解决:连接成功之后要延迟1秒设置最大传输单元

plus.bluetooth.createBLEConnection({
  deviceId: deviceId,
  timeout: 4000,
  success: function (e) {
    var u = navigator.userAgent, app = navigator.appVersion;
    var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; // Android
    if(isAndroid){
      setTimeout(function(){    
          plus.bluetooth.setBLEMTU({
            deviceId:deviceId,
            mtu:255,
            success:function(e){
              0 && console.log('set MTU success: '+JSON.stringify(e));
            },
            fail:function(e){
              console.log('set MTU failed: '+JSON.stringify(e));
            }
          });
        },1000)
    }
  },
  fail: function (e) {

  }
});