`
huahua09
  • 浏览: 46916 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android Wifi获取组播

 
阅读更多
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;   
    }   
}  
分享到:
评论

相关推荐

    Android WIFI直连源码

    1. 初始化:首先,我们需要获取`WifiP2pManager`实例,通常在Service或Activity中初始化。这可以通过`getSystemService(WifiP2pManager.class)`得到。 2. 注册监听器:注册一个`WifiP2pManager.Channel`对象和`Wifi...

    android 多播 简单例程

    为了加入多播组,我们需要获取到多播地址并调用`joinGroup()`方法: ```java InetAddress multicastAddress = InetAddress.getByName("239.255.255.250"); // 示例多播地址 MulticastSocket socket = new ...

    ijkplayer实现网络视频流播放

    调用`prepareAsync`(Android)或`ijkmp_prepare_async`(iOS)进行预加载,等待准备完成后再调用`start`或`ijkmp_start`开始播放。 5. **控制播放**: ijkplayer提供了播放、暂停、停止、快进、快退等控制接口。...

    基于android的wifi热点的局域网通讯仿飞鸽

    一种常见的解决方案是使用UDP,因为它不需要建立连接,适合广播和组播。也可以考虑使用轻量级的消息传递协议,如MQTT,它特别适合低带宽和不可靠的网络环境。 4. **文件传输**: 文件传输是此类应用的重要部分。...

    UDP.rar_android_socket源码android_udp 热点_wifi udp配网_wifi 热点

    首先,需要获取到`WifiManager`的实例,然后调用`setWifiEnabled(false)`关闭已有的WiFi连接。接着,使用`createWifiApConfiguration()`创建热点配置,并通过`setWifiApEnabled()`开启热点。例如: ```java ...

    Android局域网UDP广播通信

    1. **申请权限**:由于涉及到网络操作,Android应用需要在AndroidManifest.xml文件中声明`INTERNET`权限和`ACCESS_WIFI_STATE`权限,以允许应用访问网络和获取Wi-Fi状态。 ```xml &lt;uses-permission android:name=...

    android局域网共享视频 代码

    3. **Multicast UDP**:对于多设备之间的视频共享,多播UDP是一种高效的方式,因为它只需要发送一次数据,所有加入到特定多播组的设备都能接收到。 4. **文件管理**:Android提供了`java.io`和`java.nio`包,用于...

    Android配置文件,所有权限

    - `CHANGE_WIFI_MULTICAST_STATE`:改变WiFi多播状态,用于接收组播包,如发现局域网内的服务。 这些权限的合理使用对于开发高质量的Android应用至关重要,确保了用户隐私的安全和应用功能的正常运行。在编写应用...

    Android登录、注册、轨迹回放,报警记录

    - **定位服务**:使用GPS、WiFi或移动网络获取用户的地理位置信息。 - **地图API**:集成如Google Maps API,显示用户的位置轨迹。 - **数据存储**:将轨迹点保存在服务器或本地,可能用到SQLite或云数据库。 - ...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android 用Animation-list实现逐帧动画

    `Animation-list`是Android XML动画资源的一种类型,它定义了一组子项(通常为ImageView的源),这些子项按照指定的顺序和时间间隔依次显示,从而形成动画效果。在`res/anim`目录下创建XML文件,例如`wait_animation...

    android实现局域网聊天 - UDP实现

    对于大量用户的情况,可以考虑使用多播(Multicast)来提高效率,只需将消息发送一次,多播组内的所有成员都能接收到。 通过以上步骤,我们可以构建一个简单的基于UDP的局域网聊天应用。"CanChatDemo"这个项目应该...

    android6.0的新权限问题说明

    - `CHANGE_WIFI_MULTICAST_STATE`:更改Wi-Fi多播状态。 - `CHANGE_WIFI_STATE`:更改Wi-Fi连接状态。 - `DISABLE_KEYGUARD`:禁用屏幕锁定。 - `EXPAND_STATUS_BAR`:扩展状态栏。 - `GET_PACKAGE_SIZE`:获取包...

    Android-Wifi-P2P-Polling-App

    《Android-Wifi-P2P-Polling-App:探索移动设备间的无线直连通信》 ...同时,此项目也提供了一个良好的起点,让开发者能够进一步研究Wi-Fi Direct的高级特性,如多设备组播和更复杂的网络拓扑结构。

    wifi直连服务发现DEMO

    WiFi直连服务发现DEMO是Android平台上实现设备间无线通信的一种技术示例。这项技术主要基于Wi-Fi Direct,允许设备在没有传统Wi-Fi网络的情况下直接建立连接,进行数据传输和服务发现。在这里,"DEMO"是指一个演示...

    Android技术专题讲解

    7. **硬件接口**:支持GSM、Bluetooth、WiFi、GPS等多种硬件接口。 8. **开发工具**:提供完整的开发环境,包括模拟器、调试工具等。 #### 三、Android架构详解 **1. 应用层** - **预装应用**:包括电子邮件、...

    Android权限表

    29. **CHANGE_WIFI_MULTICAST_STATE**:应用可以启用或禁用Wi-Fi的多播接收,用于接收组播数据包。 30. **CHANGE_WIFI_STATE**:允许应用连接、断开或更改Wi-Fi网络设置。 31. **CLEAR_APP_CACHE**:应用可以清除...

    android入门经典资料

    - **网络定位**: 通过WiFi热点或基站信号进行定位。 - **地理编码**: 地址到坐标或坐标到地址的转换。 #### 十九、蓝牙功能 - **连接设备**: 连接其他蓝牙设备。 - **数据传输**: 通过蓝牙发送数据。 - **设备发现...

Global site tag (gtag.js) - Google Analytics