Проблема связи между устройствами Wi-Fi - PullRequest
6 голосов
/ 15 сентября 2011

Я написал код в своем приложении, чтобы включить Wi-Fi-соединение между устройствами (передача только текста / строки). Код такой же, как в примере Apple Witap Приложение, которое загружается из Developer.Apple. ком.

Хорошо работает в моей сети, а также в других сетях.

Однако на моем клиентском сайте это не работает.

Я провел время на сайте Клиента, чтобы решить проблему с устройствами, которые не общаются друг с другом, и это то, что я обнаружил. Они в своей настройке безопасности блокируют одноранговую связь… », и моя связь с устройством идентифицируется как одноранговая.

Есть ли способ решить эту проблему Есть ли что-нибудь кроме Wi-Fi связи PEER 2 PEER, которую поддерживает Apple?

Прототип WIFI-приложений Рабочие понятия


В приложении WiFi в основном четыре класса, называемых AppController, Picker, BrowserViewController, TCP Server.

При загрузке приложения класс AppController будет инициализировать NSInputStraem и NSOutPut Stream.

А также он вызовет метод start из класса TcpServer для установки номера порта.

После того, как он вызовет метод enableBounjourWithDomain из класса TcpServer.

Вышеупомянутый вызов метода с параметром, называемым идентификатором (это общее имя, например: WiTap), и отправитель ищет устройства с этим общим идентификатором.

После выполнения этого метода устройство отправителя может идентифицировать наше устройство и может подключиться.

Получение собственного имени устройства


Tcp serverServer делегат «DidEnabledBounjer» будет работать после выполнения вышеуказанного кода и даст текущее имя устройства.

Затем делегат NSNetservice «didFindService» будет работать (он будет работать при обнаружении каждой службы) и извлекать имя обнаруженной службы.

После получения нового имени службы мы проверим, совпадает ли оно с именем нашего устройства, которое мы получили от делегата DidEnabledBounjer.

в противном случае имя новой службы будет добавлено в массив NSMutable, называемый службами.

Затем массив сервисов привязывается к представлению Table, и мы можем увидеть список обнаруженных имен устройств.

обнаружение новых устройств:


Нет настроек таймера для обнаружения новых устройств.

Когда новое устройство подключено к той же сети WiFi, делегат «DidFindservice» сработает (это делегат NSNetservice, реализованный в классе BrowserViewController).

DidFindservice даст новое имя устройства. После его получения мы проверим, совпадает ли оно с именем нашего устройства, которое мы получили от делегата «DidEnabledBounjer».

в противном случае имя службы будет добавлено в массив NSMutable с именем services.

Затем отсортируйте все обнаруженные имена устройств в соответствии с именем устройства и перезагрузите табличное представление.

Работа после выбора имени устройства в табличном представлении


После нажатия на имя устройства в TableView оно вызовет делегат didSelectRowAtIndexPath, который реализован в классе BrowserViewController (это делегат класса TableView).

Он выберет имя NetService из нашего массива сервисов (содержит все обнаруженные сервисы) в соответствии с индексом TableView и установит результирующий NSService в качестве Текущего сервиса.

Запустить делегат didResolveInstance, и он установит значения InPutStream и OutPutStream.

После получения значений для InPutStream и OutPutStream будет вызван метод «OpenStream» для открытия потоков ввода и вывода.

Наконец, он освобождает объекты NSService и Picker и готов к отправке сообщений с выбранных устройств.

Рабочая кнопка отправки


Вызовите функцию «отправить» из BrowserViКласс ewController со строковым параметром. Это может быть ввод текста пользователем или сгенерированная строка после распознавания речи.

Преобразовать входную строку в тип данных uint_8 и отправить ее на приемное устройство.

Работа со стороны приемника


Когда данные поступают на приемное устройство, запускается делегат «TcpServerAcceptCallBack» (реализован в классе TcpServer).

Он будет вызывать метод DidAcceptConnectionForServer из запроса BrowserViewControll через другого делегата класса TcpServer с именем «HandleNewConnectionFromAddress».

Запустите «делегат дескриптора потока», который находится в классе «AppController», и он проверит, есть ли укусы или нет.

Если доступны байты, преобразуйте данные типа uint_8 в строку, и мы отобразим результирующую строку в текстовом поле получателя.

А также загрузка изображений и отображение их в представлении изображений из AppBundle с использованием результирующей строки.

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

В исходной сети WiTap / TCPServer.m порт сокета установлен на ноль (= ядро ​​выбирает номер порта, и его значение превышает 50000).Вы можете изменить это значение на 0, например, 81, и любопытная настройка безопасности больше не будет классифицировать вас как peer2peer.Любое значение от 1 до 1023 должно работать.

0 голосов
/ 16 сентября 2011

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

Начните с простого пинга и перейдите к уровням UDP и TCP. Вы можете обнаружить, что разрешена какая-либо форма общения.

Если нет, вы можете попросить их сотрудников службы безопасности принять некоторую форму связи между определенным диапазоном IP-адресов и / или номеров портов и соответствующим образом адаптировать ваше приложение.

...