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
- 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.
Primary visual
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.