[avahi] Receive mDNS annoucnements
Jonathan Bagg
jbagg at lenbrook.com
Mon Jan 11 12:49:20 PST 2016
My Qt zeroconf / avahi wrapper keeps a list of discovered / resolved
services...
https://github.com/jbagg/QtZeroConf
QMap<QString, QZeroConfService *> services; is private, but you could
move it to the public part of the class for your project.
On 16-01-08 06:57 PM, Jon Fitt wrote:
> Hi Trent, or any other interested parties,
>
> I don't know if you're watching this mailing list any more, but I'm
> trying to pick this up again.
>
> What I'm looking to do is query the avahi service to get it to tell me
> all hosts that it has seen make any service announcements, and ideally
> when. I'd like to have my Raspberry Pi keep a passive list of all
> hosts it has seen and when they were last seen.
>
> I'm ultimately looking for it to be able to tell when I have returned
> home because my iphone will make service announcements as soon as it
> rejoins the wifi.
>
> I'd guess I can use a service browser to look for "ANY" service and
> then use a service resolver to resolve all of them to their
> hostname/IP, but that seems inefficient.
>
> Is there a way to query the avahi service based on hostname, instead
> of service type?
>
> Regards,
>
> Jonathan
>
>
>
>
> On Sunday, 30 November 2014, 21:58, Trent Lloyd <lathiat at bur.st> wrote:
>
>
> A quick Avahi primer,
>
> A “browser” is a long running process to watch for records coming and
> going,
> A “resolver” is a short running process to resolve a record and get a
> final result.
>
> Avahi is also a combination of two technologies, first “multicast dns”
> which implements DNS with special considerations for a shared
> multicast network — and then “DNS-SD” or DNS based service discovery.
> This is a set of DNS records that can be used to discover a service,
> it can be used over multicast dns, or in fact can also be used over
> normal DNS.
>
>
> Generally you “browse” for some set of records, then if you are
> interested in one, you “resolve” it.
>
> So generally in most Avahi applications, the “Service Browser” queries
> a list of services over time, e.g. get a list of all _http._tcp
> services. It then returns a list of such services, which you can then
> (optionally) resolve with the “Service Resolver”, that will then fetch
> the service and resolve it’s additional TXT records, the IP address
> for the hostname, etc.
>
> A typically use case in an application is that you browse the service
> list with a ServiceBrowser, you provide the user with a list of the
> service names, they then click a service and you then run the
> ServiceResolver to get the IP and other TXT details — to then connect
> to it. Some applications will also run a ServiceResolver on every
> service because they need the TXT data to show extra information to
> the user.
>
> The reason these are split is that it saves unnecessary network
> traffic if the application did not want to resolve the service. This
> can be a big issue in large networks, so you want to avoid every
> application resolving all services if possible. Or at least, not all
> the time.
>
>
>
> The “Record Browser” is a more low level tool for browsing a specific
> DNS record over mDNS. It is not normally used by most applications,
> as they use the ServiceBrowser/ServiceResolver which queries multiple
> records for you and does extra logic to handle service discovery. But
> if you wanted to watch a specific record, this is the tool to use.
> For example perhaps you want to see if there is an entry for
> “my-computer.local” with an A record (IPv4 Address).
>
> This might actually be ideal for this use case, since you want to know
> over time if a specific device is on the network or not - regardless
> of what services it is advertising.
>
>
> Hope that helps!
>
> - Trent
>
>> On 26 Nov 2014, at 6:24 am, Jon Fitt <jonfitt at yahoo.com
>> <mailto:jonfitt at yahoo.com>> wrote:
>>
>> In the avahi-client C-API there is the concept of a Service Browser
>> and a Record Browser. Service Browser sounds like what you are using now:
>>
>> AvahiServiceBrowser
>> <http://avahi.org/download/doxygen/lookup_8h.html#ade1392a93ff4d0407c1735374bc0ff7b>*
>> avahi_service_browser_new
>> <http://avahi.org/download/doxygen/lookup_8h.html#a52d55a5156a7943012d03e6700880d2b>
>> ( AvahiClient
>> <http://avahi.org/download/doxygen/client_8h.html#a3d65e9ea7182c44fa8df04a72f1a56bb> *
>> client,
>>
>>
>> AvahiIfIndex
>> <http://avahi.org/download/doxygen/address_8h.html#a2fda397a8f430cb537e37bbca0afb535>
>> interface,
>>
>>
>> AvahiProtocol
>> <http://avahi.org/download/doxygen/address_8h.html#a5342ada86ff1566a7fc6e855b3d46c3d>
>> protocol,
>>
>>
>> const char * type,
>>
>>
>> const char * domain,
>>
>>
>> AvahiLookupFlags
>> <http://avahi.org/download/doxygen/defs_8h.html#afa669747c3ff55190d86673dff960e50>
>> flags,
>>
>>
>> AvahiServiceBrowserCallback
>> <http://avahi.org/download/doxygen/lookup_8h.html#a666e712e840c612ba24d9e41673a94df>
>> callback,
>>
>>
>> void * userdata
>>
>> )
>>
>>
>> The type being for example _http._tcp. Whereas a Record Browser looks
>> like this:
>>
>> AvahiRecordBrowser
>> <http://avahi.org/download/doxygen/lookup_8h.html#ad0a38359b6c52d4272acd831410186f2>*
>> avahi_record_browser_new
>> <http://avahi.org/download/doxygen/lookup_8h.html#a21ac2275126fb9e5eaaae8afe3b75532>
>> ( AvahiClient
>> <http://avahi.org/download/doxygen/client_8h.html#a3d65e9ea7182c44fa8df04a72f1a56bb> *
>> client,
>>
>>
>> AvahiIfIndex
>> <http://avahi.org/download/doxygen/address_8h.html#a2fda397a8f430cb537e37bbca0afb535>
>> interface,
>>
>>
>> AvahiProtocol
>> <http://avahi.org/download/doxygen/address_8h.html#a5342ada86ff1566a7fc6e855b3d46c3d>
>> protocol,
>>
>>
>> const char * name,
>>
>>
>> uint16_t clazz,
>>
>>
>> uint16_t type,
>>
>>
>> AvahiLookupFlags
>> <http://avahi.org/download/doxygen/defs_8h.html#afa669747c3ff55190d86673dff960e50>
>> flags,
>>
>>
>> AvahiRecordBrowserCallback
>> <http://avahi.org/download/doxygen/lookup_8h.html#a867a24784f27539ed34291e0db8b51b8>
>> callback,
>>
>>
>> void * userdata
>>
>> )
>>
>>
>> I wonder if that is a more generic mDNS browser? Unfortunately the
>> parameters, and what a "record" is, is not explained in the online
>> documentation. I'll have a look in the source to see if I can find
>> out more.
>>
>> Regards,
>> Jonathan
>>
>>
>> On Tuesday, 25 November 2014, 13:17, Michael Jones <avahi at jonesmz.com
>> <mailto:avahi at jonesmz.com>> wrote:
>>
>>
>>
>>
>> Hi Michael,
>> I'm looking at your ZConfBrowserWidget and I see that it needs a
>> service type. Technically I believe from what I've been reading
>> the mDNS host announcements are different to an DNS-SD service,
>> although they are both announced in a similar way.Is there a
>> "service type" that catches the mDNS hostname announcements?
>> Regards,
>> Jonathan
>>
>> On Friday, 21 November 2014, 15:08, Jonathan Fitt
>> <jonfitt at yahoo.com <mailto:jonfitt at yahoo.com>> wrote:
>>
>>
>> Thanks! I'll give that a go and let you know how it goes.
>> Jonathan
>> On Nov 21, 2014, at 1:25 PM, Michael Jones <avahi at jonesmz.com
>> <mailto:avahi at jonesmz.com>> wrote:
>>
>>
>>
>>
>> Hello,I am looking for a way for a Linux machine to tell when I
>> return home. My idea is that my iPhone will always do an mDNS
>> announcement when it joins my home wifi. So I'm looking for a way
>> to watch for mDNS announcements and perform and action if the
>> right one is seen. Obviously the avahi-daemon is watching these
>> all the time and updating its cache, so I was thinking that there
>> might be a good place to start. However the only command line way
>> I can see to get to the avahi-daemon cache is to send a SIGUSR1
>> to get it to dump to /var/log/syslog. Then I can look at the
>> timestamp to determine the last time it registered and compare
>> with now. That seems quite ugly though, and I don't like the idea
>> of continually dumping to syslog.
>> So is there a way to make it more event driven with the
>> avahi-daemon? I think from looking at the D-Bus API that might be
>> the way to go?If it is the right approach, I would appreciate it
>> if someone knew of a related chunk of source that I could use as
>> a starting point.
>> Thanks!Jonathan
>>
>>
>>
>> Write a small program that uses the Avahi API. A very high level
>> wrapper for the Avahi API is:
>> https://github.com/johanneshilden/qtzeroconf
>>
>> Using that, you can detect your phone joining your home network
>> in under 10 lines of code.
>> Create the service browser object
>> Connect that new object to a qt slot that'll respond to the new
>> service joining your network, Tell the service browser object
>> which services to listen for.
>>
>> >From there, you can do whatever you want with the information.
>> Perhaps you would want to send some kind of DBus signal to let
>> other programs know.
>>
>> I'm afraid I haven't investigated the DBus API, so I'm not
>> certain I can give you any advice in that direction, but I have
>> written apps using the high level Qt API that I linked above, and
>> I've never had any trouble with it.
>>
>> --Michael Jone
>>
>>
>>
>> Hi Jonathan
>>
>>
>> That's a good question. I actually don't know. The qtzeroconf library
>> isn't actually mine, originally. I made a lot of modifications to it
>> (Here: https://github.com/jonesmz/qtzeroconf) that take advantage of
>> Qt5 and C++11, but those changes aren't compatible with older
>> versions of Qt, so I didn't want to recommend it to you.
>>
>> If you feel like poking around at the Avahi C API and can demonstrate
>> how to get mDNS host announcements out of the Avahi C api, I'd be
>> willing to add support for that to my version of the qtzeroconf
>> library (though, it'll still not be compatible with Qt4 or older
>> versions of C++, so you might end up needing to backport the changes
>> to the original authors github project.)
>>
>> If you want to work just with what the current qtzeroconf library can
>> do, you can just make your phone advertise an avahi service. Perhaps
>> give the protocol name something like "_phone._tcp" or something.
>>
>> Another thing to keep in mind, I don't know whether Avahi will
>> automatically detect your phone on the local network unless your
>> phone's operating system automatically sends that announcement. As
>> far as I know, Android doesn't do that. I don't know about the other
>> phone OS's.
>>
>> Best of luck, and let me know if you want to investigate the host
>> announcement support in qtzeroconf.
>>
>> --Michael Jones
>>
>> _______________________________________________
>> avahi mailing list
>> avahi at lists.freedesktop.org <mailto:avahi at lists.freedesktop.org>
>> http://lists.freedesktop.org/mailman/listinfo/avahi
>>
>>
>> _______________________________________________
>> avahi mailing list
>> avahi at lists.freedesktop.org <mailto:avahi at lists.freedesktop.org>
>> http://lists.freedesktop.org/mailman/listinfo/avahi
>
>
> _______________________________________________
> avahi mailing list
> avahi at lists.freedesktop.org <mailto:avahi at lists.freedesktop.org>
> http://lists.freedesktop.org/mailman/listinfo/avahi
>
>
>
>
> _______________________________________________
> avahi mailing list
> avahi at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/avahi
--
Jonathan Bagg
Embedded Systems Developer
NAD Electronics | Lenbrook Industries Limited
633 Granite Court, Pickering, Ontario, Canada L1W 3K1 | 905-831-0799 ext 4478 | http://www.nadelectronics.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/avahi/attachments/20160111/2f5cdb8e/attachment-0001.html>
More information about the avahi
mailing list