- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当发出 M-SEARCH 命令时,所有提供服务的设备都必须回复它们提供的服务的 IP 地址。
我的手机有 2 个接口(interface)(除其他外):
根据收到 M-SEARCH 的接口(interface),我必须使用 wifi 的 IP 或手机的 IP 回复。
我怎样才能知道哪个接口(interface)收到了请求?我正在寻找一种可靠的方法来做到这一点。正在寻找 192.168...所以看起来不是一个好的解决方案。
我这样听 M_SEARCH:
MulticastSocket clientSocket;
clientSocket = new MulticastSocket(1900);
clientSocket.joinGroup(InetAddress.getByName("239.255.255.250") );
while(true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
clientSocket.receive(dp);
final String msg = new String(dp.getData(), 0, dp.getLength());
if (msg.contains("M-SEARCH"))
{
DatagramSocket resSocket = new DatagramSocket(null);
String req = "HTTP/1.1 200 OK\r\n";
req += "LOCATION: http://" + IP_TO_SPECIFY + "/index.html \r\n";
req += "HOST: "+android.os.Build.MODEL+"\r\n";
req += "EXT: \r\n";
req += "ST: upnp:rootdevice\r\n";
byte [] sendData = req.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, dp.getAddress(), dp.getPort());
resSocket.send(sendPacket);
resSocket.close();
}
}
最佳答案
这是 CheapCast 使用的:-
package com.mobiotics.motionsdk;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.SocketAddress;
import java.util.Scanner;
import android.content.Context;
import android.util.Log;
public class SSDP extends Thread {
/**
* Default IPv4 multicast address for SSDP messages
*/
public static final String ADDRESS = "239.255.255.250";
public static final String IPV6_LINK_LOCAL_ADDRESS = "FF02::C";
public static final String IPV6_SUBNET_ADDRESS = "FF03::C";
public static final String IPV6_ADMINISTRATIVE_ADDRESS = "FF04::C";
public static final String IPV6_SITE_LOCAL_ADDRESS = "FF05::C";
public static final String IPV6_GLOBAL_ADDRESS = "FF0E::C";
public static final String ST = "ST";
public static final String LOCATION = "LOCATION";
public static final String NT = "NT";
public static final String NTS = "NTS";
/* 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 notification sub type */
public static final String NTS_ALIVE = "ssdp:alive";
public static final String NTS_BYEBYE = "ssdp:byebye";
public static final String NTS_UPDATE = "ssdp:update";
public static final String LOG_TAG = "SSDP";
private SocketAddress mMulticastGroupAddress = new InetSocketAddress("239.255.255.250", 1900);
private MulticastSocket mMulticastSocket;
private DatagramSocket mUnicastSocket;
private NetworkInterface mNetIf;
private Context mContext;
private boolean mRunning = false;
public SSDP(Context ctx) throws IOException {
mContext = ctx;
mNetIf = Utils.getActiveNetworkInterface();
}
@Override
public synchronized void start() {
mRunning = true;
super.start();
}
@Override
public void run() {
try {
mMulticastSocket = new MulticastSocket(1900);
mMulticastSocket.setLoopbackMode(true);
mMulticastSocket.joinGroup(mMulticastGroupAddress, mNetIf);
mUnicastSocket = new DatagramSocket(null);
mUnicastSocket.setReuseAddress(true);
mUnicastSocket.bind(new InetSocketAddress(Utils.getLocalV4Address(mNetIf),1900));
} catch (IOException e) {
Log.e(LOG_TAG, "Setup SSDP failed.", e);
}
while(mRunning) {
DatagramPacket dp = null;
try {
dp = receive();
String startLine = parseStartLine(dp);
if(startLine.equals(SL_MSEARCH)) {
String st = parseHeaderValue(dp, ST);
if(st.contains("dial-multiscreen-org:service:dial:1")) {
String responsePayload = "HTTP/1.1 200 OK\n" +
"ST: urn:dial-multiscreen-org:service:dial:1\n"+
"HOST: 239.255.255.250:1900\n"+
"EXT:\n"+
"CACHE-CONTROL: max-age=1800\n"+
"LOCATION: http://"+Utils.getLocalV4Address(mNetIf).getHostAddress()+":8008/ssdp/device-desc.xml\n" +
"CONFIGID.UPNP.ORG: 7339\n" +
"BOOTID.UPNP.ORG: 7339\n" +
"USN: uuid:"+ Installation.id(mContext)+"\n\n";
DatagramPacket response = new DatagramPacket(responsePayload.getBytes(), responsePayload.length(), new InetSocketAddress(dp.getAddress(),dp.getPort()));
mUnicastSocket.send(response);
//Log.d(LOG_TAG, "Responding to "+ dp.getAddress().getHostAddress());
}
}
} catch (IOException e) {
Log.e(LOG_TAG, "SSDP fail.", e);
}
}
Log.e(LOG_TAG, "SSDP shutdown.");
}
public synchronized void shutdown() {
mRunning = false;
}
private DatagramPacket receive() throws IOException {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
mMulticastSocket.receive(dp);
return dp;
}
private String parseHeaderValue(String content, String headerName) {
Scanner s = new Scanner(content);
s.nextLine(); // Skip the start line
while (s.hasNextLine()) {
String line = s.nextLine();
int index = line.indexOf(':');
String header = line.substring(0, index);
if (headerName.equalsIgnoreCase(header.trim())) {
return line.substring(index + 1).trim();
}
}
return null;
}
private String parseHeaderValue(DatagramPacket dp, String headerName) {
return parseHeaderValue(new String(dp.getData()), headerName);
}
private String parseStartLine(String content) {
Scanner s = new Scanner(content);
return s.nextLine();
}
private String parseStartLine(DatagramPacket dp) {
return parseStartLine(new String(dp.getData()));
}
}
关于java - SSDP & Android, 如何回复 M-SEARCH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362730/
我有多个 InOut 模式的顺序队列,每个队列通向一个 Camel 处理器。如果处理器花费太多时间进行处理,我希望请求-答复检测到超时并发送 ExchangeTimedOutException。Cam
我是一名学生,试图了解更多关于 C# 中的 ARP 和套接字的信息 为此,我尝试使用原始 Socket 发送 ARP 请求和回复。在 C# 中。 我已经在一个字节数组中手动重建了一个 ARP 回复
我正在使用 Amazon Web Services 数据库 dynamodb。它返回一个 JSON,看起来像这样: {"Responses":{"friends":[{"to_username":"u
我有 servlet,它创建 html 文件,然后将其转换为 pdf 文件: private void ConvertHTMLtoPDF(String sConvertationProgramm, S
我正在为我的项目使用 Mailkit 库 (Imap)。 我可以轻松地通过 SmtpClient 发送新消息。 目前我正在研究如何回复特定邮件。是否可以向该回复邮件添加更多收件人? @jstedfas
这个问题已经有答案了: How to parse JSON in Java (36 个回答) 已关闭 7 年前。 请您告诉我如何解析 JSON 回复。我从 https://api.privatbank
我正在尝试从事 YouTube 视频评级工作。但我被困在这里了。这两个 YouTube 评级请求有什么区别? https://www.googleapis.com/youtube/v3/videos/
我搜索了该网站,令人惊讶的是没有找到任何适合我情况的答案。所以我发布了这个问题。 我正在使用 jQuery AJAX 来获取网页并将其动态添加到网站。但我的代码不起作用并抛出错误 ERROR Type
我正在编写一个 C 程序来搜索本地网络上的 smb 共享并安装它们。为了获取找到的 smb 服务器的主机名,我向服务器发送了 udp nbns 数据包。数据包正确,服务器回复。我正在使用wiresha
我正在尝试使用 Java 创建自己的 WebSocket 服务器。 当我的客户端连接时,我收到以下请求: (14): GET / HTTP/1.1 (18): Upgrade: WebSocket (
我正在使用 Nodejs、Express、MySQL、EJS。 用户能够创建帖子和评论/回复评论/回复对这些帖子的回复。 问题:我不知道如何以允许我在 EJS 中呈现它们的方式将数据分类为对象/数组。
我正在用 .NET c++ 编写程序。我正在本地网络上发送广播 ping。我的所有目标设备都能够响应 ping 广播,事实上我在 Wireshark 中跟踪了它们的所有响应。我的目标是检索所有响应站点
我有一个向 JMS MDB 发送请求的客户端。它可以很好地向 MDB 发送消息,但我一辈子都无法弄清楚如何让客户端接收 MDB 发回给它的响应。 编辑:客户端代码是同一实例上的 Web 服务,使用 @
我使用钩子(Hook)函数制作了一个模块。它可以工作,但是当我使用 ping google.com 时,我得到 0045 作为 icmp 类型。但我认为它应该是 0 用于回显回复。我使用了以下打印命令
我正在用 C 从头开始编写一个网络库。我已经实现了以太网协议(protocol),现在我想让 ARP 工作。发送请求/回复工作正常,但接收工作不正常。当我发送一个发送请求并等待它之后的回复时,re
我在替换字符串的一部分时遇到问题。现在这段代码。我的目标是针对包含此字典中的键的每个字符串。 mapping = { "St": "Street", "St.": "Stree
我有一个 WCF p2p 网状网络,它运行良好,适合单向对话。我正在研究是否可以调用一种方法来添加两个数字并返回和总和。 但是我在尝试连接时遇到错误: 契约(Contract)需要请求/回复,但绑定(
大家好,我正在尝试使用分块编码流式传输多媒体数据。因此,我首先尝试使用分块编码发送文本数据。 这是我的代码。我创建了一个服务器套接字,我在上面监听请求(端口 80),回复请求,然后我的程序终止。无论您
我的 Servlet 中有一些图像,我想将它们下载到我的 Android 应用中。 我正在对这个 URL 执行一个 GET 请求: public static final String URL ="h
文档:https://developers.google.com/apps-script/reference/gmail/gmail-message#replybody-options 当跟进一封电子
我是一名优秀的程序员,十分优秀!