Google HomeのIPアドレスがmDNS(avahi)で取れなかったときのメモ

## 背景

Google Home (Mini)はmDNSで名前解決を行うことが出来るはずなのに、うまくいかないと思ったときの作業。トラブルシュート手順としてメモしておきます。

### WiFiアクセスポイントの設定確認

自分でも忘れてましたが、マルチキャストとかいらないだろうと、使用しない設定にしていました。mDNSはマルチキャストを使用するので、設定をやりなおす。

### avahi-utilsのインストール

```
sudo apt-get -y install avahi-utils
```

### avahi-browseで一覧を表示してみる

```
pi@raspberrypi:~ $ avahi-browse -at
+   eth0 IPv6 ReadyNAS104                                   _nut._tcp            local
+   eth0 IPv4 ReadyNAS104                                   _nut._tcp            local
+   eth0 IPv6 ReadyNAS Administration on ReadyNAS104        Web Site             local
+   eth0 IPv4 ReadyNAS Administration on ReadyNAS104        Web Site             local
+   eth0 IPv6 ReadyNAS104 (SMB)                             Microsoft Windows Network local
+   eth0 IPv4 ReadyNAS104 (SMB)                             Microsoft Windows Network local
+   eth0 IPv6 ReadyNAS104 [28:c6:XX:XX:XX:XX]               Workstation          local
+   eth0 IPv4 ReadyNAS104 [28:c6:XX:XX:XX:XX]               Workstation          local
+   eth0 IPv4 amzn.dmgr:91BXXXXXXXXXXXXXXXXXXXXXXXXXXXX8:rZDHJ+sCFo:370062 _amzn-wplay._tcp     local
+   eth0 IPv4 Google-Home-Mini-543XXXXXXXXe2e5a50XXXXXXXX27d9 _googlecast._tcp     local
+   eth0 IPv4 543XXXXX-120e-Xe5a-50XX-d4XXXXXX27d9          _googlezone._tcp     local
+   eth0 IPv4 c0XXXXXXXXXXXf0c-0                            _spotify-connect._tcp local
```

サービス名が_google*のものが見つかる。ということでちゃんと認識はしている。

### pingしてみる

```
pi@raspberrypi:~ $ ping Google-Home-Mini-543XXXXXXXXe2e5a50XXXXXXXX27d9.local
ping: Google-Home-Mini-543XXXXXXXXe2e5a50XXXXXXXX27d9.local: Name or service not known
```

失敗する。なんで？

```
pi@raspberrypi:~ $ ping ReadyNAS104.local
PING ReadyNAS104.local (192.168.X.XX) 56(84) bytes of data.
64 bytes from 192.168.X.XX (192.168.X.XX): icmp_seq=1 ttl=64 time=60.7 ms
```

NASのほうは問題なく応答する。

### avahiではなく、libnss側を疑ってみる

- libnss-mdnsの確認

```
pi@raspberrypi:~ $ dpkg -l | grep mdns
ii  libnss-mdns:armhf                     0.10-8                               armhf        NSS module for Multicast DNS name resolution
```
ちゃんと入ってる。

- nsswitch.confの確認

```
pi@raspberrypi:~ $ cat /etc/nsswitch.conf
:
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
```

ちゃんと、mDNSの名前解決設定が入ってる。
ちなみに、mdns4_minimalとmdns4の違いはなんだろうと思ったら、minimalはlocalドメインの名前解決しかしないらしい。minimalだけで十分かも。


### avahi-resolveで名前解決試してみる

```
pi@raspberrypi:~ $ avahi-resolve -nv 'Google-Home-Mini-543XXXXXXXXe2e5a50XXXXXXXX27d9.local'
Server version: avahi 0.6.32; Host name: raspberrypi.local
Failed to resolve host name 'Google-Home-Mini-543XXXXXXXXe2e5a50XXXXXXXX27d9.local': Timeout reached
```

やっぱりだめ。

### avahi-browseでサービス名指定のブラウズをしてみる

```
pi@raspberrypi:~ $ avahi-browse -rk _googlecast._tcp
+   eth0 IPv4 Google-Home-Mini-543XXXXXXXXe2e5a50XXXXXXXX27d9 _googlecast._tcp     local
=   eth0 IPv4 Google-Home-Mini-543XXXXXXXXe2e5a50XXXXXXXX27d9 _googlecast._tcp     local
   hostname = [543XXXXX-120e-Xe5a-50XX-d4XXXXXX27d9.local]
   address = [192.168.X.XX]
   port = [8009]
   txt = ["rs=" "nf=1" "bs=FA8FCA8D6433" "st=0" "ca=2052" "fn=ダイニング ルーム" "ic=/setup/icon.png" "md=Google Home Mini" "ve=05" "rm=" "cd=85XXXXXXXXXXXXXXE4" "id=543XXXXXXXXe2e5a50XXXXXXXX27d9"]
```

やっと、IPアドレスを見ることが出来た。

上の、avahi-browse -rkの結果では、ホスト名は'Google-Home-Mini~'ではなく、'543XXXXX-120e-Xe5a-50XX-d4XXXXXX27d9.local'になる模様。それを使って、もう一度avahi-resolveしてみた

```
pi@raspberrypi:~ $ avahi-resolve -n 543XXXXX-120e-Xe5a-50XX-d4XXXXXX27d9.local
543XXXXX-120e-Xe5a-50XX-d4XXXXXX27d9.local      192.168.1.5
```
今度はちゃんと結果が返った。

```
pi@raspberrypi:~ $ ping 543XXXXX-120e-Xe5a-50XX-d4XXXXXX27d9.local
PING 543XXXXX-120e-Xe5a-50XX-d4XXXXXX27d9.local (192.168.1.5) 56(84) bytes of data.
64 bytes from 192.168.1.5 (192.168.1.5): icmp_seq=1 ttl=64 time=2.13 ms
```
pingも普通に動作する。