Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making bluetooth discoverable using c code

I want to make a bluetooth server that starts and other devices can pair with it.

I can get the code to compile fine, the server starts, but I cannot see the advertisement when I scan for bluetooth devices from android phone.

I think i need to switch on the discoverable mode on.

I tried searching for the function in the hci_lib.h which will make the bluetooth discoverable but couldn't find it.

This is the code I have till now.

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

What has to be done to set bluetooth discoverable mode on?

like image 758
Yogesh Ghaturle Avatar asked Jun 08 '16 19:06

Yogesh Ghaturle


People also ask

What code does Bluetooth use?

Use the code 0000 when pairing with another Bluetooth® device. The passcode may appear as Pass key, PIN code, PIN number, or Password depending on the Bluetooth device used.

How do I make my laptop Bluetooth discoverable?

On your PC, select Start > Settings > Devices > Bluetooth & other devices > Add Bluetooth or other device > Bluetooth. Choose the device and follow additional instructions if they appear, then select Done.

How do I make my Android Bluetooth always discoverable?

putExtra(BluetoothAdapter. EXTRA_DISCOVERABLE_DURATION, 0); startActivity(discoverableIntent); 'You can define a different duration by adding the EXTRA_DISCOVERABLE_DURATION Intent extra. The maximum duration an app can set is 3600 seconds, and a value of 0 means the device is always discoverable.


1 Answers

Through the BlueZ command line, the command to enable discoverability is achieved through the hciconfig tool as follows:

hciconfig hciX piscan

Where hciX is your HCI device installed on the system, and in most cases will be hci0. You can try the above command and if it doesn't return an error then you should be able to see your Linux machine through your Android device by performing an inquiry. If this does work for you, then the code that you need can be found in the hciconfig source in the link below:-

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

And then your starting point will be the following function:-

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

I hope this helps

like image 185
Youssif Saeed Avatar answered Oct 22 '22 14:10

Youssif Saeed