QPython 中文文档 下载 App

QSL4A 蓝牙与 NFC——Python 控制近距离通信

蓝牙 API

功能概览

QSL4A 的蓝牙 API 覆盖了 Android 蓝牙的核心功能:

蓝牙扫描

扫描周围的蓝牙设备:

from androidhelper import Android
droid = Android()

# 启动扫描
droid.bluetoothStartDiscovery()
import time
time.sleep(10)  # 扫描 10 秒

# 获取扫描到的设备列表
devices = droid.bluetoothGetDiscoveredDevices().result
for device in devices:
    print(f"名称: {device.get('name')}, 地址: {device.get('address')}")

# 停止扫描
droid.bluetoothCancelDiscovery()

查看已配对设备

paired = droid.bluetoothGetBondedDevices().result
for device in paired:
    print(f"已配对: {device.get('name')} ({device.get('address')})")

连接和通信

和蓝牙设备(如串口蓝牙模块)建立连接后,可以发送和接收数据:

# 连接到指定地址的设备(需要先配对)
success = droid.bluetoothConnect("AA:BB:CC:DD:EE:FF").result

if success:
    # 发送数据
    droid.bluetoothWrite("AT\r\n")
    
    # 接收响应
    response = droid.bluetoothRead()
    print(response)
    
    # 断开连接
    droid.bluetoothDisconnect()

权限需求

API需要的权限
扫描设备蓝牙扫描权限 + 粗略位置权限(Android 12+)
连接设备蓝牙连接权限 + 蓝牙配对设备权限
开启可发现蓝牙可发现权限

Android 12(API 31)之后,蓝牙权限被拆得更细。如果蓝牙扫描返回空列表,99% 是位置权限没给——Android 要求扫描蓝牙时必须同时能获取位置。

NFC API

NFC 是什么

NFC(Near Field Communication,近场通信)是一种短距离无线通信技术,常见于:

QSL4A NFC 功能

QSL4A 的 NFC API 主要支持读取 NFC 标签:

# 开启 NFC 监听
droid.nfcEnableForegroundDispatch()

# 等待读取标签
import time
time.sleep(60)  # 在这 60 秒内把 NFC 标签靠近手机

# 获取读到的标签数据
tag = droid.nfcGetTagID().result
print(f"标签 ID: {tag}")

# 关闭监听
droid.nfcDisableForegroundDispatch()

NFC 权限

需要 NFC 权限(android.permission.NFC)。部分手机不支持 NFC,相关 API 会静默失败。

实际应用场景

蓝牙场景

NFC 场景

开发注意事项

蓝牙连接超时

某些蓝牙设备连接需要几秒甚至几十秒。建议在连接代码里加超时处理:

import time
start = time.time()
while time.time() - start < 15:  # 15 秒超时
    result = droid.bluetoothConnect(address).result
    if result:
        break
    time.sleep(1)
else:
    print("连接超时")

蓝牙和位置权限

Android 12+ 扫描蓝牙需要同时授予位置权限。如果蓝牙扫描返回空列表,先检查位置权限。

后台蓝牙操作

Android 对后台蓝牙操作限制很严。如果脚本要持续监听蓝牙,需要申请前台服务权限(FOREGROUND_SERVICE)并显示通知。

小结

蓝牙和 NFC 把 QPython 的硬件控制能力从「自带传感器」扩展到「外部设备通信」。蓝牙扫描 + 连接 + 收发数据这一套 API 在 IoT 场景下特别实用。NFC 主要用于标签读取。注意 Android 12+ 蓝牙扫描必须配合位置权限,这是最常踩的坑。

继续看 系统服务接口 了解 QSL4A 的系统级 API。