【问题标题】:Android how to implement ssdp alive receiver functionAndroid如何实现ssdp alive接收功能
【发布时间】:2013-08-20 09:37:32
【问题描述】:

我正在尝试实现一个功能来监听 1900 门并捕获活动消息和设备 ip,我尝试使用我找到的一些库,但我的应用程序在尝试启动应用程序时一直崩溃。

这是我的主要功能

     public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splash_screen_layout);

   //----------SSDP para identificação da STB--------------------------------

        SSDPSocket sock;
        try {
            sock = new SSDPSocket();

            while (true) {
                DatagramPacket dp = sock.receive(); **//crashes here**
                String c = new String(dp.getData());
                System.out.println(c);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }




        //---------------------------------------------------------------------

lib 代码的其余部分

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.SocketAddress;

public class SSDPSocket {
SocketAddress mSSDPMulticastGroup;
MulticastSocket mSSDPSocket;

public SSDPSocket() throws IOException {
    InetAddress localInAddress = InetAddress.getLocalHost(); **//crashes here first**
    System.out.println("Local address: " + localInAddress.getHostAddress());

    mSSDPMulticastGroup = new InetSocketAddress(SSDP.ADDRESS, SSDP.PORT);
    mSSDPSocket = new MulticastSocket(new InetSocketAddress(localInAddress,
            0));

    NetworkInterface netIf = NetworkInterface
            .getByInetAddress(localInAddress);
    mSSDPSocket.joinGroup(mSSDPMulticastGroup, netIf);
}

/* Used to receive SSDP packet */
public DatagramPacket receive() throws IOException {
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf, buf.length);

    mSSDPSocket.receive(dp);

    return dp;
}

public void close() {
    if (mSSDPSocket != null) {
        mSSDPSocket.close();
    }
}

}


public class SSDP {
/* New line definition */
public static final String NEWLINE = "\r\n";

public static final String ADDRESS = "239.255.255.250";
public static final int PORT = 1900;

/* Definitions of start line */
public static final String SL_NOTIFY = "NOTIFY * HTTP/1.1";
public static final String SL_MSEARCH = "M-SEARCH * HTTP/1.1";
public static final String SL_OK = "HTTP/1.1 200 OK";

/* Definitions of search targets */
public static final String ST_RootDevice = "ST:rootdevice";
public static final String ST_ContentDirectory = "ST:urn:schemas-upnp- org:service:ContentDirectory:1";

/* Definitions of notification sub type */
public static final String NTS_ALIVE = "NTS:ssdp:alive";
public static final String NTS_BYE = "NTS:ssdp:byebye";
public static final String NTS_UPDATE = "NTS:ssdp:update";
}




public class SSDPSearchMsg {

static final String HOST = "Host:" + SSDP.ADDRESS + ":" + SSDP.PORT;
static final String MAN = "Man:ssdp:discover";

int mMX = 3;    /* seconds to delay response */
String mST;     /* Search target */

public SSDPSearchMsg(String ST) {
    mST = ST;
}

public int getmMX() {
    return mMX;
}

public void setmMX(int mMX) {
    this.mMX = mMX;
}

public String getmST() {
    return mST;
}

public void setmST(String mST) {
    this.mST = mST;
}

@Override
public String toString() {
    StringBuilder content = new StringBuilder();

    content.append(SSDP.SL_MSEARCH).append(NEWLINE);
    content.append(HOST).append(NEWLINE);
    content.append(MAN).append(NEWLINE);
    content.append(mST).append(NEWLINE);
    content.append("MX:" + mMX).append(NEWLINE);
    content.append(NEWLINE);

    return content.toString();
}
}

【问题讨论】:

  • 您找到解决此问题的方法了吗?我正在线程中运行您的确切代码,它只是在DatagramPacket dp = sock.receive() 行消失(没有崩溃,只是没有发生任何事情)。 while 循环永远不会出现第二个回合,所以它在那条线上阻塞......不确定它在那个时候期待什么。
  • 有人找到解决方案了吗?因为我也面临同样的问题。

标签: android upnp ssdp


【解决方案1】:

似乎没有什么问题。

你是否在 Mainifest 中添加了组播权限?

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"></uses-permission>

【讨论】:

  • ' '
【解决方案2】:

Android 不喜欢您在主线程中执行昂贵的操作,并且在您执行此操作时会引发异常。尝试使用您创建的新线程执行该代码。那么它应该可以工作。

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多