Android的Wifi,默认情况下是不接受组播的,见:http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html
默认情况下,应用是不接收组播信息的,这样要接收处理的报文太多,很快就会把电池用尽。要知道移动设备(特指电话一类的,平板要好得多)目前最重要的因素是电量。
要想打开组播功能,有以下几个步骤:
在Manifest文件中加入:android.permission.CHANGE_WIFI_MULTICAST_STATE,这个权限
获取到MulticastLock对象,这个对象不能直接实例化,要通过WifiManager间接得到,工厂模式
调用MulticastLock对象的acquire方法,获取到组播锁
相应的,用完组播,为了不浪费电力,要调用MulticastLock的release方法释放锁
下面写了个简单示例,通过组播发现服务器。
Activity写的比较简单:
public class MulticastDemoActivity extends Activity {
MulticastLock multicastLock;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
allowMulticast();
try {
NetUtil.findServerIpAddress();
} catch (IOException e) {
throw new RuntimeException(e);
}
Log.d("multicast.demo", "find ip ok.");
multicastLock.release();
}
private void allowMulticast(){
WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
multicastLock=wifiManager.createMulticastLock("multicast.test");
multicastLock.acquire();
}
}
在Activity中打开和释放组播锁。
使用组播发送报文和接收ip地址信息的工具类代码
public class NetUtil {
private static final String TAG="Net.Utils";
private static final int MULTICAST_PORT=5111;
private static final String GROUP_IP="224.5.0.7";
private static byte[] sendData;
static{
sendData=new byte[4];
// 0xEE78F1FB
sendData[3] = (byte) 0xEE;
sendData[2] = (byte) 0×78;
sendData[1] = (byte) 0xF1;
sendData[0] = (byte) 0xFB;
}
public static String findServerIpAddress() throws IOException{
String ip=null;
MulticastSocket multicastSocket=new MulticastSocket(MULTICAST_PORT);
multicastSocket.setLoopbackMode(true);
InetAddress group = InetAddress.getByName(GROUP_IP);
multicastSocket.joinGroup(group);
DatagramPacket packet=new DatagramPacket(sendData, sendData.length,group,MULTICAST_PORT);
for(;;){
multicastSocket.send(packet);
Log.d(TAG,">>>send packet ok");
byte[] receiveData=new byte[256];
packet=new DatagramPacket(receiveData, receiveData.length);
multicastSocket.receive(packet);
String packetIpAddress=packet.getAddress().toString();
packetIpAddress=packetIpAddress.substring(1, packetIpAddress.length());
Log.d(TAG,"packet ip address: "+packetIpAddress);
StringBuilder packetContent=new StringBuilder();
for(int i=0;i<receiveData.length;i++){
if(receiveData[i]==0){
break;
}
packetContent.append((char)receiveData[i]);
}
ip=packetContent.toString();
Log.d(TAG,"packet content ip is: "+ip);
if(ip.equals(packetIpAddress)){
Log.d(TAG,"find server ip address: "+ip);
break;
}else{
Log.d(TAG,"not find server ip address, continue …");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
return ip;
}
}
分享到:
相关推荐
1.android中获取wifi列表简单示例 2.根据信号级别显示不同网络图标
Android wifi 获取信号 ssid 强度 等 可自动刷新
本文实例讲述了Android编程获取Wifi名称(SSID)的方法。分享给大家供大家参考,具体如下: 可以使用WifiManager和WifiInfo来获取当前Wifi连接信息 WifiManager wifiManager = (WifiManager) getSystemService(WIFI_...
Android中获取GSM、CDMA、Wifi信号强度。 Android中获取GSM、CDMA、Wifi信号强度
android wifi连接打印机并获取打印机状态 博客地址http://blog.csdn.net/jinfulin/article/details/52622055
获取带有以太网接口的android系统中ethernet和wifi连接信息(连接状态,IP地址,dns,netmask等信息)
自己在网上资源找到的资料在整合的,很基础
Android Wifi开发的Demo程序,包括Wifi的搜索、连接、数据的传输。
android获取wifi的IP,子网掩码,网关,dns等信息
Android wifi测试demo,获取wifi信息,信号强度等等,模拟系统wifi列表,通信
android wifi 视屏传输,可以实现手机和手机之间的传输。、
android wifi列表显示,点击输入密码连接,断开,打开wifi开关,自动识别连接
对熟悉手机平板等Android设备的WIFI驱动移植和驱动调试很有帮助
android获取wifi强度,通过广播监听wifi信号强度的变化.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Android获取本地Wifi的Mac地址[实测MIUI Android8.1]
通过listfragment框架为基础获取wifi列表,适合新手用来学习了解。功能很简单,实现也很简单,通过在demo中练习一下自己的一些基础知识
Android Wifi模块,实现了一些wifi常用的接口封装,可以实现wifi密码连接是否成功,wifi的加密发誓,wifi的(有无)密码连接等等。
判断WIFI是否开启,开启后自动扫描周围热点,选择热点后输入密码连接
android,demo,获取Wifi名称即SSID