本文記錄在 Linux(以 Fedora Core 5 為例)下通過藍牙連接手機(諾基亞 6600)實現 AT 指令控制(發送短信)與 OBEX 文件傳輸的完整操作流程,適用於內核 2.6+ 且已內置藍牙協議棧的發行版。
# 啟動藍牙守護進程
/etc/init.d/bluetooth start
# 掃描可見設備,獲取手機 MAC 地址
hcitool scan
# 輸出示例:
# Scanning ...
# 00:13:E0:2A:99:6A Nokia 6600
sdptool browse 00:13:E0:2A:99:6A
# 關鍵輸出:
# Service Name: Dial-up Networking
# Channel: 1
# Service Name: OBEX Object Push
# Channel: 9
記錄 Channel 1 (DUN) 和 Channel 9 (OBEX Push),後續連接需用到。
# 語法:rfcomm bind <設備編號> <通道號>
rfcomm bind 0 00:13:E0:2A:99:6A 1
成功後會生成 /dev/rfcomm0 字符設備:
ls -l /dev/rfcomm0
# crw------- 1 root root 216, 0 Nov 5 20:49 /dev/rfcomm0
# 簡單測試(需手機端確認配對碼)
cat < /dev/rfcomm0
# 若提示 "Operation already in progress",嘗試重啟藍牙服務或重新綁定
# 安裝 kermit
yum install ckermit # 或 apt-get install ckermit
# 交互式連接
kermit
C-Kermit> set line /dev/rfcomm0
C-Kermit> set speed 9600
C-Kermit> connect
# 進入 AT 指令模式,輸入:
ati3
# 回顯手機型號:Nokia 6600
# 發送短信示例(PDU 模式較複雜,此處略)
# 退出:Ctrl+\ 然後輸入 C
FC5 內置 obex_push 工具,支雙向傳輸:
# 語法:obex_push <通道號> <文件路徑>
obex_push 9 00:13:E0:2A:99:6A /mnt/d/mig-29.jpg
# 監聽模式,默認保存至 /tmp
obex_push -l 9 00:13:E0:2A:99:6A
# 手機端選擇"通過藍牙發送"即可
| 現象 | 原因分析 | 解決方案 |
|---|---|---|
| minicom 提示 "cannot open /dev/rfcomm0" | RFCOMM 設備未正確綁定或已被釋放 | 重新執行 rfcomm bind;改用 kermit |
| 配對失敗 / PIN 碼不匹配 | 雙端 PIN 碼不一致 | 在 /etc/bluetooth/pin 設置固定 PIN,或手機端輸入同一碼 |
| 文件傳輸中斷 | 藍牙信號弱或 OBEX 協議不兼容 | 縮短距離;嘗試 obexftp 替代 obex_push |
| 內核 2.4 系統無藍牙支持 | 藍牙子系統僅在 2.6+ 完善 | 升級發行版(推薦 FC5+、RHEL5+、Debian Etch+) |
#!/bin/bash
# 藍牙手機自動連接腳本
MAC="00:13:E0:2A:99:6A"
DUN_CH=1
OBEX_CH=9
# 1. 綁定 DUN 串口
rfcomm release 0 2>/dev/null
rfcomm bind 0 $MAC $DUN_CH
# 2. 發送測試短信(需預先生成 PDU)
# echo "AT+CMGS=..." > /dev/rfcomm0
# 3. 接收文件(後台運行)
obex_push -l $OBEX_CH $MAC -d /home/user/bluetooth_inbox &
echo "藍牙服務就緒:串口 /dev/rfcomm0,OBEX 監聽中..."
Linux 下操作藍牙手機的核心流程是:服務啟動 → sdptool 獲取通道 → rfcomm 綁定虛擬串口 → 終端軟體發送 AT 指令 / obex_push 文件傳輸。關鍵點在於正確識別 DUN 和 OBEX 的通道號,並使用穩定的終端工具(推薦 Kermit)。現代發行版(Ubuntu 20.04+、Fedora 35+)已整合藍牙面板,圖形界面操作更便捷,但命令行方式仍是腳本自動化與嵌入式場景的首選。