[LINUX] Als ich versuchte, eine Socket-Kommunikation mit Raspberry Pi durchzuführen, war das Protokoll anders

Ich habe versucht, die Signalverarbeitungsparameter per Socket-Kommunikation an RPi zu senden. Als ich den Internet-Code für die erste Socket-Kommunikation kopierte, gab die Accept-Funktion einen Fehler "Ungültiges Argument" aus und funktionierte nicht. Also fand ich heraus, dass accept eine Funktion ist, die verwendet wird, wenn das Protokoll TCP ist, und die Clientseite es per UDP sendet.

Informationen zum Überblick über das UDP-Protokoll und den Servercode finden Sie auf der folgenden Site. UDP verwenden: Geek-Seite Aus der Erläuterung der obigen Site geht hervor, dass UDP gut ist, wenn Unmittelbarkeit erforderlich ist und der Parameter bis zu einem gewissen Grad kurz ist. Daher habe ich beschlossen, den Empfang des Servers in UDP umzuschreiben. Unten ist der Code, der das Signal in der Hauptroutine verarbeitet und die Parameter in einem anderen Thread empfängt. Der Teil, der Audiodaten erfasst, wird weggelassen.

main.c



#include <netinet/in.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>


#define  PORT_NO    12345


/*Struktur zum Speichern von Empfangsparametern*/
typedef struct {
    /*Geeigneter Parameter Variablengruppe*/
} socket_data_struct;


int serverSock;
struct sockaddr_in serverAddress;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;


/*Socket-Initialisierungsfunktion*/
int socketInit();      
/*Eine Funktion für Threads, die Parameter in der Socket-Kommunikation empfangen*/                 
void* parameterReceive(void* pParam);


int socketInit()
{
    serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    if(serverSocket < 0) {
        return -1;
    }

    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(PORT_NO);
    /*Empfangen Sie Daten, die an alle IP-Adressen adressiert sind*/                     
    serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); 

    if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) != 0) {
        return -1;
    }
    
    return 0;
}

void* parameterReceive(void* pParam)
{
    socket_data_struct data;
    struct sockaddr_in senderInfo;    
    socklen_t addressLength;

    while (1) {
        recvfrom(serverSock, &data, sizeof(socket_data_struct), 0, (struct sockaddr *)&senderInfo, &addressLength);

        pthread_mutex_lock(&m);            
        
        /*Verarbeitung empfangener Parameter*/

        pthread_mutex_unlock(&m);

        /*Echo empfangene Daten an Client*/
        sendto(serverSocket, (char *)&data, sizeof(socket_data_struct), 0, (struct sockaddr *)&senderInfo, addressLength);

        usleep(500);
    }

    close(serverSocket);
}


int main(void)
{
    pthread_t threadIdSocket; 

    if(socketInit()){
        return -1;
    }

    pthread_mutex_init(&m, NULL);
    pthread_create(&threadIdSocket, NULL, parameterReceive, NULL); 

    while(1){
        /*Enthält den DSP-Code*/
    }

    pthread_join(threadIdSocket, NULL);  
    pthread_mutex_destroy(&m); 

    return 0;
}

Als Vorsichtsmaßnahme bei paralleler Signalverarbeitung und Socket-Kommunikation sollten Sie den Socket-Kommunikationsthread nicht vor der Haupt-while-Schleife "pthread_join", sondern "sleep" in die while-Schleife des Socket-Kommunikationsthreads setzen. Geht es um Natürlich muss auch der zu verwendende Port mit ufw oder so geöffnet werden. Sie können jetzt Signalverarbeitungsparameter empfangen, während Sie die Signalverarbeitung durchführen.

Recommended Posts

Als ich versuchte, eine Socket-Kommunikation mit Raspberry Pi durchzuführen, war das Protokoll anders
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich möchte Python GUI ausführen, wenn Raspberry Pi startet
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
Hinweis: Ich möchte die Heimautomation mit Home Assistant + Raspberry Pi + Sensor Nr. 1 durchführen
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Als ich versuchte, das Root-Passwort mit ansible zu ändern, konnte ich nicht darauf zugreifen.
Ich habe versucht, mit Raspberry Pi 4 eine Umgebung von Ubuntu 20.04 LTS + ROS2 zu erstellen
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Stellen wir uns den Raum mit Raspeltorte vor, Teil 1
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, das Telefon klingeln zu lassen, als es auf dem IoT-Post veröffentlicht wurde
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
Ein Anfänger versuchte, eine Strichzeichnung mit einem Kettenmesser zu färben. Ich konnte es schaffen.
Ich möchte über die Verbindungsumgebung benachrichtigt werden, wenn RaspberryPi eine Verbindung zum Netzwerk herstellt
Ich habe mit Raspberry Pi gesprochen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, Raspeye und conect + mit der Web-API zu verbinden
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
Ändern Sie die Meldung, die beim Anmelden bei Raspberry Pi angezeigt wird
Ich habe die Daten von Raspberry Pi an GCP gesendet (kostenlos)
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Es war großartig, die Python-Datei in Raspberry Pi mit der Remote-Funktion von Atom zu bearbeiten
Ich habe versucht, mit OpenCV eine Bewegungserkennungsüberwachungskamera mit einer WEB-Kamera mit Raspberry Pi herzustellen
Es wird kalt, also habe ich versucht, das automatische Ein- und Ausschalten der Klimaanlage mit Raspberry Pi zu ermöglichen!
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Die Platte, von der ich süchtig war, als ich MeCab in Heroku einsetzte
Ich habe gelernt, wie die Infrarot-Fernbedienung mit Raspberry Pi funktioniert
Ein Memorandum beim automatischen Erwerb mit Selen
Mir wurde gesagt, dass ich XML_SetHashSalt nicht finden konnte, als ich versuchte, pip mit Python zu verwenden.
Serielle Kommunikation mit Raspberry Pi + PySerial
Ich habe mit Razpai einen Webserver erstellt, um Anime zu schauen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht zusammenzufassen, was mit Qiita mit Word Cloud ausgegeben wurde
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Ich habe am Wochenende versucht, mit Bitcoin Systre zu beginnen
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Ich möchte ○○ mit Pandas machen
Was tun, wenn "Ich kann die Site nicht sehen !!!!"
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.