一、項目介紹
本系統的主控是CY8C624ABZI,負責智能門鎖的控制邏輯和藍牙的host,通過sdio和串口外接一個型號為cyw43012的wifi & ble controller combo,為系統提供聯網和藍牙功能。
本系統在軟件上由門鎖模塊、gatt模塊組成:gatt模塊實現一個基于gatt的智能門鎖的profile;門鎖模塊通過創建一個任務為系統其他應用提供門鎖控制的服務,提供注冊接口給上層應用注冊 具體的門鎖驅動。
本項目使用的開發板是 RT-Thread 聯合英飛凌推出的一款集成32位雙核CPU子系統( ARM Cortex-M4 和 ARM Cortex-M0)的Psoc6-evaluationkit-062S2開發板。
二、CY8C624ABZI和CYW43012介紹
2.1 CY8C624ABZI介紹
2.2 CYW43012介紹
英飛凌的AIROC cyw43012是一款超低功耗單芯片組合設備,具有雙頻2.4 GHz和5 GHz Wi-Fi 4(802.11n)和藍牙5.4。CYW43012采用低功耗架構,非常適合電池供電應用,在這些應用中,同類最佳的功耗至關重要。CYW43012支持256-QAM(適用于5 GHz頻段的20 MHz通道),支持802.11ac接入點,數據速率最高可達78 Mbps。2.4和5GHz頻段均內置片內功率放大器和低噪聲放大器。
三、CYW43012藍牙SDK介紹和注意事項
3.1 ATT和GATT介紹
3.1.1 ATT屬性
服務器持有客戶端需要訪問的資源,這些數據作為屬性存儲在服務器上。屬性是一種數據表示格式,由四個字段組成:屬性句柄,屬性類型,屬性權限,屬性值。
屬性句柄用于引用屬性,應用通過句柄訪問指定的屬性;屬性類型通過UUID編碼,不同類型的屬性具有不同的含義和功能,如一個屬性的UUID如果為0x2803,表示這個屬性用于作為特征的開始,特別地,除了SIG已經定義的類型,其他的類型主要作為用戶自定義的特征值,如在門鎖應用中,自定義0xDD01為門鎖開關的特征值;屬性權限決定客戶端能夠對屬性采取的操作;屬性值是屬性存儲數據的字段,在門鎖wifi配網功能中,屬性值存儲了客戶端想要傳給服務器進行配網的wifi ssid和密碼。
屬性類型指定此屬性代表什么。這是通過使用通用唯一標識符(簡稱為UUID)來實現的。UUID是一個128位的值,任何人都可以將其分配給屬性,而無需將其注冊到中央機構。兩個不同方分配相同UUID的概率非常低(1/2128),因此UUID被認為是唯一的。由于這些設備提供的許多功能都是常見的,因此為預定義的值保留了一系列UUID值,每個值都為常見用例公開了一組操作和數據。為了減少傳輸的數據量,這些值的長度為16位或32位,并且通過使用藍牙基本UUID和簡單的算術運算來計算實際的UUID。
屬性句柄是一個非零值,用于引用屬性。通過增加屬性句柄值,將BLE服務器的所有屬性存儲在其數據庫中。連續的屬性不一定要有下一個整型句柄值。屬性句柄值之間允許有空格,但句柄值必須按升序排列。
屬性權限指定是否可以讀取和/或寫入資源,以及執行此操作所需的安全級別。允許不同的安全組合。例如,屬性可能不需要讀取權限,但客戶端可能必須進行身份驗證才能修改資源。
屬性值可以是固定長度的,也可以是可變長度的。對于可變長度屬性值,一個PDU中只允許發送一個屬性值。如果該值太長,它可能會被分到多個PDU中。
有一種特殊類型的屬性不允許讀取,但可以寫入、通知或指示(我們稍后將討論最后兩個操作)。這些屬性稱為控制點屬性,因為它們主要用于應用程序控制,而不是在設備之間傳遞數據。
3.1.2 ATT屬性方法
ATT協議還定義了讀取或寫入屬性的方法。支持的方法有六種,因此它們定義了六個協議數據單元(PDU)。就ATT協議而言,PDU是將被轉發到(或從)較低層,即邏輯鏈路控制和適配協議(L2CAP)層接收的分組,并且隨后將被封裝以在物理鏈路上發送(或分別被發送到較高層)。這六種方法及其PDU類型是:
命令:由客戶端發送到服務器并且不調用響應請求:由客戶端發送到服務器并且調用響應響應:當接收到請求時由服務器發送到客戶端。
通知:由服務器發送到客戶端,而不調用響應。它們是在客戶端沒有請求它們的情況下發送的。
指示:由服務器發送到客戶端,并調用響應。它們是在客戶端沒有請求它們的情況下發送的。
確認:由客戶端發送到服務器,作為對指示的確認。
3.1.3 GATT介紹
??Generic Attribute Profile(GATT)建立在屬性協議(ATT)之上,并為屬性協議傳輸和存儲數據提供通用的操作和框架。
??GATT定義了兩個角色:服務器和客戶端。GATT的角色不一定與特定的GAP角色捆綁在一起,而是可以由更高層的profile指定。
??GATT和ATT不不依賴于特定的controller,可以在BR/EDR和LE中使用。然而,GATT和ATT是在LE中是要求強制實現的,在LE應用中使用GATT來發現設備能夠提供的服務。
??GATT服務器存儲著屬性協議傳輸需要的數據,接受來自GATT客戶端的屬性協議請求、命令和確認,GATT服務器發送對請求的響應。可以通過配置,讓GATT服務器在發生指定事件時向GATT客戶端異步地發送指示和通知。
??GATT規定了GATT服務器上包含的數據的格式,屬性協議傳輸的屬性被格式化為服務和特征,服務包含一組特征,特征包含值和描述該特征值的任意數量的描述符。通過規定好的服務、特征和特征描述符的結構,GATT客戶端可以遍歷GATT服務器并向用戶顯示特征值,特征描述符以用戶可理解的方式對特征值進行描述。
3.3 GATT-BASED PROFILE層次結構
GATT Profile規定了Profile交換數據的結構。此結構定義Profile中使用的基本元素,如服務和特征。結構的頂層是Profile。Profile由實現用例所必需的一個或多個服務組成。服務由特征或對其他服務的引用組成。每個特征都包含一個值,并且可能包含有關該值的可選信息。服務和特征以及特征的組成部分(即,值和描述符)包含Profile數據,存儲在服務器的屬性中。
Service:服務是用于實現設備或設備部分的特定功能或特性的數據和相關行為的集合。服務可以引用其他主要或次要服務和/或組成該服務的一組特征。有兩種類型的服務:主要服務和次要服務。主要服務是提供設備的主要功能的服務。輔助服務是提供設備的輔助功能并且從該設備上的至少一個主服務引用的服務。為了保持與早期客戶端的向后兼容性,服務定義的較新版本只能添加新的引用服務或可選特征。服務定義的較新版本也被禁止更改與服務定義的先前版本相比的行為。服務可以在一個或多個配置文件中使用,以滿足特定的用例。
Referenced Services:引用的服務是將服務器上的另一個服務定義合并為引用它的服務的一部分的方法。當一個服務引用另一個服務時,整個引用的服務將成為新服務的一部分,包括任何嵌套的引用服務和特征。引用的服務仍作為獨立服務存在。嵌套參照的深度沒有限制。
Characteristic:特征是在服務中使用的值,以及有關如何訪問值的屬性和配置信息以及有關如何顯示或表示值的信息。特征定義包含特征聲明、特征屬性和值。它還可以包含描述服務器相對于特征值的值或允許配置的描述符。
3.2 CYW43012 SDK應用編程接口
3.2.1 SDK架構
SDK由platform和bt協議棧組成,platform為bt協議棧提供調用controller的接口,可以使用串口或者芯片內部的ipc,bt協議棧主要由HCI_TX和HCI_RX兩個任務完成,HCI_TX任務完成串口數據的發送,HCI_RX完成串口數據的接收和協議棧的處理。在協議棧中,回調用戶注冊的gap和gatt事件回調函數,在回調函數中,處理用戶的邏輯。
3.2.2 應用編程接口
wiced_bt_stack_init注冊藍牙回調,示例中注冊了app_bt_management_callback,當藍牙準備好時,在回調中處理BTM_ENABLED_EVT事件,啟動藍牙應用,在app_bt_application_init中初始化gatt服務器。
在初始化gatt服務的過程中,通過wiced_bt_gatt_register注冊gatt的回調,這個回調是用戶的編程接口;通過wiced_bt_gatt_db_init初始化屬性表gatt_database,gatt_database是用戶定義的gatt profile。
3.2.3 自定義profile
根據gatt_database示例,通過PRIMARY_SERVICE_UUID16和CHARACTERISTIC_UUID16定義服務和特征。
3.3 SDK調試方法
默認cybt_platform_trace.h中的日志等級是CYBT_TRACE_LEVEL_ERROR,只在出錯的時候打印log,用戶在遇到問題調試時,可以根據需要調整log等級。
3.4 注意事項:取消.heap段從flash加載,減少1M的flash空間占用
startup_psoc6_02_cm4.S中,sdk會從flash復制數據到內存的.heap和.stack段,導致這部分段是READONLY的,占了1M的flash,我理解這部分是在主控做低功耗(standby模式)時heap掉電的時候用于從flash恢復heap中的內容,如果主控不需要stanby模式可以注釋相關代碼釋放1M的flash給到應用。
四、創建基于gatt的智能門鎖的profile
定義智能門鎖的gattdb
1//---------------------------服務和特征---------------------------
2
3//智能門鈴服務
4
5#define__UUID_SERVICE_SMART_LOCK0xD000
6
7//門鎖開關
8
9#define__UUID_CHARACTERISTIC_LOCK_SWITCH0xD001
10
11//密碼
12
13#define__UUID_CHARACTERISTIC_LOCK_PASSWORD0xD002
14
15//門鈴鈴聲
16
17#define__UUID_CHARACTERISTIC_DOORBELL_RINGTONE0xD003
18
19//音量
20
21#define__UUID_CHARACTERISTIC_VOLUME0xD004
22
23//電池電量
24
25#define__UUID_CHARACTERISTIC_BATTERY_LEVEL0xD005
26
27//離家布防
28
29#define__UUID_CHARACTERISTIC_FORTIFICATION0xD006
30
31//逗留偵測
32
33#define__UUID_CHARACTERISTIC_STAY_DETECTION0xD007
34
35//逗留感應距離
36
37#define__UUID_CHARACTERISTIC_STAY_INDUCTION_DISTANCE0xD008
38
39//逗留保持時間
40
41#define__UUID_CHARACTERISTIC_STAY_INDUCTION_TIME0xD009
42
43//wifi配網服務
44
45#define__UUID_SERVICE_PROV_WIFI0xD100
46
47//WIFIssid和密碼
48
49#define__UUID_CHARACTERISTIC_SSID_AND_PSWD0xD101
50
51//---------------------------句柄---------------------------------
52
53/*ServiceGenericAccess*/
54
55#defineSMART_LOCK_SERV0x0001
56
57#defineSMART_LOCK_CHARACTER_SWITCH0x0002
58
59#defineSMART_LOCK_CHARACTER_VALUE_SWITCH0x0003
60
61#defineSMART_LOCK_CHARACTER_PASSWORD0x0004
62
63#defineSMART_LOCK_CHARACTER_VALUE_PASSWORD0x0005
64
65#defineSMART_LOCK_CHARACTER_DOORBELL_RINGTONE0x0006
66
67#defineSMART_LOCK_CHARACTER_VALUE_DOORBELL_RINGTONE0x0007
68
69#defineSMART_LOCK_CHARACTER_VOLUME0x0008
70
71#defineSMART_LOCK_CHARACTER_VALUE_VOLUME0x0009
72
73#defineSMART_LOCK_CHARACTER_BATTERY_LEVEL0x000a
74
75#defineSMART_LOCK_CHARACTER_VALUE_BATTERY_LEVEL0x000b
76
77#defineSMART_LOCK_CHARACTER_FORTIFICATION0x000c
78
79#defineSMART_LOCK_CHARACTER_VALUE_FORTIFICATION0x000d
80
81#defineSMART_LOCK_CHARACTER_STAY_DETECTION0x000e
82
83#defineSMART_LOCK_CHARACTER_VALUE_STAY_DETECTION0x000f
84
85#defineSMART_LOCK_CHARACTER_STAY_INDUCTION_DISTANCE0x0010
86
87#defineSMART_LOCK_CHARACTER_VALUE_STAY_INDUCTION_DISTANCE0x0011
88
89#defineSMART_LOCK_CHARACTER_STAY_INDUCTION_TIME0x0012
90
91#defineSMART_LOCK_CHARACTER_VALUE_STAY_INDUCTION_TIME0x0013
92
93#defineSMART_LOCK_PROV_SERV0x0014
94
95#defineSMART_LOCK_CHARACTER_SSID_AND_PSWD0x0015
96
97#defineSMART_LOCK_CHARACTER_VALUE_SSID_AND_PSWD0x0016
五、門鎖任務
門鎖任務負責接收其他任務對門鎖的請求,在smart_door_init初始化的時候注冊用戶的門鎖驅動,與具體門鎖驅動解耦。門鎖操作集和門鎖結構體定義如下:
1structsmart_lock_ops
2
3{
4
5 smart_lock_err_t(*smart_lock_switch)(smart_lock_t*lock,uint8_tonoff);
6
7};
8
9structsmart_lock
10
11{
12
13 uint32_tinited:1;
14
15 uint32_tstate:1;
16
17 uint32_trsvd:30;
18
19 uint8_tmsg_num;
20
21 rt_thread_tthread;
22
23 rt_mq_tmsg;
24
25 structsmart_lock_ops*lock_ops;
26
27};
六、總結
有幸參加了rtthread和英飛凌聯合舉行的開發板測評活動,領到了心心念念的開發板,rtthread工作人員已經適配好了英飛凌CY8C624ABZI的bsp和cyw43012的藍牙sdk,在實現智能門鎖的profile中,主要在回調中處理。開發過程得到了微信群里大佬們的幫助,也學習到了很多,感謝rtthread和英飛凌提供的機會。
-
PSoC
+關注
關注
12文章
170瀏覽量
91914 -
藍牙
+關注
關注
114文章
5823瀏覽量
170313 -
RTT
+關注
關注
0文章
65瀏覽量
17127
發布評論請先 登錄
相關推薦
評論