树莓派蓝牙连接手机或其他设备(主机+从机)

扫描&查看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

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值