2017-09-05 15 views
0

BLEデバイスにメッセージを送信します。私の理解では、最初にデバイスのサービスを発見してから、メッセージをサービス特性に送信しなければなりません。だからここに私がやったことです:私はデバイスに接続し、送信したい時はいつでもBLEサービスが見つかりませんでした

private void sendMessage() { 
    BluetoothLeService ble = new BluetoothLeService("B0:00:00:00:00:C0", "0000fff0-1111-0000-0000-00805f9b34fb","0000fff1-1111-0000-0000-00805f9b34fb"); 
    ble.initialize(app); 
    ble.connect();, 
    ble.writeCharacteristic(450) 
} 

今:

public class BluetoothLeService extends Service { 

private BluetoothManager mBluetoothManager; 
private BluetoothAdapter mBluetoothAdapter; 
private String mBluetoothDeviceAddress; 
private BluetoothGatt mBluetoothGatt; 

private String macAddress; 
private String serviceUuid; 
private String characteristicUuid; 
private Application app; 
private int transmissionValue = 450;  

public BluetoothLeService(String address, String serviceUuid, String characteristicUuid) { 
    this.macAddress = address; 
    this.serviceUuid = serviceUuid; 
    this.characteristicUuid = characteristicUuid; 
} 


private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     System.out.println("connectionStateChange: " + status); 
     if (STATE_CONNECTED == newState) { 
      gatt.discoverServices(); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
     if(gatt.getDevice().getName().equals("MyDeviceName")) { 
      sendMessageAfterDiscovery(gatt); 
     } 
    } 

}; 

public boolean initialize(Application app) { 
    this.app = app; 
    if (mBluetoothManager == null) { 
     mBluetoothManager = (BluetoothManager) app.getSystemService(Context.BLUETOOTH_SERVICE); 
     if (mBluetoothManager == null) { 
      return false; 
     } 
    } 

    mBluetoothAdapter = mBluetoothManager.getAdapter(); 
    if (mBluetoothAdapter == null) { 
     return false; 
    } 
    return true; 
} 


public boolean connect() { 
    return connect(macAddress); 
} 

public boolean connect(final String address) { 
    this.macAddress = address; 
    if (mBluetoothAdapter == null || macAddress == null) { 
     return false; 
    } 

    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(macAddress); 
    if (device == null) { 
     Log.w(TAG, "Device not found. Unable to connect."); 
     return false; 
    } 
    mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 
    return true; 
} 

public void writeCharacteristic(int value) { 
    this.transmissionValue = value; 
    BluetoothDevice mDevice = mBluetoothAdapter.getRemoteDevice(this.macAddress); 
    BluetoothGatt mBG = mDevice.connectGatt(app.getApplicationContext(), true, mGattCallback); 
    System.out.println("device name: " + mBG.getDevice().getName()); 

} 

private void sendMessageAfterDiscovery(BluetoothGatt gatt) { 
    BluetoothGattService mSVC = gatt.getService(UUID.fromString(serviceUuid)); 

    BluetoothGattCharacteristic mCH = mSVC.getCharacteristic(UUID.fromString(characteristicUuid)); 
    mCH.setValue(transmissionValue, BluetoothGattCharacteristic.FORMAT_UINT16, 0); 
    System.out.println("characteristic writable: " + isCharacteristicWriteable(mCH)); 

    System.out.println("success? " + gatt.writeCharacteristic(mCH)); 
} 

public static boolean isCharacteristicWriteable(BluetoothGattCharacteristic pChar) { 
    return (pChar.getProperties() & (BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE)) != 0; 
} 

}

そして、ここでは、私がメッセージを送信するコードですデバイスの名前を取得できるため、デバイスが認識されても、onServiceDiscoveredメソッドは呼び出されません。また、エラーもスローされません。

なぜこのメソッドは呼び出されませんか?私は何か間違っているのですか? 私は既にパーミッションをチェックしており、クラスをマニフェストのサービスとして追加しました。あなたの助けのための

おかげで...

答えて

1

あなたのGATTのコールバックのonConnectionStateChange方法の中からdiscoverServicesを呼び出す必要があります。リモートデバイス、並びにそれらの 特性と記述子によって提供される

発見サービス:discoverServicesメソッドのドキュメント。

これは非同期操作です。 のサービス検出が完了すると、onServicesDiscovered(BluetoothGatt, int)コールバックは がトリガーされます。検出が成功した場合、リモートサービスは、getServices()機能を使用して取得された になります。あなたのケースでは

、次のようにコードを更新することはトリックを行う必要があります。

@Override 
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
    System.out.println("connectionStateChange: " + status); 

    if (STATE_CONNECTED == newState) { 
     gatt.discoverServices(); 
    } 
} 
+0

私はちょうどそれを試してみましたが、 しかし、私はそれをonConnectionStateChangeで呼び出すと、このメソッドは呼び出されませんが、私はまだconnectGattの後にdeviceNameを取得します。 コードを更新しました –

+0

接続状態が「STATE_CONNECTED」に戻っていることを確認しましたか? – stkent

+0

onConnectionStateChangeは決して呼び出されません。チェックする接続状態はありません。 –

関連する問題