자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey 재문의 - Beacon, Bluetooth, Bluetooth LE 동시 접속 문의
2015.08.26 14:47
질문에 대한 답변 감사드립니다.
답변을 읽으니, 제가 질문 내용을 충분히 작성하지 못한 것 같아 다시 문의 드립니다.
1. 비콘 접속은 한개의 모바일에서 여러개의 비콘 신호를 동시에 볼 수 있는 방법을
문의한 것 입니다.
2. Bluetooth 4.0 LE 의 경우에도 한개의 모바일 기기에서 여러개의 BT LE 디바이스(체중계 같은)를
동시에 접속하여 데이터를 가져오는 방법을 알고 싶습니다.
감사합니다.
댓글 3
-
Humphery
2015.08.31 14:21
-
이정이남편
2015.09.01 15:39
답변 감사드립니다.
1. Beacon의 경우 (major 와 minor 값을 -1 로 하고 검색)
1) beacon 들의 major 와 minor 값이 같을 경우에는 한개 밖에 검색되지 않았습니다.
2) major 와 minor 값을 다르게 세팅하니, 한개의 TBeacon 에서 여러개의 Beacon 검색 되었습니다.
2. Bluetooth LE 의 경우
1) TBluetoothLE 컴포넌트를 여러개 사용하여 테스트 해 보았습니다
- 동시에 값을 받을 수 있었으나,
- 각 TBluetoothLE 컴포넌트 모두에서 DiscoverDevices 를 해야 하는 부담이 있었습니다.
2) TBluetoothLE 한개에서
- DiscoveredDevices 를 이용하여 필요한 Device 들을 선택하여
- SubscribeToCharacteristic 함수를 호출하면,
- OnCharacteristicRead 에서 각 Device의 값을 동시에 받을 수 있었습니다.
- Device 구분은 Address 혹은 DeviceName 를 비교해서 처리할 수 있었습니다.
procedure TForm1.BluetoothLE1EndDiscoverDevices(const Sender: TObject;
const ADeviceList: TBluetoothLEDeviceList);
var
I: integer;
FBLEDevice: TBluetoothLEDevice; FWeightGattService: TBluetoothGattService;
FWeightMeasurementGattCharacteristic: TBluetoothGattCharacteristic;
begin
cnt := 0;
FWeightGattService := nil;
FWeightMeasurementGattCharacteristic := nil;
for i := 0 to ADeviceList.Count - 1 do
begin
FBLEDevice := ADeviceList.items[i];
if FBluetoothLE.GetServices(FBLEDevice).Count <> 0 then
begin
FWeightGattService := FBluetoothLE.GetService(FBLEDevice, Weight_SERVICE);
if FWeightGattService <> nil then
begin
// get Weight Characteristic
BluetoothLE1.GetCharacteristics(FWeightGattService);
FWeightMeasurementGattCharacteristic
:= BluetoothLE1.GetCharacteristic(FWeightGattService, Weight_CHARACTERISTIC);
if FWeightMeasurementGattCharacteristic <> nil then
FBluetoothLE.SubscribeToCharacteristic(FBLEDevice, FWeightMeasurementGattCharacteristic)
else
Memo1.Lines.Add('Weight Char not found');
end
Memo1.Lines.Add('Weight Service not found');
end
else
memo1.Lines.Add(i.ToString + ' : not found services!');
end;
procedure TForm1.BluetoothLE1CharacteristicRead(const Sender: TObject;
const ACharacteristic: TBluetoothGattCharacteristic;
AGattStatus: TBluetoothGattStatus);
begin
if AGattStatus <> TBluetoothGattStatus.Success then
Memo1.Lines.Add('Error reading Characteristic ' + ACharacteristic.UUIDName + ': ' + Ord(AGattStatus).ToString)
else
memo1.Lines.Add((Sender as TBluetoothLEDevice).Address);
end;
-
Humphery
2015.09.01 15:43
테스트 결과 공유 너무 감사드립니다.
해당 정보가 필요하신 분들에게 좋은 자료가 될것입니다.
Firemonkey 재문의 - Beacon, Bluetooth, Bluetooth LE 동시 접속 문의
2015.08.26 14:47
질문에 대한 답변 감사드립니다.
답변을 읽으니, 제가 질문 내용을 충분히 작성하지 못한 것 같아 다시 문의 드립니다.
1. 비콘 접속은 한개의 모바일에서 여러개의 비콘 신호를 동시에 볼 수 있는 방법을
문의한 것 입니다.
2. Bluetooth 4.0 LE 의 경우에도 한개의 모바일 기기에서 여러개의 BT LE 디바이스(체중계 같은)를
동시에 접속하여 데이터를 가져오는 방법을 알고 싶습니다.
감사합니다.
댓글 3
-
Humphery
2015.08.31 14:21
-
이정이남편
2015.09.01 15:39
답변 감사드립니다.
1. Beacon의 경우 (major 와 minor 값을 -1 로 하고 검색)
1) beacon 들의 major 와 minor 값이 같을 경우에는 한개 밖에 검색되지 않았습니다.
2) major 와 minor 값을 다르게 세팅하니, 한개의 TBeacon 에서 여러개의 Beacon 검색 되었습니다.
2. Bluetooth LE 의 경우
1) TBluetoothLE 컴포넌트를 여러개 사용하여 테스트 해 보았습니다
- 동시에 값을 받을 수 있었으나,
- 각 TBluetoothLE 컴포넌트 모두에서 DiscoverDevices 를 해야 하는 부담이 있었습니다.
2) TBluetoothLE 한개에서
- DiscoveredDevices 를 이용하여 필요한 Device 들을 선택하여
- SubscribeToCharacteristic 함수를 호출하면,
- OnCharacteristicRead 에서 각 Device의 값을 동시에 받을 수 있었습니다.
- Device 구분은 Address 혹은 DeviceName 를 비교해서 처리할 수 있었습니다.
procedure TForm1.BluetoothLE1EndDiscoverDevices(const Sender: TObject;
const ADeviceList: TBluetoothLEDeviceList);
var
I: integer;
FBLEDevice: TBluetoothLEDevice;FWeightGattService: TBluetoothGattService;
FWeightMeasurementGattCharacteristic: TBluetoothGattCharacteristic;
begin
cnt := 0;
FWeightGattService := nil;
FWeightMeasurementGattCharacteristic := nil;
for i := 0 to ADeviceList.Count - 1 do
begin
FBLEDevice := ADeviceList.items[i];
if FBluetoothLE.GetServices(FBLEDevice).Count <> 0 then
begin
FWeightGattService := FBluetoothLE.GetService(FBLEDevice, Weight_SERVICE);
if FWeightGattService <> nil then
begin
// get Weight Characteristic
BluetoothLE1.GetCharacteristics(FWeightGattService);
FWeightMeasurementGattCharacteristic
:= BluetoothLE1.GetCharacteristic(FWeightGattService, Weight_CHARACTERISTIC);
if FWeightMeasurementGattCharacteristic <> nil then
FBluetoothLE.SubscribeToCharacteristic(FBLEDevice, FWeightMeasurementGattCharacteristic)
else
Memo1.Lines.Add('Weight Char not found');
end
Memo1.Lines.Add('Weight Service not found');
end
else
memo1.Lines.Add(i.ToString + ' : not found services!');
end;
procedure TForm1.BluetoothLE1CharacteristicRead(const Sender: TObject;
const ACharacteristic: TBluetoothGattCharacteristic;
AGattStatus: TBluetoothGattStatus);
begin
if AGattStatus <> TBluetoothGattStatus.Success then
Memo1.Lines.Add('Error reading Characteristic ' + ACharacteristic.UUIDName + ': ' + Ord(AGattStatus).ToString)
else
memo1.Lines.Add((Sender as TBluetoothLEDevice).Address);
end;
-
Humphery
2015.09.01 15:43
테스트 결과 공유 너무 감사드립니다.
해당 정보가 필요하신 분들에게 좋은 자료가 될것입니다.
1. 비콘 접속은 한개의 모바일에서 여러개의 비콘 신호를 동시에 볼 수 있는 방법을 문의한 것 입니다.
- 비콘은 MonitorizedRegions에 등록된 비콘 정보(UUID, Major, Minor)의 신호를 받을 수 있습니다.
- 단, Major, Minor 값을 -1로 설정 시 UUID가 등록된 모든 비콘 신호를 받아올 수 있습니다.
(http://docwiki.embarcadero.com/RADStudio/XE8/en/Using_Beacons)
- 만약, 주변에 어떤 비콘의 신호가 있는지 스캔하려면 TBluetoothLE 컴포넌트로 주변의 블루투스 LE 신호를 스캔할 수 있습니다.
2. Bluetooth 4.0 LE 의 경우에도 한개의 모바일 기기에서 여러개의 BT LE 디바이스(체중계 같은)를
동시에 접속하여 데이터를 가져오는 방법을 알고 싶습니다.
- TBluetoothLE 컴포넌트를 여러개 올려서 여러개의 BLE 디바이스에 접속할 수 있습니다.
(http://docwiki.embarcadero.com/RADStudio/XE8/en/Using_Bluetooth_Low_Energy)
저도 데모에 BLE 체중계와 4개의 비콘과 동시에 연결해 사용하고 있습니다.
비콘과 블루투스LE 사용법에 대한 내용은 사물인터넷 교육과정에서 모두 진행합니다.
학습해 보시고 사물인터넷 교육도 고려해보시기 바랍니다.
http://devgear.co.kr/support/education/radstudio_iot.html