2016-03-17 60 views
0

我偶爾需要根據正在運行的計算機來定製MATLAB腳本。我通常使用下面的命令來獲取計算機名稱:在MATLAB中獲取(一致的)計算機名稱

char(getHostName(java.net.InetAddress.getLocalHost) 

案件返回計算機名稱。但是,我的筆記本電腦(MacBook)根據我連接的網絡而有所不同。

有沒有辦法檢索某種關於電腦的某種唯一標識符,不會改變取決於它連接的網絡?

更新:我忘了提及我正在尋找一個獨立於操作系統的解決方案。我需要找到一個適用於Mac,PC或Linux的命令。

+0

我對Mac協議並不是很瞭解,但是根據網絡而改變名稱的部分不僅僅是後綴(名稱的前綴保持不變)? – Hoki

回答

0

一個獨立於網絡的好標識是MAC Address(與macbook無關)。每臺計算機都有一個唯一的MAC地址。你可以用MATLAB的這個命令得到它:

system('ifconfig en0 | grep ether') 

你會得到類似的東西在輸出:

ether 80:e6:50:28:76:d0 
0

可以使用的計算機的網卡的硬件地址,如建議here,用下面的Matlab代碼提取它:

not_win=true; 
switch computer('arch') 
    case {'maci','maci64'} 
     [~,mac_add]=system('ifconfig |grep ether | grep -o -E "([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}"'); 
    case {'glnx86','glnxa64'} 
     [~,mac_add]=system('ifconfig | grep HWaddr | grep -o -E "([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}"'); 
    case {'win32','win64'} 
     not_win=false; 
     sid = ''; 
     ni = java.net.NetworkInterface.getNetworkInterfaces; 
     while ni.hasMoreElements 
      addr = ni.nextElement.getHardwareAddress; 
      if ~isempty(addr) 
       sid = [sid, '.', sprintf('%.2X', typecast(addr, 'uint8'))]; 
      end 
     end 
    otherwise, error('Unknown architecture') 
end 

if(not_win) 
    mac_add=regexprep(mac_add,'\r\n|\n|\r','.'); 
    sid=upper(strrep(mac_add(1:end-1),':','')); 
end 

sid變量包含你正在尋找的唯一標識符。 您必須檢測機器的體系結構,因爲java.net.NetworkInterface.getNetworkInterfaces在Unix上無法正常工作,只返回正在運行的接口;因此您必須收集解析ifconfig結果的mac地址(有關示例,請參閱here)。

注意!在Mac上,如果啓動虛擬機,則可以添加虛擬網絡接口,因此sid可能會更改。

+0

唉,我不得不接受這個答案,因爲事實證明,每當我移動位置並連接到一個新的網絡時,sid'變量都會改變。 – CaptainProg

+0

此問題涉及函數java.net.NetworkInterface.getNetworkInterfaces在Unix系統上,只返回正在運行的接口。所以,如果你連接到網絡的不同接口,你會得到一個不同的sid;但在技術上,標識符是獨立於特定網絡的。 – PieCot

+0

我已經更新了答案。這個版本是否適合您的需求? – PieCot