Serveur d'impression

Exemple d'application client RFCOMM Bluetooth en C – Serveur d’impression

Par Titanfall , le 4 mai 2019 - 7 minutes de lecture

J'ai récemment travaillé avec un client qui souhaitait une application client-serveur Bluetooth RFCOMM. Le serveur serait assis sur un téléphone Android, tandis que le client s'exécutera sur un périphérique Linux intégré. La partie client de rfcomm était simplement un exemple de code sur lequel il souhaitait baser son implémentation. J'ai écrit une application rapide pour la même chose. Le code que vous êtes sur le point de voir est moche et peut être réécrit pour paraître plus agréable à l'œil. Comprend également un horrible aller à pirater. Mais cela fonctionne et peut être utilisé pour baser les implémentations de rfcomm.

Fonctionnalité:

  1. Rechercher tous les périphériques Bluetooth découvrables
  2. Connectez-vous aux serveurs SDP de chacun d'entre eux et recherchez un service particulier identifié par un UUID unique.
  3. La première correspondance possible est remplie de données factices
  4. Si le périphérique Bluetooth cesse de faire de la publicité auprès du serveur, l'application attendra que le serveur SDP du périphérique Bluetooth soit inaccessible.
  5. Accédez au périphérique suivant de la liste, le cas échéant, ou revenez à l'étape 1
  6. Ctrl – C pour quitter

Trouvez un lien vers le fichier point C au bas de la publication.

#comprendre <stdio.h>
#comprendre <errno.h>
#comprendre <ctype.h>
#comprendre <fcntl.h>
#comprendre <unistd.h>
#comprendre <stdlib.h>
#comprendre <string.h>
#comprendre <getopt.h>
#comprendre <signal.h>
#comprendre <sys / param.h>
#comprendre <sys / ioctl.h>
#comprendre <sys / socket.h>

#comprendre <bluetooth / bluetooth.h>
#comprendre <bluetooth / hci.h>
#comprendre <bluetooth / hci_lib.h>
#comprendre <bluetooth / sdp.h>
#comprendre <bluetooth / sdp_lib.h>
#comprendre <bluetooth / rfcomm.h>




