Обнаружение сетевых служб Android

Я работаю над созданием приложения, использующего обнаружение сетевых служб. Я следил за этим сообщением http://developer.android.com/training/connect-devices-wireless/nsd-wifi-direct.html, и приложение работает, но у меня есть пара вопросов, основанных на приведенном ниже коде.

WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", запись);

Похоже, запись не может содержать много данных. Например, если размер записи равен 20, информация не отправляется. Можете ли вы сказать мне об ограничении размера? Какой объем данных я могу отправить?

Мне не совсем понятны доступные типы служб, такие как _presence._tcp. Это зависит от поставщика? Будет полезно узнать список поддерживаемых типов служб. Определяет ли тип услуги количество информации, которую я могу отправить? Если да, то какие типы услуг предпочтительнее для отправки карты хорошего размера.

Обновление: я проверил этот черновик по адресу http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt и см. раздел 6.2 Размер записи DNS-SD TXT. Похоже, что ограничение по размеру невелико, как указано: «Общий размер типичной записи TXT DNS-SD должен быть небольшим — 200 байт или меньше. В случаях, когда оправдано большее количество данных (например, печать LPR [BJP]), сохранение общего размера менее 400 байт должно позволить ему поместиться в одно 512-байтовое сообщение DNS». Есть предположения?


person ZakiMak    schedule 26.07.2013    source источник
comment
Возможно, мой ответ на соответствующий вопрос может оказаться полезным.   -  person Stan    schedule 11.11.2013


Ответы (2)


Я новичок в Java/Android, но мне удалось провести некоторые эксперименты.

API службы DNS ожидает карту <String, String> для record. Если мы хотим сосредоточиться исключительно на данных, мы используем только одну пару и устанавливаем ключ на «». В этом случае можно передать 92 символа:

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

Это максимум, который вы можете отправить (или, лучше сказать, получить) по воздуху. Мне было любопытно, что произойдет, если я захочу отправить какие-то двоичные данные. Использование массива byte[] вместо String не очень хорошая идея (сбой), поэтому мы должны придерживаться строк:

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 символов Unicode/60 байт). Причина в том, что API Wi-Fi, по-видимому, преобразует все строки в UTF-32, т. е. в то время как в первом примере использовались только значения ASCII (т. е. в UTF-32 один символ = один байт), во втором примере использовались все значения из диапазона 0x8000 - 0xffff (т.е. в UTF-32 один символ = 3 байта).

Если вы посчитаете, то увидите, что 30 x 3 байта = 90 байт, т.е. должно остаться 2 байта (символа) и действительно:

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 байта. Обратите внимание, что вы не можете использовать два свободных байта для общих данных (например, что-то вроде 0x1234), потому что они кодируются как 3-байтовые значения, и это больше не будет работать.

Интересный вопрос заключается в том, лучше ли кодировать данные с помощью двоичного метода или с использованием чего-то вроде base64. Википедия говорит, что base64 преобразует три октета в четыре закодированных символа, то есть для 92 символов ASCII мы получим 69 байт данных, что делает base64 намного более эффективным для этого небольшого набора данных.

person Miro Kropacek    schedule 17.02.2014

Насколько мне известно, в Android NSD Api отсутствует надлежащая поддержка txt-записей.

Это побудило меня переключиться на jmdns для недавнего проекта, в котором мне нужно было использовать txtrecords.

Дополнительную информацию об использовании jmdns можно найти здесь: http://home.heeere.com/tech-androidjmdns.html

person Daniel Blake    schedule 10.10.2014