網頁最後修改時間:2014/07/29
- HC-05 主從一體藍牙模組初體驗 01 ( 硬體接線、從動角色 )
- HC-05 主從一體藍牙模組初體驗 02 ( AT 指令說明與使用演示、主動角色 )
- HC-05 主從一體藍牙模組初體驗 03 ( BTSCmode.apk Eclipse 編譯環境說明 )
這篇網頁是 "HC-05 主從一體藍牙模組初體驗" 的第二篇。主要注重在 AT 指令的實機演示以及參數的詳細說明,並且說明在 HC-05 為主動角色時,如何使用 BTSCmode 讓 HC-05 主動連接到手機端。
在開始手機連線之前,先了解一下 HC-05 AT 指令的使用以及藍牙相關的知識是非常重要的,現在就讓我們先由 AT 指令開始。
Note: 因為不能直接使用手機以及 HC-05 實際的藍牙位址,因此本網頁使用了下面假設的位址址,( 即便如此,所有的輸出資料都是使用實機測試得到的 ):
- Xperia P 手機:12:34:56:78:9A:BC
- HC-05 藍牙模組:01:22:03:04:55:06
** HC-05 的 AT 指令:
HC-05 所下的 AT 指令後面都必須加上 \r\n ( 要記得勾選 "SendNew" 選項 ),網頁中並不一定會為每個指令特別提起。如果不是使用 SSCOM,一定記得在所使用的軟體中確認這一點,不然是收不到任何回應的。
** AT ( 測試指令 ) ( HC-05 AT Command.pdf, page 3;HC-05指令集.pdf, page 2 )
使用任何裝置之前,怎麼知道裝置是 OK 的 ? HC-05 提供了一個簡單的指令,讓我們可以先跟藍牙裝置說聲 HELLO
指 令
|
回 應
|
參 數
|
AT
|
OK
|
無
|
ERROR(#(1))
|
(1) 回應的錯誤碼,請參考資料手冊 ( HC-05 AT Command.pdf, page 22;HC-05指令集.pdf, page 11…12 )
** AT+NAME ( 查詢/指定裝置名稱 ) ( HC-05 AT Command.pdf, page 4...5;HC-05指令集.pdf, page 3 )
有時候同時好幾個藍牙裝置在一起,為了好區別,就會希望可以修改藍牙裝置的名稱,下面這個 AT 指令可用來修改或是查詢 HC-05 藍牙模組的名稱
指 令
|
回 應
|
參 數
| |
AT+NAME=<PARAM>
|
OK
|
PARAM:藍牙裝置名稱,預設值是 HC-05;若使用 ORGL 指令回復預設值則是 H-C-2010-06-01
| |
AT+NAME?
|
成功
|
+NAME:<PARAM>
OK
| |
失敗
|
FAIL
|
下面是一個設定 HC-05 藍牙模組名稱的詳細操作過程:
AT+NAME?;AT+NAME=<裝置命名名稱> |
** 查詢周邊藍牙裝置
要查詢藍牙裝置是使用 AT+INQ 指令,但是使用之前需要幾個前導的指令來設置所要搜尋的藍牙裝置的存取碼 ( Access Code )、類型 ( Device Type )、數量、方式以及逾時時間...等設定,而且被搜尋的那一端需要伺服端的軟體,因此這些指令的演示與詳細的使用說明會在下一節 "HC - 05 @ 主動模式連線到手機" 說明,但現在先了解一下大概吧 !
AT+ROLE ( Inquire module role, 查詢/設置藍牙模組主從角色 )
HC-05 AT Command.pdf, page 5;HC-05指令集.pdf, page 3
指 令
|
回 應
|
參 數
|
AT+ROLE=<PARAM>
|
OK
|
PARAM:角色設定
0–從動(1)角色(Slave)
1–主動(2)角色(Master)
2–迴歸迴路測試(3)角色(Slave-loop)
預設值:0
|
AT+ROLE?
|
+ROLE:<PARAM>
OK
|
(1) 從動角色 – 被動連接。
(2) 主動角色 – 尋找週邊藍牙從動裝置,並主動發起連接,從而建立主、從藍牙裝置間的無線數據傳輸通道。
(3) 迴歸迴路角色 – 被動連接;接收遠端藍牙主動裝置數據並將數據原封不動直接返回給遠端藍牙主動裝置
,這是用來測試主、從藍牙裝置間通訊是否正常最容易的方式。
AT+IAC ( Inquire access code, 查詢/設置訪問碼 )
HC-05 AT Command.pdf, page 6…7;HC-05指令集.pdf, page 4
指 令
|
回 應
|
參 數
| |
AT+IAC=<PARAM>
|
成功
|
OK
|
PARAM:查詢訪問碼
預設值是 9E8B33
|
失敗
|
FAIL
| ||
AT+IAC?
|
+IAC:<PARAM>
OK
|
AT+CLASS ( Inquire device type, 查詢/設置裝置類型 )
HC-05 AT Command.pdf, page 6;HC-05指令集.pdf, page 4
指 令
|
回 應
|
參 數
| |
AT+CLASS=<PARAM>
|
OK
|
PARAM:藍牙裝置類別。
預設值是 0
| |
AT+CLASS?
|
成功
|
+CLASS:<PARAM>
OK
| |
失敗
|
FAIL
|
AT+INQM ( Inquire access mode, 查詢/設置訪問模式 )
HC-05 AT Command.pdf, page 7;HC-05指令集.pdf, page 4
指 令
|
回 應
|
參 數
| |
AT+INQM,=<PARAM1>,
<PARAM2>,<PARAM3>
|
成功
|
OK
|
PARAM1:查詢存取碼
0 – 標準查詢模式
1 – RSSI 查詢模式
PARAM2:最大回應數目
PARAM3:逾時查詢時間
逾時範圍:1-48
(對應時間為:1.28s – 61.44s)
預設值:1,1,48
|
失敗
|
FAIL
| ||
AT+INQM?
|
+INQM:<PARAM1>,
<PARAM>,<PARAM3>
OK
|
AT+INQ ( Inquire Bluetooth device, 查詢藍牙裝置 )
HC-05 AT Command.pdf, page 17…19;HC-05指令集.pdf, page 9…11
指 令
|
回 應
|
參 數
|
AT+INQ
|
+INQ:<PARAM1>,<PARAM2>,<PARAM3>,
… …
OK
|
PARAM1:藍牙位址
PARAM2:藍牙裝置類型
PARAM3:RSSI 信號強度
|
AT+LINK (Connect device , 連接遠端藍牙裝置 )
HC-05 AT Command.pdf, page 20;HC-05指令集.pdf, page 11
指 令
|
回 應
|
參 數
| |
AT+LINK=<PARAM>
|
成功
|
OK
|
PARAM:遠端藍牙裝置位址
xxxx,xx,xxxxxx
PARAM2:藍牙裝置類型
( CoD )
PARAM3:RSSI 訊號強度
|
失敗
|
FAIL
+INQ:<PARAM>,<PARAM2>,<PARAM3>
… …
OK
|
IAC 與 CLASS 指令所談到的藍牙裝置訪問碼與類型的定義與詳細說明,可到 Bluetooth.org Bluetooth Baseband ( 或藍牙基頻 ) 網頁查看。
查詢藍牙周邊裝置所介紹的這幾個指令,透過實際操作,對於了解藍牙基頻 ( Bluetooth Baseband ) 裡談到的 IAC ( Inquiry Access Code, 訪問存取碼 )、CoD ( The Class of Device /Service, 設備類型/服務類型 ) 組成非常有幫助,可以用來釐清原本對於 IAC 以及 CoD 觀念上以及資料手冊上不足之處。
* Master / Slave vs. Server / Client
不知道大家有沒被 Master / Slave / Server / Client ( 主 / 從 / 伺服端 / 客戶端 ) 搞混 !!
不管怎樣,在這網頁中因為 HC-05 主從架構與手機上的伺服 / 客戶端常說到的緣故,因此說明一下我的理解:
- HC-05 作為 Master (主) 表示為主動,要主動連到手機或是其他的伺服端
- HC-05 作為 Slave (從) 表示為從動,是要被動讓手機或其他客戶端連上的
這部分因為常會說到,所以麻煩清楚這幾個名詞之間的不同之處。
**AT+RNAME ( 查詢遠端藍牙模組位址 ) ( HC-05 AT Command.pdf, page 5;HC-05指令集.pdf, page 3 )
ps. 使用這指令需要先知道遠端藍牙裝置的位址,且要 HC-05 須設為從動角色 ( ROLE=0 )
這個 AT 指令可以讓你嘗試著與遠端藍牙裝置測試連結,也可用來確認輸入的遠端藍牙位址是否正確,還記得預設的手機 Xperial P 的藍牙位址是 12:34:56:78:9A:BC ( 說明上需要,虛構的藍牙位址,但回應是用手機真實藍牙位址得到的 ) ,那麼完整的 AT 指令輸入就應該是
AT+RNAME? 1234,56,789ABC
成功的話,就會回覆手機的名稱。詳細的指令說明,如下表所示:
實際操作示範例子,如下圖所示:
** AT+ADDR ( 查詢 HC-05 藍牙模組位址) ( HC-05 AT Command.pdf, page 4;HC-05指令集.pdf, page 2 )
使用這個指令,可以得到現在連接的藍牙裝置位址,<PARAM> 的輸入格式與 AT+RNAME 指令參數格式一樣
指令回傳位址會是 ( HC-05 預設位址:01:22:03:04:55:06 )
+ADDR:122,3,45506
OK
要注意解讀時,逗號之前的每一組數字,只要一開始前面是數字 0 的話,都會被忽略 !
** AT+PSWD ( 藍牙配對密碼 ) ( HC-05 AT Command.pdf, page 3;HC-05指令集.pdf, page 2 )
看標題就知道這是設定藍牙密碼的指令,預設的藍牙密碼是 1234。
AT+PSWD ( Set/Inquire passkey, 查詢/設置藍牙配對密碼 )
試著將配對密碼由原本的 1234 換成 5678,然後試著用手機連上 HC-05 並用新的密碼配對。完成測試之後,關閉手機藍牙,再將密碼再改回 1234 。
** AT+UART ( 串列介面參數 ) ( HC-05 AT Command.pdf, page 3;HC-05指令集.pdf, page 2 )
這是設定串列介面的指令,控制的硬體與 HC-05 兩者之間的串列通訊參數設定都要一樣,沒有硬性規定一定要使用哪一個通訊速率。
試著將 HC-05 的鮑率設為 115200 bps,其他的維持不變 ! 眼尖的你應該會發現,改完之後,我依舊使用 9600 來取得 HC-05 改完之後的數值。
要讓新的設定鮑率起作用,設定之後必須先浮接 KEY 並重開 HC-05 ( 拔掉電源再重新接上電源 ),最後再將 KEY 接高準位,這樣 HC-05 新的鮑率設定才會生效。
步驟如下:
** AT 指令結論
本節中列出了幾個在本網頁中會用到的指令,其他沒列出的指令,有用到的時候會再提,若需要更多 AT 指令的說明,請再自行閱讀 AT 指令資料手冊。
HC - 05 @ 主動模式連線到手機:
當 HC-05 角色互換為主動角色,意味著它可以主動連接周邊藍牙裝置,不過需要被連接的藍牙裝置提供 SPP Server,才能建立兩者之間的溝通管道。
不過很不巧的 ! 藍牙串口助手 ( 其他的 APP 絕大部分也一樣 ) 並沒有提供 SPP Server 端的功能,因此請安裝由我重新撰寫的另一個可提供 SPP Server / Client 兩種模式的 Android APP 軟體 BTSCmode。
不管是在哪一種 ( Server / Client ) 模式下,雙方都可以雙向溝通。若是有購買藍牙入門套件的使用者,現在可以先到雲端硬碟的 software 資料夾下載 BTSCmode 安裝程式 ( 或下面提供的連結 ),以及 codes 資料夾下載 Android 原始碼
下載 BTSCmode.apk,安裝時請記得在手機安全性選項下選擇允許安裝來源不明的應用程式。
** HC-05 @ 主動模式下與 BTSCmode 的連接過程
HC-05 主動配對遠端藍牙裝置 ( 手機 ),下面幾個情況必須同時成立:
** 搜尋藍牙裝置
為了演示時考慮不同情況,因此加入另一片藍牙模組
INQ 指令下了之後就會開始搜尋藍牙裝置,且不管何種型態的都會被搜尋 ( 因為 Class 設為 0,且 IAC 設為 9E8B33 (GIAC) )。由於現在可被搜尋的就是手機與 HC-06 兩個藍牙裝置,因此可看到回應的結果只有兩個不同的位址,兩個位址會出現 5 次是因為 INQM 第二個參數設定為 5 的緣故,這可用來限制可搜尋的藍牙裝置的數目。
********************************************************************************
2015/03/08:
如果在下達 AT+INQ 出現 ERROR(16) 的回應錯誤,請直接下 AT+INIT 就可修正這個錯誤出現!
這是因為 SPP 函式庫沒有初始化的緣故造成這個錯誤出現!
********************************************************************************
而下 INQ 回傳的藍牙裝置的資料中,第三個參數是 RSSI 的訊號強度,這是個 8-bit 有符號整數,如果沒錯的話值的範圍是從 FF80 - FFFF,數目越大訊號越強。除了測訊號強弱之外,對於這個 RSSI 有很多研究是關於距離測定的,有興趣在自己上網找找相關應用,下面分享一則網路上使用 RSSI 訊號來控制伺服馬達的影片( Raspberry Pi + Arduino + iPhone + 藍牙模組 + USB 藍牙卡 )
另外,INQ 指令回傳的第二個參數與 CLASS 指令中所指定的參數值相關。一開始將 CLASS 設定為 0 是因為不去過濾任何藍牙裝置,而為什麼在這邊又加入另一片藍牙模組,就是等一下要用來說明 CLASS 參數的使用以及藍牙 CoD 的。
手機回傳的第二個參數 ( 藍牙裝置類別 ) 是 (0x) 5A020C,這是一個 16 進制值,但回傳會省略前面的 0x,這代表手機上面的藍牙裝置可與外部藍牙裝置直接配對的類型有哪些,也就是預先定義在手機裡面的藍牙服務 ( 現在應該就要新開一個網頁視窗,Bluetooth.org Bluetooth Baseband ( 或藍牙基頻 ) ) ,稱為 CoD ( The Class of Device / Service )。
CoD 是一個 24-bit 的值,這些值被分開為三個區段:第一個區段是主要服務類型 ( Major Service Classes ),佔 11- bit;第二個區段是主要裝置類型 ( Major Device Classes ),佔 5-bit;第三個區段是次要裝置類型 ( Minor Device Classes ),設定要根據第二個區段的選擇而定,佔 6-bit。
以手機的回傳的 CoD 為例:5A020C,將其分成上圖三個區段以利對照
0101,1010,000-0,0010,-0000,11-00
第一個是 11-bit ( 0101,1010,000 ) 的主要服務類型,對應到的服務是:電話、對象傳輸、捕捉和網路
第二個是 5-bit ( 0,0010 ) 的主要裝置類型,對應到的設備類型有 32 種,對應到:電話
第三個是 6-bit ( 0000,11 ) 的次要裝置類型,這個數值的組成要是上一個主要裝置類型去尋找相對應的次要裝置類型。由於上一個是主要裝置類型是電話,則找到的次要裝置類型的表格就如下表所示。所對應到的就是:智能手機
HC-06 所得到的 CoD 是 1F00,表示主要裝置類型是:未分類:未指定裝置代碼;次要裝置類型:未分類,未指定設備代碼。
若現在我只要搜尋跟 SPP 相關的裝置 ( 例如 SPP ),那我要如何設定呢 ? 很簡單,只要指定 Class=1F00 就不會搜尋到手機 ( 也就是只會搜尋未分類的裝置類型 )
因此藉由適當的規劃要搜尋的 CLASS,就可以過濾掉不需要知道的藍牙裝置類型,而且這不僅限於只能搜尋 SPP 藍牙模組 !
玩一下稍微進階一點點!我們知道手機的服務類型的電話,其他的不需要裡會,並且主要與次要裝置類型也不須理會 ( 但這可用來設定更多的過濾設定 ),所以設定 CLASS=400000 ( 0100,0000,000-,0,0000,-0000,00-00 ) 來搜尋有電話服務的藍牙裝置
因此,只要明白如何去設定 CoD 就可以很方便的過濾藍牙裝置,而且 CoD 這一部分在藍牙程式撰寫來說是非常重要的一個觀念。
最後,如果手邊有藍牙耳機,試著不先使用 CLASS=0 去搜尋藍牙耳機的 CoD 是多少,嘗試著使用上面 Major Service Classes 和 Major Device Classes 來兜前面的 11 +5 的 bit 數字 ( 後面 8-bit 都設為 0 即可 ),想出來了嗎 ?
滑鼠按住劃過這一行:0x402000
** IAC ( Inquiry Access Code )
說到這個,說明在剛剛開啟的網頁起頭處的一段文字描述。我的理解是,這個數值共有 64 個,範圍從 0x9EB00 - 0x9E8B3F。其中 0x9E8B33 是作為 GIAC 用;而 0x9E8B00 是 LIAC。若沒有特殊使用需求的話,AT+IAC 就是指定 0x9E8B33 即可。
** HC-05 主動連接手機
在上面的一些指令的操作下,已經將 HC-05 切換為主動角色,所以現在我們要主動連到手機上面去。
打開剛剛手機安裝的 BTSCmode APP,在 APP 畫面中按下 "Open Bluetooth" 按鈕開啟藍牙功能
在藍牙權限要求的對話視窗中選擇 "是",讓手機藍牙可被搜尋
按下 "AS Server" 開啟 SPP 藍牙 Server 等待 HC-05 連線
開啟等待 SPP 藍牙 Server 畫面後,可以看到這是個雙向通訊的介面。因此一旦 HC-05 連線成功回應之後就可以開始雙方面的文字通訊了,不過不是現在 !
打開 SSCOM 輸入 AT+LINK=1234:56:789ABC,成功就回傳第一次 OK ( 不然就會傳回 FAIL 並過一段時間後在傳回第二個字串 ),若是第一次通訊 就會在手機出現輸入密碼的視窗,輸入密碼正確之後,就會在回傳第二次 OK;若之前有通訊過了,就會只回傳一次 OK。然後就可以開始雙方的通訊了。
如果 HC-05 之前已經先設定為主動角色,則第一個指令可以不用再次輸入
輸入連線的指令並按下 "SEND"
由於是第一次連線,因此在手機端會出現藍牙配對要求的視窗,要求輸入配對密碼
輸入 HC-05 藍芽配對的密碼:1234
正確輸入 HC-05 藍牙配對密碼並驗證成功,就會傳回兩次 OK !!
在手機輸入 i am xperia p 按下 "Send" 按鈕傳送就會在 SSCOM 看到由手機傳送過來的字串
在 SSCOM 輸入 i am sscom,取消 SendNew 選項,再按下 "SEND" 按鈕,就會在手機看到由 SSCOM 傳送出去的字串
如此,就完成了 HC-05 主動連線到手機的演示過程。
結論:
在撰寫 HC-05 藍牙模組程式之前,對於 AT 常用指令的操作與了解是非常重要的,不管所使用的微處理器是哪一種,所不同的只是程式指令的撰寫,基本的藍牙控制流程都是相同的。
手機 Android APP 軟體的操作,雖然只是單純很簡單的字串傳送,但是換個方式來說,藍牙通訊一旦建立之後,剩下的就只是字串處理的事了。
只要遠端能夠解析手機所傳出去的字串,要叫它做什麼它就會做什麼,不是嗎 ?
**AT+RNAME ( 查詢遠端藍牙模組位址 ) ( HC-05 AT Command.pdf, page 5;HC-05指令集.pdf, page 3 )
ps. 使用這指令需要先知道遠端藍牙裝置的位址,且要 HC-05 須設為從動角色 ( ROLE=0 )
這個 AT 指令可以讓你嘗試著與遠端藍牙裝置測試連結,也可用來確認輸入的遠端藍牙位址是否正確,還記得預設的手機 Xperial P 的藍牙位址是 12:34:56:78:9A:BC ( 說明上需要,虛構的藍牙位址,但回應是用手機真實藍牙位址得到的 ) ,那麼完整的 AT 指令輸入就應該是
AT+RNAME? 1234,56,789ABC
成功的話,就會回覆手機的名稱。詳細的指令說明,如下表所示:
指 令
|
回 應
|
參 數
|
AT+RNAME?_<PARAM1(1)>
á底線是代表空格
|
+NAME:<PARAM2>
OK
|
PARAM1:遠端藍牙裝置的位址
PARAM2:遠端藍牙裝置的名稱
|
FAIL
|
(1) 藍牙位址輸入的格式 1234,56,789ABC
實際操作示範例子,如下圖所示:
AT_RNAME? 1234,56,789AB |
** AT+ADDR ( 查詢 HC-05 藍牙模組位址) ( HC-05 AT Command.pdf, page 4;HC-05指令集.pdf, page 2 )
使用這個指令,可以得到現在連接的藍牙裝置位址,<PARAM> 的輸入格式與 AT+RNAME 指令參數格式一樣
AT+ADDR? |
指令回傳位址會是 ( HC-05 預設位址:01:22:03:04:55:06 )
+ADDR:122,3,45506
OK
要注意解讀時,逗號之前的每一組數字,只要一開始前面是數字 0 的話,都會被忽略 !
** AT+PSWD ( 藍牙配對密碼 ) ( HC-05 AT Command.pdf, page 3;HC-05指令集.pdf, page 2 )
看標題就知道這是設定藍牙密碼的指令,預設的藍牙密碼是 1234。
AT+PSWD ( Set/Inquire passkey, 查詢/設置藍牙配對密碼 )
HC-05 AT Command.pdf, page 8;HC-05指令集.pdf, page 5
指 令
|
回 應
|
參 數
|
AT+PSWD=<PARAM>
|
OK
|
PARAM:配對碼
預設值:1234
|
AT+PSWD?
|
+PSWD:<PARAM>
OK
|
試著將配對密碼由原本的 1234 換成 5678,然後試著用手機連上 HC-05 並用新的密碼配對。完成測試之後,關閉手機藍牙,再將密碼再改回 1234 。
AT+PSWD |
** AT+UART ( 串列介面參數 ) ( HC-05 AT Command.pdf, page 3;HC-05指令集.pdf, page 2 )
這是設定串列介面的指令,控制的硬體與 HC-05 兩者之間的串列通訊參數設定都要一樣,沒有硬性規定一定要使用哪一個通訊速率。
AT+UART ( Set/Inquire serial parameter, 查詢/設置串列介面參數 )
HC-05 AT Command.pdf, page 8;HC-05指令集.pdf, page 5
指 令
|
回 應
|
參 數
|
AT+UART=<PARAM1>,
<PARAM2>,<PARAM3>
|
OK
|
PARAM1:鮑率(baud rate(bit/s)
可設定之數值如下:
4800,9600,19200,38400,57600,
115200,23400,460800,921600,
1382400
PARAM2:停止位元(stop-bit)
0 – 1 bit
1 – 2 bits
PARAM3:同位元檢查(parity bit)
0 – None
1 – Odd parity
2 – Even parity
預設值:9600,0,0
|
AT+UART?
|
+UART:<PARAM1>,
<PARAM2>,<PARAM3>
OK
|
試著將 HC-05 的鮑率設為 115200 bps,其他的維持不變 ! 眼尖的你應該會發現,改完之後,我依舊使用 9600 來取得 HC-05 改完之後的數值。
設定 AT+UART=115200,0,0 |
要讓新的設定鮑率起作用,設定之後必須先浮接 KEY 並重開 HC-05 ( 拔掉電源再重新接上電源 ),最後再將 KEY 接高準位,這樣 HC-05 新的鮑率設定才會生效。
步驟如下:
- 拔掉 KEY 讓 KEY 浮接
- 按下 SSCOM 上的 CloseCom 按鈕
- 拔掉 USB 轉串列介面線
- 在 SSCOM 的 BaudRate 欄位輸入或是選擇 115200
- 插上 USB 轉串列介面線
- 插上 KEY ( KEY 要接高準位 )
- 再輸入一次 AT+UART? 就會收到回應
AT_UART? @ Baud rate115200 bps |
** AT 指令結論
本節中列出了幾個在本網頁中會用到的指令,其他沒列出的指令,有用到的時候會再提,若需要更多 AT 指令的說明,請再自行閱讀 AT 指令資料手冊。
HC - 05 @ 主動模式連線到手機:
當 HC-05 角色互換為主動角色,意味著它可以主動連接周邊藍牙裝置,不過需要被連接的藍牙裝置提供 SPP Server,才能建立兩者之間的溝通管道。
不過很不巧的 ! 藍牙串口助手 ( 其他的 APP 絕大部分也一樣 ) 並沒有提供 SPP Server 端的功能,因此請安裝由我重新撰寫的另一個可提供 SPP Server / Client 兩種模式的 Android APP 軟體 BTSCmode。
不管是在哪一種 ( Server / Client ) 模式下,雙方都可以雙向溝通。若是有購買藍牙入門套件的使用者,現在可以先到雲端硬碟的 software 資料夾下載 BTSCmode 安裝程式 ( 或下面提供的連結 ),以及 codes 資料夾下載 Android 原始碼
下載 BTSCmode.apk,安裝時請記得在手機安全性選項下選擇允許安裝來源不明的應用程式。
- 使用 Android 4.4.2 編譯 ( Android OS 低於 2.3 的不適用 )
- APK 安裝測試
- Sony Xperia P, Android OS 4.1.2
- Sony Xperia L, Android OS 4.4.2
** HC-05 @ 主動模式下與 BTSCmode 的連接過程
HC-05 主動配對遠端藍牙裝置 ( 手機 ),下面幾個情況必須同時成立:
- HC-05 設為主動角色,並且設置好 IAC 以及 CoD 相關參數
- 開啟手機藍牙並設為可被搜尋 ( 或按下 Open Bluetooth 按鈕 )
- 開啟 SPP 藍牙 Server 準備被連接 ( 按下 As Server 按鈕 )
** 搜尋藍牙裝置
為了演示時考慮不同情況,因此加入另一片藍牙模組
- Name: HC-06
- 位址:00:11:03:AB:DD:EE
HC-05, ROLE=1, 搜尋周邊藍牙裝置 |
INQ 指令下了之後就會開始搜尋藍牙裝置,且不管何種型態的都會被搜尋 ( 因為 Class 設為 0,且 IAC 設為 9E8B33 (GIAC) )。由於現在可被搜尋的就是手機與 HC-06 兩個藍牙裝置,因此可看到回應的結果只有兩個不同的位址,兩個位址會出現 5 次是因為 INQM 第二個參數設定為 5 的緣故,這可用來限制可搜尋的藍牙裝置的數目。
********************************************************************************
2015/03/08:
如果在下達 AT+INQ 出現 ERROR(16) 的回應錯誤,請直接下 AT+INIT 就可修正這個錯誤出現!
這是因為 SPP 函式庫沒有初始化的緣故造成這個錯誤出現!
********************************************************************************
而下 INQ 回傳的藍牙裝置的資料中,第三個參數是 RSSI 的訊號強度,這是個 8-bit 有符號整數,如果沒錯的話值的範圍是從 FF80 - FFFF,數目越大訊號越強。除了測訊號強弱之外,對於這個 RSSI 有很多研究是關於距離測定的,有興趣在自己上網找找相關應用,下面分享一則網路上使用 RSSI 訊號來控制伺服馬達的影片( Raspberry Pi + Arduino + iPhone + 藍牙模組 + USB 藍牙卡 )
另外,INQ 指令回傳的第二個參數與 CLASS 指令中所指定的參數值相關。一開始將 CLASS 設定為 0 是因為不去過濾任何藍牙裝置,而為什麼在這邊又加入另一片藍牙模組,就是等一下要用來說明 CLASS 參數的使用以及藍牙 CoD 的。
手機回傳的第二個參數 ( 藍牙裝置類別 ) 是 (0x) 5A020C,這是一個 16 進制值,但回傳會省略前面的 0x,這代表手機上面的藍牙裝置可與外部藍牙裝置直接配對的類型有哪些,也就是預先定義在手機裡面的藍牙服務 ( 現在應該就要新開一個網頁視窗,Bluetooth.org Bluetooth Baseband ( 或藍牙基頻 ) ) ,稱為 CoD ( The Class of Device / Service )。
CoD 是一個 24-bit 的值,這些值被分開為三個區段:第一個區段是主要服務類型 ( Major Service Classes ),佔 11- bit;第二個區段是主要裝置類型 ( Major Device Classes ),佔 5-bit;第三個區段是次要裝置類型 ( Minor Device Classes ),設定要根據第二個區段的選擇而定,佔 6-bit。
The Class of Device / Service Format |
以手機的回傳的 CoD 為例:5A020C,將其分成上圖三個區段以利對照
0101,1010,000-0,0010,-0000,11-00
第一個是 11-bit ( 0101,1010,000 ) 的主要服務類型,對應到的服務是:電話、對象傳輸、捕捉和網路
位數 | 主要服務類型( Major Service Classes ) |
---|---|
13 | 有限可發現模式[Ref #1] |
14 | (保留) |
15 | (保留) |
16 | 定位(位置標識) |
17 | 網路(LAN、Ad hoc ...) |
18 | 渲染(打印、揚聲器...) |
19 | 捕捉(掃描儀、麥克風...) |
20 | 對像傳輸(v-Inbox、v-Folder ...) |
21 | 音頻(揚聲器、麥克風、耳機服務...) |
22 | 電話(無繩電話、調製解調器、耳機服務...) |
23 | 信息(WEB 服務器、WAP 服務器) |
第二個是 5-bit ( 0,0010 ) 的主要裝置類型,對應到的設備類型有 32 種,對應到:電話
12 | 11 | 10 | 9 | 8 | 主要設備類 ( Major Device Class ) |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 其他[Ref #2] |
0 | 0 | 0 | 0 | 1 | 計算機(台式機、筆記本、PDA、organizer ....) |
0 | 0 | 0 | 1 | 0 | 電話(手機、無繩、支付電話、調製解調器...) |
0 | 0 | 0 | 1 | 1 | LAN/網絡接入點 |
0 | 0 | 1 | 0 | 0 | 音頻/視頻(耳機、揚聲器、立體聲、視頻顯示、VCR..... |
0 | 0 | 1 | 0 | 1 | 配件(鼠標、遊戲桿、鍵盤.....) |
0 | 0 | 1 | 1 | 0 | 成像(打印、掃描儀、相機、顯示...) |
0 | 0 | 1 | 1 | 1 | 可穿戴 |
0 | 1 | 0 | 0 | 0 | 玩具 |
0 | 1 | 0 | 0 | 1 | 健康 |
1 | 1 | 1 | 1 | 1 | 未分類:未指定設備代碼 |
X | X | X | X | X | 所有其他保留值 |
7 | 6 | 5 | 4 | 3 | 2 | 次要設備類 ( Minor Device Class ) 字段- 電話主要類 |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 未分類,未指定設備代碼 |
0 | 0 | 0 | 0 | 0 | 1 | 手機 |
0 | 0 | 0 | 0 | 1 | 0 | 無繩 |
0 | 0 | 0 | 0 | 1 | 1 | 智能手機 |
0 | 0 | 0 | 1 | 0 | 0 | 有線調製解調或語音網關 |
0 | 0 | 0 | 1 | 0 | 1 | 通用ISDN 接入 |
X | X | X | X | X | X | 所有其他保留值 |
若現在我只要搜尋跟 SPP 相關的裝置 ( 例如 SPP ),那我要如何設定呢 ? 很簡單,只要指定 Class=1F00 就不會搜尋到手機 ( 也就是只會搜尋未分類的裝置類型 )
AT+CLASS=1F00 |
因此藉由適當的規劃要搜尋的 CLASS,就可以過濾掉不需要知道的藍牙裝置類型,而且這不僅限於只能搜尋 SPP 藍牙模組 !
玩一下稍微進階一點點!我們知道手機的服務類型的電話,其他的不需要裡會,並且主要與次要裝置類型也不須理會 ( 但這可用來設定更多的過濾設定 ),所以設定 CLASS=400000 ( 0100,0000,000-,0,0000,-0000,00-00 ) 來搜尋有電話服務的藍牙裝置
AT+CLASS=400000 |
因此,只要明白如何去設定 CoD 就可以很方便的過濾藍牙裝置,而且 CoD 這一部分在藍牙程式撰寫來說是非常重要的一個觀念。
最後,如果手邊有藍牙耳機,試著不先使用 CLASS=0 去搜尋藍牙耳機的 CoD 是多少,嘗試著使用上面 Major Service Classes 和 Major Device Classes 來兜前面的 11 +5 的 bit 數字 ( 後面 8-bit 都設為 0 即可 ),想出來了嗎 ?
滑鼠按住劃過這一行:0x402000
** IAC ( Inquiry Access Code )
說到這個,說明在剛剛開啟的網頁起頭處的一段文字描述。我的理解是,這個數值共有 64 個,範圍從 0x9EB00 - 0x9E8B3F。其中 0x9E8B33 是作為 GIAC 用;而 0x9E8B00 是 LIAC。若沒有特殊使用需求的話,AT+IAC 就是指定 0x9E8B33 即可。
# | LAP值 | 用途 |
---|---|---|
0 | 0x9E8B33 | 通用/不受限的訪問查詢碼(GIAC) General/Unlimited Inquiry Access Code (GIAC) |
1 | 0x9E8B00 | 受限的專用訪問查詢碼(LIAC) Limited Dedicated Inquiry Access Code (LIAC) |
2 63 | 0x9E8B01-0x9E8B32, 0x9E8B34-0x9E8B3F | 留待將來使用 |
** HC-05 主動連接手機
在上面的一些指令的操作下,已經將 HC-05 切換為主動角色,所以現在我們要主動連到手機上面去。
打開剛剛手機安裝的 BTSCmode APP,在 APP 畫面中按下 "Open Bluetooth" 按鈕開啟藍牙功能
BTSCmode 主選單畫面 |
在藍牙權限要求的對話視窗中選擇 "是",讓手機藍牙可被搜尋
BTSCmode 開啟藍芽並設為可被搜尋 |
按下 "AS Server" 開啟 SPP 藍牙 Server 等待 HC-05 連線
BTSCmode 開啟 SPP 藍牙 Server |
開啟等待 SPP 藍牙 Server 畫面後,可以看到這是個雙向通訊的介面。因此一旦 HC-05 連線成功回應之後就可以開始雙方面的文字通訊了,不過不是現在 !
BTSCmode SPP 藍牙 Server 畫面 |
如果 HC-05 之前已經先設定為主動角色,則第一個指令可以不用再次輸入
AT+ROLE=1 |
輸入連線的指令並按下 "SEND"
AT+LINK=123456789ABC |
由於是第一次連線,因此在手機端會出現藍牙配對要求的視窗,要求輸入配對密碼
BTSCmode 藍牙配對要求視窗 |
輸入 HC-05 藍芽配對的密碼:1234
BTSCmode 輸入 HC-05 藍牙配對密碼 |
正確輸入 HC-05 藍牙配對密碼並驗證成功,就會傳回兩次 OK !!
AT+LINK=123456789ABC 指令完成 |
在手機輸入 i am xperia p 按下 "Send" 按鈕傳送就會在 SSCOM 看到由手機傳送過來的字串
BTSCmode 訊息互傳畫面 |
在 SSCOM 輸入 i am sscom,取消 SendNew 選項,再按下 "SEND" 按鈕,就會在手機看到由 SSCOM 傳送出去的字串
手機與 HC-05 訊息互傳 |
如此,就完成了 HC-05 主動連線到手機的演示過程。
結論:
在撰寫 HC-05 藍牙模組程式之前,對於 AT 常用指令的操作與了解是非常重要的,不管所使用的微處理器是哪一種,所不同的只是程式指令的撰寫,基本的藍牙控制流程都是相同的。
手機 Android APP 軟體的操作,雖然只是單純很簡單的字串傳送,但是換個方式來說,藍牙通訊一旦建立之後,剩下的就只是字串處理的事了。
只要遠端能夠解析手機所傳出去的字串,要叫它做什麼它就會做什麼,不是嗎 ?
如果有購買賣場的 "藍牙入門套件 ",可以在賣場的雲端硬碟中下載 BTSCmode 的 Android 手機的原始碼,這是使用 Eclipse 撰寫的 SPP 藍牙 Server / Client 程式,在 HC-05 藍牙模組初體驗的第三篇會說明這軟體的編譯方式以及需要注意的地方,方便使用者修改以及編譯。
**************************************
HC-05 主從一體藍牙模組初體驗,第三篇
HC-05 主從一體藍牙模組初體驗 03 ( BTSCmode.apk Eclipse 編譯環境說明 )
******************************************************************
<< 部落格藍牙相關網頁連結 >>
- 樹莓派中 USB 藍牙卡的驅動與設置
- HC-05 主從一體藍牙模組初體驗 01 ( 硬體接線、從動角色 )
- HC-05 主從一體藍牙模組初體驗 03 ( BTSCmode.apk Eclipse 編譯環境說明 )
- Bluetooth USB Dongle 初體驗 - Windows 篇 ( 7:免驅;8:BlueSoleil )
- { Client 篇 } Bluetooth USB Dongle 初體驗 - Linux 篇 ( BlueZ , Serial Port Profile)
- { Server 篇 } Bluetooth USB Dongle 初體驗 - Linux 篇 ( BlueZ , Serial Port Profile )
<<樹莓派編輯環境設置系列文章>>
- 在 Windows 設置 Raspberry Pi (樹莓派) 遠端編輯環境 [第一發] 工欲善其事,必先利其器
- 把 Windows 桌面當作是 Raspberry Pi (樹莓派) 的螢幕 [第二發] 工欲善其事,必先利其器
- 遠端桌面 - VNC [第三發] 工欲善其事,必先利其器
Sublime Text 2 與遠端 (樹莓派) 資料夾連線畫面 |
MobaXterm: Windows 作業系統下開啟樹莓派作業系統的 LXDE 桌面 |
VNC |
你好!
回覆刪除我下達AT+INQ出現ERROR(16)
也按照您的方法下達AT+INIT
但我再次輸入AT+INQ還是出現同樣錯誤訊息
我該如何解決?
這是 ERROR(16) 的解決方法,如果不能解決,要去跟你的廠商問一下,我是這樣用的 !
回覆刪除您好!
回覆刪除關於上次的問題我已解決<發現key腳沒接所導致的!
但我又遇到了一個問題
我再次輸入at+inq
但沒有任何回應
周圍是用手機藍芽,並且設定成周圍藍芽裝置都可以搜尋
我該如何解決?
藍牙模組在部落格分幾個部分,每個部分都跟前面的有關,建議你從頭看並且一步一步照著做就不會出現這些問題!
刪除我以解決找不到周圍的藍芽訊號的問題
回覆刪除我這顆模組是要持續按著模組上的按鈕才會持續搜尋
我還想再問個問題
在AT指令中的AT+INQM,=,,
其中的為最大搜尋範圍,請問一夏,那有不限制最大的搜尋範圍的指令嗎?
可以試一下設 0 試試,不然就是要設定 !
刪除就算可以設定最大的搜尋範圍,但還是有時間的限制!