문제비콘 + 블루투스 통신 I 특정 ID 비컨 방출되는 주변기기했습니다
미세 [BLE]를 작동하지 않는다. 내 스마트 폰 (중심 역할을 담당)은 주변 장치의 표지를 검색합니다. 올바른 신호를 찾으면 GATT 프로파일을 통해 블루투스 통신을 시작합니다. 장치가 처음 연결될 때 데이터가 하나에서 다른 장치로 올바르게 전송되지만 두 번째 장치 (20 초마다 두 장치를 연결하려고하는 타이머가 있음)에서 연결이 실패합니다. 왜 ... 나는 앱 프로세스를 죽이고 다시 열어서 다시 작동시켜야합니다. 내가 비콘 들어
한 적이 무엇
, 내가 altbeacon을 사용하고, 그래서 중앙 장치에서 비콘 검출을위한 코드는이 :
@Override public void onBeaconServiceConnect() { beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { Log.i(TAG, "Beacon detected!"); if (beacons.size() > 0 && Utils.getUserData(getApplicationContext(), "id").compareTo("-1") != 0) { if(region.getId1().compareTo(Identifier.parse(identifier))==0) { Beacon beacon = beacons.iterator().next(); Log.i(TAG, "The first beacon I see is about " + beacon.getDistance() + " meters away. " + region.getId1()); String mac = beacon.getBluetoothAddress(); Log.i("MAC", "MAC: "+mac); CustomBluetoothManager customBluetoothManager = CustomBluetoothManager.getInstance(getApplicationContext()); if(!customBluetoothManager.isScanning()) { customBluetoothManager.scanLeDevice(true, mac); } } } } }); try { beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", Identifier.parse(identifier), null, null)); } catch (RemoteException e) { } }
비콘이 발견
,public void scanLeDevice(final boolean enable, String mac) {
target_mac = mac;
mHandler = new Handler();
if (enable) {
// Stops scanning after a pre-defined scan period.
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, SCAN_PERIOD);
mScanning = true;
mBluetoothAdapter.startLeScan(mLeScanCallback);
} else {
mScanning = false;
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
을 여기에 mLeScanCallback 코드는 다음과 같습니다 : 다음 scanLeDevice가 호출됩니다
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
long epoch = System.currentTimeMillis()/1000;
SharedPreferences prefs = context.getSharedPreferences(
"epoch", Context.MODE_PRIVATE);
long epochStored = prefs.getLong("epoch", 0);
if (device.getAddress().compareTo(MAC) == 0 && after20Seconds) {
prefs.edit().putLong("epoch", epoch).apply();
Log.d("epoch", Long.toString(epoch));
mDeviceAddress = device.getAddress();
final Intent gattServiceIntent = new Intent(context, BluetoothLeService.class);
context.bindService(gattServiceIntent, mServiceConnection, context.BIND_AUTO_CREATE);
}
}
};
비콘이 패킷에 포함되어있는 MAC 주소가 실제 장치 MAC과 동일하지 않기 때문에 MAC 주소를 하드 코드해야했습니다 (BLE 정의의 것이지만 정확히 어떻게 알지는 못합니다). 그것은 작동한다). 데이터가 전송 될 때
마지막으로, 나는 닫고 블루투스 채널을 분리하고 너무 서비스 바인딩을 해제하려고했지만, 아무것도 작동 :
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicWrite(gatt, characteristic, status);
disconnect();
close();
unbindService(mServiceConnection);
}
을 그래서,이 코드로, 처음 장치가 연결되어 데이터가 올바르게 전송되지만 두 번째 시도에서 20 초 후에는 절대로 통신을 설정하지 않습니다.
질문
- 이 문제가 될 수 있는지의 어떤 생각?
- BLE 작동 원리? 비컨 패킷에서 MAC은 보안 상 가짜입니다. 그러나 비콘 스캔 응용 프로그램에서 응용 프로그램을 가져 와서 응용 프로그램에 하드 코딩하면 통신이 작동합니다 ... 작동하지 않아야한다고 생각합니다.
- 비콘 패킷에서 올바른 장치 MAC을 얻으려면 어떻게해야합니까?
- 블루투스 통신과 함께 비콘을 사용할 샘플을 알고 있습니까?
- "mBluetoothAdapter.stopLeScan (mLeScanCallback)"방법을 통해 검사를 중지하면 검사가 실제로 중지되지 않는 것처럼 보입니다 ... 정상입니까? 로그는 continuosly 보여주고있다 "startRegisteration : BluetoothLeScanner를 mLeScanClients = {5445b45 = android.bluetooth.le.BluetoothLeScanner @ org.altbeacon.beacon.service.scanner.CycledLeScannerForLollipop $ 4 ......"
왜 altbeacon이 필요합니까? 당신이 요구하는 것은 gatt 중앙 및 주변 역할을 기반으로하며, 장치의 MAC ID를 중심으로 이루어집니다. (그 사이에 나는 또한 왜 그 문제가 두 번째로, 비슷한 것을 직면하는 것을 기억하는지 생각하고있다) – user2450263
답장을 보내 주셔서 감사합니다! 사용자가 주변 장치 근처에있을 때를 알기 위해서는 비컨이 필요합니다. 이렇게하면 앱이 사용자 주변의 블루투스 장치를 계속해서 스캔하는 것을 피할 수 있습니다. – adri1992
'scanLeDevice'와 그것의 콜백은 어쨌든 근접성에 대한 rssi 값을 계산할 필요가 있습니다 - 사용자가 장치 근처에 있는지 여부를 계산하기 위해 – user2450263