[導(dǎo)讀] 在做一個(gè)ZYNQ項(xiàng)目時(shí),需要實(shí)現(xiàn)嵌入式Linux與Windows電腦直連??赡軙?huì)有盆友會(huì)遇到類似的需求,所以整理分享一下。
問題描述
基于ZYNQ芯片設(shè)計(jì)的一塊嵌入式板子,板上運(yùn)行Linux需要將大量的數(shù)據(jù)通過網(wǎng)口傳輸給電腦。這里借用黑金AX7010開發(fā)板示例,事實(shí)上也是這樣做實(shí)驗(yàn)的。最開始系統(tǒng)是這樣工作的:
板子連以及電腦網(wǎng)口都連接在路由器的LAN口,路由器自動(dòng)給電腦與板子分配IP地址,板子與電腦在同一個(gè)子網(wǎng)里。從而實(shí)現(xiàn)了數(shù)據(jù)通信。這樣用是能用,就是設(shè)備總是需要帶一個(gè)路由器,這樣很不方便。有沒有辦法直連呢?就像下面這樣:
這樣就需要配置板子與電腦的IP地址在同一個(gè)網(wǎng)段內(nèi),有沒有什么辦法能夠自動(dòng)分配IP地址給板子以及電腦呢?經(jīng)過一些搜索,發(fā)現(xiàn)了這么一個(gè)非常棒的開源組件Avahi。下面就來分享一下Avahi。
何為Avahi?
https://www.avahi.org/
Avahi is a system which facilitates service discovery on a local network via the mDNS/DNS-SD protocol suite. This enables you to plug your laptop or computer into a network and instantly be able to view other people who you can chat with, find printers to print to or find files being shared. Compatible technology is found in Apple MacOS X (branded "Bonjour" and sometimes "Zeroconf").
Avahi is primarily targetted at Linux systems and ships by default in most distributions. It is not ported to Windows at this stage, but will run on many other BSD-like systems. The primary API is D-Bus and is required for usage of most of Avahi, however services can be published using an XML service definition placed in /etc/avahi/services.
翻譯一下:
Avahi 是一個(gè)通過 mDNS/DNS-SD 協(xié)議實(shí)現(xiàn)在局域網(wǎng)發(fā)現(xiàn)服務(wù)的系統(tǒng)。從而使您能夠?qū)?a class="article-link" target="_blank" href="/tag/%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91/">筆記本電腦或計(jì)算機(jī)連接到網(wǎng)絡(luò),并立即能夠查看可以與之會(huì)話的其他機(jī)器、查找局域網(wǎng)打印機(jī)或查找正在共享的文件。在 Apple MacOS X中存在與之兼容的技術(shù)(品牌為 “Bonjour”,也稱為“Zeroconf” 零配置)。
Avahi 主要針對 Linux 系統(tǒng),并在大多數(shù)發(fā)行版中默認(rèn)提供。目前還不支持Windows,但可以在許多其他類似 BSD 的系統(tǒng)上運(yùn)行。主要 API 基于D-Bus實(shí)現(xiàn),并可以在/etc/avahi/services 中的 XML 文件中定義發(fā)布服務(wù)。
那么什么是mDNS/DNS-SD呢?什么又是零配置呢?
mDNS協(xié)議
mDNS是multicast DNS的縮寫,也即是多播DNS協(xié)議。
什么是DNS呢?簡單打個(gè)比方就是相當(dāng)于電話簿,比如要給某人打電話,往往很難記住某個(gè)人的電話號碼,因此需要去電話簿查這個(gè)人的號碼,然后再撥過去。計(jì)算機(jī)間通信IP需要知道目標(biāo)機(jī)的IP地址,也是常常使用主機(jī)名或者某個(gè)站點(diǎn)的域名進(jìn)行訪問,但是就通信協(xié)議而言則是需要對應(yīng)機(jī)器的IP地址。因?yàn)镈NS系統(tǒng)就被設(shè)計(jì)出來了。
DNS(Domain Name Server) 是指域名系統(tǒng),是用于管理域名與IP間對應(yīng)關(guān)系的軟件系統(tǒng)。那么問題來了,mDNS與常規(guī)的DNS又有何差異呢?
和DNS一樣,mDNS也是將域名解析為IP地址,不同的是mDNS在局域網(wǎng)級別運(yùn)行,這與全局級別運(yùn)行的常規(guī)DNS不同。它與零配置(Zeroconf)網(wǎng)絡(luò)中的DNS-SD(DNS-Service Discovery)協(xié)議結(jié)合使用。零配置網(wǎng)絡(luò)不需要手動(dòng)操作。此外,零配置網(wǎng)絡(luò)不依賴DNS服務(wù)器和DHCP服務(wù)器進(jìn)行操作。
DNS-SD協(xié)議
DNS-SD又是個(gè)什么東西呢?用來做什么的呢?DNS-SD允許客戶端獲取服務(wù)實(shí)例及其服務(wù)類型的命名列表,并使用標(biāo)準(zhǔn)DNS查詢消息將這些服務(wù)解析為主機(jī)名。mDNS協(xié)議在RFC6762中定義,DNS-SD協(xié)議在RFC6763中定義。mDNS有多種實(shí)現(xiàn)版本,比如Bonjor,Avahi,Windows等。
怎么使能Avahi
對于ZYNQ系統(tǒng)使用petalinux-tools編譯構(gòu)建Linux內(nèi)核以及根文件系統(tǒng),使用起來非常方便。
- 首先在已經(jīng)建立的petalinux工程運(yùn)行根文件系統(tǒng)配置命令:
petalinux-config -c rootfs
這樣得到如下的配置界面:
2.選擇 Filesystem Packages進(jìn)入:
3.選擇network進(jìn)入下一級配置界面:
4.進(jìn)入avahi配置界面進(jìn)入:
如上圖這樣配置,保存退出,就完成avahi配置了。
5.編譯部署
petalinux-build
再運(yùn)行如下命令,生成部署鏡像文件:
petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga xxxx.bit --u-boot --force
xxxx.bit是PL的FPGA所需要的bit文件。
6.運(yùn)行測試
將BOOT.BIN以及image.ub文件拷貝進(jìn)SD卡,將板子與電腦網(wǎng)口用網(wǎng)線直連,然后系統(tǒng)上電運(yùn)行,可見到如下類似的內(nèi)核打印信息:
INIT: Entering runlevel: 5
Configuring network interfaces... IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
udhcpc: started, v1.29.2
run-parts: /etc/udhcpc.d/00avahi-autoipd: exit status 1
udhcpc: sending discover
random: app: uninitialized urandom read (4 bytes read)
Server is listening...
udhcpc: sending discover
macb e000b000.ethernet eth0: link up (1000/Full)
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
udhcpc: sending discover
random: avahi-autoipd: uninitialized urandom read (4 bytes read)
"169.254.3.140"
broadcastDatagram
udhcpc: no lease, forking to background
done.
random: dbus-uuidgen: uninitialized urandom read (12 bytes read)
random: dbus-uuidgen: uninitialized urandom read (8 bytes read)
Starting system message bus: dbus.
Starting internet superserver: inetd.
Starting syslogd/klogd: done
* Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon
...done.
* Starting Avahi Unicast DNS Configuration Daemon: avahi-dnsconfd
...done.
檢查板子的IP地址:
root@idaq:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0A:35:00:1E:53
inet6 addr: fe80::20a:35ff:fe00:1e53/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:39 errors:0 dropped:0 overruns:0 frame:0
TX packets:63 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4132 (4.0 KiB) TX bytes:8953 (8.7 KiB)
Interrupt:27 Base address:0xb000
eth0:avahi Link encap:Ethernet HWaddr 00:0A:35:00:1E:53
inet addr:169.254.3.140 Bcast:169.254.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:27 Base address:0xb000
再檢查電腦的IP地址:
從而開發(fā)板IP地址為169.254.3.140,電腦的IP為169.254.50.229,子網(wǎng)掩碼都是255.255.0.0,所以電腦與開發(fā)板處于同一個(gè)子網(wǎng)中。剩下做應(yīng)用就是利用socket進(jìn)行TCP/UDP通信了。
這里對avahi的幾個(gè)配置項(xiàng)做個(gè)簡要的介紹:
avahi-dbg:使能這個(gè)選項(xiàng)就將avahi相關(guān)的調(diào)試符號編譯進(jìn)去了。
libavahi-glib:將avahi引擎編譯成glib庫接口以支持GTK+/GNOME
libavahi-client:編譯avahi client庫
libavahi-core:編譯avahi引擎編譯成庫,將完整的 mDNS/DNS-SD棧嵌入到應(yīng)用軟件中的 API。這僅適用于嵌入式設(shè)備的開發(fā)人員。
avahi-dev:多播/單播 DNS-SD框架
avahi-dnsconfd:mDNS/DNS-SD配置守護(hù)進(jìn)程的單播DNS服務(wù)器。avahi-dnsconfd 連接到正在運(yùn)行的avahi-daemon,并為本地 LAN 根據(jù)腳本 /etc/avahi/dnsconfd.action發(fā)送單播DNS服務(wù)。如此mDNS 就以類似DHCP的方式配置單播 DNS 服務(wù)。
avahi-autoipd:avahi-autoipd 實(shí)現(xiàn)了 IPv4LL,即“IPv4 鏈路本地地址的動(dòng)態(tài)配置協(xié)議”(IETF RFC3927),是一種無需中央服務(wù)器即可從鏈路本地 169.254.0.0/16 范圍自動(dòng)配置 IP 地址的協(xié)議。主要用于缺少DHCP服務(wù)器的ad-hoc網(wǎng)絡(luò)。avahi-autoipd可以用作獨(dú)立的地址分配器或用作DHCP客戶端的插件,如果找不到DHCP服務(wù)器,它可以用作后備解決方案。
avahi-utils:該配置項(xiàng)將使能多個(gè)實(shí)用程序,可以使用這些命令行與Avahi守護(hù)程序交互,包括發(fā)布、瀏覽和發(fā)現(xiàn)服務(wù)。
libavahi-common:該配置項(xiàng)使能Avahi 通用庫。
avahi-daemon:Avahi mDNS/DNS-SD守護(hù)進(jìn)程實(shí)現(xiàn)了Zeroconf 架構(gòu)。該守護(hù)進(jìn)程使用mDNS/DNS-SD注冊本地 IP 地址和靜態(tài)服務(wù),并為本地程序提供兩個(gè)進(jìn)程間通信的API,以利用 avahi-daemon維護(hù)的 mDNS 記錄緩存。
avahi-daemon 在系統(tǒng)啟動(dòng)時(shí)解釋其配置文件 /etc/avahi/avahi-daemon.conf 并從 /etc/avahi/services/*.service 讀取 XML ,這些信息可能被定義為靜態(tài) DNS-SD服務(wù)。如果在 avahi-daemon.conf 中啟用 publish-resolv-conf-dns-servers,文件 /etc/resolv.conf 也將被讀取。
libavahi-gobject:使能Avahi的GObject 接口庫。
總結(jié)一下
如果你使用buildroot進(jìn)行系統(tǒng)構(gòu)建,Buildroot也已經(jīng)內(nèi)置了Avahi的支持,配置也基本類似。當(dāng)然你也可以直接下載源碼進(jìn)行交叉編譯,不過個(gè)人不建議這樣使用。
總之,利用Avahi可以方便實(shí)現(xiàn)零配置網(wǎng)絡(luò),實(shí)現(xiàn)嵌入式Linux與電腦直連,自動(dòng)分配IP地址給電腦只是一個(gè)比較簡單實(shí)用的應(yīng)用,利用其庫還可以開發(fā)出更為復(fù)雜的應(yīng)用。
整理不易,如覺得有價(jià)值,請轉(zhuǎn)發(fā)給有需要的朋友,是對我最大的支持和肯定!