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