Ответ 1
Подумайте об этом немного, как о разнице между открытием TCP-соединения с портом, который вы указываете по номеру, и откройте его для порта, который вы ищете по имени от /etc/services
.
createRfcommSocketToServiceRecord
принимает UUID, который вы передаете, и использует SDP для определения того, какой радиоканал используется для соединения. Он также проверяет, что сервер прослушивает удаленную конечную точку, с тем же UUID. Таким образом, это самый надежный способ получить соединение: он всегда будет использовать правильный канал, и если открытие соединения будет успешным, вы знаете, что что-то на другом конце может понять ваш протокол.
Напротив, createRfcommSocket
просто подключается к каналу, который вы ему рассказываете. Там нет способа узнать, слушает ли что-нибудь на удаленной конечной точке: вы знаете, что устройство есть. Кроме того, ваш выбор радиоканала может быть совершенно неуместным. Вот почему эта функция не публикуется в API, а другая функция предпочтительнее.
createRfcommSocket
может показаться на первый взгляд более надежным, но это связано с тем, что он не проверяет наличие слушателя на другой конечной точке: он игнорирует некоторые случаи ошибок. Это может быть хорошо для экспериментов, но это бесполезно для производственной системы, потому что часто пользователь забудет запустить сервер на другой конечной точке, и ваше приложение не будет запутывать.
Конечно, поскольку createRfcommSocket
не публикуется в API, у вас нет гарантии, что он будет продолжать работать вообще в будущих версиях Android.