Android : 블루투스 UUID는 어떻게 작동하나요?


81

블루투스 UUID가 의미하는 바를 이해하지 못합니다. UUID는 프로토콜 (예 : RFCOMM )을 나타 니까? 그렇다면 createRfcommSocketToServiceRecord()이름에 rfcomm을 지정할 때 메서드에 UUID가 필요한 이유는 무엇입니까? BluetoothChat 샘플 코드에 임의의 하드 코딩 된 UUID가있는 이유는 무엇입니까?

내 질문은 이 질문에 따라 4.0.4를 실행하는 장치가 리플렉션을 사용하여 외부, Android가 아닌 장치에 연결하려고 할 때 null 포인터 예외가 발생하기 때문에 발생합니다 . 그러나 그 질문에 대한 해결책은 저에게 효과가 없습니다. UUID muuid = device.getUuids()[0].getUuid();예외가 발생합니다.

편집 : 이 답변에 따라 직렬 포트 서비스에 대한 UUID를 하드 코딩하여 문제를 해결했습니다 (사용 UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");).

createInsecureRfcommSocketToServiceRecord(),리플렉션 방법을 사용하지 않고 보안되지 않은 rfcomm 소켓을 만들기 위해 UUID를 제공해야하는 이유에 대해 더 궁금합니다 .

누구든지 나를 정리할 수 있습니까?


학문적 목적을 제외하고는 블루투스 연결을 사용하지 않았지만 내가 아는 것은 UUID는 장치의 식별자, 장치의 주소와 같은 장치이며 장치에 대해 동일하게 유지된다는 것입니다.
noob

@Creator :이 답변과 모순됩니다 : stackoverflow.com/a/4963069/1286571
ForeverWintr

3
이것이 제가 블루투스 UUID에 대해 아는 전부입니다.이 pdf를 읽고 블루투스 프로토콜과 UUID를 더 잘 이해할 수 있습니다.- people.csail.mit.edu
noob

질문 : Android 전화가 원격 장치의 UUID를 지원하지 않는 경우 어떤 결과가 발생합니까? (Android에 나열되지 않은 UUID ... getUuids ())?
Orri 2014 년

헤이 헤이 헤이! @ForeverWintr, 내 자신의 형식으로 단일 UUID를 정의하고 두 개의 Android 장치에서 사용해도 괜찮습니까? 그들은 서로 의사 소통 할 수 있습니까?
gumuruh

답변:


7

Bluetooth에서 모든 개체는 UUID로 식별됩니다. 여기에는 서비스, 특성 및 기타 많은 것들이 포함됩니다. Bluetooth는 표준 개체에 대해 할당 된 번호의 데이터베이스를 유지하고 공급 업체 (예약 비용을 충분히 지불 한)에 하위 범위를 할당합니다. 여기에서이 목록을 볼 수 있습니다.

https://www.bluetooth.com/specifications/assigned-numbers/

표준 서비스 (예 : 직렬 포트, 키보드, 헤드셋 등)를 구현하는 경우 해당 서비스의 표준 UUID를 사용해야합니다. 이렇게하면 개발하지 않은 장치와 상호 운용 할 수 있습니다.

사용자 지정 서비스를 구현하는 경우 호환되지 않는 타사 장치가 서비스를 다른 것으로 생각하지 않도록하기 위해 고유 한 UUID를 생성해야합니다. 가장 쉬운 방법은 임의의 항목을 생성 한 다음 애플리케이션에서 결과를 하드 코딩하는 것입니다 (물론 서비스에 연결할 장치에서 동일한 UUID를 사용).


이 UUID는 어디서 얻으며 왜 항상 무작위로 보이는 문자열입니까?
luke 크로스

UUID는 RFC 4122에 따라 생성됩니다. 선택할 수있는 UUID 버전에는 다섯 가지가 있습니다. 가장 많이 사용되는 것은 버전 1 (타임 스탬프 및 MAC 주소 기반)과 버전 4 (임의)입니다. en.wikipedia.org/wiki/Universally_unique_identifier 도 참조하십시오 . UUID를 생성 할 수있는 웹 페이지는 uuidgenerator.net 입니다. Bluetooth SIG 회원 인 경우 회원 ID에 연결된 UUID를 생성하는 알고리즘을 제공합니다.
David C.

29

UUID는 정보를 고유하게 식별하는 데 사용됩니다. Bluetooth 장치에서 제공하는 특정 서비스를 식별합니다. 표준은 기본 BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB.

의료 센서와 같은 장치는 처음 8 자리 숫자를 사전 정의 된 코드로 대체하여 서비스를 제공 할 수 있습니다. 예를 들어 RFCOMM 연결을 제공하는 장치는 단축 코드 0x0003을 사용합니다 .

따라서 Android 휴대폰은 장치에 연결 한 다음 SDP (서비스 검색 프로토콜)를 사용하여 제공하는 서비스 (UUID)를 찾을 수 있습니다.

대부분의 경우 이러한 고정 UUID를 사용할 필요가 없습니다. 예를 들어 채팅 애플리케이션을 만드는 경우 한 Android 휴대 전화가 동일한 애플리케이션을 사용하므로 동일한 UUID를 사용하는 다른 Android 휴대 전화와 상호 작용합니다.

그래서, 당신은 예를 들어, 사용하여 응용 프로그램 (웹에서 많은 랜덤 UUID 생성기 중 하나에 대한 임의의 UUID 설정할 수 있습니다 예를 들어 ).


따라서 RFCOMM 서비스의 전체 UUID는 다음과 같습니다. 00000003-0000-1000-8000-00805F9B34FB?
gyozo kudor 2015 년

1
참고 : 32 비트 서비스 ID의 짧은 형식을 나열합니다. GUID의 처음 4 자리를 대체하는 BT SIG의 기본 UUID 00000000-0000-1000-8000-00805F9B34FB와 결합합니다. 전의. RFCOMM은 0x0003이므로 RFCOMM 서비스의 UUID는 00030000-0000-1000-8000-00805F9B34FB
sam msft

22

일반적으로 Bluetooth 장치가 지원하는 몇 가지 일반적인 서비스 (프로토콜)를 나타냅니다.

자신의 rfcomm 서버 (를 사용하여 listenUsingRfcommWithServiceRecord)를 생성 할 때 자신의 UUID를 지정하여 연결하는 클라이언트가이를 식별 할 수 있도록해야합니다. createRfcommSocketToServiceRecordUUID 매개 변수가 필요한 이유 중 하나입니다 .

그렇지 않으면 일부 공통 서비스에 동일한 UUID가 있으므로 필요한 것을 찾아서 사용하십시오.

여기를 참조 하십시오


3
그것은 일반적으로 합니까? 언제 그렇지 않습니까? 내가 이해하지 못하는 것은 RCOMM 서버를 만들 때 RFCOMM UUID를 사용하지 않는 이유입니다.
ForeverWintr

1
음, UUID이다 범용 식별자입니다. RFCOMM은 블루투스 프로토콜 스택의 레이어 일 뿐이며 블루투스 사양에 따라 UUID를 연결했습니다. 그리고 SDP에서 사용하지만 무엇을 위해 사용되는지 완전히 확실하지 않습니다. 그러나 당신은 항상 사양에서 그것에 대해 읽을 수 있습니다. 이제 RFCOMM 프로토콜을 기반으로 서비스를 만드는 경우 SDP에서 요구하는 UUID를 제공해야합니다. 그렇지 않으면 서비스가 검색되지 않습니다.
nullpotent

3
웹에서 이것을 찾았습니다. 모두?? BT 용 UUID. sviluppomobile.blogspot.de/2012/11/…
Orri

Link is dead-일반적인 UUID 목록 이었습니까?
user1725145

7

UUID는 인터넷의 포트 번호와 개념이 비슷합니다. 그러나 Bluetooth와 인터넷의 차이점은 Bluetooth에서 각 UUID에 포트 번호가 부여되는 런타임 동안 SDP (서비스 검색 프로토콜) 서버가 포트 번호를 동적으로 할당한다는 것입니다. 다른 장치는 예약 된 포트 번호로 등록 된 SDP 서버에게 해당 장치에서 사용 가능한 서비스에 대해 물어보고 다른 UUID에 등록되어 서로 구별 가능한 다른 서비스로 응답합니다.


4

UUID는 숫자 일뿐입니다. Android 앱의 서버 측에서 생성하는 것 외에는 의미가 없습니다. 그런 다음 클라이언트는 동일한 UUID를 사용하여 연결합니다.

예를 들어 서버 측에서 먼저 uuid = UUID.randomUUID ()를 실행하여 fb36491d-7c21-40ef-9f67-a63237b5bbea와 같은 난수를 생성 할 수 있습니다. 그런 다음 저장하고 다음과 같이 리스너 프로그램에 하드 코드하십시오.

 UUID uuid = UUID.fromString("fb36491d-7c21-40ef-9f67-a63237b5bbea"); 

Android 서버 프로그램은 다음과 같이 해당 UUID로 들어오는 요청을 수신합니다.

    BluetoothServerSocket server = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("anyName", uuid);

BluetoothSocket 소켓 = server.accept ();


1

요약하자면 : UUid애플리케이션을 고유하게 식별하는 데 사용됩니다. 각 응용 프로그램에는 고유 한UUid

따라서 UUid각 장치에 대해 동일하게 사용하십시오.


0

UUID는 Universally Unique Identifier를 나타냅니다. UUID는 전 세계에 고유하게 배포 된 단순한 128 비트 숫자입니다.

블루투스는 무선으로 데이터를 전송하고 주변의 모든 장치에서 데이터를 수신 할 수 있습니다. 때로는 Bluetooth를 통해 중요한 파일을 보내야하고 주변의 모든 장치가 범위 내에서 액세스 할 수 있다고 가정 해 보겠습니다. 따라서 다른 장치와 페어링 할 때 파일을 공유하기 전에 UUID 번호를 공유하고 일치시킵니다. 파일을 보낼 때 장치는 적절한 장치 UUID로 해당 파일을 암호화하고 네트워크를 통해 공유합니다. 이제 범위 내의 모든 Bluetooth 장치가 암호화 파일에 액세스 할 수 있지만 올바른 UUID 번호가 필요합니다. 따라서 올바른 UUID 장치 만 파일을 암호화 할 수 있으며 다른 장치는 잘못된 UUID의 원인을 거부합니다.

간단히 말해 UUID를 두 Bluetooth 장치간에 파일을 공유하기위한 비밀 암호로 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.