Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: C++ realtime komunikace mezi programy  (Přečteno 3495 krát)

Richie

  • Návštěvník
  • Příspěvků: 65
C++ realtime komunikace mezi programy
« kdy: 08 Března 2011, 17:41:32 »
Zdravím, potřeboval bych trochu helfnout s prográmkem.. Uvedu jednoduchý příklad:
Řekněme že mám dva programy - vysílač a přijmač. Spustím program vysílač, počká se cca 15 vteřin a vytvoří se soubor /media/virtual/soubor.txt a do něj se uloží číslo 1. Teď spustím program přijmač, ten načte obsah souboru /media/virtual/soubor.txt , který v tomto případě obsahuje číslo jedna. přijmač toto hyhodnotí jako splnění podmínky a vypíše aktivace. V tomto případě proběhne všechno v pořádku.
Problém ale je, když ty programy spustím v opačném pořadí. Přijmač načte prázdný soubor a vypíše čekám, což je ok. Ted spustím vysílač, počká se 15 vteřin a do souboru se uloží číslo 1. Nastává můj problém. Program přijmač tuto změnu nijak nezaznamená, i když by podle mě měl:)
Jde mě právě o to, aby ty dva programy spolu komunikovali realtime..co se zobrazí v jednom programu, chci aby se zobrazilo hned v tom druhém.

Vysílač:
Kód: [Vybrat]
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <unistd.h>
FILE *vystup;
double px,kx,y,x,krok,a,b;

int main ()
{
 sleep(15);
 printf("sensor 1:                                                    ");
 std::cout<<"\e[5m ACTIVACE\e[0m"<<std::endl;
    vystup = fopen("/media/virtual/soubor.txt","wt");
    fprintf(vystup,"1");
 //system("clear");
 fcloseall;
 return 0;
}

Přijmač:
Kód: [Vybrat]
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <unistd.h>

FILE *vstup;

int main()
{
int r,i;
char c;

do {vstup = fopen("/media/virtual/soubor.txt", "rt");//otevreni souboru pro cteni
    fscanf (vstup, "%d", &r);
        if (r==1) {printf ("\naktivovan sensor 1 \n");} else printf("cekam...");
        //system("clear");
        fcloseall;
   }while((c = getchar()) != EOF);
return 0;
}

V druhém případě otevírám  a čtu ve smičce ten soubor, takže jakákoli jeho změna by se měla hned projevit, ne? Proč ten druhý program nezaznamená změnu?
Mohly by ste mě nějak nasměrovat, nebo poradit v čem je problém?

premet

  • Host
Re: C++ realtime komunikace mezi programy
« Odpověď #1 kdy: 08 Března 2011, 18:11:50 »
Tak možná pro tohle bych zkusil použít semafor pro procesy  :)
http://phoenix.inf.upol.cz/~outrata/courses/os2/texts/synch1_l.html

Richie

  • Návštěvník
  • Příspěvků: 65
Re: C++ realtime komunikace mezi programy
« Odpověď #2 kdy: 08 Března 2011, 18:25:53 »
Zapoměl sem říct, že oba tyto programy poběží na jiných počítačích. Spojení se vytvoří přez ssh (přez sshfs připojím ten disk /media/virtual). o to se postará skript, kterým ten program spouštím. Přiznám se, že sem s těmi semafory nikdy nic nedělal, ale řekl bych, že by to šlo použít jen v rámci lokálního systému...

pacholik

  • Závislák
  • ***
  • Příspěvků: 2072

Kedrigern

Re: C++ realtime komunikace mezi programy
« Odpověď #4 kdy: 08 Března 2011, 18:34:27 »
Na tohle je technologie (BSD) socketů, na netu toho o nich najdeš hafo.

Richie

  • Návštěvník
  • Příspěvků: 65
Re: C++ realtime komunikace mezi programy
« Odpověď #5 kdy: 08 Března 2011, 18:39:13 »
určitě na to mrknu..díkec, ale nenapadá vás, proč ten program nedetekuje změnu toho souboru? Vždyť ho otevírám pořád dokola, takže potom, co dojde k přepsání souboru by to měl ten druhý program zanamenat, nebo ne?

Martin - ViPEr*CZ*

