用C写蓝牙通讯程序:扫描、读取、发送

简介: 在Linux下,通过bluez 蓝牙库可以用C语言轻松实现蓝牙通信。在ubuntu下可以用 apt-get install libbluetooth-dev 安装该库。下面是几个简单示例。
在Linux下,通过bluez 蓝牙库可以用C语言轻松实现蓝牙通信。在ubuntu下可以用 apt-get install libbluetooth-dev 安装该库。下面是几个简单示例。

一个简单的扫描程序,得到周边的蓝牙从机设备名和地址:

  1. #include stdio.h>
  2. #include stdlib.h>
  3. #include unistd.h>
  4. #include sys/socket.h>
  5. #include bluetooth/bluetooth.h>
  6. #include bluetooth/hci.h>
  7. #include bluetooth/hci_lib.h>

  8. int main(int argc, char **argv)
  9. {
  10.     inquiry_info *ii = NULL;
  11.     int max_rsp, num_rsp;
  12.     int dev_id, sock, len, flags;
  13.     int i;
  14.     char addr[19] = { 0 };
  15.     char name[248] = { 0 };

  16.     dev_id = hci_get_route(NULL);
  17.     sock = hci_open_dev( dev_id );
  18.     if (dev_id 0 || sock 0) {
  19.         perror("opening socket");
  20.         exit(1);
  21.     }

  22.     len = 8;
  23.     max_rsp = 255;
  24.     flags = IREQ_CACHE_FLUSH;
  25.     ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
  26.     
  27.     num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
  28.     if( num_rsp 0 ) perror("hci_inquiry");

  29.     for (i = 0; i num_rsp; i++) {
  30.         ba2str(&(ii+i)->bdaddr, addr);
  31.         memset(name, 0, sizeof(name));
  32.         if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name),
  33.             name, 0) 0)
  34.         strcpy(name, "[unknown]");
  35.         printf("%s %s\n", addr, name);
  36.     }

  37.     free( ii );
  38.     close( sock );
  39.     return 0;
  40. }

读和写示例:

  1. #include stdio.h>
  2. #include unistd.h>
  3. #include sys/socket.h>
  4. #include bluetooth/bluetooth.h>
  5. #include bluetooth/rfcomm.h>

  6. int main(int argc, char **argv)
  7. {
  8.     struct sockaddr_rc addr = { 0 };
  9.     int s, status, len=0;
  10.     char dest[18] = "00:12:01:31:01:13";
  11.     char buf[256];
  12.     // allocate a socket
  13.     s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

  14.     // set the connection parameters (who to connect to)
  15.     addr.rc_family = AF_BLUETOOTH;
  16.     addr.rc_channel = (uint8_t) 1;
  17.     str2ba( dest, &addr.rc_bdaddr );

  18.     // connect to server
  19.     status = connect(s, (struct sockaddr *)&addr, sizeof(addr));

  20.     
  21.     if(status){
  22.         printf(" failed to connect the device!\n");
  23.         return -1;
  24.     }

  25.     
  26.     do{
  27.         len = read(s, buf, sizeof buf);
  28.     
  29.      if( len>0 ) {
  30.          buf[len]=0;
  31.          printf("%s\n",buf);
  32.          write(s, buf, strlen(buf));
  33.      }
  34.     }while(len>0);

  35.     close(s);
  36.     return 0;
  37. }



目录
相关文章
|
Linux API Windows
linux系统中利用QT实现蓝牙功能的方法
linux系统中利用QT实现蓝牙功能的方法
1027 0
|
存储 安全 算法
【BLE】 BLE配对绑定保姆级介绍
实现蓝牙通信安全,除了paring/bonding这种底层方式,用户也可以在应用层去实现相同功能,两者从功能上和安全性上没有本质区别,只不过应用层自己实现的话,需要自己选择密码算法,密钥生成,密钥交换等,如果你不是这方面的专家,你的应用就有可能会存在安全漏洞。设备跟手机绑定成功后,手机再次重连这个设备时,就会自动跳过service discovery过程,换句话说,配对的时候手机会把设备所有服务和characteristic的handle保存下来,二次重连的时候,直接用以前保存的handle值去操作设备。
4750 1
【BLE】 BLE配对绑定保姆级介绍
|
机器学习/深度学习 移动开发
解决mqtt连接报Connection lost (32109) - java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]错误问题
最近生产环境在向mqtt客户端发布数据时反复出现一会断开一会连接错误,捕获的异常是java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]。尝试各种方式都未找到问题的原因,最后在检查发送主题topic的时候发现所发送mqtt客户端的topic的结尾包含了换行符,最终才将问题得以解决。
6066 0
解决mqtt连接报Connection lost (32109) - java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]错误问题
|
编解码 安全 Android开发
低功耗蓝牙LE Audio Profile 详细介绍
2019年底,蓝牙官方组织SIG发布了蓝牙5.2版本的核心协议,其中增加了一个重要的特性---LE Audio。蓝牙的应用协议都是从应用层到物理层完整包含的协议,LE Audio也不例外。但蓝牙5.2核心协议仅仅定义了蓝牙LE的链路层传输Audio的方式,上层协议以及完整的LE Audio规范迟迟未出,近日,蓝牙官方组织释放了LE Audio较为完整的规范文档。
低功耗蓝牙LE Audio Profile 详细介绍
|
Linux 网络安全
树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)
|
传感器 存储 Ubuntu
一步一步学会蓝牙开发之 ESP-IDF GATT Server 示例解析
学习蓝牙的 GATT 开发,我们从示例代码,一段代码一段代码进行详细分析说明
2821 1
一步一步学会蓝牙开发之 ESP-IDF GATT Server 示例解析
|
物联网 API 数据库
一文带你认识蓝牙 GATT 协议
正所谓磨刀不误砍柴工,我们有必要先深入的学习一下 GATT 以及 GATT 相关的一些知识。 本文我们就来了解一下 蓝牙 GATT 到底是什么?同时了解下我们使用的 ESP32-C3 GATT示例的工程的代码结构。
8001 4
一文带你认识蓝牙 GATT 协议
|
安全 Linux 数据安全/隐私保护
探索 Linux 高级进程间通讯 D-Bus的神秘妙用
探索 Linux 高级进程间通讯 D-Bus的神秘妙用
1748 1
|
IDE 编译器 Linux
你应该搞懂的 C 语言头文件路径问题
聊聊系统路径位置,绝对路径与相对路径,正斜杠 `/` 与 反斜杠 `\` 使用说明 ...... by 矜辰所致
582 0
你应该搞懂的 C 语言头文件路径问题
|
C语言
bluez5.50蓝牙文件传输
bluez5.50蓝牙文件传输
1378 0
bluez5.50蓝牙文件传输