当前位置: 首页 > 知识库问答 >
问题:

未调用Android BLE服务onServiceDiscover()

盖马鲁
2023-03-14

Ble是广告,在BluetoothGattServer中添加广告数据,广告完成,设备连接。在连接之后,也调用discoverServices(),但是没有发现服务,即没有触发onserviceinstovered()回调。

private void startAdvertising() {
    Log.d(TAG, "Service: Starting Advertising");

    if (mAdvertiseCallback == null) {
        AdvertiseSettings settings = buildAdvertiseSettings();
        AdvertiseData data = buildAdvertiseData();
        mAdvertiseCallback = new SampleAdvertiseCallback();

        if (mBluetoothLeAdvertiser != null) {
            mBluetoothLeAdvertiser.startAdvertising(settings, data, mAdvertiseCallback);
        }
    }
}
private void initServer() {
     BluetoothGattService service =
            new BluetoothGattService(Constants.Service_UUID,BluetoothGattService.SERVICE_TYPE_PRIMARY);

    BluetoothGattCharacteristic characteristic =
            new BluetoothGattCharacteristic(Constants.Char_UUID,
                    //Read + write characteristics and permission
                    BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE,
                    BluetoothGattCharacteristic.PERMISSION_READ | BluetoothGattCharacteristic.PERMISSION_WRITE);

    service.addCharacteristic(characteristic);
    mBluetoothGattServer.addService(service);
}

//回调以处理所有Gatt客户端连接以处理读写请求

private BluetoothGattServerCallback mBGattServerCallback = new BluetoothGattServerCallback() {
    @Override
    public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
        super.onConnectionStateChange(device, status, newState);
        Log.d(TAG ,"OnConnection state change");
        if(newState == BluetoothProfile.STATE_CONNECTED){

        }else  if(newState == BluetoothProfile.STATE_DISCONNECTED){

        }

    }

    @Override
    public void onServiceAdded(int status, BluetoothGattService service) {
        super.onServiceAdded(status, service);
        Log.i(TAG, " Service are added");
    }

//广告数据

private AdvertiseData buildAdvertiseData() {

advertedata data=new advertedata.builder().setIncludedEviceName(true).addServiceUUID(new ParcelUuid(constants.service_uuid)).build();}

private AdvertiseSettings buildAdvertiseSettings() {
    AdvertiseSettings settings = new AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
            .setConnectable(true)
            .setTimeout(0)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
            .build();
    return settings;
private void initialize() {
    if (mBluetoothLeAdvertiser == null) {
        BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        if (mBluetoothManager != null) {
            BluetoothAdapter mBluetoothAdapter = mBluetoothManager.getAdapter();
            if (mBluetoothAdapter != null) {
                mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
                //register the instance of server to BLE framework
                mBluetoothGattServer = mBluetoothManager.openGattServer(this,mBGattServerCallback);
                initServer();
            } else {
                Toast.makeText(this, getString(R.string.bt_null), Toast.LENGTH_LONG).show();
            }
        } else {
            Toast.makeText(this, getString(R.string.bt_null), Toast.LENGTH_LONG).show();
        }
    }
}

//日志总结

`//服务uuid和特性uuid将进入广告数据{onGetService()-device=65:5E:34:E1:47:55 uuid=0000xxxx-0000-1000-8000-00805xxx10-31 17:55:11.542 232 76-25749/d/bluetoothgatt:onGetService()-device=65:5E:34:E1:47:55 uuid=0000xxxx-0000-1000-8000-0080xxxx

ongetexpretice()-device=65:5e:34:e1:47:55 uuid=0000xxxx-0000-1000-8000-00805fxxxx srvctype=0 srvcinstid=0 charinstid=0 charprops=32 10-31 17:55:11.627 232 76-23290/d/bluetoothgatt:ongetexpretice()-device=65:5e:34:e1:47:55 uuid=0000xxx-0000-1000-8000-00805fxxxx srvctype=0 srvcinstid=0 charinstid=1 718 232 76-23289/D/Bluetoothgatt:ongetexpretice()-device=65:5e:34:e1:47:55 uuid=0000xxxx-0000-1000-8000-00805fxxxxx srvctype=0 srvcinstid=0 charinstid=0 charpps=2}`

共有1个答案

李言
2023-03-14

我正在用micromax canvas作为中心测试设备变化。现在我换了设备,这里的服务被发现了,并得到了回调…

但是writeCharacteristics()请求时,服务器(远程设备)没有触发回调onCharacteristicsReadRequest(),因为我只对所需的特性执行写操作。没有别的东西可以拒绝手术。

 类似资料:
  • 在异步HTTP SERVER中使用服务 全局方法service_center() 使用service_center($service)获取服务地址,然后使用call()方法调用公开的服务方法 $service = (yield service_center('User')); $user = (yield $service->call("User::getUser", ['id'

  • 问题内容: 我正在使用FCM服务器进行远程通知,它可以完美地与发送和接收通知配合使用。 我的问题是,当设备在后台运行时,不会调用此函数。 我尝试过的解决方案: 该功能: 当用户点击通知时调用。否则,它不会被触发。 添加到有效载荷。另外,我尝试了这个值。 这是我的功能代码: func application(_ application: UIApplication, didReceiveRemote

  • 我不熟悉单元测试。参考google之后,我创建了一个测试类来测试我的控制器,如下所示: 我有以下控制器和服务类: 当我调试单元测试时,控制器中的p对象为null。我的状态是200,但不是预期的JSON响应 我错过了什么?

  • 服务调用监控 KernalEvent::SERVICE_CALL事件 在框架层,调用servcie时,会抛出KernalEvent::SERVICE_CALL事件,你可以监听该事件,做数据上报处理,请以异步方式上报 <?php namespace src\Web\Listeners; use Listener; use Event; class Servic

  • 我的域名上运行了一个angular2应用程序,现在被Rails应用程序取代。 但是,我一直在 有没有办法从我的用户浏览器中删除旧的服务人员?

  • 问题内容: 我已经编写了带有远程接口的服务,并将其安装在PC的Eclipse AVD上。我有一个客户端测试工具,可以启动和调用服务中的方法。最初,我是通过控件类和活动安装的服务,现在已将其删除,因此该服务的清单如下所示: 因此没有活动标签。 当我从Eclipse中的调试图标启动它时,控制台会告诉我它正在安装apk(它确实是),但是它并没有作为调试线程出现,也没有触发断点,尽管该服务的行为到目前为止