扫描&查看MAC:sudo bluetoothctl
输入命令sudo bluetoothctl
进入此工具的命令界面
使用命令scan on
命令可以扫描当前环境中存在的蓝牙设备。
找到需要连接的设备,记录MAC地址。
[NEW] Device 64:46:0B:05:8F:07 64-46-0B-05-8F-07
[CHG] Device 64:46:0B:05:8F:07 LegacyPairing: no
[CHG] Device 64:46:0B:05:8F:07 Name: SU_Band
[CHG] Device 64:46:0B:05:8F:07 Alias: SU_Band
使用bluetoothctl进行连接有些问题。
连接设备:bluez
bluez是linux官方蓝牙协议栈。
安装和配置
#安装
sudo apt-get install pi-bluetooth bluez bluez-firmware blueman
#添加用户到蓝牙组(假设用户名为pi)
sudo usermod -G bluetooth -a pi
sudo reboot #重启
#启动/增加SPP(Serial Port Profile)
sudo vim /etc/systemd/system/dbus-org.bluez.service
给配置文件增加两行:
[Unit]
Description=Bluetooth service
Documentation=man:bluetoothd(8)
ConditionPathIsDirectory=/sys/class/bluetooth
[Service]
Type=dbus
BusName=org.bluez
#增加下面这两行
ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP
NotifyAccess=main
#WatchdogSec=10
#Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1
ProtectHome=true
ProtectSystem=full
[Install]
WantedBy=bluetooth.target
Alias=dbus-org.bluez.service
再重启sudo reboot
使用命令hciconfig
查看树莓派的蓝牙信息。
hci0: Type: Primary Bus: UART
BD Address: AA:AA:AA:AA:AA:AA ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING PSCAN ISCAN
RX bytes:353313 acl:4941 sco:0 events:9829 errors:0
TX bytes:130290 acl:8889 sco:0 commands:217 errors:0
可以看到设备是hci0
SSP模式与其他蓝牙设备进行连接
从机模式:被动连接
使用命令sudo rfcomm watch hci0
开启等待连接
pi@raspberrypi:~ $ sudo rfcomm watch hci0
Waiting for connection on channel 1
打开手机蓝牙调试助手,连接树莓派蓝牙
连接成功后,/dev/目录下将生成一个设备rfcomm0,可以直接当做串口设备进行使用。
#发送数据
echo 1234541 > /dev/rfcomm0
#读取数据
cat /dev/rfcomm0
主机模式:主动连接
使用命令:sudo rfcomm conn /dev/rfcomm0 [MAC]
连接到目的主机
pi@raspberrypi:~ $ sudo rfcomm conn /dev/rfcomm0 64:46:0B:05:8F:07
Connected /dev/rfcomm0 to 64:46:0B:05:8F:07 on channel 1
Press CTRL-C for hangup
同样,连接成功后可以使用设备rfcomm0进行通讯
#include <sys/types.h> //系统常用类型定义
#include <sys/stat.h> //系统常用文件状态定义
#include <fcntl.h> //文件控制相关
#include <unistd.h> //POSIX常用系统调用
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h> //POSIX线程管理
#include <string.h>
#include <termios.h>
#include <errno.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/select.h>
#include <stdint.h>
int fd;//串口的句柄
/*串口初始化函数
*@method Usart_Init
*@param{void}
*@return {void}
*/
void Usart_Init()
{
struct termios Opt;
memset(&Opt ,0 ,sizeof(Opt));
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B115200); /*设置为115200Bps*/
cfsetospeed(&Opt,B115200);
Opt.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); //特殊字符不做特殊处理
Opt.c_oflag &= ~OPOST;
Opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
Opt.c_cflag |= CLOCAL | CREAD;//保证程序不会成为端的占有者|使端口能读取输入的数据
Opt.c_cflag &= ~CSIZE;
Opt.c_cflag |= CS8; //8数据位
Opt.c_cflag &= ~PARENB; //无校验
Opt.c_cflag &= ~CSTOPB; //一停止位
Opt.c_cc[VTIME] = 10;/* 非规范模式读取时的超时时间*/
Opt.c_cc[VMIN] = 128; /* 非规范模式读取时的最小字符数*/
tcflush(fd ,TCIFLUSH);/* tcflush清空终端未完成的输入/输出请求及数据*/
tcsetattr(fd,TCSANOW,&Opt);
}
void HexViewer(uint8_t *buf, int rc){
if (rc<=0) return;
int i = 0;
while (i<rc){
printf("%02X ",buf[i++]);
}
printf("\n");
}
int main(int argc, char *argv[]){
fd = open("/dev/rfcomm0",O_RDWR|O_NOCTTY|O_NDELAY);
if (fd<0) return fd;
Usart_Init();
int cn = 0;
uint8_t buf[48];
while (1){
cn = read(fd, buf, 48);
if (cn <=0) continue;
printf("Read Count:%d\n", cn);
HexViewer(buf, cn);
}
}
输出
Read Count:24
A5 B2 B2 A7 CC 18 94 02 AC 3F 63 FF 0C FF 00 00 1A 00 02 00 D2 FF CA 5A
Read Count:24
A5 B2 B2 A7 AC 18 8C 02 C0 3F 5D FF 14 00 42 00 15 00 05 00 CB FF F2 5A
Read Count:24
A5 B2 B2 A7 CC 18 90 02 98 3F 5D FF 05 00 38 00 11 00 09 00 D1 FF DB 5A
Read Count:24
A5 B2 B2 A7 F0 18 9C 02 74 3F 69 FF 2C 00 46 00 17 00 01 00 D7 FF 2C 5A
Read Count:24
A5 B2 B2 A7 D0 18 74 02 A4 3F 61 FF 0C 00 2F 00 15 00 03 00 CF FF CD 5A
Read Count:24
A5 B2 B2 A7 AC 18 84 02 74 3F 50 FF F4 FF 20 00 13 00 01 00 D5 FF 52 5A
Read Count:24
A5 B2 B2 A7 C4 18 A0 02 E4 3E 40 FF 1D 00 3F 00 17 00 FF FF CB FF 25 5A
Read Count:24
A5 B2 B2 A7 98 19 80 02 48 3F 64 FF F6 FF 14 00 17 00 FD FF D5 FF 18 5A
Read Count:24
A5 B2 B2 A7 D4 18 A0 02 8C 3F 4A FF 04 00 27 00 15 00 01 00 C9 FF B6 5A
Read Count:24
A5 B2 B2 A7 88 18 A8 02 24 3F 57 FF 17 00 1D 00 15 00 01 00 CD FF 24 5A
Read Count:24
A5 B2 B2 A7 D4 18 24 02 50 3F 69 FF 00 00 21 00 16 00 FC FF CA FF 0F 5A
Read Count:24
A5 B2 B2 A7 B8 18 70 02 D0 3F 48 FF 28 00 28 00 1B 00 FF FF D3 FF DE 5A
参考文献:
https://www.jianshu.com/p/f7999399b4a8
https://blog.csdn.net/linuxheik/article/details/51923924