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

Author: Titanfall —

Short summary: 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 […]

Quick overview

Site
Tutos GameServer
Canonical URL
https://tutos-gameserver.fr/2019/05/04/exemple-dapplication-client-rfcomm-bluetooth-en-c-serveur-dimpression/
LLM HTML version
https://tutos-gameserver.fr/2019/05/04/exemple-dapplication-client-rfcomm-bluetooth-en-c-serveur-dimpression/llm
LLM JSON version
https://tutos-gameserver.fr/2019/05/04/exemple-dapplication-client-rfcomm-bluetooth-en-c-serveur-dimpression/llm.json
Manifest
https://tutos-gameserver.fr/llm-endpoints-manifest.json
Estimated reading time
6 minutes (357 seconds)
Word count
1187

Key points

Primary visual

Exemple d'application client RFCOMM Bluetooth en C

 – Serveur d’impression
Main illustration associated with the content.

Structured content

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. en relation

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

Topics and keywords

Themes: Serveur d'impression

License & attribution

License: CC BY-ND 4.0.

Attribution required: yes.

Manifest: https://tutos-gameserver.fr/llm-endpoints-manifest.json

LLM Endpoints plugin version 1.1.2.