我是否遗漏了什么或者由于某些原因这是不可能的?还有其他发现网络上其他设备的方法,只要它们在同一IP范围内也可以(因为它们将在同一IP范围内),但是尽管从2012年12月开始就有一些关于扩展程序的发现API的传言,但似乎还不存在。
有人有任何想法吗?
我是否遗漏了什么或者由于某些原因这是不可能的?还有其他发现网络上其他设备的方法,只要它们在同一IP范围内也可以(因为它们将在同一IP范围内),但是尽管从2012年12月开始就有一些关于扩展程序的发现API的传言,但似乎还不存在。
有人有任何想法吗?
您可以通过WebRTC API获取本地IP地址列表(更准确地说,是本地网络接口的IP地址)。此API可被任何Web应用程序使用(不仅限于Chrome扩展程序)。
示例:
// 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>
经过一番搜索,我发现类似的问题已经有人回答过了。
如果是在扩展程序中调用,无法访问该API,但对于Chrome应用程序可用:
可以使用
chrome.system.network.getNetworkInterfaces
。该方法将返回一个包含所有接口及其IP地址的数组。
以下是示例代码:
chrome.system.network.getNetworkInterfaces(function(interfaces){ console.log(interfaces); });
权限声明(manifest-permissions):
"permissions": [ "system.network" ], ...
'system.network' 仅允许打包的应用程序使用,但这是一个扩展。
- jishi> chrome.system.network.getNetworkInterfaces(function(interfaces){
> console.log(interfaces); });
清单权限:
"permissions": [ "system.network" ],...
对我也有效,并回复:
(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
'system.network' 只允许在打包的应用程序中使用,但这是一个扩展程序。
- Can Rau请查看http://developer.chrome.com/extensions/webRequest.html获取详细信息, 以下是我的代码示例:
// 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: []
},
[]
);