登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 994818|回复: 16

Android Wifi获取组播

[复制链接]

206

主题

1622

帖子

2721

安币

Android大神

Rank: 6Rank: 6

发表于 2011-11-10 10:29:04 | 显示全部楼层 |阅读模式

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写的比较简单:

  1. public class MulticastDemoActivity extends Activity {
  2.    
  3.     MulticastLock multicastLock;
  4.    
  5.     /** Called when the activity is first created. */
  6.     @Override
  7.     public void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         setContentView(R.layout.main);
  10.         
  11.         allowMulticast();
  12.         
  13.         try {
  14.             NetUtil.findServerIpAddress();
  15.         } catch (IOException e) {
  16.             throw new RuntimeException(e);
  17.         }
  18.         
  19.         Log.d("multicast.demo", "find ip ok.");
  20.         
  21.         multicastLock.release();
  22.     }
  23.    
  24.     private void allowMulticast(){
  25.         WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
  26.         multicastLock=wifiManager.createMulticastLock("multicast.test");
  27.         multicastLock.acquire();
  28.     }
  29. }
复制代码
在Activity中打开和释放组播锁。使用组播发送报文和接收ip地址信息的工具类代码:
  1. public class NetUtil {
  2.    
  3.     private static final String TAG="Net.Utils";
  4.     private static final int MULTICAST_PORT=5111;
  5.     private static final String GROUP_IP="224.5.0.7";
  6.     private static byte[] sendData;
  7.    
  8.     static{
  9.         sendData=new byte[4];
  10.         // 0xEE78F1FB
  11.         sendData[3] = (byte) 0xEE;
  12.         sendData[2] = (byte) 0×78;
  13.         sendData[1] = (byte) 0xF1;
  14.         sendData[0] = (byte) 0xFB;
  15.     }
  16.    
  17.     public static String findServerIpAddress() throws IOException{
  18.         String ip=null;

  19.         MulticastSocket multicastSocket=new MulticastSocket(MULTICAST_PORT);
  20.         multicastSocket.setLoopbackMode(true);
  21.         InetAddress group = InetAddress.getByName(GROUP_IP);
  22.         multicastSocket.joinGroup(group);
  23.         
  24.         DatagramPacket packet=new DatagramPacket(sendData, sendData.length,group,MULTICAST_PORT);
  25.         
  26.         for(;;){
  27.             multicastSocket.send(packet);
  28.             Log.d(TAG,">>>send packet ok");
  29.             
  30.             byte[] receiveData=new byte[256];
  31.             packet=new DatagramPacket(receiveData, receiveData.length);
  32.             multicastSocket.receive(packet);
  33.             
  34.             String packetIpAddress=packet.getAddress().toString();
  35.             packetIpAddress=packetIpAddress.substring(1, packetIpAddress.length());
  36.             Log.d(TAG,"packet ip address: "+packetIpAddress);
  37.             
  38.             StringBuilder packetContent=new StringBuilder();
  39.             for(int i=0;i<receiveData.length;i++){
  40.                 if(receiveData[i]==0){
  41.                     break;
  42.                 }
  43.                 packetContent.append((char)receiveData[i]);
  44.             }
  45.             ip=packetContent.toString();
  46.             Log.d(TAG,"packet content ip is: "+ip);
  47.             
  48.             if(ip.equals(packetIpAddress)){
  49.                 Log.d(TAG,"find server ip address: "+ip);
  50.                 break;
  51.             }else{
  52.                 Log.d(TAG,"not find server ip address, continue …");
  53.                 try {
  54.                     Thread.sleep(1000);
  55.                 } catch (InterruptedException e) {
  56.                 }
  57.             }
  58.         }
  59.         
  60.         return ip;
  61.     }
  62. }
复制代码


0

主题

11

帖子

6

安币

初级码农

Rank: 1

发表于 2012-3-27 05:30:33 | 显示全部楼层
:D 多谢分享

0

主题

40

帖子

30

安币

初级码农

Rank: 1

QQ达人

发表于 2012-5-21 22:13:33 | 显示全部楼层
{:Caca:}谢谢咯。。。。。。。。。。。。。

12

主题

830

帖子

1659

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2012-7-26 17:04:18 | 显示全部楼层
{:Bye:}{:Bye:}{:Bye:}
我的游戏,大家捧场下,顺便帮我来点评论谢谢!!!http://u.360.cn/detail.php?s=web&sid=1988071

0

主题

37

帖子

62

安币

程序猿

Rank: 2

发表于 2012-12-18 15:27:56 | 显示全部楼层
{:Nose:}{:Skateboard:}

28

主题

1万

帖子

1383

安币

Android大神

小白

Rank: 6Rank: 6

发表于 2012-12-20 15:37:56 | 显示全部楼层
不错。谢谢分享!{:Jump:}

0

主题

81

帖子

21

安币

初级码农

Rank: 1

QQ达人

发表于 2013-1-5 16:36:07 | 显示全部楼层
{:Bye:}{:Bye:}{:Bye:}{:Big Chin 2:}{:Big Chin:}{:Cry:}

0

主题

30

帖子

1

安币

初级码农

Rank: 1

发表于 2013-1-5 17:21:58 | 显示全部楼层
kankan  xuexixia
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表