Re: C++ realtime komunikace mezi programy
« Odpověď #6 kdy: 08 Března 2011, 18:59:34 »
A tohle je co: fcloseall;

To je nějaký makro? Zkoušel jste použít klasické fclose(FILE * stream); ?
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

Richie

  • Návštěvník
  • Příspěvků: 65
Re: C++ realtime komunikace mezi programy
« Odpověď #7 kdy: 08 Března 2011, 19:06:54 »
nezkoušel. myslíte, že to může mít nějaký vliv? Já sem totiž původně vytvářel víc souborů (v dalším byl obsažený seznam senzorů, které se pak natáhly do druhého programu). Pro test to ale neni nezbytné. Přezto jsem to zavření nechal tak, jelikož mě nenapadlo, že by to mohlo mít nějaký vliv

EDIT: zkoušel sem v obou programech zavírat pouze ten jeden soubor, ale vliv to nemá.
« Poslední změna: 08 Března 2011, 19:22:33 od Richie »

Martin - ViPEr*CZ*

Re: C++ realtime komunikace mezi programy
« Odpověď #8 kdy: 08 Března 2011, 19:37:34 »
Když v jedné aplikaci do souboru zapíšete něco a pak uzavřete... a druhá ho neustále checkuje... pak by měl být podle mě vidět rozdíl...
Zkuste si načíst vždy kompletní obsah daného souboru a vypsat na výstup... a taky tam zakomponujte to aby se skončilo čtení při dosažení konce souboru.

Taktéž toto ošetřete pro vyjímky... když se třeba nepovede otevřít soubor co to má udělat...
vstup = fopen("/media/virtual/soubor.txt", "rt");//otevreni souboru pro cteni
fscanf (vstup, "%d", &r);

Taktéž ošetřete při fclose... to má taky svojí návratovou hodnotu...  ;) Pak se to mnohem lépe testuje, když vyloučíte x dalších anomálií.
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

Richie

  • Návštěvník
  • Příspěvků: 65
Re: C++ realtime komunikace mezi programy
« Odpověď #9 kdy: 31 Července 2011, 14:24:33 »
Programy se mi podařilo úspěšně dokončit. Chyba byla v těch cyklech..než to sem hodím popíšu, k čemu to vlastně bude.
Chtěl bych se časem pokusit vytvořit software k bezpečnému řízení, například inteligentní budovy, odkudkoliv, právě přes protokol ssh. Prozatím je to jen simulace. Funguje to následovně - připojím se k serveru (počítač ovládající náš dům) příkazem:
ssh -L 5000:localhost:22 uzivatel@server
- čímž vytvořím ssh tunel který posílá všechno z 22 portu serveru na 5000 port vzdáleného počítače. Nyní se ocitnu na serveru kde spustím testovací program VYSÍLAČ.
vysílač.cpp
Kód: [Vybrat]
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
FILE *vystup;
double px,kx,y,x,krok,a,b;
int i,f,g,s;


int main ()
{
system("clear");
printf("\nsensor 1:                                                    ");
printf("\nsensor 2:                                                    ");
printf("\nsensor 3:                                                    ");
printf("\nsensor 4:                                                    ");
printf("\nsensor 5:                                                    ");
printf("\n");


for (;;)
{
 f=rand() % 6;
 sleep(f);
 system("clear");

 s=rand() % 5;if (s==0) s=1; //AKTIVATOR SENZORU

 printf("\n");printf("sensor 1:                                                    ");
    if (s==1) {
    std::cout<<"\e[5m AKTIVACE\e[0m"<<std::endl;
    vystup = fopen("/home/uzivatel/Projekt/vystup.txt","wt");
    fprintf(vystup,"1");fclose(vystup);
    } //printf ("aktivace");
 printf("\n");printf("sensor 2:                                                    ");
    if (s==2) {
    std::cout<<"\e[5m AKTIVACE\e[0m"<<std::endl;
    vystup = fopen("/home/uzivatel/Projekt/vystup.txt","wt");
    fprintf(vystup,"2");fclose(vystup);
    }
 printf("\n");printf("sensor 3:                                                    ");
    if (s==3) {
    std::cout<<"\e[5m AKTIVACE\e[0m"<<std::endl;
    vystup = fopen("/home/uzivatel/Projekt/vystup.txt","wt");
    fprintf(vystup,"3");fclose(vystup);
    }
 printf("\n");printf("sensor 4:                                                    ");
    if (s==4) {
    std::cout<<"\e[5m AKTIVACE\e[0m"<<std::endl;
    vystup = fopen("/home/uzivatel/Projekt/vystup.txt","wt");
    fprintf(vystup,"4");fclose(vystup);
    }
 printf("\n");printf("sensor 5:                                                    ");
    if (s==5) {
    std::cout<<"\e[5m AKTIVACE\e[0m"<<std::endl;
    vystup = fopen("/home/uzivatel/Projekt/vystup.txt","wt");
    fprintf(vystup,"5");fclose(vystup);
    }
 printf("\n");
 g=rand() % 6; if (g<2) g=2;
 sleep(g);
}
 //system("clear");
 return 0;
}

