Управляем чем угодно откуда угодно

[ferro-remote][+lua] Луна для клиента.

Обсуждение линуксовой части и софта на борту виртурилки

[ferro-remote][+lua] Луна для клиента.

Сообщение nwnclv » 14 окт 2014, 01:28

Всем снова привет.

Пока не могу разобраться с i2c (видимо один из пинов на виртурилке скорее мертв, чем жив :( ) Решил встроить в клиента (пока только в него) луашечку. В задаче было предоставить интерфейс удаленных вызовов в скрипт Луа.

Ссылка на github та же. Скачать собранного агента (теперь так называется серверная сторона), клиента для виртурилки (в смысле клиент, который может запуститься на виртурилке), а так же клиента для windows можно тут

Для привлечения внимания =)
Код: Выделить всё
function main( argv )

    dev = gpio.export( tonumber( argv.gpio ), gpio.DIRECT_OUT ) -- открыть GPIO

    local i = 0

    local on_off = { 'OFF', 'ON' }

    while true do  --- do work
        println( on_off[(i % 2) + 1]  )
        gpio.set_value( dev, i % 2 ) -- поменять состояние пина на противоположное
        sleep( 1 )  -- спать секунду
        i = i + 1
    end
end


Краткое описание.

Что уже есть: консольный клиент, который я уже описывал в соседней теме, который, к тому же, умеет исполнять lua-скрипты.
Нюансы:
  • Скрипт исполняется на стороне клиента уже в настроенной среде.
  • Клиент может быть на любой удаленной системе, либо на той же виртурилке, что и агент.
  • клиент уже подключен к удаленной машине (виртурилке, например)
  • в состояние Луа предоставлена таблица с интерфейсами вызовов и некоторые переменные (например флаги открытия файлов, направление GPIO ...)
Иными словами если запустился скрипт, то он уже может работать с удаленной системой.
В скрипты добавлены все возможности библиотеки ferro-remote, как то:
  • os.system( "" ),
  • работа с файловой системой,
  • работа с интерфейсом GPIO (через /dev/)
  • Поддерживает асинхронные события от спец. файлов и GPIO (по-сути тоже файлы, но интерфейс этих событий немного упрощен, поскольку заранее известно, что ожидается)

На github в состав проекта входят некоторые скрипты-примеры там же (в README.md) есть разворот таблицы fr, которая является основным инструментом для удаленной работы.

Про таблицу:

В таблицу входит еще одна большая таблица, названная client, что намекает на принадлежность к пространству клиента. В таблицу клиента входят еще 3 таблицы:
  • os - для вызов system на удаленной системе
  • fs - для работы с файловой системой. Сюда входит и таблица file, которая есть интерфейс для работы с файлами (чтение, запись...)
  • gpio - собссно для работы с GPIO

Нюансы скриптования:
У скпритов есть 2 фазы исполнения: первая - это загрузка и инициализация и вторая - это исполнение функции main, в которою передается таблица параметров (параметры задаются в командной строке клиента как -p"param=value", все параметры строковые). Скрипт можно прервать в любой момент вызовом 'die("строка с сообщением")', который кинет исключение например так.
Примеры:

  • show-fr-table.lua, show-main-argv.lua: просто выводят таблицы
  • remote-exec.lua: исполняет команду на удаленной системе. Команда должна быть передана как -p"command=command"
  • directory-tree.lua, directory-list.lua: показывают директорию как дерево и как список соответственно. Показывают работу с файловыми итераторами
  • file-push.lua, file-pull.lua: заливают и сливают файл соответственно.
  • file-stat.lua: статистика удаленного пути (см. man 2 stat)
  • gpio-blinking.lua: включает, выключает GPIO по заданному номеру, с паузой в секунду
  • gpio-change-event.lua: Один из интересных примеров. Открывается GPIO и происходит подписка на событие изменения состояния пина. Сигнал о смене приходит асинхронно и вызовы main и change_handler исполняются в разных потоках Lua. В main симулируется "работа", путем вывода точек на консоль.
  • dev-random-event.lua: и еще один похожий на предыдущий пример. Только подписка производится на события файла /dev/random, который является специальным устройством. В обработчике события выводится тот "мусор", который сгенерячился для данного открытого файла.

Пример работы (GPIO, например)

На виртурилке запустим агента
Код: Выделить всё
./ferro_remote_agent -s 0.0.0.0:12345


Теперь запустим первого клиента, который будет отслеживать изменения GPIO с интедсом 3 (На виртурилке прерывания умеют только GPIO 1-7 )
Код: Выделить всё
./ferro_remote_client -s 192.168.3.1:12345 -clua -e gpio-change-event.lua -p"gpio=3"

А на другой машине я запущу скрипт gpio-blinking.lua, который раз в секунду будет менять состояние GPIO 3
Код: Выделить всё
./ferro_remote_client -s 192.168.3.1:12345 -clua -e gpio-blinking.lua -p"gpio=3"

