Xamarin 通过Wifi和移动数据向物联网设备发送web请求

Xamarin 通过Wifi和移动数据向物联网设备发送web请求,xamarin,esp8266,bonjour,mdns,zeroconf,Xamarin,Esp8266,Bonjour,Mdns,Zeroconf,我有一个Xamarin应用程序,需要从LAN端和WAN端连接到设备。设备(ESP8266)通过WiFi连接到内部网络,可以通过DDN从WAN端访问 当用户(通过Xamarin应用程序)在使用移动数据(即,他们未连接到WiFi网络)的同时发出请求时,请求到达物联网设备(物联网设备在路由器上进行UPNP映射) IoT设备使用MDN在本地网络上显示自己,如果我尝试在连接到同一网络的机器上通过Windows 10上的Chrome进行连接,则连接成功(使用“domain.local”)。在Android上

我有一个Xamarin应用程序,需要从LAN端和WAN端连接到设备。设备(ESP8266)通过WiFi连接到内部网络,可以通过DDN从WAN端访问

当用户(通过Xamarin应用程序)在使用移动数据(即,他们未连接到WiFi网络)的同时发出请求时,请求到达物联网设备(物联网设备在路由器上进行UPNP映射)

IoT设备使用MDN在本地网络上显示自己,如果我尝试在连接到同一网络的机器上通过Windows 10上的Chrome进行连接,则连接成功(使用“domain.local”)。在Android上的Chrome上执行相同操作会导致DNS错误

如果用户现在将手机连接到与物联网设备相同的网络,Xamarin应用程序请求将不再到达物联网设备。我有一些代码可以区分本地请求和发出“domain.local”请求或“domain.ddns.net”请求的远程请求

我理解苹果在我的台式机上的表现,以及安卓平台上的不足


有人知道如何解决这个问题吗?

所以我已经解决了这个问题,并发布了答案,以防将来对其他人有用

在Xamarin中使用Zeroconf库

private const string deviceHostName = "yourhostname"


    public static async void  GetDeviceIPAddress()
    {
        IReadOnlyList<IZeroconfHost> responses = null;

        responses = await ZeroconfResolver.ResolveAsync("_http._tcp.local.");

        foreach (var resp in responses)
        {
            if (resp.DisplayName == deviceHostName)
            {
                Debug.Print(resp.IPAddress);
            }
        }
    }
private const string deviceHostName=“yourhostname”
公共静态异步void getDevicePaddress()
{
IReadOnlyList响应=null;
responses=等待ZeroconfResolver.ResolveAsync(“\uHTTP.\uTCP.local”);
foreach(响应中的var响应)
{
if(resp.DisplayName==设备主机名)
{
调试.打印(分别为IPAddress);
}
}
}
现在,向resp.IPAddress发出http请求时,设备会将其主机名标记为“yourhostname


我使用的是ESP8266,在连接WiFi之前在设备上启动MDN非常重要,否则设备会将其主机名报告为ESP_xxxx,而不是“yourhostname”,这才是问题的真正根源。

1。例外情况是什么?2.您是否有一些代码来显示您是如何提出请求的?