ubuntu avahi用法

ubuntu avahi用法

在 ubuntu 16.04 中已经自带 avahi 服务了

如果没有 请使用 下面命令 安装
sudo apt-get install avahi-daemon
sudo apt-get install avahi-utils

http://avahi.org/
http://en.wikipedia.org/wiki/Avahi_%28software%29

service avahi-daemon stop

可以查看局域网内所有的mdns服务,

avahi-browse -a

使用 avahi-browse 命令行程序 /usr/bin/avahi-browse
使用 avahi-browse 命令行程序执行以下操作:
在网络上浏览以查找所有 mDNS 广播
对执行广播的设备的主机名和 IP 地址进行解析

11

我的机器没有无线设备,只作为文件服务器、下载服务器使用,所以应该关闭avahi-daemon
停止服务
systemctl stop avahi-daemon.socket
systemctl stop avahi-daemon.service
停止自动启动
systemctl disable avahi-daemon.socket
systemctl disable avahi-daemon.service

将avahi移植到arm-linux

1.两个tar包

libdaemon-0.14.tar.gz

avahi-0.6.31.tar.gz

2.先编译libdaemon

tar zxvf libdaemon-0.14.tar.gz
cd libdaemon-0.14/

./configure --host=arm-avl-linux-gnueabi --prefix=/home/xxx/airplay/avahi/daemon_arm_prefix

make

make install

3.编译avahi

tar zxvf avahi-0.6.31.tar.gz

cd avahi-0.6.31/

./configure --host=arm-avl-linux-gnueabi --prefix=/home/xxx/airplay/avahi/avahi_arm_prefix --with-distro=none --localstatedir=/ var --disable-gdbm LIBDAEMON_CFLAGS="-I/home/xxx/airplay/avahi/daemon_arm_prefix/include" LIBDAEMON_LIBS="-L/home/xxx/airplay/avahi/daemon_arm_prefix/ lib -ldaemon -L/home/project/mpxx/gst/lib" --disable-qt3 --disable-qt4 --disable-gtk --disable-gtk3 --disable-python --disable-mono GOBJECT_LIBS="-L/home/ project/mpxx/gst/gst_1.0.5/lib -lgobject-2.0" GLIB20_CFLAGS="-I/home/project/mpxx/gst/include/glib-2.0" GLIB20_LIBS="-L/home/project/mpxx/gst/lib -lglib-2. 0"

然后修改avahi-daemon/Makefile

将sysconfdir = $(prefix)/etc

改为sysconfdir = /etc

再执行make命令

make之后再修改avahi-daemon/Makefile

将sysconfdir = /etc

改为sysconfdir = $(prefix)/etc

然后make install

(这样做是为了避免编译程序时将编译时的路径带进去,在板子上运行时会出现错误的路径)

11

Avahi 是Zeroconf规范的开源实现,常见使用在Linux上。它可以在没有 DNS 服务的局域网里发现基于 zeroconf 协议的设备和服务。

它跟 mDNS 一样。包含了一整套多播DNS(multicastDNS)/DNS-SD网络服务的实现。

它使用的发布授权是LGPL。Zeroconf规范的另一个实现是Apple公司的Bonjour程式。Avahi和Bonjour相互兼容。

Avahi允许程序在不需要进行手动网络配置的情况下,在一个本地网络中发布和获知各种服务和主机。例如,当某用户把他的计算机接入到某个局域网时,如果他的机器运行有Avahi服务,则Avahi程式自动广播,从而发现网络中可用的打印机、共享文件和可相互聊天的其他用户。这有点象他正在接收局域网中的各种网络广告一样。Linux下系统实际启动的进程名,是avahi-daemon

11
## 发现所有已注册的服务
avahi-browse -a -r

## 发现某个类型的服务的返回包
avahi-browse -r "xxx"

-xxx是指服务类型,如_http._tcp

mDNS

http://www.ietf.org/rfc/rfc6762.txt
Multicast DNS and DNS Service Discovery are technologies that allow you
to register IP-based services and browse the network for those services.
For more information about mDNS, see the mDNS web site.

http://www.multicastdns.org/

mDNSPosix

ReadMe About mDNSPosix

mDNSPosix is a port of Apple’s Multicast DNS and DNS Service Discovery
code to Posix platforms.

Multicast DNS and DNS Service Discovery are technologies that allow you
to register IP-based services and browse the network for those services.
For more information about mDNS, see the mDNS web site.

http://www.multicastdns.org/

Multicast DNS is part of a family of technologies resulting from the
efforts of the IETF Zeroconf working group. For information about
other Zeroconf technologies, see the Zeroconf web site.

http://www.zeroconf.org/