на второй машине начитается смена состояния GPIO 3
Код: Выделить всё
...
OFF
ON
OFF
ON
...


В это же время первая машина получает событие по этому поводу.
Код: Выделить всё
...
.Value for gpio 3 changed to 1
.Value for gpio 3 changed to 0
.Value for gpio 3 changed to 1
.Value for gpio 3 changed to 0
...


Данное событие так же будет возникать, если GPIO3 будет соединено с каким-либо GPIO, настроенным на OUT через кнопку. Кнопку нажал - 1, отпустил - 0

PS: И про ошибки. Обработка ошибок пока по минимуму. ТО есть передал некорректный интерфейс - упал, попытался открыть несуществующий файл - вылетел. Пока это только тестовая платформа. Потом по дороге можно что-то добавить.
PSS: Еще примерами пока не покрыты вызовы работы с файловой системой. В арсенале функции
- mkdir - создает директорию
- write - записывает в файл заданную строку/данные. Делается за один вызов. Максимальный размер данных - 40к
- read - читает заданный файл. Делается за один вызов. Максимальный размер данных - 40к
- del - удаляет пустую директорию, либо файл
- rename - переименовывает файловый объект

На этом краткое описание закончено =) Будут вопросы, отвечу.
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

Re: [ferro-remote][+lua] Луна для клиента.

Сообщение nwnclv » 18 окт 2014, 15:14

¡Hola! :)

Добавил возможность подключаться прямо из скрипта. То есть скрипт может сделать какую-то работу и только потом подключиться к агенту виртурилки. А потом отключиться и подключиться к другому агенту, и тд.
Пример connect/disconnect тут.
То есть параметр -s теперь не является обязательным для исполнения lua. Но если он указан, то клиент будет подключен и только потом исполнен скрипт. Ну и таблицы fr.client.os, fr.client.fs, fr.client.gpio появляются только при подключение. + в таблице fr.client будет поле server (тыц), которое будет содержать адрес текущего сервера, к которому подключен клиент.
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04

Re: [ferro-remote][+lua] Луна для клиента.

Сообщение nwnclv » 01 ноя 2014, 18:38

И снова привет.

Наконец-то добыл рабочую железку и разобрался с I2C. Теперь ferro_remote предоставляет интерфейс для работы с этим зверем.

Умеет открыть шину, читать/писать байты/слова/блоки данных. Писать и читать байты/слова можно как по одному за вызов, так и пачкой.
Умеет получить маску поддерживаемых функций. Умеет послать ioctl (за исключением I2C_FUNCS (вывернут в отдельный вызов), I2C_RDWR (опять же размазан по вызовам) и I2C_SMBUS (пока не вывернут вовсе)).
Пока ioctl для lua недоступен, как и некоторые другие вызовы. можно тут посмотреть в таблице i2c

Как обычно накидал несколько примеров на луа. тут. 3 примера

i2c-available-bus.lua - показывает доступные шины (сделал от 0 до 9..так, на всякий случай =)) Помимо доступен/недоступен скрипт еще покажет поддерживаемые функции на доступной шине. Например:
Код: Выделить всё
 % ./ferro_remote_client -s 192.168.3.1:12345 -c lua -e i2c-available-bus.lua
Bus 0 is not available
Bus 1 is available
   SMBUS_WRITE_BYTE = yes
   SMBUS_BLOCK_PROC_CALL = no
   SMBUS_QUICK = yes
   SMBUS_READ_WORD_DATA = yes
   NOSTART = no
   SMBUS_READ_I2C_BLOCK = yes
   PROTOCOL_MANGLING = no
   SMBUS_READ_BLOCK_DATA = no
   SMBUS_WRITE_WORD_DATA = yes
   SMBUS_READ_BYTE_DATA = yes
   SMBUS_WRITE_I2C_BLOCK = yes
   SMBUS_WRITE_BLOCK_DATA = yes
   SMBUS_PROC_CALL = yes
   I2C = yes
   SMBUS_WRITE_BYTE_DATA = yes
   10BIT_ADDR = no
   SMBUS_PEC = yes
   SMBUS_READ_BYTE = yes
.....


i2c-dump.lua этот скрипт повторяет то, что делает i2cdump -y <bus> <address> на целевой системе.
Рисует практически такую же сетку. Пример с клиента на win Изображение
параметры, например -p"bus=1" -p"address=76" аналогичны параметрам -y 1 0x4c для i2cdump (лень было хексы парсить)
mma7660fc.lua Просто пример работы с датчиком mma7660fc, который акселерометр. В цикле читаются x, y, z и tilt железки.
Код: Выделить всё
....
X=46   Y=1   Z=63   TILT=24                          
X=46   Y=1   Z=63   TILT=24                          
X=46   Y=1   Z=63   TILT=24                          
X=47   Y=0   Z=63   TILT=24                          
....


/---
nwnclv
 
Сообщения: 67
Зарегистрирован: 22 авг 2014, 19:04


Вернуться в Софт на виртурилке - SDK, Linux, Github, программирование (C/C++ и др.)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron