2017-01-27 23 views
4

Я пытался получить доступ к GPIO на Raspberry Pi с Android-вещами, используя NDK, но после нескольких попыток я всегда нахожу какую-то стену безопасности, которая мешает мне получить доступ к ней.Как сделать GPIO на Android-вещах в обход Java

Мотивация - это вялая скорость, которую я получаю от GPIO с использованием Java API. В качестве базовой ссылки мне удалось включить и выключить ее примерно на 2 кГц, что оказалось самым бедным среди this list. См. Также What is Android Things Raspberry Pi GPIO max frequency?, где пока нет ответа и где я добавил комментарий о скорости java. На самом деле эта работа была мотивирована результатами, которые я получил при проверке этого вопроса.

Лучший подход пока пытается что-то похожее на то, что потребуется для sysfs под Debian. В этом смысле код выглядит честным, но после запуска с правами root, устанавливая приложение в качестве системного приложения (перемещая его в/system/app) и chmod a + rw несколько разных вещей под /sys/class/gpio/ и /sys/class/gpio/gpio24/, а также /dev/gpiomem, это было то, что я получил:

01-27 12:54:47.069 8412 8412 I NativeHelper: Call native = hello from helper java class 
01-27 12:54:47.079 8412 8412 I NativeHelper: Open pin true 
01-27 12:54:47.080 8412 8412 F libc : Fatal signal 4 (SIGILL), code 1, fault addr 0xaf2e039c in tid 8412 (le.thingssample) 
01-27 12:54:47.081 128 128 W   : debuggerd: handling request: pid=8412 uid=10028 gid=10028 tid=8412 
01-27 12:54:47.066 8412 8412 I le.thingssample: type=1400 audit(0.0:211): avc: denied { write } for name="export" dev="sysfs" ino=854 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1 
01-27 12:54:47.076 8412 8412 I le.thingssample: type=1400 audit(0.0:212): avc: denied { open } for path="/sys/class/gpio/export" dev="sysfs" ino=854 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1 
01-27 12:54:47.166 8427 8427 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
01-27 12:54:47.166 8427 8427 F DEBUG : Build fingerprint: 'generic/iot_rpi3/rpi3:7.0/NIF73/3565696:userdebug/test-keys' 
01-27 12:54:47.166 8427 8427 F DEBUG : Revision: '0' 
01-27 12:54:47.166 8427 8427 F DEBUG : ABI: 'arm' 
01-27 12:54:47.167 8427 8427 F DEBUG : pid: 8412, tid: 8412, name: le.thingssample >>> com.amazingapps.sample.thingssample <<< 
01-27 12:54:47.167 8427 8427 F DEBUG : signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xaf2e039c 
01-27 12:54:47.167 8427 8427 F DEBUG :  r0 00000000 r1 b1f5e59f r2 b1f5e59f r3 af2e1c55 
01-27 12:54:47.167 8427 8427 F DEBUG :  r4 00000000 r5 be8e35fc r6 acca3230 r7 be8e35d8 
01-27 12:54:47.167 8427 8427 F DEBUG :  r8 be8e36f8 r9 acc85400 sl 00000000 fp be8e3684 
01-27 12:54:47.168 8427 8427 F DEBUG :  ip be8e3590 sp be8e3598 lr ae7fbd2b pc af2e039c cpsr 60000030 
01-27 12:54:47.170 8427 8427 F DEBUG : 
01-27 12:54:47.170 8427 8427 F DEBUG : backtrace: 
01-27 12:54:47.170 8427 8427 F DEBUG :  #00 pc 0000139c /data/app/com.amazingapps.sample.thingssample-1/lib/arm/libsample.so (Java_com_amazingapps_sample_thingssample_ndk_NativeHelper_doAll+59) 
01-27 12:54:47.170 8427 8427 F DEBUG :  #01 pc 002c8cb3 /data/app/com.amazingapps.sample.thingssample-1/oat/arm/base.odex (offset 0x2af000) 
01-27 12:54:48.133 408 8432 W ActivityManager: Force finishing activity com.amazingapps.sample.thingssample/.view.MainActivity 
01-27 12:54:48.137 128 128 W   : debuggerd: resuming target 8412 
01-27 12:54:48.138 408 427 I BootReceiver: Copying /data/tombstones/tombstone_02 to DropBox (SYSTEM_TOMBSTONE) 
01-27 12:54:48.228 8433 8433 W crash_reporter: Received crash notification for app_process32[8412] sig 4, user 10028 (handling) 
01-27 12:54:48.233 8433 8433 I crash_reporter: State of crashed process [8412]: S (sleeping) 
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:213): avc: denied { search } for name="8412" dev="proc" ino=214991 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=dir permissive=1 
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:214): avc: denied { read } for name="exe" dev="proc" ino=217417 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=lnk_file permissive=1 
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:215): avc: denied { read } for scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1 
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:216): avc: denied { open } for path="/proc/8412/status" dev="proc" ino=216902 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1 
01-27 12:54:48.226 8433 8433 I crash_reporter: type=1400 audit(0.0:217): avc: denied { getattr } for path="/proc/8412/status" dev="proc" ino=216902 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1 
01-27 12:54:48.672 408 422 W ActivityManager: Activity pause timeout for ActivityRecord{f2233fb u0 com.amazingapps.sample.thingssample/.view.MainActivity t86 f} 

