藍牙作為一種近距離無線通信技術,被廣泛使用在汽車,智能家居和醫療等領域中。本文主要介紹如何通過EsDA開發套件,快速實現藍牙服務器的相關應用業務。
簡介
前面文章講解了ble_client的相關節點和業務處理,有興趣的可以跳轉鏈接【EsDA應用】藍牙客戶端節點詳解去查看。
本文主要基于MPC_ZC1開發板以及可將節點進行拖拽連接的圖形化設計工具AWFlow Designer,著重對UIS8910DM平臺的板載藍牙的配套節點以及示例進行講解。本文除了對ble_server設備端節點進行詳細闡述還有以MPC_ZC1開發板做藍牙服務器的相關應用業務介紹如:定義支持的服務,發布服務器以便遠程客戶端可連接,響應讀取和寫入請求等。
節點介紹
因藍牙服務端節點中的屬性數量過多,所以本節只介紹幾個重點屬性,其他的屬性內容詳見AWFlow Designer上相關節點的幫助文檔。
1. 配置節點1.1 ble_server創建BLE服務端設備,保存用戶傳入的廣播配置。1.1.1 屬性
- 發現模式:值為0表示不可發現模式;值為1表示有限可發現模式;值為2表示普通可發現模式。
- 廣播類型:值為0表示可連接的非定向廣播;值為1表示可連接的定向廣播;值為2表示不可連接的非定向廣播;值為3表示可掃描的非定向廣播。
- 廣播信道:廣播通道映射在37、38、39通道通信。值為0時表示通道37被使用,值為1時表示通道38被使用,值為2時表示通道39被使用。
廣播的過濾策略:
值為0時表示處理所有設備的掃描和連接請求;
值為1時表示處理所有設備的連接請求和只有白名單上的設備的掃描請求;
值為2時表示處理所有設備的掃描請求和只有白名單上的設備的連接請求;
值為3時表示只處理在白名單上的設備的掃描和連接請求。
SMP配對模式的參數:
smp_pair_mode | io_cap | 安全等級 |
SECURE_CONNECTION_PASSKEY | KEYBOARD_DISP | 最高 |
SECURE_CONNECTION_JUSTWORK | NOIN_NOOUT | 次之 |
LEGACY_PASSKEY | KEYBOARD_DISP | 第三 |
LEGACY_JUSTWORK | NOIN_NOOUT | 最低 |
- 支持的服務個數:支持提供的服務個數,需要與流圖中添加的服務數量一致。* 配置節點無輸入輸出。
2. 服務端節點2.1 ble_server_service2.1.1 屬性
- BLE服務端配置節點:關聯到的BLE服務端配置節點。
- 服務UUID:支持提供服務的UUID。支持2個字節或16個字節,按照小端模式依次用逗號隔開。
- 支持服務的特征相關屬性:
特征值的格式 | 特征聲明的性質 | 特征值的權限 |
短UUID | 廣播屬性 | 可讀 |
修補長度 | 讀屬性 | 可寫 |
寫通知 | 不帶回復的寫屬性 | 讀取認證 |
組 | 帶回復的寫屬性 | 讀取授權 |
沖突通知 | 通知屬性 | 讀取加密 |
追加寫 | 指示屬性 | 讀取認證文件 |
簽名認證的寫屬性 | 寫認證 | |
擴展屬性 | 寫授權 | |
寫加密 | ||
寫認證文件 | ||
只允許經典藍牙訪問 |
2.1.2 輸入
payload:輸入數據。傳入特征值數據,可以使用“fscript”節點作為前級節點,設置需要寫入的數據。
payloadLength:輸入數據。傳入特征值數據的長度,可以使用“fscript”節點作為前級節點,設置需要寫入的數據長度,最大不超過255。
2.1.3 輸出本節點無實質性數據輸出,其消費者節點一般是ble_server_adv節點。2.2 ble_server_adv
2.2.1 屬性
BLE服務端配置節點:關聯到的BLE服務端配置節點。
- 藍牙本地設備名稱:藍牙服務端本地設備的名稱,代碼里自動將此參數加入到廣播數據包的類型為09的小數據包中。
廣播數據包最長31個字節,而這31個字節又被拆分成很多小數據包,每個小數據包代表一類廣播數據。
每個小數據包是由:length(數據長度)+type(類型)+data(數據內容)構成的。
需要廣播的每個小數據包的數據長度:表示需要廣播的每個小數據包的數據長度(數據內容的字節長度+1)。因為格式是csv,所以多個數據包的數據長度按順序用逗號來隔開。
需要廣播的每個小數據包的數據類型:表示需要廣播的每個小數據包的數據長度(數據內容的字節長度+1)。多個數據包的數據類型按順序用逗號來隔開。
掃描響應的每個小數據包的數據內容:表示掃描響應的每個小數據包的數據內容。多個數據包的數據內容按順序用逗號來隔開。
掃描響應的每個小數據包的數據類型:表示掃描響應的每個小數據包的數據類型,多個數據包的數據類型按順序用逗號來隔開。具體的廣播數據包類型詳細信息可在網上進行查閱。
數據類型為09表示本地設備名稱即屬性藍牙本地設備名稱,現已被后續代碼自動處理加入到了廣播數據包中。計算長度時需注意,如若廣播數據包超過最長31個字節的內容,則截斷。
掃描響應的每個小數據包的數據內容:表示掃描響應的每個小數據包的數據內容。多個數據包的數據內容按順序用逗號來隔開。
如:需要廣播的每個小數據包的數據長度為0x02;需要廣播的每個小數據包的數據類型為:0x01;需要廣播的每個小數據包的數據內容為:0x06。那么算上藍牙本地設備名稱:(BLE-ZC1)0x42,0x4c,0x45,0x2d,0x5a,0x43,0x31,
那么最終的廣播數據包為0x08(數據長度),0x09(數據類型),
0x42,0x4c,0x45,0x2d,0x5a,0x43,0x31(數據內容BLE-ZC1),
0x02(數據長度),0x01(數據類型),
0x06(數據內容),
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
2.2.2 輸入
ble_server_adv節點的輸入并無實際意義的輸入,由ble_server_service節點作為前級節點,進入當前節點的on_data虛函數中開啟廣播。
- * sink類型節點無輸出功能
?業務處理
定義支持的服務:由ble_server_service節點添加服務UUID和特征值UUID以及特征值數據;發布服務器,以便遠程客戶端可連接:由ble_server_adv節點開啟廣播(在一個運行程序中不能多次開啟廣播)后服務端藍牙準備完成,開始等待客戶端藍牙設備連接;以及后續的響應讀取和寫入請求。實現框圖如下所示。
1. 資源準備
硬件上依舊如【EsDA應用】藍牙客戶端節點詳解使用MPC_ZC1開發板作為服務器去廣播數據,軟件上使用可拖拽連線的圖形化設計工具AWFlow Designer去設計流圖以及手機app(BLE調試寶)作為客戶端進行藍牙通信。
2. 添加節點并繪制流圖
添加timer,gpio,trigger,fscript,ble_server_service和ble_server_adv節點到畫布中,如下圖所示。
3. 配置節點
添加多個藍牙服務端的服務和特征值數據,并開啟藍牙廣播。需注意的是本藍牙模塊在程序運行時不能重復多次開啟藍牙廣播,否則會打開藍牙失敗。
雙擊gpio節點的前驅timer節點,打開屬性面板設置定時周期(ms),定時去讀取gpio的引腳電平狀態。修改完后點擊右上角的完成即可保存屬性配置。
雙擊gpio節點,配置屬性如下圖所示,根據需求選擇所需的gpio引腳,本章節使用的是P4.5,并設置為浮空輸入,用戶可根據自身需求設置該gpio引腳號。修改完后點擊右上角的完成即可保存屬性配置。
雙擊gpio的后繼節點fscript,功能代碼內容的主要目的是讓后續的trigger節點只能被觸發一次,因P4.5的引腳默認是低電平,且trigger節點被觸發只能收到msg.trigger_stop屬性消息,所以具體代碼如下。
if (msg.payload == 1) { msg.trigger_stop = "reset";}
雙擊trigger節點,本節點主要目的是只一次觸發多個后繼節點,所以在此選擇等待被重置模式(Wait_to_be_reset_mode)在trigger被觸發前,不傳遞任何的消息給后繼節點。修改完后點擊右上角的完成即可保存屬性配置。
雙擊第一欄的fscript節點,本節點作為ble_server_service節點的前驅節點,所以具體內容即ble_server_service的輸入組:payload(傳入的特征值數據),payloadLength(傳入的特征值數據的長度)。修改完后點擊右上角的完成即可保存屬性配置。
msg.payload = "hello";set(msg.payloadLength, u16("5"));
雙擊第一欄的ble_server_service節點中的屬性:BLE服務端配置節點旁的鉛筆圖標,屬性:BLE服務端配置節點在本流圖中只需要配置一遍即可,后續不再闡述。需注意的是支持的服務個數的屬性值必須與本流圖中所添加的服務個數數量一致,其他屬性參數可用demo流圖默認值。修改完后點擊右上角的完成即可保存屬性配置。
雙擊第一欄的ble_server_service節點,只需要確定需要添加的服務UUID和特征值UUID,其他參數視具體情況而定,也可使用默認的參數值。修改完后點擊右上角的完成即可保存屬性配置。
雙擊第二欄的fscript節點,其內容與第一欄的fscript節點大體一致,都是作為ble_server_service節點的前驅節點,所以具體內容即ble_server_service的輸入組:payload(傳入的特征值數據),payloadLength(傳入的特征值數據的長度)。修改完后點擊右上角的完成即可保存屬性配置。
msg.payload = "server";set(msg.payloadLength, u16("6"));
雙擊第二欄的ble_server_service節點,其屬性與第一欄的ble_server_service節點大體一致,需要添加的服務UUID和特征值UUID不同,其他參數視具體情況而定,也可使用默認的參數值。
服務UUID:
0xf5,0x89,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xfe,0x18,0x00,0x00
特征值UUID:
0xf5,0x89,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xfe,0xff,0x11,0x11
最后雙擊ble_server_adv節點,自行設置藍牙本地設備名稱,以及需要廣播的每個小數據包的數據長度,類型,內容和掃描的每個小數據包的數據長度,類型,內容。修改完后點擊右上角的完成即可保存屬性配置。
4. 下載驗證
下載流圖后可在BLE調試寶點擊藍牙服務選項對流圖提供的service進行訪問,點擊每個service的左側箭頭,展開對各個service提供的特征進行查看,還可對支持操作的特性進行讀寫。
每次操作都會有相應的日志信息,注意各服務UUID的聯系,實時日志如下所示。
BLE調試寶向特征值UUID為0x1111fffe寫入12 34 56,作為服務端板子的串口打印可顯示收到的相應數據如下。
-
藍牙
+關注
關注
114文章
5809瀏覽量
170193 -
節點
+關注
關注
0文章
218瀏覽量
24422 -
終端節點
+關注
關注
0文章
6瀏覽量
1868
發布評論請先 登錄
相關推薦
評論