- program simuluje výstup z několika senzorů a změnu stavu ukládá do souboru /home/uzivatel/Projekt/vystup.txt

Na vzdáleném počítači spustím následující skript:
Kód: [Vybrat]
#!/bin/sh
sshfs -p 5000 localhost:/home/uzivatel/Projekt/ /media/server
if [ -d /media/server ]
then
    echo OK!
    else echo Not OK! && sleep 5 && exit
fi &&
sleep 3 &&
printf '\nSpouštím testovací program\n' && sleep 3 &&
/home/richie/Projekt/prijmac
- čímž vlastně připojím disk serveru k vzdálenému počítači, na kterém se nachází můj konfigurační soubor.

program PŘIJMAČ vypadá následovně:
Kód: [Vybrat]
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <unistd.h>

FILE *vstup;

int main()
{
int r,i;
char c;

for(;;)
  {vstup = fopen("/media/server/vystup.txt", "rt");//otevreni souboru pro cteni
    fscanf (vstup, "%u", &r);
   
        if (r==1) {system("clear"); printf ("\naktivovan sensor 1 \n");}
        if (r==2) {system("clear"); printf ("\naktivovan sensor 2 \n");}
        if (r==3) {system("clear"); printf ("\naktivovan sensor 3 \n");}
        if (r==4) {system("clear"); printf ("\naktivovan sensor 4 \n");}
        if (r==5) {system("clear"); printf ("\naktivovan sensor 5 \n");}
        //system("clear");
        sleep (1);

   }
return 0;
}


Teď mám v plánu pokusit se vyřešit toto pomocí signálů, ale když sem si pročítal ty stránky co jsou o pár příspěvků víš, no zatím je to pro mě trochu psycho:/ Takže kdyby se někomu chtělo uvést nějaký triviální příklad, velice by mi to pomohlo. Dalším krokem bude připojení nějakého reálného senzoru k počítači. Zatím sem uvažoval o tom, že bych se pokusil senzor opatřit jednoduchým wifi modulem, který by mi přes síť posílal info o stavu tohoto senzoru na server. Sousta práce, ale výsledek by mohl být poměrně zajímavý a užitečný..navíc by to bylo podstatně levnější řešení, než ty co jsou momentálně na trhu.
Je kladen důraz na bezpečnost, takže vítám jakýkoliv názor na její zlepšení.   
« Poslední změna: 31 Července 2011, 14:50:52 od Richie »

skunkos

  • Aktivní člen
  • *
  • Příspěvků: 399
    • Osobní web
Re: C++ realtime komunikace mezi programy
« Odpověď #10 kdy: 31 Července 2011, 16:37:41 »
Tak možná pro tohle bych zkusil použít semafor pro procesy  :)
http://phoenix.inf.upol.cz/~outrata/courses/os2/texts/synch1_l.html
Hele outratuův matroš :D je to tejpek
ArchLinux (KDE)
Můj web

Martin - ViPEr*CZ*

Re: C++ realtime komunikace mezi programy
« Odpověď #11 kdy: 31 Července 2011, 18:04:19 »
No když se na to dívám, tak to půjde řešit i přes klient-server technologii.
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

 

Provoz zaštiťuje spolek OpenAlt.