int str2uuid( const carboniser *uuid_str, uuid_t *uuid ) 

    uint32_t uuid_int[[[[4];
    carboniser *endptr;

    si( Strlen( uuid_str ) == 36 ) 
        
        carboniser buf[[[[9] =  0 ;

        si( uuid_str[[[[8] != '-' EtEt uuid_str[[[[13] != '-' EtEt
            uuid_str[[[[18] != '-'  EtEt uuid_str[[[[23] != '-' ) 
            revenir 0;
        
        
        strncpy(buf, uuid_str, 8);
        uuid_int[[[[0] = htonl( strtoul( buf, Etendptr, 16 ) );
        si( endptr != buf + 8 ) revenir 0;

        
        strncpy(buf, uuid_str+9, 4);
        strncpy(buf+4, uuid_str+14, 4);
        uuid_int[[[[1] = htonl( strtoul( buf, Etendptr, 16 ) );
        si( endptr != buf + 8 ) revenir 0;

        
        strncpy(buf, uuid_str+19, 4);
        strncpy(buf+4, uuid_str+24, 4);
        uuid_int[[[[2] = htonl( strtoul( buf, Etendptr, 16 ) );
        si( endptr != buf + 8 ) revenir 0;

        
        strncpy(buf, uuid_str+28, 8);
        uuid_int[[[[3] = htonl( strtoul( buf, Etendptr, 16 ) );
        si( endptr != buf + 8 ) revenir 0;

        si( uuid != NUL ) sdp_uuid128_create( uuid, uuid_int );
     autre si ( Strlen( uuid_str ) == 8 ) 
        
        uint32_t i = strtoul( uuid_str, Etendptr, 16 );
        si( endptr != uuid_str + 8 ) revenir 0;
        si( uuid != NUL ) sdp_uuid32_create( uuid, je );
     autre si( Strlen( uuid_str ) == 4 ) 
        
        int je = Strtol( uuid_str, Etendptr, 16 );
        si( endptr != uuid_str + 4 ) revenir 0;
        si( uuid != NUL ) sdp_uuid16_create( uuid, je );
     autre 
        revenir 0;
    

    revenir 1;


int principale(vide) {
    int je, j, se tromper, chaussette, dev_id = -1;
    struct hci_dev_info dev_info;
    inquiry_info *Info = NUL;
    int num_rsp, longueur, drapeaux;
    bdaddr_t ba;
    carboniser addr[[[[19] =  0 ;
    carboniser prénom[[[[248] =  0 ;
    uuid_t uuid =  0 ;
    
    carboniser *uuid_str="66841278-c3d1-11df-ab31-001de000a901";
    uint32_t gamme = 0x0000ffff;
    sdp_list_t *liste_réponses = NUL, *liste_recherche, *attrid_list;
    int s, loco_channel = -1, statut;
    struct sockaddr_rc loc_addr =  0 ;

    (vide) signal(SIGINT, SIG_DFL);

    dev_id = hci_get_route(NUL);
    si (dev_id < 0) 
        perror("Non Bluetooth Adaptateur Disponible");
        sortie(1);
    

    si (hci_devinfo(dev_id, Etdev_info) < 0) 
        perror("Ne peut pas obtenir dispositif Info");
        sortie(1);
    



    chaussette = hci_open_dev( dev_id );
    si (chaussette < 0) 
        perror("HCI dispositif ouvrir échoué");
        libre(Info);
        sortie(1);
    

    
    si( !str2uuid( uuid_str, Etuuid ) ) 
        perror("Invalide UUID");
        libre(Info);
        sortie(1);
  

    faire {
        printf("Balayage ...  n");
        Info = NUL;
        num_rsp = 0;
        drapeaux = 0;
        longueur = 8; 
        num_rsp = hci_inquiry(dev_id, longueur, num_rsp, NUL, EtInfo, drapeaux);
        si (num_rsp < 0) 
            perror("Enquête échoué");
            sortie(1);
        

        printf("Non de resp % d  n",num_rsp);

        pour (je = 0; je < num_rsp; je++) {
            sdp_session_t *session;
            int retries;
            int trouvé, les réponses;
            ba2str(Et(Info+je)->Bdaddr, addr);
            memset(prénom, 0, taille de(prénom));
            si (hci_read_remote_name(chaussette, Et(Info+je)->Bdaddr, taille de(prénom), 
                    prénom, 0) < 0)
            strcpy(prénom, "[unknown]");
            printf("A trouvé % s  % s, recherche pour la la voulu un service sur il maintenant  n", addr, prénom);
            
sdpconnect:
            session = 0; retries = 0;
            tandis que(!session) 
                session = sdp_connect( BDADDR_ANY, Et(Info+je)->Bdaddr, SDP_RETRY_IF_BUSY );
                si(session) Pause;
                si(errno == EALREADY EtEt retries < 5) 
                    perror("Réessayer");
                    retries++;
                    dormir(1);
                    continuer;
                
                Pause;
            
            si ( session == NUL ) 
                perror("Ne peut pas ouvrir session avec la dispositif");
                libre(Info);
                continuer;
            
            liste_recherche = sdp_list_append( 0, Etuuid );
            attrid_list = sdp_list_append( 0, Etintervalle );
            se tromper = 0;
            se tromper = sdp_service_search_attr_req( session, liste_recherche, SDP_ATTR_REQ_RANGE, attrid_list, Etliste_réponses);
            sdp_list_t *r = liste_réponses;
            sdp_record_t *rec;
            
            trouvé = 0;
            les réponses = 0;
            pour (; r; r = r->suivant ) {
                    les réponses++;
                    rec = (sdp_record_t*) r->Les données;
                    sdp_list_t *proto_list;
                    
                    
                    si( sdp_get_access_protos( rec, Etproto_list ) == 0 ) {
                    sdp_list_t *p = proto_list;

                        
                        pour( ; p ; p = p->suivant ) {
                                sdp_list_t *pds = (sdp_list_t*)p->Les données;

                                
                                pour( ; pds ; pds = pds->suivant ) 

                                        
                                        sdp_data_t *= (sdp_data_t*)pds->Les données;
                                        int proto = 0;
                                        pour( ;;=->suivant ) 
                                                commutateur(->dtd )  
                                                        Cas SDP_UUID16:
                                                        Cas SDP_UUID32:
                                                        Cas SDP_UUID128:
                                                                proto = sdp_uuid_to_proto( Et->val.uuid );
                                                                Pause;
                                                        Cas SDP_UINT8:
                                                                si( proto == RFCOMM_UUID ) 
                                                                        printf("rfcomm canal: % d  n",->val.int8);
                                                                        loco_channel =->val.int8;
                                                                        trouvé = 1;
                                                                
                                                                Pause;
                                                
                                        
                                
                                sdp_list_free( (sdp_list_t*)p->Les données, 0 );
                        }
                        sdp_list_free( proto_list, 0 );

                    }
                    si (loco_channel > 0)
                        Pause;

            }
            printf("Non de Réponses % d  n", les réponses);
            si ( loco_channel > 0 EtEt trouvé == 1 ) 
                printf("A trouvé un service sur ce dispositif, à présent va explosion il avec mannequin données  n");
                s = prise(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
                loc_addr.famille_rc = AF_BLUETOOTH;
                loc_addr.rc_channel = loco_channel;
                loc_addr.rc_bdaddr = *(Et(Info+je)->Bdaddr);
                statut = relier(s, (struct sockaddr *)Etloc_addr, taille de(loc_addr));
                si( statut < 0 ) 
                    perror("euh Oh");
                
                faire 
                    statut = écrire(s, "salut!", 6);
                    printf ("A écrit %ré octets  n", statut);
                    dormir(1);
                 tandis que (statut > 0);
                Fermer(s);
                sdp_record_free( rec );
            

            sdp_close(session);
            si (loco_channel > 0) 
                aller à sdpconnect;
                
            
        }
    } tandis que (1);

    printf("Quitter ...  n");
}

Utilisez la commande ci-dessous pour compiler le code.

rendre bluetooth LDFLAGS = - bluetooth

Faites-moi savoir dans les commentaires si quelqu'un a besoin de plus d'explications.

Click to rate this post!
[Total: 0 Average: 0]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.