[LINUX] Quand j'ai essayé de faire une communication socket avec Raspberry Pi, le protocole était différent

J'ai essayé d'envoyer les paramètres de traitement du signal à RPi par communication socket, donc quand j'ai copié le code Internets pour la première communication socket, la fonction accept a généré une erreur "Argument invalide" et n'a pas fonctionné. Donc, j'ai découvert que accepter est une fonction utilisée lorsque le protocole est TCP et que le côté client l'envoie par UDP.

Pour une compréhension des grandes lignes du protocole UDP et du code serveur, reportez-vous au site suivant. Utiliser UDP: page Geek D'après l'explication du site ci-dessus, il semble qu'UDP soit bon si l'immédiateté est requise et que le paramètre est court dans une certaine mesure, j'ai donc décidé de réécrire la réception du serveur en UDP. Vous trouverez ci-dessous le code qui traite le signal dans la routine principale et reçoit les paramètres dans un autre thread. La partie qui acquiert les données audio est omise.

main.c



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


#define  PORT_NO    12345


/*Structure pour stocker les paramètres de réception*/
typedef struct {
    /*Paramètre approprié Groupe de variables*/
} socket_data_struct;


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


/*Fonction d'initialisation de socket*/
int socketInit();      
/*Une fonction pour les threads qui reçoit des paramètres dans la communication socket*/                 
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);
    /*Recevoir des données adressées à toutes les adresses IP*/                     
    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);            
        
        /*Traitement des paramètres reçus*/

        pthread_mutex_unlock(&m);

        /*Echo a reçu des données au 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){
        /*Contient le code DSP*/
    }

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

    return 0;
}

Par précaution lors du traitement du signal et de la communication de socket en parallèle, ne pas pthread_join le thread de communication de socket avant la boucle while principale, mettre sleep dans la boucle while du thread de communication de socket, Est-ce à propos? De plus, bien sûr, le port à utiliser doit être ouvert avec ufw ou quelque chose. Vous pouvez désormais recevoir les paramètres de traitement du signal tout en effectuant le traitement du signal.

Recommended Posts

Quand j'ai essayé de faire une communication socket avec Raspberry Pi, le protocole était différent
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
Je veux exécuter l'interface graphique Python au démarrage de Raspberry Pi
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
Remarque: je souhaite faire de la domotique avec Home Assistant + Raspberry Pi + capteur # 1
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé L-Chika avec Razpai 4 (édition Python)
Lorsque j'ai essayé de changer le mot de passe root avec ansible, je ne pouvais pas y accéder.
J'ai essayé de créer un environnement Ubuntu 20.04 LTS + ROS2 avec Raspberry Pi 4
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Dans IPython, quand j'ai essayé de voir la valeur, c'était un générateur, donc je l'ai inventé quand j'étais frustré.
J'ai essayé d'entraîner la fonction péché avec chainer
Visualisons la pièce avec tarte aux râpes, partie 1
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de faire sonner le téléphone lorsqu'il a été publié sur le poste IoT
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
Un débutant a essayé de colorier un dessin au trait avec un chainer. J'ai pu le faire.
Je souhaite être informé de l'environnement de connexion lorsque RaspberryPi se connecte au réseau
J'ai parlé à Raspberry Pi
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de connecter Raspeye et conect + avec l'API Web
J'ai essayé d'automatiser [une certaine tâche] à l'aide d'une tarte à la râpe
Changer le message affiché lors de la connexion à Raspberry Pi
J'ai envoyé les données de Raspberry Pi à GCP (gratuit)
Notez ce que vous voulez faire à l'avenir avec Razpai
C'était génial d'éditer le fichier Python dans Raspberry Pi avec la fonction à distance d'Atom
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
Il fait froid, j'ai donc essayé de permettre d'allumer / d'éteindre automatiquement le chauffage AC avec Raspberry Pi!
J'ai essayé de décrire le trafic en temps réel avec WebSocket
Le record auquel j'étais accro en mettant MeCab dans Heroku
J'ai appris comment la télécommande infrarouge fonctionne avec Raspberry Pi
Un mémorandum lors de l'acquisition automatique avec du sélénium
On m'a dit que je ne pouvais pas trouver XML_SetHashSalt lorsque j'ai essayé d'utiliser pip avec python.
Communication série avec Raspberry Pi + PySerial
J'ai créé un serveur Web avec Razpai pour regarder des anime
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de résumer ce qui était sorti avec Qiita avec Word cloud
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
J'ai essayé de démarrer avec Bitcoin Systre le week-end
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé d'agrandir la taille du volume logique avec LVM
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Je veux faire ○○ avec les Pandas
Que faire lorsque vous obtenez "Je ne peux pas voir le site !!!!"
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé la communication SMTP avec Python
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.