Пишем простое, но полезное приложение для Nokia N900 за 20 минут

    Приветствую, уважаемый хабраюзер!
    В данной заметке я расскажу об интересных свойствах операционной системы Maemo с точки зрения
    системного администратора Unix. Цель заметки — показать удобство написания приложений под данную ОС.

    Писать приложение мы будем на Shell. А почему бы и нет? — ведь для Maemo это родная среда!

    В качестве примера хочу привести shell-скрипт, решающий простую задачу: автоматическое подключение к домашней точке доступа Wi-Fi при зарядке телефона. Этот скрипт может пригодиться тем, кто любит вешать на телефон различные задачи на ночь: например, обновление RSS-каналов, синхронизация с Google-календарем, обновление софта, и т.д.

    Open Source

    Чтобы не быть голословным, приведу сразу весь скрипт:

    #!/bin/sh
    ############ КОНФИГ #############################
    # Время "спячки" скрипта между попытками (в секундах)
    sleeptime=60
    # id вашей сети. Узнать можно командой gconftool -R /system/osso/connectivity/IAP
    WIFI_ID="56b4d822-edd4-4692-baf2-25b0711d1e7b"
    #
    #################################################
    temp=1
    # Начинаем бесконечный цикл
    while [ $temp = "1" ]; do  	
    	# узнаем статус зарядки - connected или disconnected
    	status=`hal-get-property --udi /org/freedesktop/Hal/devices/bme --key maemo.charger.connection_status`	
    	if [ $status = "connected" ]; then    
    	  echo "Charger found! Trying to connect to home wifi..."
    	  # Подключаемся
    	  dbus-send --system --print-reply --type=method_call --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:"$WIFI_ID" uint32:0
    	  #
    	fi		
     #спим
     sleep $sleeptime	
    done
    #
    #### КОНЕЦ ####
    


    Как это работает?

    Хотелось бы остановиться на двух строчках:

    1. status=`hal-get-property --udi /org/freedesktop/Hal/devices/bme --key maemo.charger.connection_status`	
      

      Данная команда использует HAL чтобы узнать подключена ли подзарядка к телефону. Необходимый udi я узнал, кажется, здесь, а нужный ключ командой
      lshal | grep charge

    2. dbus-send --system --print-reply --type=method_call --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:"$WIFI_ID" uint32:0
      

      Здесь мы подключаемся к D-Bus и посылаем запрос на подключение к сохраненной точке доступа. Команду можно найти в очень полезном для новичков мануале Phone Control официальной Wiki Maemo.


    Думаю, касательно остальной части скрипта вопросов возникать не должно.

    Установка


    Далее, необходимо заставить работать скрипт постоянно в фоне и добавить в «автозапуск»:
    • Даем скрипту имя wifi-on-charge.sh и помещаем в /usr/bin/
    • Даем права на исполнение: chmod +x /usr/bin/wifi-on-charge.sh
    • Создаем скрипт для запуска (не уверен, что оптимальный вариант, но я делаю так):
      #!/bin/sh
      /usr/bin/nohup /usr/bin/wifi-on-charge.sh > /dev/null 2>&1 &
      
    • Даем права на исполнение chmod +x /usr/bin/run-wifi-on-charge.sh
    • В директории /etc/event.d создаем текстовый файл wifi-on-charge с содержанием:
      #
      start on started hildon-desktop
      
      exec /usr/bin/run-wifi-on-charge.sh
      
      #
      
    • Перезагружаем аппарат, проверяем: после вставки кабеля подзарядки в течении 60 секунд должно произойти подключение к Wi-Fi


    Заключение


    В заметке показан один из простых способов добавления приятных фич в свой N900. Данный скрипт не дописан: он плохо себя ведет, если рядом нет домашней точки доступа. Но данная проблема легко решается, если вы полны энтузиазма и владеете основами программирования. ;)

    Надеюсь, данная заметка поможет новичкам в мире Maemo сделать первый шаг к написанию своей полезной утилиты.

    В следующий раз я расскажу о том, как писал приложение Outcoming Call Vibro.

    Ссылки:
    Phone Control
    D-Bus Scripts
    Поделиться публикацией

    Комментарии 43

      +2
      Вообще логично заменить WIFI_ID=«56b4d822-edd4-4692-baf2-25b0711d1e7b» на WIFI_ID=`gconftool -R /system/osso/connectivity/IA`. Если конечно команда gconftool -R /system/osso/connectivity/IA выводит только id.
        +3
        Не, она выводит список всех сохраненных соединений.
        А вообще, в скрипте можно многое улучшить, конечно же. Например, бесконечный цикл не принято так делать в Shell. :)
        0
        Зачем скрипт? N900 же сама соединяется с домашней сетью как только переступаешь порог, без зависимости от зарядки.
          +2
          Многие выключают эту опцию потому что от постоянного скана садится батарейка.
            –1
            Увличить интервал скана до 2х часов. Профит? Где-то в полночь оно подключится
              +1
              Тогда оно будет подключаться ко всем известным точкам, а не только к домашней.
                0
                Но, наверное, вполне можно сделать так скриптом, чтобы подключалось только к домашней.
              0
              А я модуль сам отключаю обычно, можно ли его как-то заводить скриптом?
            +2
            Нужен скрипт отключающий WiFi при севшей батарейке :)
              +1
              Я, кстати, когда-то хотел такое сделать, но передумал. Представьте ситуацию: вы понимаете, что телефон сейчас умрет, а вам надо за считанные секунды до его выключения что-то важное прочесть в инете; а тут — раз, и вайфай рвется.
              +1
              Не лучше ли осовываться на dbus-scripts и ждать path=/org/freedesktop/Hal/devices/bme; interface=org.freedesktop.Hal.Device; member=PropertyModified сообщения? Хотя потом надо все равно hal-get-property, так как от PropertyModified идут массивы, они AFAIK dbus-scripts'ом не обрабатываются, но может быть это уже будет реже, чем раз в минуту.

              Out-call-vibro я тоже переписал у себя на dbus-scripts, так как после установки enhanced busybox он перестал нормально работать. И еще глючок, он плохо убивается через stop имя сервиса, так как создается 2 процесса из-за вызова vibro() внутри.
                0
                Можно dbus-scripts. Я просто о нем на днях узнал. Когда out-call-vibro делал, его еще не было (либо был сильно не стабильным).

                В enhanced busybox, интересно почему не работает. А убивать его лучше специальным скриптом stop-out-call-vibro.sh (что-то вроде того).

                А не покажите ваш вариант на dbus-scripts?
                +1
                Господа, вам памяти не жалко, лишнего демона в систему пускать? Можно ведь на udev!

                Пишем /etc/udev/rules.d/11-charger-connect-monitor.rules

                SUBSYSTEM!="power_supply", GOTO="charger_connect_moitor_end"

                ENV{BATTERY_STATE_DETECTED}!="Discharging", ATTR{status}=="Discharging", RUN+="/sbin/udevadm control --env=BATTERY_STATE_DETECTED=Discharging"
                ENV{BATTERY_STATE_DETECTED}!="Charging", ATTR{status}=="Charging", RUN+="/path/to/executable"
                ENV{BATTERY_STATE_DETECTED}!="Charging", ATTR{status}=="Charging", RUN+="/sbin/udevadm control --env=BATTERY_STATE_DETECTED=Charging"

                LABEL="charger_connect_moitor_end"


                А потом я не понял, следит ли сам udevd на N900 за изменениями правил, на всякий случай
                # /sbin/udevadm control --reload_rules

                И есть нюансы. Во-первых, таким способом будут отслеживаться события системы power_supply, а они генерируются каждую минуту, что ли, в момент подключения/отключения зарядки не генерируются.
                Во-вторых, мониторится статус «заряжается/разряжается». Т.е. если подключить провод при полной батарее, то скрипт вызван не будет.
                  0
                  Спасибо! Попробую.
                  А где почитать про этот «язык udev»?
                  0
                  Упс, я тут не учёл, что POWER_SUPPLY_STATUS может принимать значение «Full»…

                  Вообще, по идее, должен быть способ ловить именно событие подключения зарядки, т.е. мой подход тоже не очень правильный.
                    +1
                    Заметка для себя.

                    Бида-бида, в ядре kernel-power v48+ отключили загрузку модуля bq27x00_battery (и включать, как я понял, не рекомендуется), посему папочки /sys/class/power_supply нема и события от power_supply не генерируются.

                    Мой убер метод не работает :(

                    Хочу нормальный способ запускать скрипт по подключению к зарядке!
                      0
                      У меня 49-й kernel power и метод, описанный в топике еще работает…
                  0
                  Очень странно что это не поведение устройства по умолчанию или не регулируется опциями по энергосбережению.
                    +3
                    Всё просчитать невозможно. По сравнению с андройдом < 2.3, в настройках maemo5 и так продумано гораздо больше вариантов использования.
                      +2
                      А что, правда есть телефоны, которые из коробки умеют подключаться к домашней WiFi при подключении кабеля зарядки?
                      0
                      >status=`hal-get-property --udi /org/freedesktop/Hal/devices/bme --key maemo.charger.connection_status`

                      а если так?:

                      cat /sys/class/power_supply/ac/online
                        0
                        No such file or directory. :(
                        Сейчас погуглил — походу, только так можно узнать статус чарджера на этом девайсе.
                          0
                          >No such file or directory. :(

                          ну эээ ls /sys/class/power_supply/ покажите
                            0
                            нет директории такой
                              0
                              это как-то очень странно — такая директория обязательно есть, если в ядре включена поддержка устройств питания (проверит — zcat /proc/config.gz|grep POWER_SUPPLY).

                              если она отключена, что было бы очень странно на телефоне, то мне непонятно, откуда у вас система берет информацию о подлючении зарядки и уровне батареи
                          0
                          /sys/class/power_supply/bq27200-0/status

                          Подключил правда USB-зарядку — всё равно Discharging. Розеточной под рукой нету.
                            0
                            А через HAL и USB-зарядка детектится способом из скрипта в заметке.

                            Что-то не нашел у себя power_supply.
                            Ядро 2.6.28.10power42
                              0
                              А, ну у меня 2.6.28.10-power48
                                +1
                                Посмотрел сейчас на телефон, вроде шнур вставлен, а желтый светодиод не мигает. (Хотя Advanced Power показывал зарядку). Переткнул, в status стало Charging. Так что можно и так, но на последних ядрах от pali по всей видимости.
                            –1
                            Затравка не соответствует теме, чуть менее чем полностью.
                            Это не написание приложения под Maemo, это написание sh-скрипта приницпиально работающего в любой nix системе. Что
                            а) совсем не одно и то же
                            б) никак не иллюстрирует мысль «Цель заметки — показать удобство написания приложений под данную ОС.»
                              +2
                              Хотя, конечно «Ух ты, Маемо это настоящий линукс».
                              Но я так сделал год назад и успокоился.
                                +2
                                бу-бу-бу… скрипт-то работает только на N900, как ни крути. :)
                                Можно, конечно, зафигачить на Си, но я люблю Unix-way.

                                Мне нравится сама идея писать на Shell под N900. И я стараюсь популяризовать эту идею, так как почему-то этим почти никто не занимается.
                                  0
                                  «почему-то»? Нет, Вы серьёзно?
                                    0
                                    А вы много видели пакетов в репозиториях Maemo, написанных на shell?
                                  0
                                  >это написание sh-скрипта приницпиально работающего в любой nix системе. Что

                                  нет, тут маемо-специфичный проприетарный api
                                    0
                                    ну, я бы не стал называть d-bus и hal проприетарными api )
                                      0
                                      >--dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect

                                      это не HAL, а какой-то нокиевский проприетарный демон. который проприетарный, даже если он опенсорс
                                        0
                                        ну тут согласен )
                                  +1
                                  Как только мне попал N900 в руки я захотел странного, а именно:

                                  1. Входящий звонок
                                  2. Поднимается труба
                                  3. Проигрывается звуковой файл «Абонент находится в заднице, перезвоните попозже»

                                  Таким образом:

                                  1. Я вижу кто мне звонит
                                  2. В случае надобности я перезвоню
                                  3. Если мне с этим человеком общаться сейчас влом, то проигнорирую. А он будет свято уверен, что я был не в сети.
                                  4. Все довольны.

                                  Такой режим я бы постоянно включал на работе.

                                  Можно ли такое соорудить? Не обязательно скриптом, чисто теоретически?
                                    0
                                    Вроде этот функционал называется «автоответчик». :)
                                    Я погуглил — вроде есть что-то. Но ссылки на софтину не нашел… Надо лучше поискать — возможно, уже есть такая штука.
                                    0
                                    Ну, в принципе, да… Автоответчик и есть. :)) Софта точно такого нету. Обыскался весь.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое