C中的蓝牙编程 - 安全连接和数据传输

sac*_*hin 6 c debian bluetooth

我正在尝试用 C 编写程序以通过蓝牙发送/接收数据。我参考了 Albert Huang 的一本书,其中有示例程序和很好的信息来源。链接:https : //people.csail.mit.edu/albert/bluez-intro/index.htmlhttps://people.csail.mit.edu/albert/bluez-intro/x502.html)中的示例4.2显示了使用套接字编程的 RFCOMM 连接。还有没有办法使用设备的蓝牙名称而不是 BD 地址进行连接?在这里,我没有看到如何为通过蓝牙连接的通信设置 PIN 或身份验证。有没有办法实现它。由于没有身份验证过程,套接字连接是否足够安全?

我正在使用 debian 机器和 Bluez 包进行开发。我试图实现的拓扑是 - 1 个主服务器/服务器连接到 N(根据蓝牙协议规范最多 7 个)客户端,这些客户端可能是任何嵌入式简单芯片计算机,并且应该能够进行通信,直到连接被任何一个(源或客户)。

有没有人做过类似的事情或者可能是任何参考。

我发现关于 SO 的参考资料很少,但一切都指向我回到书中描述的相同内容。我找不到与我正在寻找的内容相似的内容。

任何帮助表示赞赏。

感谢您的时间和帮助。

Esm*_*elE 5

首先,您必须搜索所有 BT 设备。

第二项检查是任何资助设备的名称是否与您的具体名称匹配。

如果 true 执行发送到服务器代码。

客户

#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;
}
Run Code Online (Sandbox Code Playgroud)

服务器

只是只使用

rfcomm-server.c
Run Code Online (Sandbox Code Playgroud)

in Albert Huang 不错的BT教程

#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;
}
Run Code Online (Sandbox Code Playgroud)

这两个代码对我有用。

rfcomm-client.c我在我的电脑和rfcomm-server.c笔记本电脑上运行。我的笔记本电脑 BT 名称是"ss"我硬编码的rfcomm-client.c

客户端发送一个 hello 消息,服务器如果收到则显示它。