2017-07-11 2 views
1

Ich versuche, Programm in C zu schreiben, um Daten über Bluetooth zu senden/zu empfangen. Ich habe einen Verweis auf ein Buch von Albert Huang, die Beispielprogramme und auch eine gute Quelle für Informationen hat. Link: https://people.csail.mit.edu/albert/bluez-intro/index.html Das Beispiel 4.2 in (https://people.csail.mit.edu/albert/bluez-intro/x502.html) zeigt die RFCOMM-Verbindung mit Socket-Programmierung. Gibt es auch eine Möglichkeit, eine Verbindung mit dem Bluetooth-Namen des Geräts anstelle der BD-Adresse herzustellen? Hier sehe ich nicht, wie Sie PIN oder Authentifizierung für die Kommunikation über Bluetooth-Verbindung einrichten. Gibt es eine Möglichkeit, es zu implementieren? Ist die Socket-Verbindung auch ausreichend gesichert, da keine Authentifizierung stattfindet?Bluetooth-Programmierung in C - Sichere Verbindung und Datenübertragung

Ich benutze Debian-Maschine und Bluez-Paket für meine Entwicklung. Topologie Ich versuche zu erreichen, ist - 1 Master/Server mit N (max 7 gemäß Bluetooth Protokoll Spezifikation) Clients, die alle eingebetteten einfachen Chip - Computer verbunden sein können und sollte in der Lage zu kommunizieren, bis die Verbindung von beiden (Quelle oder Kunde).

Hat jemand etwas Ähnliches getan oder kann irgendeine Referenz/s sein.

Ich fand einige Verweise auf SO, aber alles wies mich auf das selbe zurück, das im Buch beschrieben wurde. Ich konnte nichts finden, das dem ähnlich war, wonach ich suchte.

Jede Hilfe wird geschätzt.

Vielen Dank für Ihre Zeit und Hilfe.

+0

https: // Stapelüberlauf.com/questions/6494006/how-to-senden-und-empfangen-daten-in-android-programmierung-mit-bluetooth-ohne-paar – EsmaeelE

+0

https://electronics.stackexchange.com/questions/47273/is-bluetooth- Kommunikation möglich-ohne-Pairing – EsmaeelE

+0

http://pages.iu.edu/~rwisman/c490/html/pythonandbluetooth.htm https://stackoverflow.com/questions/14820004/bluetooth-pairing-in-c-bluez- on-linux – EsmaeelE

Antwort

1

Zuerst müssen Sie nach allen BT-Geräten suchen.

Zweite Überprüfung ist der Name der finanzierten Geräte mit Ihrem spezifischen Namen übereinstimmen oder nicht.

Wenn True führen, senden an Server-Codes.

Kunde

#include <stdio.h> 
// POSIX sys lib: fork, pipe, I/O (read, write) 
#include <unistd.h> 
// superset of unistd, same 
#include <stdlib.h> 

//Bluetooth 
#include <bluetooth/bluetooth.h> 
#include <bluetooth/rfcomm.h> 
#include <bluetooth/hci.h> 
#include <bluetooth/hci_lib.h> 
#include <bluetooth/sdp.h> 
#include <bluetooth/sdp_lib.h> 
#include <bluetooth/sco.h> 

//socket 
#include <sys/socket.h> 


int main(int argc, char **argv) 
{ 
     int flag=0; 

    struct sockaddr_rc addrress = { 0 }; 
    int s, status; 

    char dest[18]="";// = "B0:10:41:3F:6E:80";//My destination address Laptop 
    char namelaptop[20]="ss"; 


    // allocate a socket 
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); 
    ///create a socket 

    // set the connection parameters (who to connect to) 
    addrress.rc_family = AF_BLUETOOTH; 
    addrress.rc_channel = (uint8_t) 1;//must use sdp to work in real devices 
    //may this channel not ready 


    printf("Search for BT Devices...\n"); 

///search 

    inquiry_info *ii = NULL; 
    int max_rsp, num_rsp; 
    int dev_id, sock, len, flags; 
    int i; 

    char addr[18] = { 0 }; 
    char name[248] = { 0 }; 

    dev_id = hci_get_route(NULL); 
    sock = hci_open_dev(dev_id); 
    if (dev_id < 0 || sock < 0) { 
     perror("opening socket"); 
     exit(1); 
    } 

    len = 8; 
    max_rsp = 2; 
    flags = IREQ_CACHE_FLUSH; 
    ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info)); 

    num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags); 
    if(num_rsp < 0) { 
     perror("hci_inquiry"); 
    } 

    for (i = 0; i < num_rsp; i++) { 
     ba2str(&(ii+i)->bdaddr, addr); 
     memset(name, 0, sizeof(name)); 
     if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name), 
      name, 0) < 0) 
     strcpy(name, "[unknown]"); 

     else{ 
     printf("\nFind #%d\n",i); 

     printf("Addr:%s Name:%s\n", addr, name); 

     int a=strcmp(name, namelaptop); 
     //printf("compare:%d\n",a); 

     if (!a){ // if name mached 
      str2ba(addr, &addrress.rc_bdaddr);//copy dest-->addr.rc_bdaddr  
      flag =1; 
     } 
     } 

    } 


