Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/FileWriteScript

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Запись в файл shell-скрипта[1]

Этот пример показывает, как при помощи класса FileIO записывать данные в файл, находящийся в файловой системе Yun. Скетч сначала создаст файл shell-скрипта (в директории «tmp»), а затем запустит его выполнение.

Необходимое оборудование

  • Плата Arduino Yun;

Цепь

Для этого примера цепи строить не нужно.

Код

Подключаем класс FileIO – для коммуникации с файловой системой.

  1. #include <FileIO.h>

В секции setup() инициализируем Bridge, FileSystem и Serial (последовательную передачу данных). Ждем активации соединения, а затем вызываем пользовательскую функцию uploadScript(), которая загрузит ваш файл.

  1. void setup() {
  2.   Bridge.begin();
  3.   Serial.begin(9600);
  4.  
  5.   while(!Serial);  // ждем подключения последовательного порта
  6.   Serial.println("File Write Script example\n\n");  // "Пример создания и записи в файл для shell-скрипта"
  7.  
  8.   FileSystem.begin();
  9.  
  10.   uploadScript();
  11. }

Секция loop() будет просто выполнять ваш скрипт каждые 5 секунд. Это будет осуществляться при помощи другой пользовательской функции – runScript().

  1. void loop() {
  2.   runScript();
  3.   delay(5000);
  4. }

Функция uploadScript() создаст в файловой системе shell-скрипт, который будет следить за сетевым трафиком WiFi-интерфейса. Создаем файл, а затем открываем его – посредством создания экземпляра класса File и вызова функции FileSystem.open(), где указывается, в каком месте нужно создать скрипт. Этим местом будет директория «tmp», находящаяся в RAM – для того, чтобы сэкономить места в ограниченной FLASH-памяти, занимающейся циклами считывания/записи.

  1. void uploadScript() {
  2.   File script = FileSystem.open("/tmp/wlan-stats.sh", FILE_WRITE);

Записываем содержимое скрипта в файл при помощи функции File.print(). Начинаем с заголовка «#!/bin/s», а затем вписываем ifconfig – это утилита командной строки для управления сетевыми интерфейсами. Вам нужен будет WiFi-интерфейс, поэтому далее вписываем «wlan0». Затем вписываем grep – это утилита, которая будет выискивать результат ifconfig. Вам нужно количество полученных байтов, поэтому будем искать слова «RX bytes». Теперь закрываем файл.

  1. script.print("#!/bin/sh\n");
  2.   script.print("ifconfig wlan0 | grep 'RX bytes'\n");
  3.   script.close();  // закрываем файл

Создаем экземпляр класса Process, который будет отвечать за выполнение скрипта. Для этого воспользуемся командой chmod, задачей которой является изменение прав доступа к файлам. Пишем эту команду вместе с путем к файлу – благодаря этому shell-скрипт запустится как приложение.

  1. Process chmod;
  2.   chmod.begin("chmod");      // chmod – меняем право доступа к файлу
  3.   chmod.addParameter("+x");  // «x» означает «выполнение»
  4.   chmod.addParameter("/tmp/wlan-stats.sh");  
  5.   chmod.run();
  6. }

В функции runScript() создаем еще один экземпляр класса Process – он запустит скрипт, а затем выведет результат на Serial Monitor. Затем запускаем его при помощи функций Process.begin(путь к файлу) и Process.run().

  1. void runScript() {
  2.   Process myscript;
  3.   myscript.begin("/tmp/wlan-stats.sh");
  4.   myscript.run();

Создаем строку, в которой будем хранить результат. Далее считываем результат в эту строку.

  1. String output = "";
  2.  
  3.   while (myscript.available()) {
  4.     output += (char)myscript.read();
  5.   }

Удаляем пустые места в начале и конце строки, а затем выводим результат на Serial Monitor.

  1. output.trim();
  2.   Serial.println(output);
  3.   Serial.flush();
  4. }

Весь скетч полностью – ниже:

  1. /*
  2. Запись в файл при помощи класса FileIO
  3.  
  4. Этот скетч демонстрирует как записывать данные в файл, находящийся в файловой системе Yun.
  5. В директории «tmp» создается файл shell-скрипта, а затем запускается его выполнение.
  6.  
  7. Создан 7 июня 2010 Кристианом Мэгли (Cristian Maglie).
  8.  
  9. Этот пример не защищен авторским парвом.
  10.  
  11.  */
  12.  
  13. #include <FileIO.h>
  14.  
  15. void setup() {
  16.   // Инициализируем Bridge (будет требоваться каждый раз при коммуникации с Arduino Yun):
  17.   Bridge.begin();
  18.   // Инициализируем последовательную передачу данных:
  19.   Serial.begin(9600);
  20.  
  21.   while(!Serial);  // ждем подключения последовательного порта
  22.   Serial.println("File Write Script example\n\n");  // "Пример создания и записи в файл для shell-скрипта"
  23.  
  24.   // Инициализируем FileIO
  25.   FileSystem.begin();
  26.  
  27.   // Загружаем скрипт для сбора статистики о работе сети  
  28.   uploadScript();
  29. }  
  30.  
  31. void loop() {
  32.   // Делаем так, чтобы этот скрипт запускался каждые 5 секунд:
  33.   runScript();
  34.   delay(5000);
  35. }
  36.  
  37. // Эта функция создает в процессоре Linux файл с shell-скриптом,
  38. // который следит за сетевым трафиком WiFi-интерфейса.
  39. void uploadScript() {
  40.   // Сохраняем наш shell-скрипт в директорию «tmp».
  41.   // Таким образом, мы помещаем его в RAM,
  42.   // благодаря чему экономим место во FLASH-памяти.
  43.   File script = FileSystem.open("/tmp/wlan-stats.sh", FILE_WRITE);
  44.   // Заголовок для shell-скрипта:
  45.   script.print("#!/bin/sh\n");
  46.   // Команды скрипта:
  47.   // «ifconfig» – это утилита командной строки для управления сетевыми интерфейсами,
  48.   // а «wlan0» – как раз тот самый интерфейс, который нам нужен.
  49.   // «grep» – поиск в выдаче команды ifconfig на предмет слов «RX bytes»,
  50.   // а затем извлечение строки, содержащей необходимые данные.
  51.   script.print("ifconfig wlan0 | grep 'RX bytes'\n");
  52.   script.close();  // закрываем файл
  53.  
  54.   // Описываем выполнение скрипта:
  55.   Process chmod;
  56.   chmod.begin("chmod");      // chmod – команда для изменения прав доступа к файлам
  57.   chmod.addParameter("+x");  // «x» – это «выполнение»
  58.   chmod.addParameter("/tmp/wlan-stats.sh");  // путь к файлу со скриптом, который нужно выполнить
  59.   chmod.run();
  60. }
  61.  
  62.  
  63. // Эта функция запускает скрипт и считывает итоговые данные
  64. void runScript() {
  65.   // Запускаем скрипт:
  66.   Process myscript;
  67.   myscript.begin("/tmp/wlan-stats.sh");
  68.   myscript.run();
  69.  
  70.   String output = "";
  71.  
  72.   // Считываем данные выдачи скрипта:
  73.   while (myscript.available()) {
  74.     output += (char)myscript.read();
  75.   }
  76.   // Удаляем пустые места в начале и конце строки:
  77.   output.trim();
  78.   // Показываем результаты в Serial Monitor:
  79.   Serial.println(output);
  80.   Serial.flush();
  81. }

См.также

Внешние ссылки

  1. Arduino - File Write Script