по chmod a+rw /sys/class/gpio/export по крайней мере, я получил разницу и мог открыть и закрыть шпильку, проверяется значение метода возврата, а также проверка создание /sys/class/gpio/gpio24.

Я пытаюсь на Raspberry Pi 3 со следующим кодом: https://github.com/fmatosqg/androidthings_ndk/tree/SO_question

В другом подходе я попытался загрузки libperipheralman.so непосредственно в Java в надежде сделать вызовы функций (по-видимому, это где GPIO SetValue() жизни), но на этот раз я столкнулся с другой проблемой, когда подмножество библиотек было отказано в загрузке некоторой проблемой безопасности. См. Документацию Nougat о них, не позволяющую разработчикам получать доступ ко всем .so из-за обратной/будущей совместимости.

Я предполагаю, что любая реализация, которая пропускает использование Java VM/Dalvik, также потенциально может приблизить меня к моей цели, которая получает приличную скорость GPIO на .apk, но я не знаю, есть ли какой-либо из подходов, которые Здесь можно использовать работу с rpi3 + debian.

ответ

1

Редакция:

Run что-то вроде этого каждый раза вы собираетесь запустить приложение (работает на штифт 24, замените предпочитаемый штырь):

cd /sys/class/gpio 
su root chmod a+w export 
echo 24 > export 
su root chmod a+w gpio24/direction 
su root chmod a+w gpio24/value 

ls gpio24/ -l 

К сожалению, призывающей execl возвращается -1 и система возвращает 32256, поэтому нет способа заменить этот ручной шаг. Даже при попытке system("/system/bin/date > /storage/self/primary/now "); даст 32256.

Затем соберите скрипт, который прослушивает именованный канал и на основе которого выполняется указанный выше код. После битвы немного с su и chmod, чтобы упростить запуск, я собрал код C, который будет писать на тот же самый канал. Добавьте 300 мс дождаться, пока труба будет прочитана, и я начну писать в gpio23/direction и gpio/value из кода C изнутри apk.

Led загорается, и как только я оптимизирую код C для более жесткого цикла, я отправлю некоторый бенчмаркинг по скорости.

Полное решение здесь https://github.com/fmatosqg/androidthings_ndk/tree/SO_answer. Ознакомьтесь с инструкциями README.md.

Чтобы было лучше, мне нужно было отлаживать именованное чтение канала, потому что иногда я читаю неправильную информацию. А также запустить скрипт при загрузке.

 Смежные вопросы

  • Нет связанных вопросов^_^