/// End Search 



///Connect and send 

    if (flag==0){ 
     printf("Not find dest: %s\n",name); 
     exit(0); 
    } 

    // connect to server, throw socket s 
    status = connect(s, (struct sockaddr *)&addrress, sizeof(addrress)); 
    //successful, connect() returns 0. 

    printf("connection status: %d\n\n",status);//0 show OK 

    // send a message to server 
    if(status == 0) { 
     status = write(s, "hello!", 6); 
     if (status == 6){ 
      printf("Send data to server done\n"); 
     } 
    } 
    else 
     if(status < 0){ 
      perror("send message to server Failed\n"); 
    } 

    printf("Closing socket\n"); 

    ///close the socket 
    close(s); 

///End connect and send 


    free(ii); 
    close(sock); 

    return 0; 
} 

Server

nur

rfcomm-server.c 

in Albert Huang Good BT tutorial

#include <stdio.h> 
#include <unistd.h> 
#include <sys/socket.h> 
#include <bluetooth/bluetooth.h> 
#include <bluetooth/rfcomm.h> 

int 
main(int argc, char **argv) 
{ 
    struct sockaddr_rc loc_addr = { 0 }, rem_addr = { 0 }; 
    char buf[1024] = { 0 }; 
    int s, client, bytes_read; 
    socklen_t opt = sizeof(rem_addr); 

    // allocate socket 
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); 

    // bind socket to port 1 of the first available 
    // local bluetooth adapter 
    loc_addr.rc_family = AF_BLUETOOTH; 
    loc_addr.rc_bdaddr = *BDADDR_ANY; 
    loc_addr.rc_channel = (uint8_t) 1; 
    bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr)); 

    //get local address ? 
    //~ ba2str(&loc_addr.rc_bdaddr, buf); 
    //~ fprintf(stdout, "local %s\n", buf); 

    // put socket into listening mode 
    listen(s, 1); 

    // accept one connection 
    client = accept(s, (struct sockaddr *)&rem_addr, &opt); 


    ba2str(&rem_addr.rc_bdaddr, buf); 
    fprintf(stderr, "accepted connection from %s\n", buf); 


    memset(buf, 0, sizeof(buf)); 

    // read data from the client 
    bytes_read = read(client, buf, sizeof(buf)); 

    if(bytes_read > 0) { 
     printf("received [%s]\n", buf); 
    } 

    // close connection 
    close(client); 
    close(s); 
    return 0; 
} 

Diese beiden Code Arbeit für mich verwenden nur.

Ich laufe rfcomm-client.c in meinem PC und rfcomm-server.c auf einem Laptop. mein Laptop BT Name ist "ss", dass ich es hart codiert auf rfcomm-client.c

Client eine hallo Massage und Server-Show senden, wenn es empfängt.

+0

Danke für Ihre Antwort. Sie haben einen Teil meiner Verwirrung beantwortet, aber der andere Teil, der mich betrifft, ist die Authentifizierung für die Verbindung. Auch Sie verwenden Socket-Programmierung hier richtig? Ist Socket-Programmierung die einzige Möglichkeit, eine Bluetooth-Verbindung zu implementieren? Ich weiß nicht, ob es sicher ist, da es keine Authentifizierung gibt und das ist meine Hauptsorge. – sachin

+0

Ja, ich benutze nur Socket-Programmierung für Bluetooth-Kommunikation [Bluetooth-Socket-Programmierung]. Bevor Sie diesen Code ausführen, habe ich zwei Systeme mit Ubuntu-Einstellung> Bluetooth-Menü gepaart. Die Authentifizierung erfolgt manuell und nicht über Codes. – EsmaeelE

+0

Ja, wir haben andere Optionen für die Bluetooth-Programmierung. Verwenden Sie spezielle Pakete anstelle von Socket-Programmierung. siehe http://blog.kevindoran.co/bluetooth-programming-with-python-3/ aber ich denke, dieses Paket verwendet auch Sockets. – EsmaeelE

Verwandte Themen