I am working on a chrome extension which is supposed to discover and then communicate with other devices in a local network. To discover them it needs to find out its own IP
After some searching I've found that similar question was answered before. This API is inaccessible from extension, but available for chrome apps:
use
chrome.system.network.getNetworkInterfaces
.This will return an array of all interfaces with their IP address.
This is my sample code:
chrome.system.network.getNetworkInterfaces(function(interfaces){ console.log(interfaces); });
manifest-permissions:
"permissions": [ "system.network" ], ...
see http://developer.chrome.com/extensions/webRequest.html for detail, my code example:
// get IP using webRequest
var currentIPList = {};
chrome.webRequest.onCompleted.addListener(
function(info) {
currentIPList[info.url] = info.ip;
currentIPList[info.tabId] = currentIPList[info.tabId] || [];
currentIPList[info.tabId].push(info);
return;
},
{
urls: [],
types: []
},
[]
);
You can get a list of your local IP addresses (more precisely: The IP addresses of your local network interfaces) via the WebRTC API. This API can be used by any web application (not just Chrome extensions).
Example:
// Example (using the function below).
getLocalIPs(function(ips) { // <!-- ips is an array of local IP addresses.
document.body.textContent = 'Local IP addresses:\n ' + ips.join('\n ');
});
function getLocalIPs(callback) {
var ips = [];
var RTCPeerConnection = window.RTCPeerConnection ||
window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
var pc = new RTCPeerConnection({
// Don't specify any stun/turn servers, otherwise you will
// also find your public IP addresses.
iceServers: []
});
// Add a media line, this is needed to activate candidate gathering.
pc.createDataChannel('');
// onicecandidate is triggered whenever a candidate has been found.
pc.onicecandidate = function(e) {
if (!e.candidate) { // Candidate gathering completed.
pc.close();
callback(ips);
return;
}
var ip = /^candidate:.+ (\S+) \d+ typ/.exec(e.candidate.candidate)[1];
if (ips.indexOf(ip) == -1) // avoid duplicate entries (tcp/udp)
ips.push(ip);
};
pc.createOffer(function(sdp) {
pc.setLocalDescription(sdp);
}, function onerror() {});
}
<body style="white-space:pre"> IP addresses will be printed here... </body>
> chrome.system.network.getNetworkInterfaces(function(interfaces){
> console.log(interfaces); });
manifest-permissions:
"permissions": [ "system.network" ], ...
Works for me too and it replies:
(4) [{…}, {…}, {…}, {…}]
0 : {address: "xxxx", name: "en0", prefixLength: 64}
1 : {address: "192.168.86.100", name: "en0", prefixLength: 24}
2 : {address: "xxxx", name: "awdl0", prefixLength: 64}
3 : {address: "xxxx", name: "utun0", prefixLength: 64}
length : 4