google-home-notifier의 'Error : getaddrinfo -3008'에 대처하기

소개



긴급 지진 속보를 Google Home에서 발표합시다. 및 Ubuntu14.04에서 google-home-notifier를 실행 한 결과,
Error: getaddrinfo -3008

가 발생했습니다. 이하, 그 때 실시한 내용의 메모 쓰기가 됩니다.

browser.js 수정



항상 그렇다면 google-home-notifierAfter "npm install"에 따라 node_modules/mdns/lib/browser.js에 {families:[4]}를 추가했습니다.

browser.js.diff
--- browser.js  (revision x)
+++ browser.js  (working copy)
@@ -116,7 +116,7 @@

 Browser.defaultResolverSequence = [
   rst.DNSServiceResolve()
-, 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
+, 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]})
 , rst.makeAddressesUnique()
 ];

그런데 결과는 변함없이 에러 발생. Raspberry Pi등에서는 개선했는데..., 다른 것인가.

Raspberry PI 2 getaddrinfo 3008 error #130 안의 코멘트에 있었다 {families:[0]} 등도 시험해 보았습니다만, 이것도 안돼....

IP 주소 지정



node_modules/google-home-notifier/google-home-notifier.js를 확인해 보면 Google Home의 IP 주소를 지정하면 mdns를 사용하지 않는다는 것을 알았습니다. 사실,
const googlehome = require('google-home-notifier')

googlehome.device('Google-Home', 'ja'); 
googlehome.ip('192.168.xxx.xxx'); //Google HomeのIPアドレスを指定
googlehome.notify('こんにちは。私はグーグルホームです。', function(res) {
  console.log(res);
});

같은 느낌으로 하면, 에러는 회피할 수 있었습니다. 하지만 가능하면 IP 주소를 지정하고 싶지 않습니다 ....

google-home-notifier.js 수정



결국, Google Home의 IP 주소를 다른 방법으로 취득하면 좋을까, 라고 하는 것으로, Google Home의 이름과 IP 주소를 찾는 방법 를 참고했습니다(감사합니다). 그 곳에서는 multicast-dns을 사용했으므로 node_modules/google-home-notifier/google-home-notifier.js를 다음과 같이 수정했습니다.

google-home-notifier.js.diff
--- google-home-notifier.js (revision x)
+++ google-home-notifier.js (working copy)
@@ -1,7 +1,6 @@
 var Client = require('castv2-client').Client;
 var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
-var mdns = require('mdns');
-var browser = mdns.createBrowser(mdns.tcp('googlecast'));
+var mdns = require('multicast-dns')()
 var deviceAddress;
 var language;

@@ -25,17 +24,28 @@

 var notify = function(message, callback) {
   if (!deviceAddress){
-    browser.start();
-    browser.on('serviceUp', function(service) {
-      console.log('Device "%s" at %s:%d', service.name, service.addresses[0], service.port);
-      if (service.name.includes(device.replace(' ', '-'))){
-        deviceAddress = service.addresses[0];
+    mdns.on('response', function (response) {
+      var name = '';
+      var ip = '';
+      for (const additional of response.additionals) {
+        if (additional.type == 'TXT') name = additional.name;
+        if (additional.type == 'A') ip = additional.data;
+      }
+      console.log('Device "%s" at %s', name, ip);
+      if (name.includes(device.replace(' ', '-'))){
+        deviceAddress = ip;
         getSpeechUrl(message, deviceAddress, function(res) {
           callback(res);
         });
+        mdns.destroy();
       }
-      browser.stop();
     });
+
+    mdns.query('_googlecast._tcp.local', 'PTR');
+
+    setTimeout(function () {
+      mdns.destroy();
+    }, 2500);
   }else {
     getSpeechUrl(message, deviceAddress, function(res) {
       callback(res);

우선은 이 수정으로 움직이고 있는 것 같습니다(IP 주소를 지정하지 않고). 처음에 응답이 있었던 Google Home에만 통지하고 있으므로, 오리지날과는 동작이 다른 생각이 듭니다만....

결론



이번은 장당적인 대처 밖에 실시하지 않았기 때문에, 시간이 생기면 근본의 원인을 조사해 보려고 생각합니다(조사는 어떻게 하는 것일까...).

좋은 웹페이지 즐겨찾기