Raspberry PiにNodeJSをインストールしましたが、rPiがNodeJを介してインターネットに接続されているかどうかを確認する方法はありますか?
10 に答える
簡単で汚い方法は、ノードが解決できるかどうかを確認することwww.google.com
です。
require('dns').resolve('www.google.com', function(err) {
if (err) {
console.log("No connection");
} else {
console.log("Connected");
}
});
これは、RaspPi がインターネットに接続されていてwww.google.com
も、何らかの理由で解決できない可能性があるため、完全に確実というわけでerr.type
はありません。ダウンしてください」)。
少し前にNodeJSアプリで似たようなものを構築しなければなりませんでした。私が行った方法は、最初にnetworkInterfaces()関数を OS モジュールとして使用し、次に 1 つ以上のインターフェイスに非内部 IP があるかどうかを確認することでした。
それが本当なら、私はexec()を使用して、明確に定義されたサーバー (私は Google の DNS サーバーが好きです) で ping を開始しました。exec() の戻り値を確認することで、ping が成功したかどうかがわかります。インターフェイスの種類に基づいて ping の数を調整しました。プロセスをフォークするとオーバーヘッドが発生しますが、このテストは私のアプリではあまり頻繁に実行されないため、余裕があります。また、ping と IP アドレスを使用することで、構成されている DNS に依存しません。次に例を示します。
var exec = require('child_process').exec, child;
child = exec('ping -c 1 128.39.36.96', function(error, stdout, stderr){
if(error !== null)
console.log("Not available")
else
console.log("Available")
});
ここで他のソリューションでDNSキャッシュが気になったので、実際にhttp2を使って接続テストをしてみました。大量のデータを送信せず、DNS 解決のみに依存せず、非常に高速であるため、これがインターネット接続をテストする最良の方法だと思います。
const http2 = require('http2');
function isConnected() {
return new Promise((resolve) => {
const client = http2.connect('https://www.google.com');
client.on('connect', () => {
resolve(true);
client.destroy();
});
client.on('error', () => {
resolve(false);
client.destroy();
});
});
};
isConnected().then(console.log);
編集:誰かが興味を持っている場合は、これをパッケージにしました。