Verwendung von DNS Service Discovery (DNS SD)?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    Verwendung von DNS Service Discovery (DNS SD)?

    Hallo..

    Ich muß Geräte im lokalen Netzwerk finden. Der Hersteller schreibt in seiner Schnittstellendoku, man soll DNS Service Discovery (DNS SD) mit dem Service-Typ _https._tcp verwenden. Die Geräte melden sich dann mit einem eindeutigen Namen.
    Das Thema ist für mich bislang schwer zu recherchieren gewesen, so daß ich es hilfsweise dadaurch gelöst habe, einfach alle möglichen IPv4-Adressen im Subnetz anzupingen und die Antworten auszuwerten. Das klappt auch soweit.

    Nun würde ich mich gerne näher mit der vom Hersteller gewollten Lösung beschäftigen. Ist DNS SD sowas wie multicast DNS (mDNS)? Ich bekomme das Thema nicht zu richtig zu greifen.

    Letztlich soll folgendes erreicht werden:
    Ich benötige eine Liste der Geräte mit ihrem eindeutigen Namen

    Wie macht man sowas?

    --------------------------------

    Nachtrag:
    Wenn ich nicht auf dem Holzweg bin, muß ich Multicast-DNS (mDNS) verwenden und per UDP den String _https._tcp, den der Hersteller der Geräte vorgibt, an die IP-Adresse 224.0.0.251 auf Port 5353 senden. Die Geräte antworten dann vermutlich auf Port 443. Man muß sich dazu aber im selben Netzwerk befinden. Ich bin nur über einen VPN-Zugang drin, so daß es vielleicht deshalb nicht funktioniert.
    --------
    Lieber inkompetent als inkontinent

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „100Volt“ ()

    100Volt schrieb:

    Ist DNS SD sowas wie multicast DNS (mDNS)?

    Ja.

    Hatte mich vor kurzem mit dem gleichen Thema beschäftigt.
    Allerdings ging es mir um SmartHome-Geräte.
    Eine App findet innerhalb weniger Millisekunden alle kompatiblen Geräte und ich wollte wissen, wie das technisch umgesetzt war, da anpingen und Datenaustauschen vermutlich länger dauern würde...

    Ich habe übrigens die gleiche mDNS-Lib gefunden wie Du und sie auch verwendet, damit findest du alle mDNS-Geräte im Netzwerk :)
    Hast Du es nur recherchiert oder auch selbst programmiert, um es zu testen?
    Wenn ja, wie hast Du es gelöst? Ich bekomme es nicht hin :(
    Vielleicht ist _https._tcp auch falsch. In der Doku ist das Thema leider nur ganz nebensächlich erwähnt.
    --------
    Lieber inkompetent als inkontinent
    hab es auch programmiert.
    Allerdings bin ich auf ein "Problem" gestoßen, dass ich diese Multicast-Nachrichten regelmäßig empfange und ich sie ja eigentlich nur 1x bekommen möchte.
    Evtl. muss man dann selber nach einer gewissen Zeit das Discovery abschalten.


    Wenn ich mich recht erinnere, war da bei GitHub ein Beispiel.
    Hier ein Auszug aus meiner Software:

    C#-Quellcode

    1. using System;
    2. using System.Linq;
    3. using Makaretu.Dns;
    4. using Makaretu.Dns.Resolving;
    5. //https://github.com/richardschneider/net-mdns
    6. namespace mDNS_Browser.Core
    7. {
    8. internal class mdnsManager
    9. {
    10. #region constructor
    11. internal mdnsManager()
    12. {
    13. mdns = new MulticastService();
    14. mdns.AnswerReceived += Mdns_AnswerReceived;
    15. //mdns.QueryReceived += Mdns_QueryReceived;
    16. serviceDiscovery = new ServiceDiscovery(mdns);
    17. serviceDiscovery.ServiceInstanceDiscovered += ServiceDiscovery_ServiceInstanceDiscovered;
    18. serviceDiscovery.ServiceDiscovered += ServiceDiscovery_ServiceDiscovered;
    19. }
    20. #endregion
    21. #region variables
    22. private MulticastService mdns;
    23. private ServiceDiscovery serviceDiscovery;
    24. #endregion
    25. ///////////////////////////////////////////////
    26. #region public methods
    27. internal void StartDiscovery()
    28. {
    29. mdns.Start();
    30. serviceDiscovery.QueryAllServices();
    31. }
    32. internal void StopDiscovery()
    33. {
    34. mdns.Stop();
    35. }
    36. //internal void PublishService(string instanceName, string serviceName, ushort port)
    37. //{
    38. // //ServiceProfile service = new ServiceProfile( instanceName, serviceName, port );
    39. // //serviceDiscovery.Advertise( service );
    40. //}
    41. //internal void StopPublishingService(ServiceProfile profile = null)
    42. //{
    43. // if (profile != null)
    44. // serviceDiscovery.Unadvertise( profile );
    45. // else
    46. // serviceDiscovery.Unadvertise();
    47. //}
    48. #endregion
    49. ///////////////////////////////////////////////
    50. #region callbacks
    51. private void ServiceDiscovery_ServiceDiscovered(object sender, DomainName serviceName)
    52. {
    53. Console.WriteLine( $"Service: '{serviceName}'" );
    54. // Ask for the name of instances of the service.
    55. mdns.SendQuery( serviceName, type: DnsType.PTR );
    56. }
    57. private void ServiceDiscovery_ServiceInstanceDiscovered(object sender, ServiceInstanceDiscoveryEventArgs e)
    58. {
    59. Console.WriteLine( $"service instance '{e.ServiceInstanceName}'" );
    60. // Ask for the service instance details.
    61. //mdns.SendQuery( e.ServiceInstanceName, type: DnsType.SRV );
    62. }
    63. private void Mdns_AnswerReceived(object sender, MessageEventArgs e)
    64. {
    65. Console.WriteLine( "response from " + e.RemoteEndPoint.Address.ToString() );
    66. // Is this an answer to a service instance details?
    67. var servers = e.Message.Answers.OfType<SRVRecord>();
    68. foreach (var server in servers)
    69. {
    70. Console.WriteLine( $"host '{server.Target}' for '{server.Name}'" );
    71. // Ask for the host IP addresses.
    72. mdns.SendQuery( server.Target, type: DnsType.A );
    73. mdns.SendQuery( server.Target, type: DnsType.AAAA );
    74. }
    75. //// Is this an answer to host addresses?
    76. //var addresses = e.Message.Answers.OfType<AddressRecord>();
    77. //foreach (var address in addresses)
    78. //{
    79. // Console.WriteLine( $"host '{address.Name}' at {address.Address}" );
    80. //}
    81. }
    82. //private void Mdns_QueryReceived(object sender, MessageEventArgs e)
    83. //{
    84. // var names = e.Message.Questions.Select( q => q.Name + " " + q.Type );
    85. // Console.WriteLine( $"got a query for {String.Join( ", ", names )}" );
    86. //}
    87. #endregion
    88. }
    89. }


    Also Klasse instanzieren und dann mit StartDiscovery() starten.

    @100Volt:
    Schau mal, was bei Dir passiert und gib Rückmeldung...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TRiViUM“ ()