7

我有一个蓝牙设备,我可以在 Linux 上使用 gatttool 进行控制。我想开发自己的可以向其发送命令的 c 程序。

我过去做过蓝牙编程,它相对简单,类似于网络编程,但这次,它是蓝牙低功耗设备,遵循这里的原则会导致主机关闭消息,当我可以清楚地连接/断开它时使用 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;
4

3 回答 3

5

我也一直在尝试弄清楚如何做到这一点:您可能想查看Github 上sandeepmistry/noble:src/l2cap-ble.c中的源代码。(C 组件在此提交中被排除,因此您需要查看旧版本的源代码。)

在构建它(需要libbluetooth-dev)并运行它之后,该l2cap-ble示例实质上创建了一个与 BLE 设备的简单的类似 TTY 的连接:

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

源代码说明了一些hci_*需要与标准套接字 I/O 代码穿插的 BLE 特定函数 ( )。

更新:我从以下代码开始编写了一个更加充实和功能齐全的程序:https ://github.com/dlenski/ttblue 。您可以将此源代码用作如何使用 Bluez 与 BLE 小工具通信的示例。

于 2015-07-29T02:21:30.517 回答
2

您的程序适用于经典蓝牙,为了支持我的说法,我想说任何经典蓝牙设备上,您的代码都可以正常工作

要获得 lescan,我建议通过此链接。sudo ./st将扫描附近的 ble 设备

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

于 2015-03-28T14:23:09.607 回答
0

github.com 上的另一个项目看起来很干净:https ://github.com/edrosten/libblepp

在这里的讨论中提到了它:https ://mbientlab.com/community/discussion/2492/bluetooth-le-library-linux

它是 C++ 而不是 C。

于 2020-12-17T17:10:08.290 回答