You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Android中SSDP发现设备后无法获取XML描述文档

问题解答

1. Android或.NET MAUI是否存在阻止HTTP获取XML的固有限制?

是的,核心限制有两点:

  • Android 9+明文HTTP拦截:Android 9(API 28)及以上默认禁止明文HTTP(非HTTPS)请求,若设备XML地址为http://开头,会直接被拦截。解决方式:
    在Android项目的Resources/xml目录创建network_security_config.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">192.168.0.0/16</domain>
        </domain-config>
    </network-security-config>
    
    然后在AndroidManifest.xml的<application>标签中添加配置:
    android:networkSecurityConfig="@xml/network_security_config"
    
  • 权限缺失:必须在AndroidManifest.xml中声明网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

2. 当SSDP可用但XML获取失败时,有没有其他获取friendlyName的方法?

  • 检查SSDP响应头:部分设备会在SSDP响应的SERVER头中携带设备名称信息,可通过device.Server属性查看;也可遍历device.ResponseHeaders,确认是否有自定义扩展头包含设备名称。
  • 手动调整HTTP请求参数:
    • 替换主机名为IP:若DescriptionLocation包含主机名,局域网内可能无法解析,直接提取SSDP响应中的IP地址构造请求URL。
    • 添加指定User-Agent:部分UPnP设备要求特定的User-Agent才会响应,修改HttpClient请求头:
      using var httpClient = new HttpClient();
      httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
      
    • 延长超时时间:设备响应较慢时,设置更长的超时:
      httpClient.Timeout = TimeSpan.FromSeconds(10);
      

3. 这是否是Rssdp库的限制,有没有其他可尝试的库?

Rssdp库存在对部分非标准UPnP设备的兼容性问题,比如XML解析格式不匹配、HTTP请求头设置不符合设备要求。可尝试:

  • 手动实现SSDP流程:用UdpClient发送M-SEARCH请求,解析响应获取LOCATION后手动发送HTTP请求,完全控制请求过程。示例片段:
    using var udpClient = new UdpClient();
    udpClient.EnableBroadcast = true;
    var request = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: upnp:rootdevice\r\n\r\n";
    var data = Encoding.ASCII.GetBytes(request);
    await udpClient.SendAsync(data, data.Length, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900));
    
    var response = await udpClient.ReceiveAsync();
    var responseStr = Encoding.ASCII.GetString(response.Buffer);
    // 解析responseStr提取LOCATION头
    
  • 其他UPnP库:比如Upnp.NET、Open.Network.SSDP,这类库对不同设备的兼容性可能更好。

内容的提问来源于stack exchange,提问作者Matan Yamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:15:12