2013-07-26 2 views
8

네트워크 서비스 발견을 사용하는 응용 프로그램을 빌드하기 위해 노력하고 있습니다. 이 게시물 http://developer.android.com/training/connect-devices-wirelessly/nsd-wifi-direct.html을 따라 갔고 응용 프로그램이 작동하지만 아래에 표시된 코드를 기반으로 몇 가지 질문이 있습니다.네트워크 서비스 발견 안드로이드

WifiP2pDnsSdServiceInfo.newInstance ("_ test", "_presence._tcp", record);

레코드은 많은 양의 데이터를 보유 할 수 없습니다. 예를 들어 레코드 크기가 20이면 정보가 전달되지 않습니다. 크기 제한에 대해 저에게 말씀해 주시겠습니까? 얼마나 많은 데이터를 보낼 수 있습니까?

서비스 유형에 대한 내용이 명확하지 않음 _ presence._tcp. 특정 공급 업체입니까? 지원되는 서비스 유형 목록은입니다. 서비스 유형에 따라 보낼 수있는 정보의 양이 결정됩니까? 그렇다면 좋은 크기의지도를 보내는 데 바람직한 서비스 유형입니다.

업데이트 :이 초안을 http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt에서 확인했으며 섹션을 참조하십시오. 6.2 DNS-SD TXT 레코드 크기. "일반적인 DNS-SD TXT 레코드의 전체 크기는 작게는 - 200 바이트 이하로 작정됩니다. 더 많은 데이터가 정당화되는 경우 (예 : LPR 인쇄 [BJP]) 크기 제한이 작은 것으로 보입니다. , 총 크기를 400 바이트 미만으로 유지하면 단일 512 바이트 DNS 메시지에 맞춰야합니다. " 이견있는 사람?

+1

아마도, 내 [관련 질문에 대한 대답은] (http://stackoverflow.com/a/19356052/1102014) 도움 될 수있다. – Stan

답변

3

나는 Java/Android의 초보자이지만 실험을 수행 할 수있었습니다.

DNS 서비스 API는 레코드에 대해 <String, String>의 맵을 필요로합니다. 전적으로 데이터에 중점을 두려는 경우 한 쌍만 사용하고 키를 ""로 설정합니다. 이 경우 92자를 전송할 수 있습니다.

record.put("", "123456789"); 

이것은 공중에서 보낼 수있는 (또는받는 것이 더 좋은) 최대 값입니다. 내가 바이너리 데이터를 보내고 싶다면 어떻게 될까 궁금했다. 대신 Stringbyte[] 배열을 사용하는 것은 좋은 생각 (충돌)하지 그래서 우리는 문자열을 고수해야한다 : 흥미롭게

record.put("", "\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u1234\u5678\u9012\u3456\u7890\u1234\u5678"); 

, 이것은 당신이 (30 개 유니 코드 문자/60 바이트)를 보낼 수있는 최대입니다. 그 이유는 Wi-Fi API가 모든 문자열을 UTF-32로 변환하는 것 같습니다. 즉 첫 번째 예제에서는 ASCII 값만 사용했지만 (예 : UTF-32 한 문자 = 한 바이트) 두 번째 예제는 0x8000 - 0xffff (즉 UTF-32 한 문자 = 3 바이트). 당신이 수학을하는 경우

, 당신은 30 × 3 바이트 = 90 바이트를 참조 즉이 2 바이트 (문자) 왼쪽 indeeed되어야한다 :

record.put("", "\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u0031\u0032"); 

여전히 92 바이트의 한계에 도달, 작업 . 3 바이트 값으로 인코딩되어 더 이상 작동하지 않으므로 일반 데이터 (예 : 0x1234)에 여분의 2 바이트를 사용할 수 없습니다.

흥미로운 질문은 데이터가 2 진법을 사용하여 더 잘 인코딩되는지 아니면 base64와 같은 것을 사용하여 더 잘 인코딩되는지 여부입니다. Wikipedia에 따르면 base64는 3 옥텟을 4 개의 인코딩 된 문자로 변환합니다. 즉 92 ASCII 문자의 경우 69 바이트의 데이터를 얻을 수 있기 때문에이 작은 데이터 세트에 대해 base64 렌더링이 훨씬 효율적입니다.

1

내가 아는 한 Android NSD API에는 txt 레코드가 제대로 지원되지 않습니다.

내가 txtrecords를 사용해야하는 최근 프로젝트에 대해 jmdns으로 전환하라는 메시지가 표시됩니다. jmdns 사용에 대한

자세한 내용은 여기에서 찾을 수 있습니다 : http://home.heeere.com/tech-androidjmdns.html

관련 문제