Raspberry Pi的蓝牙开发(一)

首先,安装基本的蓝牙库

sudo apt-get install python-dev
sudo apt-get install libbluetooth-dev
sudo pip install pybluez

修改/etc/systemd/system/bluetooth.target.wants/bluetooth.service文件

特别是要切记允许打开串口服务ExecStartPost这个(坑爹的网上大部分文章都没有提及这个,导致扫描的到,但是各种串口调试工具死活连不上,原因未知……)

ExecStart=/usr/lib/bluetooth/bluetoothd
ExecStartPost=/usr/bin/sdptool add SP

实现代码,Python的

#!/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()

这段代码不是我写的,是代码注释里头的哥们,🙏

sudo python3 bluetooth_joger.py

用手机找个蓝牙测试工具,连进来就可以测试了!

说个题外话,之前测试的时候,运行了无数次都不成功,并且反复报import bluetooth这句,找不到bluetooth库,重装了无数次,最后发现是因为我把这段测试的代码命名成了bluetooth.py了……估计他是自己找自己去了……晕死!