连接你的应用程序到一个Wi-Fi设备

原文来自: Android Developers Blog —— Connecting your App to a Wi-Fi Device

随着物联网的逐步成长,Android应用能够连接到Wi-Fi设备也越来越普遍。无论你是在创建一个远程取景器的应用,去设置连接到灯泡,或者是去控制一个四轴飞行器。如果它是依靠Wi-Fi你将需要连接到一个热点,或许这个热点不需要有internet网络连接访问。

从棒棒糖版本开始往前的系统变得更加智能了,允许多重网络连接且不会讲数据路由到一个不具有internet连接的网络。那样对用户来说非常有用,因为当他们附近的WIFI接近阳台的时候不会丢失连接。为开发者已经添加了数据路由接口文档(Data routing APIs),因此,你能够确保只有适当的应用程序的流量路由通过Wi-Fi连接到已经存在的设备上。

对于使用这个接口文档,理解起来也是非常简单的。这儿有3中网络设置对于开发者可以使用,知道这些就好了:

  • WiFiManager#开始扫描(startScan)返回一个可用Wi-Fi网络列表清单,它们是通过是私有的SSID来确定的。
  • WiFiManager#获取网络配置(getConfiguredNetworks)在设备上返回一个Wi-Fi网络配置列表清单,同时通过SSID来作为索引,但是它们不一定当前可以使用。
  • ConnectivityManager#获取所有的网络(getAllNetworks)返回一个通过手机正在互动的网络列表,从棒棒糖版本开始往前这是必要的,一个设备一次或去连接到了多重网络,Wi-FI、LTE、Bluetooth等等,通过调用ConnectivityManager#getNetworkInfo)和一个网络ID是可以确认每个的当前状态是可用的。

你可以在所有的Android版本中通过使用WiFiManager#startScan)去扫描可用的Wi-Fi网络,遍历ScanResults去查找你外部Wi-Fi设备的SSID。一旦你发现了它,你能够检查,如果它已经利用WiFiManager#getConfiguredNetworks)配置了一个网络,并通过WifiConfigrations遍历返回,和SSID进行匹配。那些SSIDs配置的网络是用双引号括起来的就需要值得去注意了,而所述的SSID在ScanResults中返回的不是。

如果你的网络配置了,你能够从WifiConfiguration对象里面去获取这个网络的ID,除此之外,你能够使用WifiManager#addNetwork)配置它,保持网络id追踪,那样可以返回。

对于连接到Wi-Fi网络,注册一个对于WifiManager.NETWORK_STATE_CHANGED_ACTION的BroadcastReceiver的监听,并且然后调用WifiManager.enableNetwork(int netId,boolean disableOthers)),通过在你的网络ID。对于下一次的扫描,该enableNetwork禁用了所有其他访问点,定位到你所请求的那一个,然后连接它。当你收到了网络广播的时候,你可以使用WifiManager#getConnectionInfo)检查,你将成功的连接到正确的网络。但是,在棒棒糖及其以上,如果那个网络没有internet网络连接,请求将不会被路由到它上面。

路由网络请求

从你的应用程序到一个已存在的Wi-Fi设备,面对所有网络的请求,在棒棒糖设备上调用ConnectivityManager#setProcessDefaultNetwork),在棉花糖设备上调用ConnectivityManager#bindProcessToNetwork)代替,这是一个直接的API替代。注意这里调用需要请求android.permission.INTERNET,否则它们将会返回false。

另外,如果你喜欢你的应用程序传输到Wi-Fi设备和一些Internet网络通过移动数据路由:

  • 对于Http请求你能够使用Network#openConnection(java.net.URL)),直接路由你的请求到这个网络。
  • 对于低等级的Socket套接字交互,打开一个socket套接字,然后调用Network#bindSoket(java.net.Socket)),或者另外使用Network#getSocketFactory)。

现在你能够保持你的用户连接,让他们从创新的Wi-Fi功能产品中受益。

以上是对Anroid 官网博客文章的翻译,如果不足,欢迎指正,谢谢。

if (本文对您有用) { Pay (请随意¥打赏) } else { Commit feedback (底部评论区提交建议、反馈) } 感谢支持!