Можем ли мы отправить данные с устройства Android на другое устройство Android напрямую (p2p) без сервера в середине?
Мне нужно отправить данные с одного устройства Android на другое устройство Android напрямую (p2p) после того, как они найдут друг друга через сервер. Я прочитал некоторые вещи, которые это не может быть сделано, но я не понимаю, почему устройство, которое может получить доступ к Интернету (у него есть IP-адрес?) Не может создать одноранговое соединение? Если это невозможно, почему? а если это как?
PS: я знаю, что без Интернета мы не сможем этого достичь, вопрос предполагает, что обе цели имеют подключение к Интернету, либо gprs/3g/4g, либо подключение к Wi-Fi!
Примечание: я хочу, чтобы это было возможно как по Wi-Fi, так и по интернету без Wi-Fi!
4 ответа
Я имел успех в прошлом, используя PubNub для этого случая. Я использовал подобные методы при сборке Mote.io.
Я всегда думал, что это глупо, что телефоны не могут легко подключиться к одноранговой сети, но вы можете эмулировать такого рода связь с третьей стороной между ними. Преимущество использования размещенного сервиса, такого как PubNub, заключается в том, что он работает в Wi-Fi и сотовых сетях и способен работать с плохими или разорванными соединениями.
Java SDK
Вы можете использовать PubNub Android SDK для Android, чтобы подписываться и публиковать каналы в сети PubNub. Все сети позаботятся, ваши единственные проблемы - каналы и сообщения.
Следующий пример взят из учебника по Android SDK, найденного здесь.
Подписывайся
Здесь начинается самое интересное! Если мы хотим получать сообщения от канала, нам нужно подписаться на канал. Для этого все, что нам нужно сделать, это использовать метод subscribe() и предоставить имя канала. Мы будем использовать hello_world для названия канала.
Нам также нужно определить объект обратного вызова, который будет передан в качестве параметра в метод subscribe(). Методы из объекта обратного вызова будут вызываться при таких событиях, как получение сообщения, ошибка, подключение, отключение, повторное подключение:
try {
pubnub.subscribe("hello_world", new Callback() {
@Override
public void connectCallback(String channel, Object message) {
Log.d("PUBNUB","SUBSCRIBE : CONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
}
@Override
public void disconnectCallback(String channel, Object message) {
Log.d("PUBNUB","SUBSCRIBE : DISCONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
}
public void reconnectCallback(String channel, Object message) {
Log.d("PUBNUB","SUBSCRIBE : RECONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
}
@Override
public void successCallback(String channel, Object message) {
Log.d("PUBNUB","SUBSCRIBE : " + channel + " : "
+ message.getClass() + " : " + message.toString());
}
@Override
public void errorCallback(String channel, PubnubError error) {
Log.d("PUBNUB","SUBSCRIBE : ERROR on channel " + channel
+ " : " + error.toString());
}
}
);
} catch (PubnubException e) {
Log.d("PUBNUB",e.toString());
}
Публиковать
Теперь пришло время найти наш голос. Пришло время отправить сообщение всем, кто подписан на демо канала. Сначала мы подпишемся, как мы делали в Шаге 3, только на этот раз мы определим канал как демо. Как только мы подписались на канал, все что нам нужно сделать, это использовать метод publish(). Мы укажем название канала, сообщение, которое мы хотим отправить. Мы также включим объект обратного вызова.
Callback callback = new Callback() {
public void successCallback(String channel, Object response) {
Log.d("PUBNUB",response.toString());
}
public void errorCallback(String channel, PubnubError error) {
Log.d("PUBNUB",error.toString());
}
};
pubnub.publish("demo", "Hello World !!" , callback);
Вам не нужно иметь интернет, вы можете сделать это в локальной сети, чтобы передавать данные между двумя устройствами Android, устройства должны быть подключены к одной локальной сети, а затем на одном устройстве вам нужно создать серверный сокет, а на другом устройстве у вас есть для создания клиентского сокета. Таким образом, два устройства могут обмениваться данными друг с другом, для создания локальной сети достаточно маршрутизатора Wi-Fi.
Android NSD API предназначен для того же, чего вы пытаетесь достичь! Пример в комплекте с SDK говорит сам за себя!
пожалуйста, проверьте:
[Пример Android NSD API] ( http://developer.android.com/training/connect-devices-wirelessly/nsd.html) и [здесь] ( Android - связь между двумя устройствами)
Вы должны использовать методологию push-уведомлений. нет без интернета этого не добиться.