2013-08-20 62 views
2

我試圖實現一個函數來聽門1900和捕捉活着的消息和設備ip,我試圖使用一些庫,我發現,但我的應用程序崩潰,所有的時間只是試圖啓動應用程序。Android如何實現ssdp活着的接收函數

這是我的主要功能

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

您是否找到解決此問題的解決方案?我在一個線程中運行你的確切代碼,它只是在'DatagramPacket dp = sock.receive()'行消失(沒有崩潰,沒有任何事情發生)。 'while'循環從來沒有出現過第二回合,所以它阻止了那條線......不知道它在那個時候會期待什麼。 –

+0

有沒有人找到解決方案?因爲我也面臨同樣的問題。 –

回答

1

似乎沒有什麼是錯的。

您是否在Mainifest中添加了多播權限?

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

' <使用權限android:name =「android.permission.ACCESS_WIFI_STATE」/> <使用權限android:name =「android.permission.ACCESS_NETWORK_STATE」/> <使用權限android:name =「android。 permission.INTERNET「/> <使用權限android:name =」android.permission.WRITE_EXTERNAL_STORAGE「/> <使用權限android:name =」android.permission.CHANGE_WIFI_MULTICAST_STATE「/> <使用權限android:name =「android.permission.CHANGE_WIFI_STATE」/> <使用權限android:name =「android.permission.CHANGE_NETWORK_STATE」/> ' – JMN

1

Android不喜歡你在主線程中執行昂貴的操作,它會拋出異常,當你這樣做。嘗試使用您創建的新線程執行該代碼。那麼它應該工作。