PHP 不能直接控制 HC-05 蓝牙模块,因其无原生蓝牙支持且缺乏串口硬件访问权限;实际需通过 exec() 调用 picocom 等工具或委托 Python/pyserial 服务中转通信。

PHP 能不能直接控制 HC-05 蓝牙模块
不能。PHP 是服务端脚本语言,没有原生蓝牙协议栈支持,也不具备直接操作硬件串口的权限(尤其在 Linux/macOS 下需设备文件读写权限,Windows 下需驱动级访问)。所谓“PHP 连蓝牙”,实际是 PHP 通过 exec()、shell_exec() 或 proc_open() 调用系统串口工具(如 screen、picocom、stty)或自编译的 C/Python 串口程序来中转通信。
Linux 下用 PHP 调用 picocom 与 HC-05 交互
HC-05 默认波特率 9600,AT 模式下需拉低 KEY 引脚(或上电时按住按键),串口设备通常为 /dev/ttyUSB0 或 /dev/ttyS0。直接在 PHP 中用 fopen("php://stdout") 无法可靠收发,必须借助终端仿真工具。
- 先确认设备存在且权限可读写:
ls -l /dev/ttyUSB0,若提示 Permission denied,需将用户加入dialout组:sudo usermod -a -G dialout $USER - 安装
picocom:sudo apt install picocom(Ubuntu/Debian) - PHP 中调用示例(发送 AT 命令并捕获响应):
exec('picocom -b 9600 -d 8 -p n -f h -t --echo /dev/ttyUSB0 -e C << EOF
AT
AT+NAME?
AT+VERSION?
EOF 2>&1', $output, $return_code);
print_r($output);
⚠️ 注意: 是 picocom 退出命令,不能直接写进字符串;真实使用需用 proc_open() 启动长期进程并分步写入,否则 picocom 会阻塞等待交互。
更可靠的做法:用 Python 写串口服务,PHP 通过 HTTP 或 socket 调用
绕过 PHP 的串口短板,把通信逻辑下沉到 Python(用 pyserial),PHP 只负责触发和取结果。这是生产环境唯一推荐方式。
立即学习“PHP免费学习笔记(深入)”;
- Python 服务监听本地端口(如 8081),接收 JSON 请求(含 AT 命令、timeout 等字段),执行
ser.write(b'AT\r\n')并返回响应 - PHP 调用:
file_get_contents('http://127.0.0.1:8081/at?cmd=AT%2BNAME%3F') - 关键点:
pyserial打开串口时必须设timeout=1,否则readline()可能永久阻塞;HC-05 对换行符敏感,务必用\r\n结尾 - HC-05 在透传模式下不响应 AT 命令——必须先进入 AT 模式(KEY 高电平或上电触发),这点常被忽略
Windows 下的替代路径:用 COM 口 + mode 命令 + more
PHP 无法直接 fopen("COM3") 成功(Windows 权限模型限制),但可用内置命令中转:
- 设置串口参数:
mode COM3:9600,n,8,1 - 发送 AT 命令:
echo AT>&1 | more > \\.\COM3(注意 Windows 下设备路径是\\.\COM3) - 读取响应较难——
more不支持读,需用 PowerShell 封装,例如:powershell -Command "&{ \$port = New-Object System.IO.Ports.SerialPort 'COM3',9600,'None','8','One'; \$port.Open(); \$port.WriteLine('AT'); Start-Sleep -Milliseconds 200; \$port.ReadExisting(); \$port.Close() }"
这种方案调试成本高、错误难捕获,仅适合临时验证,不建议嵌入业务逻辑。
真正卡住的从来不是代码怎么写,而是 HC-05 是否处于 AT 模式、串口线是否接对(TX/RX 交叉)、USB 转串口芯片驱动是否正常——这些物理层问题,比任何 PHP 函数都优先需要排查。











