2016-03-17 3 views
0

Мне иногда приходится настраивать сценарии MATLAB в зависимости от того, на котором он запущен. Я обычно использую следующую команду, чтобы захватить имя компьютера:Получить (непротиворечивое) имя компьютера в MATLAB

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

Это возвращает имя компьютера в большинстве случаев. Однако мой ноутбук (MacBook) меняется в зависимости от сети, к которой я подключен.

Есть ли способ получить какой-то уникальный идентификатор о компьютере, который не изменяет в зависимости от сети, к которой он подключен?

Обновление: Я забыл упомянуть, что я ищу решение, независимое от ОС. Мне нужно найти команду, которая работает на Mac, ПК или 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, возвращая только запущенные интерфейсы; поэтому вам нужно собрать адреса mac, анализируя результаты ifconfig (посмотрите некоторые примеры на примере here).

Обратите внимание! На Mac, если вы запустите виртуальную машину, можно добавить поддельные сетевые интерфейсы, поэтому sid может измениться.

+0

Увы, мне пришлось отказаться от ответа на этот вопрос, так как получается, что переменная 'sid' изменяется, когда я перемещаю местоположение и подключаюсь к новой сети. – CaptainProg

+0

Эта проблема касается функции java.net.NetworkInterface.getNetworkInterfaces, которая , на Unix-системах, возвращает только запущенные интерфейсы. Таким образом, если вы подключаете различные интерфейсы к сети, вы получаете другой сид; но, технически, идентификатор не зависит от конкретной сети. – PieCot

+0

Я обновил ответ. Соответствует ли эта версия вашим потребностям? – PieCot