2014-10-18 4 views
0

Я разрабатываю приложение для Linux, которое использует последовательные порты для связи с некоторыми устройствами. Я использую конвертеры usb-to-serial для всех своих устройств, поэтому все последовательные порты подключаются через USB.Уникальная идентификация последовательного порта в Java

В настоящее время я использую имя каждого порта, чтобы идентифицировать его (ttyAM0 или ttyUSB1 и т. Д.), Однако это очень проблематично, поскольку перераспределение портов продолжает меняться.

Я не могу создать правило udev, на самом деле ничего не следует изменять для самой ОС, поскольку считается, что конечный пользователь не сможет/умеет это сделать. (Это коммерческое приложение).

Вопрос: Как я могу однозначно идентифицировать каждый последовательный порт и хранить эту информацию, которая будет использоваться после следующей перезагрузки?

+0

Создать правило Udev ** и ** измените установки (или направление установки) для создания сказало правило Udev. –

+0

Порты можно изменить в настройках. PID и VID не могут быть известны, поскольку устройств много, и они все еще находятся в стадии разработки. Я также нацелен на то, чтобы не давать привилегии для приложения. –

ответ

0

ОК Я нашел решение ...
Поскольку меня интересует только Linux, я проверяю папку /dev/serial/by-id на уникальный идентификатор для каждого устройства. В файлах есть ссылки на последовательные порты.

So ...
Чтение имен файлов в этой папке дает идентификаторы.
Чтение цели каждой ссылки дает вам имя порта.

Вот часть моего рабочего кода:

HashMap<String, String> portsMap = new HashMap<>(); 

    File serialFolder = new File("/dev/serial/by-id"); 
    File[] listOfDevices = serialFolder.listFiles(); 

    for (int i = 0; i < listOfDevices.length; i++) 
    { 
     if (Files.isSymbolicLink(listOfDevices[i].toPath())) 
     { 
      try 
      { 
       String portName = listOfDevices[i].getName(); 
       String id = Files 
         .readSymbolicLink(listOfDevices[i].toPath()) 
         .toString() 
         .substring(
         Files.readSymbolicLink(listOfDevices[i].toPath()) 
         .toString().lastIndexOf("/") + 1); 
       portsMap.put(id, portName); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
Смежные вопросы