BASH... JSON...может потребуется

Тема в разделе "Raspberry Pi", создана пользователем Igor68, 22 июн 2017.

  1. Igor68

    Igor68 Гуру

    Собственно столкнулся с тем, что готовый код уже готов... и в процессе работы он в файл на RAM диске скидывает параметры в текстровом виде... сам же он являясь ещё и сервером для клиентов не допускает своего перезапуска... потому как клиенты в локальной сети будут не очень довольны:(. А потребовалось эти данные выводить и на WEB страничку. Причём данные меняются довольно быстро....
    Вот это делает поток main, точнее его кусок... скидывает на RAM диск (функция вызываемая из цикла в main):
    Код (C++):

    int WrDataFile(void)
    {
       FILE * file;
       U16 size = 0;
       //нет имени файла
       if(ndatafile[0] == 0)
         return 0;
       file = fopen(&ndatafile[0],"wt");
      if(file < 0)
      {
      printf("Open %s  error!\n", &ndatafile[0]);
      return -1;
      }
       fprintf(file, "CntTPower1: %f\n", rdata_04_real.CntTPower1);
       fprintf(file, "CntTPower2: %f\n", rdata_04_real.CntTPower2);
       fprintf(file, "Uc1: %f\n", rdata_04_real.Uc1);
       fprintf(file, "Uc2: %f\n", rdata_04_real.Uc2);
       fprintf(file, "Iout: %f\n", rdata_04_real.Iout);
       fprintf(file, "Uout: %f\n", rdata_04_real.Uout);
       fprintf(file, "Usp: %f\n", rdata_04_real.Usp);
       fprintf(file, "Upp: %f\n", rdata_04_real.Upp);
       fprintf(file, "TimeWork: %i\n", rdata_04_real.TimeWork);
       fprintf(file, "TimeShieldO: %i\n", rdata_04_real.TimeShieldO);
       fprintf(file, "TmpSCS: %i\n", rdata_04_real.TmpSCS);
       fprintf(file, "ModeCTL_SCS: %i\n", rdata_04_real.ModeCTL_SCS);
       //
       fclose(file);
      return 0;
    }
     
    Бросает данные не так просто... они требуются ещё и другим процессам на этой машине.
    Ну за одно делаем процесс на BASH... который будет брать эти данные и и конвертировать в JSON. Причём не просто брать, а ещё искать их в файле данных (приводится только функция для конветрирования):
    Код (Bash):

    function _cvtjson()
    {
       datastr=$(cat $datafile)
       echo "$datastr"
       strjson="{\n"
       dstr=$(echo -e "$datastr" | awk '/CntTPower1:/ {print($2)}')
       strjson=$strjson"\"CntTPower1\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/CntTPower2:/ {print($2)}')
       strjson=$strjson"\"CntTPower2\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/TimeWork:/ {print($2)}')
       strjson=$strjson"\"TimeWork\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/TimeShieldO:/ {print($2)}')
       strjson=$strjson"\"TimeShieldO\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/Uc1:/ {print($2)}')
       strjson=$strjson"\"Uc1\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/Uc2:/ {print($2)}')
       strjson=$strjson"\"Uc2\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/Iout:/ {print($2)}')
       strjson=$strjson"\"Iout\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/Uout:/ {print($2)}')
       strjson=$strjson"\"Uout\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/Usp:/ {print($2)}')
       strjson=$strjson"\"Usp\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/Upp:/ {print($2)}')
       strjson=$strjson"\"Upp\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/TmpSCS:/ {print($2)}')
       strjson=$strjson"\"TmpSCS\":\"$dstr\",\n"
       dstr=$(echo -e "$datastr" | awk '/ModeCTL_SCS:/ {print($2)}')
       strjson=$strjson"\"ModeCTL_SCS\":\"$dstr\""
       strjson=$strjson"\n}"
    }

     
    Рядом с этим лежит ещё и php, который читает содержимое файла сгенерированного процессом конвертирования:
    Код (PHP):

    <?php
       $handle = fopen("../ramdisk/scsjson", "rt");
         $contents = '';
         while (!feof($handle))
           $contents .= fread($handle, 4096);
       fclose($handle);
       echo $contents;
    ?>
     
    ну а JS на веб странице уж будет вызывать этот самый PHP... и получать данные в формате JSON.
    Конечно надо всё делать сразу... и по возможности закладывать всё но... бывает, что приспичит, а деваться некуда;). Приходится вот так... ну можно сказать делать. А ведь можно и в самом коде сделать было с самого начала.
     
    Последнее редактирование: 22 июн 2017
    parovoZZ и arkadyf нравится это.
  2. BAR__MEN

    BAR__MEN Гуру

    ООО.... А как это реализовано? :)
     
  3. Igor68

    Igor68 Гуру

    Да! Вы верно заметили... тут всё по тупому сделано - по TELNET. Задавал этот вопрос на форуме MOXA. И Что бы не мусорить вот ссылка:
    https://www.moxa.ru/forum/index.php?/topic/6748-avtozapusk-ot-polzovatelia-v-ia240/
    собственно тут и найдено решение... и сейчас применил в старом-новом проекте (на этом форуме только приступаю).
    Код (Bash):
    !/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
      printf "My IP address is %s\n" "$_IP"
    fi

    #
    /etc/init.d/ramdisk restart
    #
    mount --bind /mnt/ram0 /home/httpd/ramdisk
    #
    su www-data -c /home/httpd/bash/wwstart &
    #
    exit 0
     
    А по поводу JSON выше примеры вырваны из рабочего. Кстати тот самый PHP читается WEB-страницей из браузера. Что рабочие файлы надо?
     
    arkadyf нравится это.