Arduino:Примеры/FileWriteScript

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

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

  • Плата Arduino Yun;

Цепь

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

Код

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

#include <FileIO.h>

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

void setup() {
  Bridge.begin();
  Serial.begin(9600);

  while(!Serial);  // ждем подключения последовательного порта
  Serial.println("File Write Script example\n\n");  // "Пример создания и записи в файл для shell-скрипта"

  FileSystem.begin();

  uploadScript();
}

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

void loop() {
  runScript();
  delay(5000);
}

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

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

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

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

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

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

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

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

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

String output = "";

  while (myscript.available()) {
    output += (char)myscript.read();
  }

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

output.trim();
  Serial.println(output);
  Serial.flush();
}

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

/*
Запись в файл при помощи класса FileIO

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

Создан 7 июня 2010 Кристианом Мэгли (Cristian Maglie).

Этот пример не защищен авторским парвом.

 */

#include <FileIO.h>

void setup() {
  // Инициализируем Bridge (будет требоваться каждый раз при коммуникации с Arduino Yun):
  Bridge.begin();
  // Инициализируем последовательную передачу данных:
  Serial.begin(9600);

  while(!Serial);  // ждем подключения последовательного порта
  Serial.println("File Write Script example\n\n");  // "Пример создания и записи в файл для shell-скрипта"

  // Инициализируем FileIO
  FileSystem.begin();

  // Загружаем скрипт для сбора статистики о работе сети  
  uploadScript();
}  

void loop() {
  // Делаем так, чтобы этот скрипт запускался каждые 5 секунд:
  runScript();
  delay(5000);
}

// Эта функция создает в процессоре Linux файл с shell-скриптом, 
// который следит за сетевым трафиком WiFi-интерфейса.
void uploadScript() {
  // Сохраняем наш shell-скрипт в директорию «tmp».
  // Таким образом, мы помещаем его в RAM,
  // благодаря чему экономим место во FLASH-памяти.
  File script = FileSystem.open("/tmp/wlan-stats.sh", FILE_WRITE);
  // Заголовок для shell-скрипта: 
  script.print("#!/bin/sh\n");
  // Команды скрипта:
  // «ifconfig» – это утилита командной строки для управления сетевыми интерфейсами, 
  // а «wlan0» – как раз тот самый интерфейс, который нам нужен.
  // «grep» – поиск в выдаче команды ifconfig на предмет слов «RX bytes»,
  // а затем извлечение строки, содержащей необходимые данные.
  script.print("ifconfig wlan0 | grep 'RX bytes'\n");
  script.close();  // закрываем файл

  // Описываем выполнение скрипта:
  Process chmod;
  chmod.begin("chmod");      // chmod – команда для изменения прав доступа к файлам 
  chmod.addParameter("+x");  // «x» – это «выполнение»
  chmod.addParameter("/tmp/wlan-stats.sh");  // путь к файлу со скриптом, который нужно выполнить
  chmod.run();
}


// Эта функция запускает скрипт и считывает итоговые данные
void runScript() {
  // Запускаем скрипт: 
  Process myscript;
  myscript.begin("/tmp/wlan-stats.sh");
  myscript.run();

  String output = "";

  // Считываем данные выдачи скрипта:
  while (myscript.available()) {
    output += (char)myscript.read();
  }
  // Удаляем пустые места в начале и конце строки:
  output.trim();
  // Показываем результаты в Serial Monitor:
  Serial.println(output);
  Serial.flush();
}

См.также

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