用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. }



相关文章
|
23天前
win10 蓝牙开关消失 设备管理器“设备描述符请求失败”
win10 蓝牙开关消失 设备管理器“设备描述符请求失败”
20 1
win10 蓝牙开关消失 设备管理器“设备描述符请求失败”
|
7月前
4G、Wifi、蓝牙所谓的AT指令模式和数据透传模式到底是什么意思?
4G、Wifi、蓝牙所谓的AT指令模式和数据透传模式到底是什么意思?
222 0
|
9月前
I/O设备与主机信息传送的控制方式以及什么是中断
I/O设备与主机信息传送的控制方式以及什么是中断
150 0
|
9月前
|
小程序 前端开发 API
小程序学习笔记--连接蓝牙
小程序学习笔记--连接蓝牙
189 0
|
11月前
|
Windows
USB 设备:自定义批量传输及实现
USB 设备:自定义批量传输及实现
708 0
|
编解码 算法 安全
蓝牙通讯数据传输,蓝牙UUID,BluetoothAdapter;adb input 模拟系统输入,adb logcat:抓包,抓日志,蓝牙通讯,adb命令实现
蓝牙通讯数据传输,蓝牙UUID,BluetoothAdapter;adb input 模拟系统输入,adb logcat:抓包,抓日志,蓝牙通讯,adb命令实现
324 0
|
小程序 API Android开发
微信小程序使用蓝牙通信协议连接硬件整理总结(蓝牙连接、获取设备UUID、开水器notify及关闭蓝牙)
微信小程序使用蓝牙通信协议连接硬件整理总结(蓝牙连接、获取设备UUID、开水器notify及关闭蓝牙)
2600 0
微信小程序使用蓝牙通信协议连接硬件整理总结(蓝牙连接、获取设备UUID、开水器notify及关闭蓝牙)
|
网络协议 物联网 数据安全/隐私保护
Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制 | 学习笔记
快速学习 Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制
274 0
Wifi-nodeMCU-esp8266 建立热点同时作为服务器完成设备连接控制 | 学习笔记
|
安全 物联网 网络安全
蓝牙模块普通数据收发AT指令|学习笔记
快速学习蓝牙模块普通数据收发AT指令
1431 0
蓝牙模块普通数据收发AT指令|学习笔记
串口助手数据发送与接收(查询法)
串口助手数据发送与接收(查询法) 宏定义 初始化 数据发送 数据接收 主函数
408 0