Exemple d'application client RFCOMM Bluetooth en C – Serveur d’impression
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é:
- Rechercher tous les périphériques Bluetooth découvrables
- Connectez-vous aux serveurs SDP de chacun d'entre eux et recherchez un service particulier identifié par un UUID unique.
- La première correspondance possible est remplie de données factices
- 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.
- Accédez au périphérique suivant de la liste, le cas échéant, ou revenez à l'étape 1
- 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 *ré = (sdp_data_t*)pds->Les données;
int proto = 0;
pour( ; ré; ré = ré->suivant )
commutateur( ré->dtd )
Cas SDP_UUID16:
Cas SDP_UUID32:
Cas SDP_UUID128:
proto = sdp_uuid_to_proto( Etré->val.uuid );
Pause;
Cas SDP_UINT8:
si( proto == RFCOMM_UUID )
printf("rfcomm canal: % d n",ré->val.int8);
loco_channel = ré->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.
Commentaires
Laisser un commentaire