使用Python在树莓派监听广播可见蓝牙

好久没有更新了,今天更新一下我遇到的一个难受的地方,使用树莓派监听蓝牙,从而让手机连接。

代码会在下方放出,是来源于PyBluz官方例程和其他一些问题博主的提问和解答,我将代码重新整合封装成我的个人代码库,下面会展示其中和本次文章相关的部分。

环境

  • Raspberry Pi 3B+
  • Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux
  • Python 3+

依赖

1
2
3
sudo apt-get install python-dev
sudo apt-get install libbluetooth-dev
pip install pybluez

有多个网友留言这个以来安装存在问题,即便完成了安装也无法正常使用,我又重新来了一遍,发现问题出现在pip install pybluez上,如果出现

1
import bluetooth失败

的情况,可以试一试

1
sudo pip install pybluez

这是因为sudo下pybluz安装的位置是sudoer的,而运行脚本是用的sudo,所以会出现这个问题(我的猜测)

1
sudo nano /etc/systemd/system/bluetooth.target.wants/bluetooth.service

将其中的 ExecStart=/usr/lib/bluetooth/bluetoothd 后加上 -E -C 成这样

保存后重启树莓派。完成依赖配置

实现

以下是Python代码,用于蓝牙的可见和监听,如果接收到消息,则会自动返回该消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
    王政乔的个人代码库:蓝牙
    当前版本:1.0.0
    Python:2+;3+
    请注意,windows和linux存在差异,可能会导致兼容错误。
'''

from bluetooth import *
import subprocess


class service:

    uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
    server_name="SampleServer"
    def __init__(self):
        pass
    
    def set_uuid(self,new_uuid):
        self.uuid=new_uuid
        pass
    
    def set_server_name(self,newname):
        self.server_name=newname
        pass
    
    def init_service(self):
        self.server_sock=BluetoothSocket(RFCOMM)
        self.server_sock.bind(('',1))
        self.server_sock.listen(1)
        self.port=self.server_sock.getsockname()[1]
        print("初始化完成,初始化信息:")
        print("  uuid:\t",self.uuid)
        print("  server_name:\t",self.server_name)
        print("\n")
        pass
        
    
    def start_service(self):
        advertise_service(self.server_sock, self.server_name,service_id = self.uuid,service_classes = [self.uuid, SERIAL_PORT_CLASS],profiles = [SERIAL_PORT_PROFILE])
        print("等待设备接入(通道",self.port,")")
        self.client_sock, self.client_info = self.server_sock.accept()
        print("设备已连接,对方为地址为:[",self.client_info[0],"],连接端口为:",self.client_info[1])
        try:
            while True:
                data=self.client_sock.recv(1024)
                if len(data)==0: break
                print("收到消息:%s"%data)
                self.client_sock.send(data)
        except IOError:
            print("出现了异常!")
            pass
        print("通信结束")
        self.client_sock.close()
        self.server_sock.close()


cmd='sudo hciconfig hci0 piscan'
subprocess.check_output(cmd,shell=True)
ss=service()
ss.init_service()
ss.start_service()

我们可以通过

1
sudo python3 bluetooth_joger.py

运行

这时候我们可以通过手机端的《蓝牙开发助手》(华为市场可下)

最后我们退出手机APP