将iPhone连接到Android的Wifi Direct软AP

16

我知道Wifi Direct通过在其中一个设备中创建软件接入点(Soft AP)来实现功能。我还知道许多Android支持Wifi Direct,但iPhone不支持。

我的问题是:是否可能在Android侧创建一个设备到设备的Wifi Direct链接,而在iPhone侧使用常规wifi连接?其中Android的Wifi Direct将呈现一个软AP,iPhone将无法区分该AP与常规AP,并能够关联到它。

想象一下,这是在野外没有路由器AP可用的情况下使用。此外,两个用户都没有数据共享计划(tethering plan)。

这个链接将被Bump类似的应用程序用于传输文件。


伟大的想法...期待答案... - P R J
我认为这是不可能的,至少不设置移动热点就不行。 - Richard J. Ross III
相关问题:https://dev59.com/qmkw5IYBdhLWcg3wkLb2 - AlcubierreDrive
嘘,不要告诉苹果 ;) - AlcubierreDrive
1个回答

11

根据您的手机,您可以将Android手机设置为便携式热点,然后使用iPhone连接到该热点。从那里开始,应用程序特定于数据传输。

但是,您还可以使用Android的WiFi-Direct库。在这种情况下,您将使用它们来设置Android手机创建“群组所有者”,其基本上与它成为便携式热点相同。请查看:

http://developer.android.com/guide/topics/connectivity/wifip2p.html

我会给你一个代码示例来帮助你入门。

public class WifiDirectAPtestActivity extends Activity 
{
private WifiP2pManager manager;
private boolean isWifiP2pEnabled = false;
private boolean retryChannel = false;

private final IntentFilter intentFilter = new IntentFilter();
private Channel channel;
private BroadcastReceiver receiver = null;

public void setIsWifiP2pEnabled(boolean isWifiP2pEnabled) {
    this.isWifiP2pEnabled = isWifiP2pEnabled;
}
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 // add necessary intent values to be matched.

    intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
    intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

    manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    channel = manager.initialize(this, getMainLooper(), null);
}
/** register the BroadcastReceiver with the intent values to be matched */
@Override
public void onResume() {
    super.onResume();
    receiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
    registerReceiver(receiver, intentFilter);
    createGroup();
}

@Override
public void onPause() {
    super.onPause();
    unregisterReceiver(receiver);
    manager.removeGroup(channel, new ActionListener() {

        @Override
        public void onFailure(int reasonCode) {
            Log.d("WifiDirectAptestActivity", "Disconnect failed. Reason :" + reasonCode);

        }

        @Override
        public void onSuccess() {
            Log.d("WifiDirectAptestActivity", "Should have been sucessfully removed");
        }

    });
}
public void createGroup()
{
    manager.createGroup(channel, new ActionListener() {

        @Override
        public void onSuccess() {
            // WiFiDirectBroadcastReceiver will notify us. Ignore for now.
            Log.d("WifiDirectAPtestActivity", "Group creating request successfully send");
        }

        @Override
        public void onFailure(int reason) {
            Toast.makeText(WifiDirectAPtestActivity.this, "Connect failed. Retry.",
                    Toast.LENGTH_SHORT).show();
        }
    });
}

另外您需要广播接收器,在WiFi-Direct演示中查看即可了解清楚。

请注意,manager.createGroup(channel,new ActionListener()是感兴趣的代码行,正是这一行设置了设备作为便携式热点。

希望这样能澄清事情,我不知道您需要多详细的解释。如果有些东西不清楚,请留言。


我会尝试让您的示例代码适用于我连接 iPhone 的用例。如果遇到问题,我会在评论中提出问题,成功后我会接受您的答案。非常感谢! :) - AlcubierreDrive
1
看起来最重要的一行是“manager.createGroup(channel, new ActionListener() {logging code}”。在您的答案中明确突出这一行可能会很好,这样读者就不必浏览冗长的样板以找到关键行。 - AlcubierreDrive
1
是的,抱歉,我想我应该这样做。祝你的项目好运! :) - Nils Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接