bluetooth - 使用C代码使蓝牙可发现

标签 bluetooth fedora bluez

我想制作一个可以启动的蓝牙服务器,其他设备可以与之配对。

我可以使代码正确编译,服务器可以启动,但是当我从android手机扫描蓝牙设备时看不到广告。

我想我需要打开可发现模式。

我尝试在hci_lib.h中搜索该函数,该函数可发现蓝牙,但找不到它。

这是我到目前为止所拥有的代码。

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.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,dev_id,sock;
socklen_t opt = sizeof(rem_addr);

dev_id = hci_get_route(NULL);
if (dev_id < 0) {
    perror("No Bluetooth Adapter Available");
    exit(1);
}

if (hci_devinfo(dev_id, &dev_info) < 0) {
    perror("Can't get device info");
    exit(1);
}

sock = hci_open_dev( dev_id );
if (sock < 0) {
    perror("HCI device open failed");
    free(info);
    exit(1);
}


// 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));

// 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;
}

要设置蓝牙可发现模式必须做些什么?

最佳答案

通过BlueZ命令行,可通过hciconfig工具实现启用可发现性的命令,如下所示:

hciconfig hciX piscan

其中hciX是系统上安装的HCI设备,在大多数情况下为hci0。您可以尝试上面的命令,如果它没有返回错误,则应该可以通过执行查询来通过Android设备查看Linux机器。如果这对您有用,则可以在以下链接的hciconfig源代码中找到所需的代码:-

https://github.com/aguedes/bluez/blob/master/tools/hciconfig.c

然后您的起点将是以下功能:-
static void cmd_scan(int ctl, int hdev, char *opt)
{
    struct hci_dev_req dr;

    dr.dev_id  = hdev;
    dr.dev_opt = SCAN_DISABLED;
    if (!strcmp(opt, "iscan"))
        dr.dev_opt = SCAN_INQUIRY;
    else if (!strcmp(opt, "pscan"))
        dr.dev_opt = SCAN_PAGE;
    else if (!strcmp(opt, "piscan"))
        dr.dev_opt = SCAN_PAGE | SCAN_INQUIRY;

    if (ioctl(ctl, HCISETSCAN, (unsigned long) &dr) < 0) {
        fprintf(stderr, "Can't set scan mode on hci%d: %s (%d)\n",
                        hdev, strerror(errno), errno);
        exit(1);
    }
}

我希望这有帮助

关于bluetooth - 使用C代码使蓝牙可发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37711776/

相关文章:

ios - 初始化 AVAudioSession 时保持蓝牙声音

c - 如何使用 org.bluez.AudioSource GetProperty

linux - 在Linux上设置蓝牙自动配对

android - Android 何时为 BLE 调用 BluetoothGattCallback 和 onConnectionStateChange?

java - 在 root 的 android 设备上设置鼠标位置

linux - Fedora - 重新安装支持 C++ 的 GMP

python - QtWebPageRenderer SIGILL 问题

linux - 在 BASH 中,如何从使用 HTML &lt;textarea&gt;&lt;/textarea&gt; 编写的文件中存在的变量替换\r

linux - QtBlueTooth 在 Linux 上不起作用

linux - 有没有办法找出哪个蓝牙设备插入哪个USB端口?