通过Wifi和移动数据向IoT设备发送网络请求

问题描述

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

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

IoT设备使用mDNS在本地网络上广为人知,如果我尝试通过Windows 10上的Chrome在连接到同一网络的计算机上进行连接,则连接成功(使用“ domain.local”)。在Android上的Chrome上执行相同操作会遇到DNS错误。

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

我了解台式机上的Apple Bonjour方面以及Android平台上缺少此方面。

有人知道如何解决吗?

解决方法

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

在Xamarin中使用库Zeroconf https://github.com/novotnyllc/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);
            }
        }
    }

现在向 resp.IPAddress 发出http请求时,到达的设备将其主机名称为“ 您的主机名”。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...