PhotoViewer Updater (Java)

16.04.2018 14:35:55

Однажды меня спросили - могу ли я написать на Java утилиту, которая могла бы скачивать случайную картинку из интернета и отправлять ее на цифровую фоторамку через bluetooth? В тот момент я не имел ни малейшего понятия как это сделать, но идея показалась мне интересной и я согласился. Никаких ограничений по времени не было, соответственно можно было заниматься проектом в свободное время когда было вдохновение.

Задача:
  1. Находить устройства по Bluetooth
  2. Определять наличие bluetooth сервиса позволяющего передавать файлы
  3. Скачивать случайную картинку из интернета
  4. Передавать скачанную картинку на конечное устройство
  5. Отправлять новую картинку с заданной периодичностью
  6. Сохранять, редактировать и сбрасывать настройки приложения
  7. Возможность запускать приложения через планировщик заданий

На первый взгляд все кажется довольно просто, но при попытке реализовать первый пункт поставленной задачи, оказалось, что не так уж все просто. В Java существует спецификация JSR-82, которая описывает интерфейс взаимодействия с Bluetooth стэком. Тут вроде все понятно, но с реализацией не все так гладко. Единственная реализация данной спецификации, которую удалось найти - это проект Bluecove. Последний релиз данной библиотеки состоялся в декабре 2008 года, а последний preview snapshot датируется октябрем 2010 года. Мною была выбрана самая свежая версия, так как последняя релизная версия работала не корректно с bluetooth адаптерами Intel. В чем недостаток данной (единственной) библиотеки:

  • Работает только с виндовым bluetooth стеком;
  • В системе должен быть только один bluetooth адаптер;
  • Требует отдельной реализации под Linux, которая поставляется отдельно (лицензионные ограничения)
  • Не удобное API времен Ацтеков

Пробуем слепить из этого что-то рабочее. Примеры кода в данной статье приводить не буду, так как получится много буков и и скучно. Все опишу лишь некоторые ключевые моменты. После выбора устройства необходимо проверить поддерживает ли оно Bluetooth профиль Obex File Push (UUID 0x1105), далее получаем Connection URL вида btgoep://94652D2524EE:7;authenticate=false;encrypt=false;master=false далее работа с этим URL почти не отличается от HTTP.

Скачать случайную картинку из интернета не вызывает никаких сложностей, так как есть огромное множество сервисов, которые предоставляют такую возможность, я получаю случайное изображение по ссылке https://source.unsplash.com/random/?nature.

Запускать обновление изображения можно как при помощи планировщика в ОС, так и при помощи планировщика в самом приложении. Второй вариант показался более удобным, так как достаточно настроить все внутри приложения не прибегая к дополнительным настройкам в планировщике в ОС. Также была добавлена возможность только запускать приложение через планировщик, для этого нужно добавить флаг -r, так как запуск без флагов запускает консольное меню, в котором можно настроить параметры. Настройки приложения было решено хранить в при помощи класса java.util.prefs.Preferences, который выбирает способ хранения настроек приложения в зависимости от операционной системы. В Windows используется реестр, в то время как в Linux это XML файл в домашней директории пользователя. На сколько это лучше конфигурационного файла - вопрос остается открытым.

Все исходные коды на языке Java можно найти в моем профиле на GitHub, а так же небольшое видео с демонстрацией работы.

Коментариев пока нет, будьте первым!