Как запрограммировать устройство Bluetooth LE с помощью C в Linux x86?

У меня есть устройство Bluetooth, которым я могу управлять с помощью gatttool в Linux. Я хочу разработать свою собственную программу на языке C, которая может отправлять ей команды.

Раньше я занимался программированием Bluetooth, и это относительно просто, похоже на сетевое программирование, но на этот раз это Bluetooth-устройство с низким энергопотреблением и следующие принципы здесь приводит к сообщению о том, что хост не работает, когда я могу четко подключиться/отключиться от него с помощью gatttool.

Как создать эту программу? Я знаю, что мне следует использовать библиотеку bluez, но я не уверен, с чего начать с устройств с низким энергопотреблением.

int main(int argc, char **argv)
{
   struct sockaddr_rc addr = { 0 };
   int s, status;
   char dest[18] = "B4:99:4C:5C:EE:49";
   char buf[2048];
   pthread_t rthread;

   setbuf(stdout, NULL); 
   // allocate a socket
   s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
   // set the connection parameters (who to connect to)
   addr.rc_family = AF_BLUETOOTH;
   addr.rc_channel = (uint8_t) 1;
   str2ba( dest, &addr.rc_bdaddr );
   // connect to server
   status = connect(s, (struct sockaddr *)&addr, sizeof(addr));

   if( status < 0 ){
      perror("Error connecting to host\n");
      exit(1);
   }

   while(fgets(buf, sizeof(buf), stdin) != NULL){
      status = send(s, buf, sizeof(buf), 0);
      if(status < 0){
         printf("Error sending.\n");
     exit(1);
      }
   }

   close(s);

   return;

person oneb1got    schedule 27.03.2015    source источник


Ответы (3)


Я тоже пытался понять, как это сделать: вы можете взглянуть на исходный код в sandeepmistry/noble:src/l2cap-ble.c на Github. (Компонент C был исключен из этого коммита, поэтому вам нужно посмотреть на более старые версии исходного кода.)

После его сборки (требуется libbluetooth-dev) и запуска пример l2cap-ble по существу создает простое TTY-подключение к устройству BLE:

$ gcc -o l2cap-ble l2cap-ble.c utility.c -lbluetooth
$ ./l2cap-ble 12:34:56:78:9A:BC [public|random]

Исходный код иллюстрирует несколько специфичных для BLE функций (hci_*), которые необходимо чередовать со стандартным кодом ввода-вывода сокета.

ОБНОВЛЕНИЕ: я написал гораздо более содержательную и полнофункциональную программу, начиная с этого кода: https://github.com/dlenski/ttblue. Вы можете использовать этот исходный код в качестве примера того, как общаться с гаджетом BLE с помощью Bluez.

person Dan Lenski    schedule 29.07.2015
comment
Ваш код больше недоступен. Можете ли вы опубликовать это, пожалуйста? - person gregoiregentil; 26.03.2017
comment
Это не мой код. Однако я написал на его основе гораздо более содержательную и полнофункциональную программу. Вы можете использовать это как пример того, как общаться с гаджетом BLE с помощью Bluez: github.com/dlenski/ttblue< /а> - person Dan Lenski; 26.03.2017

ваша программа предназначена для классического Bluetooth, чтобы поддержать мое утверждение, я бы сказал ON на любом классическом устройстве Bluetooth, ваш код будет работать нормально

Чтобы получить lescan, я предлагаю перейти по этой ссылке. sudo ./st будет сканировать близлежащие устройства ble.

https://github.com/carsonmcdonald/bluez-experiments

person Jagdish    schedule 28.03.2015

Другой проект на github.com выглядит чистым: https://github.com/edrosten/libblepp

Это упоминалось в обсуждении здесь: https://mbientlab.com/community/discussion/2492/bluetooth-le-library-linux

Это C++, а не C.

person minghua    schedule 17.12.2020