Apple uses the trade mark “Bonjour” to describe our implementation of
Zeroconf technologies. This sample is designed to show how easy it is
to make a device “Bonjour compatible”.

The “Bonjour” trade mark can also be licensed at no charge for
inclusion on your own products, packaging, manuals, promotional
materials, or web site. For details and licensing terms, see

http://developer.apple.com/bonjour/

The code in this sample was compiled and tested on Mac OS X (10.1.x,
10.2, 10.3), Solaris (SunOS 5.8), Linux (Redhat 2.4.9-21, Fedora Core 1),
and OpenBSD (2.9). YMMV.

[从0到1搭嵌入式工程]局域网自动发现功能,苹果Bonjour/mdnsResponder移植

在局域网内通信,就必须知道对方的IP地址和端口,苹果开源的mdnsResponder,就是利用mdns组播协议,通过服务域名,来获取相应ip地址的一种方式。

比如我们有一个摄像头,在联网的情况下,同一个局域网下的app想发现这个摄像机,并和摄像机建立联系。

这样一个需求,需要摄像头调用mDNS_Register,通过传参告知mdns库,在指定的port上注册一个did._ipcxx._tcp.local的服务, 然后自己开一个socket,绑定port口,等待来自APP的数据。

APP要去找摄像机,所以调用DNSServiceBrowse,传入服务类型_ipcxx._tcp和域local, 在局域网内就能找到一条 did._ipcxx._tcp.local的服务, 再调用DNSServiceResolve,就可以得到ipc的主机名和端口号, 通过主机名,调用gethostbyname,就可以获取到摄像机的ip地址。 服务的名字使用摄像机的did,方便app应对多个摄像机,同时方便验证合法性。

有了ip和port,就可以创建一个socket,去连接到摄像头,就开始发送数据了。

至此,一个局域网自动发现功能就完成了,我们不需要了解mdns组播协议,仅仅调用苹果的api,就获取到了想要的摄像机的ip。

下面介绍苹果开源源码的移植和它的demo代码。

源码地址在:https://opensource.apple.com/tarballs/mDNSResponder/, 版本为:mDNSResponder-878.30.4.tar.gz

解压后目录结构:

在这里插入图片描述
这里面有针对不同系统的文件夹,我们不需要关心,用得上的是mDNSPosix/mDNSCore/mDNSShared三个目录。

建议读本目录和mDNSPosix下的README.TXT,里面说的很细致。

我们是Linux系统,所以进到mDNSPosix目录, 里面的各个文件我们暂时也不需要关心,这是好几个应用程序的源代码。

执行 make os=linux, 先在我们的x86linux上编译一遍, 如果你想在linux上直接调试,可以执行sudo make install os=linux, 他会安装并执行一个mdnsd的应用程序,是mDNS的常驻进程,常用调试应用dns-sd,就需要依赖这个程序才能实现mdns服务发现,参见readme文件。

在…/Clients/build目录下,执行./dns-sd就能看到命令选项, 可以注册一个service,可以再开一个shell,同样执行./dns-sd 去发现刚才注册的服务。调试很好用。

但是最终要把mdns移植到我们的嵌入式linux上,所以我们不能用mdnsd, 也不用dns-sd。

在/mDNSPosix/Makefile中, 需要我们直接修改工具链和编译参数,在build下编译出可以在嵌入式设备上运行的程序。
在这里插入图片描述
图不好修改了,在图中LD后面添加STRIP = arm-linux-strip, 否则编译不过。

刚才的make中os参数是必须的,我们指定linux,就会到这里来,在这里我们可以定义我们自己的arm gcc,可以加我们自己的编译选项CFLAGS, 同时去掉CFLAGS_OS中的-DHAVE_IPV6 -DTARGET_OS_LINUX。

rm -rf objects, 删除前一次的编译文件。同样 make os=linux,直到编译成功。在build/prod目录下,就是我们生成的可执行文件,嵌入式设备上,执行mDNSClientPosix, 就可以看到同一个局域网下,你刚才在linux上用dns-sd注册的服务, 执行mDNSResponderPosix,就可以注册一个服务。查看代码client.c 和 responder.c,你会了解服务注册和搜索的过程。

这个responder.c,就是我们嵌入式设备所需要的base代码,你自己的应用逻辑,都可以在这里实现。

怎么把它移植到我们自己的代码库中?

编译的时候,在编译mDNSResponderPosix时,会打印出它所依赖的.c文件,把这些.c文件单独摘出来,把.h文件也拿出来,单独见一个目录,就可以使用这些.c文件,执行自己的make,生成responder可执行文件了。

至此,整个移植的过程就结束了。

调试过程中,通过对client.c responder.c Clinents/dns-sd.c的学习,就会了解各个接口的应用,从而融会贯通。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值