對於一個應用程序,我需要一個Android設備既是一個Ble Gatt外設和服務器,以接受傳入和傳出的郵件;然而,似乎除了在github上查看其他人的項目外,我無法找到關於建立和維護服務器的許多信息。 任何人都可以告訴我正確的解決方案或指導我有關設置BluetoothGattServer的更多信息。Android使用藍牙收集服務器
0
A
回答
6
我想快速提及,大多數使用的Android設備不支持BluetoothGattServer。不過新型號的功能越來越多。
首先您可能想要宣傳您的服務,以便其他設備瞭解服務器。爲此,我們需要創建AdvertiseSettings,AdvertiseData和AdvertData for ScanResponses。
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setConnectable(true)
.build();
AdvertiseData advertiseData = new AdvertiseData.Builder()
.setIncludeDeviceName(true)
.setIncludeTxPowerLevel(true)
.build();
AdvertiseData scanResponseData = new AdvertiseData.Builder()
.addServiceUuid(new ParcelUuid(your_service_uuid))
.setIncludeTxPowerLevel(true)
.build();
之後,你需要創建廣告狀態回調:
AdvertiseCallback callback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
Log.d(TAG, "BLE advertisement added successfully");
}
@Override
public void onStartFailure(int errorCode) {
Log.e(TAG, "Failed to add BLE advertisement, reason: " + errorCode);
}
};
現在你可以開始宣傳你的服務:
BluetoothLeAdvertiser bluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();
bluetoothLeAdvertiser.startAdvertising(settings, advertiseData, scanResponseData, callback);
因爲我們需要先創建BluetoothGattServer a BluetoothGattServerCallback:
BluetoothGattServerCallback callback = new BluetoothGattServerCallback() {
@Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
super.onConnectionStateChange(device, status, newState);
}
@Override
public void onServiceAdded(int status, BluetoothGattService service) {
super.onServiceAdded(status, service);
}
@Override
public void onCharacteristicReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattCharacteristic characteristic) {
super.onCharacteristicReadRequest(device, requestId, offset, characteristic);
}
@Override
public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId, BluetoothGattCharacteristic characteristic, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);
}
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
}
@Override
public void onDescriptorReadRequest(BluetoothDevice device, int requestId, int offset, BluetoothGattDescriptor descriptor) {
super.onDescriptorReadRequest(device, requestId, offset, descriptor);
}
@Override
public void onNotificationSent(BluetoothDevice device, int status) {
super.onNotificationSent(device, status);
}
@Override
public void onMtuChanged(BluetoothDevice device, int mtu) {
super.onMtuChanged(device, mtu);
}
@Override
public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
super.onExecuteWrite(device, requestId, execute);
}
};
您不需要實現所有這些方法,只需要那些您感興趣的方法。例如,您可以實現onCharacteristicReadRequest(...)方法以將數據返回到讀取BluetoothGattServer上的特性的設備。
之後,你可以打開一個GattServer,創建服務和服務添加到服務器:
BluetoothGattServer bluetoothGattServer = mBluetoothManager.openGattServer(Context, callback);
BluetoothGattService service = new BluetoothGattService(your_service_uuid, BluetoothGattService.SERVICE_TYPE_PRIMARY);
//add a read characteristic.
BluetoothGattCharacteristic characteristic = new BluetoothGattCharacteristic(your_characteristic_uuid, BluetoothGattCharacteristic.PROPERTY_READ, BluetoothGattCharacteristic.PERMISSION_READ);
service.addCharacteristic(characteristic)
bluetoothGattServer.addService(service);
現在你已經設置了寫特性,您BluetoothGattServer從其他設備可以讀取。 我希望這個簡短的總結對你有幫助,否則我會盡力幫你澄清不清楚的事情。
相關問題
- 1. Android藍牙服務禁用
- 2. 將藍牙Android客戶端連接到藍牙Java服務器
- 3. Android藍牙服務發現
- 4. Android中的藍牙服務
- 5. Android的藍牙客戶端服務器
- 6. 藍牙服務
- 7. 藍牙服務器和BroadCastReceiver
- 8. 啓動藍牙服務器
- 9. Android藍牙 - 用於記錄附近藍牙設備的服務
- 10. 如何使用Android中的藍牙服務器Socket RFCOMM接收數據?
- 11. 藍牙SPP和其他藍牙服務
- 12. 使用反射方法創建藍牙服務器android
- 13. 無法調用藍牙廣播接收器方法的服務
- 14. 使用HCITool廣告藍牙LE服務
- 15. Android打開服務中的藍牙
- 16. 獲取輔助藍牙gatt服務android
- 17. Android內部的藍牙服務
- 18. Android藍牙:java.io.IOException:服務發現失敗
- 19. 在Android服務中啓動藍牙
- 20. 意向服務與藍牙 - Android Studio
- 21. 服務發現失敗android藍牙
- 22. 在Android服務上連接藍牙
- 23. Android後臺服務藍牙掃描
- 24. Android藍牙服務器客戶端應用程序
- 25. 藍牙適配器服務保持空
- 26. Windows上的藍牙SPP服務器
- 27. 組織藍牙LE服務
- 28. iOS藍牙服務建議
- 29. 藍牙服務問題
- 30. 使用android的藍牙遙控器
服務器也可以成爲gatt客戶端嗎?我似乎有一個問題,因爲添加服務器與gatt客戶端連接,但我假設當手機試圖連接到已經連接到其他設備的問題發生。由於接口更改,並且equals方法僅基於更改的地址,並且在api23中返回不正確的地址,所以再次無法識別可更新設備。 – kdgwill
是的,設備可以同時充當外設和中央設備。至於你所遇到的問題,我不太確定,但據我所知它應該起作用。請記住,Android ble堆棧非常不穩定。 – p2pkit
對於識別,有一種方法可以識別設備。在廣告設置中,您可以將附加數據添加到服務uuid,只需在ScanResponseData的構建中添加對addServiceData(...)的調用即可。但是ScanResponseData的大小不能超過31個字節。另一個缺陷是,在接收端,serviceData鍵是32位uuid而不是128位。 – p2pkit