http://blog.csdn.net/ghostyu/article/details/8182516

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方法释放锁

1、创建组播用的udp socket,

2、绑定组播地址为239.255.255.250,端口为3702,因为ws-discovery的组播地址和端口就是为239.255.255.250和3702

直接上代码:

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();
}
}
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;
}
}

上面代码供参考,但是没有测试在htc手机上成功

下面是本人修改过的代码:

public static String findServerIpAddress() throws IOException {

        String sinfo = "";
byte[] sendData = sinfo.getBytes();
String ip = "";
try {
MulticastSocket multicastSocket = new MulticastSocket(
MULTICAST_PORT);
multicastSocket.setLoopbackMode(true);//修改添加代码部分不添加不能发送成功
InetAddress group = InetAddress.getByName(GROUP_IP);
multicastSocket.setLoopbackMode(true);
multicastSocket.joinGroup(group);
multicastSocket.setSoTimeout(10000);
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) {
}
}
}
} catch (Exception ee) {
Log.d(TAG, ee.toString());
}
return ip;
}

http://blog.csdn.net/lvron/article/details/6606755

android ONVIF 组播探测在线摄像机的更多相关文章

  1. Android App用MulticastSocket监听组播,为什么连接到不同路由、在不同手机上跑,有的能收到有的收不到

    ---------------------------!! 转载请注明出处 !!-----------------------   一个项目,利用wifi组播在局域网内发现设备.却发现在有的路由器上能 ...

  2. Android开发:组播(多播)与广播

    近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播) 背景知识:组播使用UDP对一定范 ...

  3. Android MulticastSocket IP组播

    MulticastSocket是对等的关系,也就是他们通过IP多点组播保留的地址来相互接收在这个组的Socket发送的消息 我写了一个例子,MultiSocketB是一个service,用于先接收再发 ...

  4. Android为TV端助力:UDP协议(接收组播和单播)

    private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...

  5. Android设备一对多录屏直播--(UDP组播连接,Tcp传输)

    原文:https://blog.csdn.net/sunmmer123/article/details/82734245 近期需要学习流媒体知识,做一个Android设备相互投屏Demo,因此找到了这 ...

  6. Android上UDP组播无法接收数据的问题

    最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...

  7. android multicast 多播(组播)问题

    有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我    获取组播锁 private  InetAddress   group; WifiManager  wm=(WifiManager ...

  8. 浅谈Android中的组播(多播)

    组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IP ...

  9. linux下播放组播流出现setsockopt:No such device错误

    在linux下播放组播流出现setsockopt:No such device错误是因为多播IP没有add路由表里面 可以采用如下命令完成: root@android:/ # busybox rout ...

随机推荐

  1. golang的select实现原理剖析

    写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready. 本文将介绍一下golang的select的用法和实现原理. 实现原理 gola ...

  2. 4.Hbase Shell 命令

    Hbase提供了一个shell的终端给用户交互:#$HBASE_HOME/bin/hbase shell,执行quit命令可以退出命令行 2.使用Hbase Shelll 命令操作: 名称 命令表达式 ...

  3. nginx动静分离简单实例实现

    什么是动静分离? Nginx 动静分离简单来说就是把动态和静态请求分开,不能理解成只是将动态页面和静态页面物理分离.严格意义上说应该是动态请求和静态请求分开,可以理解成使用 nginx 处理静态页面, ...

  4. java中的io流总结(二)——RandomAccessFile类

    知识点:RandomAccessFile (随机访问文件)类 (一)描述 前一篇博客中https://www.cnblogs.com/shuaifing/p/11490160.html,主要描述Fil ...

  5. Procomm Plus 与ASPECT脚本语言在基于远程终端设备上的测试应用

    产测 ---------------------------------------------------- 原文:http://www.bixuanzl.com/20180801/1084478. ...

  6. LeetCode刷题--有效的括号(简单)

    题目描述 给定一个只包括 ' ( ' , ' )  ',  ' { ' , ' } ' , ' [ ' , ' ] ' 的字符串,判断字符串是否有效.有效字符串需满足: 左括号必须用相同类型的右括号闭 ...

  7. TCP的服务简单介绍

    1 引言尽管T C P和U D P都使用相同的网络层(I P),T C P却向应用层提供与U D P完全不同的服务.T C P提供一种面向连接的.可靠的字节流服务.面向连接意味着两个使用 T C P的 ...

  8. Tensorflow2.0学习(一)

    站长资讯平台:今天学习一下Tensorflow2.0 的基础 核心库,@tf.function ,可以方便的将动态图的语言,变成静态图,在某种程度上进行计算加速 TensorFlow Lite Ten ...

  9. c++类的基本形式(一个简单类的简单sample,命名空间)

    有人把类说成是占用固定大小内存块的别名,其定义时不占用空间 #include<iostream> #include<string> using namespace std; c ...

  10. python2和python3编程差异杂谈(-)

    python2 默认编码ascii 在使用中文时要显示的声明   #-*-encoding:utf-8-*- python3 默认编码utf-8,良好的支持了中文输入 python2: print函数 ...