18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Matter開發(fā),看這一篇就夠了

jf_14701710 ? 來源:jf_14701710 ? 作者:jf_14701710 ? 2025-09-17 09:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. Matter介紹

Matter(以前稱為 Project Connected Home over IP 或 Project CHIP)是由CSA聯(lián)盟制定的一個(gè)應(yīng)用層面的標(biāo)準(zhǔn),旨在打造一個(gè)統(tǒng)一的智能家居應(yīng)用標(biāo)準(zhǔn),以消除智能家居市場(chǎng)的碎片化。在Matter出來之前,智能家居市場(chǎng)是比較混亂的,每一個(gè)生態(tài)都有自己的協(xié)議,比如蘋果有自己的 Homekit,Google有自己的Weave,亞馬遜有自己的Echo,ZigBee聯(lián)盟有自己的Zigbee,這種割裂讓設(shè)備商很頭疼,他們需要為不同的生態(tài)制造不同的設(shè)備,最終用戶也很頭疼,他們需要學(xué)習(xí)各種生態(tài)的智能家居設(shè)備的使用方式。為此CSA提出了Matter技術(shù),以打造一個(gè)統(tǒng)一的標(biāo)準(zhǔn),讓一個(gè)設(shè)備可以在各個(gè)生態(tài)中工作,并給最終用戶呈現(xiàn)統(tǒng)一的使用界面。

需要說明的是,Matter只是一個(gè)應(yīng)用標(biāo)準(zhǔn),它的傳輸是建立在支持IPv6的TCP和UDP協(xié)議上的,Matter不對(duì)傳輸層進(jìn)行約定,Matter也不對(duì)網(wǎng)絡(luò)進(jìn)行約定,但是Matter約定了只能使用Thread/Wi-Fi/Ethernet三種連接協(xié)議。Thread協(xié)議由Thread Group制定,所以Matter over Thread產(chǎn)品必須通過Thread Group的認(rèn)證。Wi-Fi則由Wi-Fi聯(lián)盟進(jìn)行規(guī)范,所以Matter over Wi-Fi產(chǎn)品必須通過Wi-Fi Alliance認(rèn)證。

為了讓Matter產(chǎn)品加入Matter網(wǎng)絡(luò),需要一個(gè)配網(wǎng)的過程,Matter支持三種類型的配網(wǎng)方式,而低功耗藍(lán)牙則是首選配網(wǎng)方式,所以Matter產(chǎn)品一般都會(huì)要求支持低功耗藍(lán)牙功能。

Matter技術(shù)包含了三份規(guī)格書及其他要求文檔,大家可以從以下鏈接獲取Matter技術(shù)規(guī)范:https://csa-iot.org/developer-resource/specifications-download-request/

其中Core specification是它的核心規(guī)范,Application cluster specification對(duì)Matter組件cluster進(jìn)行了詳細(xì)規(guī)定,Device library specification則是對(duì)設(shè)備層面的一些約束和規(guī)定。

不像藍(lán)牙和Wi-Fi,即使你不過認(rèn)證,也照樣可以使用藍(lán)牙和Wi-Fi技術(shù)。由于Matter采用了PKI技術(shù),而且它又是一個(gè)應(yīng)用規(guī)范,你要使用Matter技術(shù),必須通過Matter認(rèn)證。為此CSA提供了多種資源幫助大家學(xué)習(xí)了解Matter,大家可以參考如下資源網(wǎng)站:https://csa-iot.org/developer-resource/specifications-download-request/

Matter是一個(gè)非常復(fù)雜而又現(xiàn)代的標(biāo)準(zhǔn),但是短短4年時(shí)間,Matter就實(shí)現(xiàn)了從提出到落地到追捧的成績(jī),不得不說這是一個(gè)“Matter奇跡”。下面我們一起來了解一下這個(gè)“奇跡”的更多細(xì)節(jié)。

1.1 Matter架構(gòu)

如下展示了Matter協(xié)議棧在整個(gè)系統(tǒng)中的位置,可以看出Matter就是一個(gè)應(yīng)用協(xié)議。

Matter協(xié)議棧本身又是由application, data model, interaction model, action framing, security, Message Framing and Routing和Transport and IP Framing組成,如下:

Application

Application層定義最終產(chǎn)品的業(yè)務(wù)邏輯。例如,對(duì)于門鎖應(yīng)用程序,業(yè)務(wù)邏輯可以根據(jù)來自特定語音命令來打開和關(guān)閉門鎖。它還可以定義用PIN碼開鎖或者LED反應(yīng)等。

Data Model

Data Model層用來描述Matter節(jié)點(diǎn)支持的遠(yuǎn)程操作,這里面主要運(yùn)用了attributes, commands和events三個(gè)Matter概念,我們把相應(yīng)的attributes,commands和events組合,就成了Matter設(shè)備里面的一個(gè)基石:cluster。Cluster本身是一個(gè)抽象的概念,用來定義一個(gè)一個(gè)的Matter設(shè)備,具體定義可參見之前的:Matter Application Cluster Specification。正因?yàn)橛辛薱luster,才能讓用戶快速開發(fā)出自己的Matter產(chǎn)品,同時(shí)保證互聯(lián)互通。

Interaction Model

Data Model層對(duì)數(shù)據(jù)進(jìn)行了抽象,而Interaction Model層則用來定義節(jié)點(diǎn)與節(jié)點(diǎn)之間如何交換數(shù)據(jù)。通俗地講,Interaction model就是用來規(guī)定交互命令集的,我們把發(fā)起交互的節(jié)點(diǎn)叫initiator (一般都是client設(shè)備),而接收者稱為target (一般為server設(shè)備)。

Action Framing

Action Framing層用來把Interaction Model層的命令轉(zhuǎn)成serialized格式。

Security

Security層把上面的數(shù)據(jù)進(jìn)行加密并添加MAC。

Message Framing and Routing

這層主要把包頭添加到數(shù)據(jù)中,組成一個(gè)真正的包。

Transport and IP Framing

這層把數(shù)據(jù)傳輸?shù)綄?duì)端,主要是利用TCP或者UDP協(xié)議,同時(shí)Matter定義了Message Reliability Protocol (MRP)協(xié)議,用來信息確認(rèn),重傳和拒絕重復(fù)信息。如前所述,在配網(wǎng)(commissioning)過程中,通信是建立在Bluetooth Transport Protocol (BTP)協(xié)議之上。

1.2 Matter拓?fù)浣Y(jié)構(gòu)

Matter可以同時(shí)支持Wi-Fi/Thread/Ethernet,也就是說Matter可以讓不同網(wǎng)絡(luò)中的設(shè)備進(jìn)行互聯(lián)互通通信,這個(gè)主要是指Thread board router 可以實(shí)現(xiàn)Wi-Fi和Thread通信互轉(zhuǎn)。不僅如此,Matter還允許接入其他網(wǎng)絡(luò)設(shè)備,比如ZigBee設(shè)備,這主要通過一個(gè)Matter bridge設(shè)備來實(shí)現(xiàn)。在Matter拓?fù)浣Y(jié)構(gòu)中,還有一個(gè)節(jié)點(diǎn)非常重要:Matter controller,Matter controller用來完成配網(wǎng)和遠(yuǎn)程控制設(shè)備,比如蘋果的HomePod mini和Home app就是一個(gè)典型的Matter controller節(jié)點(diǎn)。如下為一個(gè)典型的Matter拓?fù)浣Y(jié)構(gòu):

一般來說,一個(gè)Matter網(wǎng)絡(luò)稱為一個(gè)Fabric,共享同一個(gè)根操作證書的所有節(jié)點(diǎn)可以歸為同一個(gè)Fabric,簡(jiǎn)單來說,一個(gè)生態(tài)就是一個(gè)Fabric(當(dāng)然也可以包含多個(gè)),比如家里同時(shí)有蘋果Google亞馬遜的音箱,那么你可以認(rèn)為你家里有三個(gè)Matter fabric,每個(gè)fabric是獨(dú)立的,但這里要強(qiáng)調(diào)的是,Matter支持一個(gè)設(shè)備接入多個(gè)fabric,也就是可以同時(shí)用蘋果Google亞馬遜控制同一個(gè)Matter設(shè)備,比如門鎖。

1.3 Matter數(shù)據(jù)模型(Data Model)和設(shè)備類型

如下為一個(gè)典型的data model表示:

Node

節(jié)點(diǎn)(Node)是一個(gè)邏輯上獨(dú)立的設(shè)備,有自己唯一的網(wǎng)絡(luò)地址。每個(gè)Matter設(shè)備由一個(gè)或多個(gè)Node組成。

Endpoint

一個(gè)Node包含多個(gè)Endpoint,每個(gè)endpoint是一個(gè)邏輯上獨(dú)立的功能模塊。比如門鎖,它除了可以包含門鎖這個(gè)endpoint外,它還可以包含溫度傳感器這個(gè)endpoint。

注意:endpoint 0預(yù)留為Matter的utility cluster,而且每個(gè)Matter設(shè)備都必須強(qiáng)制包含它。

Cluster

Endpoint由一個(gè)或多個(gè)cluster組成,cluster可以認(rèn)為是一個(gè)基本功能集,它包含attributes, commands和events三個(gè)組件。比如前面說的門鎖endpoint,它除了可以包含開鎖/關(guān)鎖這個(gè)cluster外,它還可以包含報(bào)警cluster以實(shí)現(xiàn)報(bào)警功能。

Matter定義了兩種類型的Cluster:

Server –提供Attributes, Commands和Events

Client – 對(duì)Server發(fā)起交互(interaction)操作

Cluster的詳細(xì)規(guī)格定義請(qǐng)參見Matter Application Cluster Specification。如何通過cluster組成endpoint,進(jìn)而組成設(shè)備類型,這個(gè)則是Matter Device Library Specification規(guī)定的內(nèi)容。

Attribute

Attribute就是一條條表示物理量或者狀態(tài)的數(shù)據(jù)記錄,他們保存在設(shè)備的存儲(chǔ)器中。

Command

Command就是下文所說的action,用來觸發(fā)server的特定行為,比如關(guān)鎖命令用來觸發(fā)關(guān)鎖操作。

Event

Event其實(shí)是一種特殊的attribute,它用來更新設(shè)備的狀態(tài),因此你可以把event當(dāng)成是一種歷史數(shù)據(jù)記錄。

1.4 Matter交互命令和模型(Interaction Model)

通俗地講,Interaction model就是用來規(guī)定交互命令集的,我們把發(fā)起交互的節(jié)點(diǎn)叫initiator (一般都是client設(shè)備),而接收者稱為target (一般為server設(shè)備)。

Matter定義了如下interaction類型:

Read

用來讀取attributes或events的值

Write

用來修改attribute的值

Invoke

用來發(fā)送commands

Subscribe

用來訂閱target的數(shù)據(jù)報(bào)告,從而不用定時(shí)去查詢相關(guān)數(shù)據(jù),我們可以訂閱attribute,也可以訂閱event。

Interaction本身由transaction組成,而transaction又由action組成,每個(gè)action包含1條或者多條信息,如下:

下面我們以門鎖為例子來具體講講interaction模型。

1.4.1 Interaction例子:門鎖

下面例子假設(shè)initiator為Matter controller,target為door lock。

Read interaction

如下為讀取DoorLock cluster 中的LockType attribute 的交互圖:

wKgZO2jKEZyAHGh0AAAg0zqR1p845.jpeg

Write interaction

如下為修改DoorLock cluster 中的OperatingMode attribute的交互圖(修改為privacy模式意味著門鎖只能從建筑內(nèi)打開):

wKgZPGjKEZyAEyf5AAAi2vShfIw89.jpeg

Invoke interaction

如下為調(diào)用DoorLock cluster的UnlockDoor command的交互圖,其中Timed request用來定時(shí)命令的有效時(shí)間,為可選項(xiàng)。

wKgZO2jKEZ2AYIYmAAA4lwLr0nE82.jpeg

Subscribe interaction

如下為訂閱DoorLock cluster 的LockState attribute狀態(tài)值的交互圖,這是一個(gè)持續(xù)進(jìn)行的交互,除非一方停止或者返回失敗。

1.5 Matter網(wǎng)絡(luò)安全

Matter使用128-bit AES-CCM 算法來加密數(shù)據(jù),為了得到AES密鑰,根據(jù)兩種不同的應(yīng)用場(chǎng)景,Matter定義了兩種會(huì)話(session)建立方式:Passcode-Authenticated Session Establishment (PASE)和Certificate-Authenticated Session Establishment (CASE)

1.5.1 PASE

PASE僅用于配網(wǎng)(commission)過程中,SPAKE2+算法通過8位passcode來建立一個(gè)安全通道,為了減輕設(shè)備端計(jì)算負(fù)擔(dān),可以直接把離線計(jì)算好的SPAKE2+ Verifier用來驗(yàn)證passcode。

1.5.2 CASE

CASE用于正常業(yè)務(wù)通信過程中,CASE是建立在前面配網(wǎng)成功基礎(chǔ)上的,配網(wǎng)成功后,節(jié)點(diǎn)會(huì)得到一個(gè)節(jié)點(diǎn)操作證書(Node Operational Certificate,NOC)。當(dāng)兩個(gè)節(jié)點(diǎn)使用CASE進(jìn)行通信時(shí),他們的NOC必須共用同一個(gè)根證書,也就是他們必須屬于同一個(gè)Fabric。有了NOC,就可以使用SIGMA算法來得到前述AES密鑰了。

需要注意的是,Matter message包含如下元素:

Message Header – 會(huì)話和傳輸有關(guān)的信息

Protocol Header – Matter消息的語義規(guī)定

Payload – 真正的內(nèi)容

雖然AES-CCM算法可以保證三個(gè)元素的完整性,但是只有Protocol Header和Payload會(huì)加密。

1.6 Matter網(wǎng)絡(luò)配網(wǎng)

Matter配網(wǎng)(commissioning)就是把一個(gè)設(shè)備加入Matter Fabric(也叫Matter操作網(wǎng)絡(luò))的過程,此過程包含兩個(gè)角色:

Commissioner device,一般放在Matter controller中,用于發(fā)起配網(wǎng)過程。

Commissionee device,就是還未添加到Matter網(wǎng)絡(luò)中的設(shè)備。

為了完成配網(wǎng),commissionee必須提供如下onboarding信息:

16-bit Vendor ID and 16-bit Product ID

12-bit device discriminator

27-bit setup passcode

8-bit Discovery Capabilities Bitmask

上面這些信息可以以下面三種方式提供:

手動(dòng)配對(duì)碼(Manual Pairing Code)

二維碼(QR Code)

QR Code Payload

雙方必須支持Manual Pairing Code,但推薦使用二維碼,當(dāng)然各個(gè)生態(tài)系統(tǒng)也可以定義自己的discriminator和setup passcode。 配網(wǎng)流程如下圖所示:

如果上述配網(wǎng)流程成功,那么設(shè)備將得到如下信息:

由fabric ID和node ID組成的實(shí)例名

Node Operational Certificate(NOC)

NOC對(duì)應(yīng)的私鑰

Access Control List

操作網(wǎng)絡(luò)的其他信息

1.7 Matter重要概念介紹

1.7.1 Matter Node(節(jié)點(diǎn))

Matter node就是一個(gè)Matter設(shè)備的實(shí)例,一個(gè)Matter設(shè)備有可能包含一個(gè)或多個(gè)node,每個(gè)node通過64bit的node id來標(biāo)識(shí)。我們也可以把不同的node組成一個(gè)group,并用16bit的group id來標(biāo)識(shí)。

1.7.2 Matter controller(控制器)

Matter controller也是Matter網(wǎng)絡(luò)的一個(gè)節(jié)點(diǎn),它可以遠(yuǎn)程配置和控制附件設(shè)備,如下為兩種典型的controller。

PC機(jī)中我們常見的controller就是CHIP Tool,當(dāng)然Android或者iOS也支持CHIP Tool,開發(fā)者在調(diào)試Matter設(shè)備的時(shí)候,用得最多的就是CHIP Tool,如何在各大平臺(tái)中配置和使用CHIP Tool,大家可以參考:

https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/protocols/matter/getting_started/testing/index.html#ug-matter-gs-testing

對(duì)于商用Matter生態(tài)系統(tǒng),controller是一個(gè)組合體,比如蘋果Matter生態(tài),它的controller應(yīng)該是iOS里面的Home app和HomePod音箱的組合體。

1.7.3 Matter Fabric(網(wǎng)絡(luò))

一個(gè)Matter Fabric就是一個(gè)Matter網(wǎng)絡(luò),一個(gè)Matter Fabric中的所有節(jié)點(diǎn)共享同一個(gè)根證書,所以他們可以相互通信,每個(gè)Matter Fabric會(huì)分配一個(gè)64bit的ID進(jìn)行標(biāo)識(shí)。一般來說,一個(gè)Matter生態(tài)就是一個(gè)Matter fabric,比如蘋果的Home就是一個(gè)fabric,谷歌的home又是另一個(gè)fabric。

1.7.4 Multi-fabric/multi-admin接入多生態(tài)

一個(gè)Matter node(節(jié)點(diǎn))可以接入一個(gè)Matter fabric,也可以同時(shí)接入多個(gè)Matter fabric,比如同時(shí)被蘋果/谷歌/亞馬遜的音箱控制,這個(gè)特性就稱為multi-fabric或者multi-admin。Multi-fabric將保證不同的生態(tài)可以相互兼容,提高M(jìn)atter應(yīng)用的互聯(lián)互通性能。

1.7.5 Matter bridge

智能家居是一個(gè)非常碎片化的市場(chǎng),除了Matter技術(shù)外,還有很多其他技術(shù)運(yùn)用在智能家居市場(chǎng)中,比如藍(lán)牙和ZigBee。為了將這些現(xiàn)有的智能家居產(chǎn)品一攬子接入Matter生態(tài),Matter規(guī)范里面提出了Matter Bridge這個(gè)設(shè)備類型,通過Matter bridge,我們可以把非Matter設(shè)備快速接入Matter生態(tài)。如下網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)演示了如何將一個(gè)藍(lán)牙燈泡接入Matter網(wǎng)絡(luò),然后Matter controller像控制正常Matter設(shè)備一樣去控制它。

1.7.6 Matter標(biāo)準(zhǔn)OTA

Matter規(guī)范要求設(shè)備必須支持設(shè)備升級(jí)功能,雖然Matter定義了一整套設(shè)備升級(jí)標(biāo)準(zhǔn),但Matter沒有強(qiáng)制規(guī)定設(shè)備必須采用這套標(biāo)準(zhǔn)的OTA升級(jí)方式,也就是說設(shè)備也可以采用其他方式來升級(jí),比如使用基于藍(lán)牙或者Wi-Fi的SMP方式進(jìn)行升級(jí)。

Matter標(biāo)準(zhǔn)OTA定義了兩個(gè)角色:OTA Provider和OTA Requestor,OTA Provider和OTA Requestor都是cluster,因此他們都有client和server角色之分,要升級(jí)固件的設(shè)備叫OTA requestor,而提供固件的設(shè)備(比如controller)叫OTA provider。

1.7.7 Distributed Compliance Ledger(DCL)

通俗地說,DCL是CSA運(yùn)營(yíng)的一個(gè)分布式數(shù)據(jù)庫服務(wù)器,既然DCL是一個(gè)記賬簿,它不會(huì)不斷地更新和發(fā)展的。每當(dāng)成員公司有新品發(fā)布,他們就會(huì)把這個(gè)新品的認(rèn)證信息寫到DCL中。如果頒發(fā)了新的PAA證書,這個(gè)信息也會(huì)寫入DCL中。前面提及的Matter標(biāo)準(zhǔn)OTA,新image的URL信息也可以寫入到DCL中。CSA也可以撤銷或者作廢DCL中的一些證書或者認(rèn)證信息??傊?,DCL就是一個(gè)分布式數(shù)據(jù)庫服務(wù)器,保證了PKI系統(tǒng)的正常運(yùn)行,同時(shí)也保證了Matter各個(gè)生態(tài)的互聯(lián)互通。

1.7.8 Certificate Declaration(CD)

每當(dāng)一個(gè)產(chǎn)品通過了Matter認(rèn)證,CSA就會(huì)頒發(fā)一個(gè)CD證書給它,CD證書包括Vendor ID,Certificate ID,certification type等,由于一個(gè)產(chǎn)品類別下所有設(shè)備共用同一個(gè)CD,因此CD都是hard code在應(yīng)用中的。

2. 支持Matter的nRF設(shè)備介紹

2.1 Matter over Thread nRF設(shè)備

Nordic支持Matter over thread應(yīng)用的SoC主要包括nRF5340和nRF52840兩款。

2.1.1 nRF5340主要特性

帶1 MB 閃存和 512 KB 內(nèi)存的128/64 MHz Arm Cortex-M33 應(yīng)用處理器

帶256 KB 閃存和 64 KB 內(nèi)存的64 MHz Arm Cortex-M33 網(wǎng)絡(luò)處理器

低功耗藍(lán)牙

藍(lán)牙測(cè)向

Matter

Bluetooth mesh, Thread, Zigbee

ANT

NFC

高級(jí)安全性

USB, QSPI, HS-SPI

105 °C 擴(kuò)展工作溫度

1.7-5.5 V 電源電壓范圍

開發(fā)nRF5340應(yīng)用時(shí),在nRF Connect SDK中選擇的開發(fā)板類型為:

nrf5340dk_nrf5340_cpuapp。

2.1.2 nRF52840主要特性

64 MHz Arm Cortex-M4 帶FPU

1 MB閃存 + 256 KB RAM

低功耗藍(lán)牙,藍(lán)牙m(xù)esh

2Mbps

2.4 GHz 收發(fā)器

ANT, 802.15.4, Thread, Zigbee

長(zhǎng)距離

+8 dBm 發(fā)射功率

-95 dBm 靈敏度

支持IEEE 802.15.4無線電

Matter

Thread

Zigbee

1.7V至5.5V供電電壓范圍

全速12 Mbps USB

NFC-A tag

PWM

UART, SPI, TWI, PDM, I2S, QSP

高速 32 MHz SPI

Quad SPI 接口32 MHz

12位/200 ksps ADC

128位 AES CCM, ARM CryptoCell

USB 2.0

開發(fā)nRF52840應(yīng)用時(shí),在nRF Connect SDK中選擇的開發(fā)板類型為:

nrf52840dk_nrf52840

2.2 Matter over Wi-Fi nRF設(shè)備

要實(shí)現(xiàn)Matter over Wi-Fi應(yīng)用,需要同時(shí)使用nRF5340和nRF7002/nRF7001兩款芯片,nRF7002/nRF7001是Wi-Fi 6協(xié)同IC,他們只運(yùn)行Wi-Fi有關(guān)的MAC層,Matter的其他部分還是跑在nRF5340上。

2.2.1 nRF7002主要特性

Wi-Fi 6站點(diǎn)(STA)

2.4 GHz和5 GHz雙頻段

符合802.11a/b/g/n/ac/ax標(biāo)準(zhǔn)

用于物聯(lián)網(wǎng)的低功耗安全Wi-Fi

與低功耗藍(lán)牙的理想共存

目標(biāo)喚醒時(shí)間(TWT)

SPI / QSPI

1個(gè)空間流(SS)

20MHz通道帶寬

64 QAM (MCS7),86 Mbps PHY

OFDMA(下行鏈路和上行鏈路)

BSS著色

共存接口

nRF Connect SDK提供支持

開發(fā)nRF5340+nRF7002應(yīng)用時(shí),在nRF Connect SDK中選擇的開發(fā)板類型為:

nrf7002dk_nrf5340_cpuapp。

2.2.2 nRF7001主要特性

nRF7001跟nRF7002功能差不多

但它只支持2.4G頻段

不支持5G頻段。

3. nRF Connect SDK和Matter SDK

開發(fā)Matter應(yīng)用,你可以選擇Nordic自己的SDK:nRF Connect SDK來開發(fā),也可以選擇Matter官方SDK:Matter SDK來開發(fā)。其實(shí)兩套SDK基本上差不多,并且是相互包含的關(guān)系,也就是說,nRF Connect SDK里面已經(jīng)包含了Matter SDK,站在nRF Connect SDK角度來看,Matter SDK就是它的一個(gè)模塊。

同樣,Matter SDK里面也包含了nRF Connect SDK,站在Matter SDK角度來看,nRF Connect SDK就是它的一個(gè)模塊。由于兩者的互包含關(guān)系,導(dǎo)致兩者的版本無法同步,也就是說,當(dāng)nRF Connect SDK開始下一個(gè)版本開發(fā)的時(shí)候,它會(huì)鎖定Matter SDK一個(gè)版本,比如nRF Connect SDK v2.5.0開發(fā)的時(shí)候,由于Matter SDK v1.2.0.0還沒有發(fā)布,因此它鎖定的版本就是Matter SDK v1.1.0.1;同樣當(dāng)Matter SDK v1.2.0.0開始開發(fā)的時(shí)候,由于nRF Connect SDK v2.5.0還沒有發(fā)布,因此它鎖定的版本就是nRF Connect SDK v2.4.0。

這就導(dǎo)致一個(gè)現(xiàn)象,Matter SDK鎖定的nRF Connect SDK版本總是落后于Nordic最新版本,nRF Connect SDK鎖定的Matter SDK版本也總是落后于Matter官方最新版本。

如果你是做一個(gè)商業(yè)產(chǎn)品開發(fā),強(qiáng)烈建議你使用nRF Connect SDK來進(jìn)行開發(fā),因?yàn)槊總€(gè)nRF Connect SDK版本的發(fā)布都會(huì)對(duì)Matter所有例子進(jìn)行考核和測(cè)試,以保證他們的質(zhì)量和穩(wěn)定性,這也是為什么nRF Connect SDK會(huì)對(duì)Matter SDK打很多補(bǔ)丁以保證其質(zhì)量。

而且nRF Connect SDK同時(shí)支持Windows/MacOS/Linux平臺(tái),讓你不再局限于Linux開發(fā)平臺(tái)(經(jīng)過一定修改后,我們也可以讓Matter SDK跑在Windows平臺(tái),下文會(huì)對(duì)此進(jìn)行介紹)。

如果你想測(cè)試Matter最新的特性,而這個(gè)特性nRF Connect SDK暫時(shí)又沒有,那么可以使用Matter SDK來進(jìn)行開發(fā)和調(diào)試,待下版本nRF Connect SDK包含了該特性,你就可以直接移植過去,快速發(fā)布你的產(chǎn)品。

欲查看Matter SDK鎖定的nRF Connect SDK版本,大家可以打開這個(gè)文件:config/nrfconnect/.nrfconnect-recommended-revision,如下:

由于nRF Connect SDK會(huì)對(duì)它鎖定的Matter SDK版本進(jìn)行修改,我們沒辦法一眼看出它鎖定的版本,但是大家可以從如下網(wǎng)站找到每個(gè)版本的nRF Connect SDK鎖定的Matter SDK版本以及它遵守的Matter規(guī)范版本。

https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/protocols/matter/index.html

nRF Connect SDK version Matter specification version Matter SDK version
v2.5.99 (latest) 1.2.0 1.2.0.1
v2.5.2 1.1.0 1.1.0.1
v2.5.1 1.1.0 1.1.0.1
v2.5.0 1.1.0 1.1.0.1
v2.4.3 1.1.0 1.1.0.1
v2.4.2 1.1.0 1.1.0.1
v2.4.1 1.1.0 1.1.0.1
v2.4.0 1.1.0 1.1.0.1
v2.3.0 1.0.0 1.0.0.2
v2.2.0 1.0.0 1.0.0.0
v2.1.4 1.0.0 1.0.0.0
v2.1.3 1.0.0 1.0.0.0
v2.1.2 1.0.0 1.0.0.0

雖然nRF Connect SDK和Matter SDK相互包含,但他們使用同一套工具鏈,而且這套工具鏈?zhǔn)前殡SnRF Connect SDK一起下載和安裝的,另外,不管你使用Matter SDK來開發(fā)Matter應(yīng)用還是使用nRF Connect SDK來開發(fā)Matter應(yīng)用,nRF Connect SDK都必須下載和安裝,下面我們會(huì)以nRF Connect SDK為主來講解Matter應(yīng)用開發(fā)流程,然后在此基礎(chǔ)上再講解Matter SDK開發(fā)Matter應(yīng)用的流程。

實(shí)際上,你只要熟悉了nRF Connect SDK開發(fā)流程,也就熟悉了Matter SDK開發(fā)流程,因?yàn)閮烧邘缀跻荒R粯印?/p>

4. nRF Connect SDK開發(fā)環(huán)境搭建

關(guān)于nRF Connect SDK搭建和介紹,這里有一篇博文:

開發(fā)你的第一個(gè)nRF Connect SDK/Zephyr應(yīng)用程序l,

推薦大家去看一下。下面我們會(huì)對(duì)博文內(nèi)容進(jìn)行濃縮,簡(jiǎn)要介紹nRF Connect SDK。

4.1 前置安裝

在我們開始正式的開發(fā)環(huán)境配置之前,我們先需要下載如下三個(gè)工具:

Visual Studio Code:https://code.visualstudio.com/,這個(gè)就是我們的跨Windows/Linux/MacOS平臺(tái)的IDE工具。

nRF command line tools:https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Command-Line-Tools/Download#infotabs,這個(gè)就是j-link驅(qū)動(dòng)以及nrfjprog等Nordic提供的一些有用的命令行工具。

west,git和Python,這三個(gè)工具是可選的,不過大家手動(dòng)安裝他們一下,某些場(chǎng)合還是蠻有用處的。請(qǐng)注意,即使大家沒有手動(dòng)安裝這3個(gè)工具,Nordic工具鏈也會(huì)自動(dòng)包含這三個(gè)工具,只不過大家使用工具鏈里面自帶的工具,會(huì)有一點(diǎn)麻煩,所以這里建議大家可以先手動(dòng)安裝他們。

4.2 VS Code開發(fā)環(huán)境搭建

Microsoft Visual Studio Code(VS Code)是Nordic推薦的開發(fā)nRF Connect SDK應(yīng)用的跨平臺(tái)IDE工具,所以nRF Connect SDK開發(fā)環(huán)境搭建都是在VS Code中進(jìn)行的。

4.2.1 插件安裝

首先下載相應(yīng)的插件。打開VS Code,進(jìn)入Marketplace,搜索“nrf”,然后選擇“nRF Connect for VS Code Extension Pack”進(jìn)行安裝,一旦nRF Connect for VS Code Extension Pack安裝成功,所有nRF插件都自動(dòng)安裝成功。目前Nordic開發(fā)了如下nRF插件:

4.2.2 nRF Connect SDK安裝

由于nRF Connect SDK放在GitHub服務(wù)器上,下載和安裝nRF Connect SDK的時(shí)候請(qǐng)一定要使用VPN,否則很有可能就會(huì)下載不完整或者失敗。

上面的nRF Connect for VS code插件安裝成功后,點(diǎn)擊左邊的插件圖標(biāo),進(jìn)入WELCOME面板,選擇Manage SDKs,

然后在右邊列表框中選擇Install SDK,

然后選擇相應(yīng)版本的nRF Connect SDK,

請(qǐng)注意,如果你是一個(gè)新用戶,強(qiáng)烈建議你選擇最新版本,即列表里面版本最高的版本,上面是v2.5.0(截止本文第一次發(fā)表時(shí)),但是當(dāng)你讀到這時(shí),最高版本有可能已經(jīng)到v2.6.0,v2.7.0,甚至更高,請(qǐng)選擇此時(shí)最高版本。(注意:*.*.99之類的版本是開發(fā)專用版本,不能用于量產(chǎn))

選擇好版本后,然后選擇SDK安裝根目錄,一般使用默認(rèn)推薦的目錄即可,如下。

大家千萬不要使用很長(zhǎng)的目錄作為安裝根目錄,否則在Windows上編譯例子的時(shí)候,經(jīng)常會(huì)碰到目錄名太長(zhǎng)的編譯報(bào)錯(cuò)。

然后VS code開始下載nRF Connect SDK,

下載完成之后,你就可以打開SDK所在的根目錄,

SDK在下載過程中,經(jīng)常碰到下載不完整的情況,而且這種情況又不會(huì)報(bào)錯(cuò),為此我們可以通過下面的方式去檢驗(yàn)nRF Connect SDK是否下載完整和正確,選擇Manage west workspace,然后選擇West Update,

如果nRF Connect SDK還缺少一些組件沒有下載完整,此時(shí)在OUTPUT窗口,你將會(huì)看到類似下面這樣的報(bào)錯(cuò)信息:

如果nRF Connect SDK已經(jīng)完整下載并正確,此時(shí)在OUTPUT窗口,你將會(huì)看到下面的信息輸出:

除了上述的VS code安裝成功確認(rèn)方式,我們也可以通過目錄和命令行的方式來確認(rèn)nRF Connect SDK是否完整安裝正確。

nRF Connect SDK和工具鏈安裝成功后,都放在Windows如下目錄里面:

打開CMD,進(jìn)入相應(yīng)SDK根目錄,然后輸入命令:git show,以確認(rèn)安裝版本是否正確:

然后,我們可以手動(dòng)輸入命令:west update,以同步nRF Connect SDK所有倉庫,從而確認(rèn)SDK是否下載完整和正確,

如果最后沒有出現(xiàn)報(bào)錯(cuò)信息,說明所有關(guān)聯(lián)倉庫都已經(jīng)下載并同步成功,nRF Connect SDK已經(jīng)下載完整和正確。

4.2.3 Toolchain安裝

nRF Connect SDK開發(fā)使用的Toolchain也可以通過VS Code直接安裝,上面的nRF Connect for VS code插件安裝成功后,點(diǎn)擊左邊的插件圖標(biāo),進(jìn)入WELCOME面板,然后選擇Manage toolchains,在右邊的列表框中選擇Install Toolchain,如下:

根據(jù)你選擇的nRF Connect SDK版本選擇對(duì)應(yīng)版本的Toolchain,比如nRF Connect SDK v2.5.0對(duì)應(yīng)的Toolchain安裝如下所示:

然后開始下載Toolchain,

下載成功后,自動(dòng)解壓和安裝,

如下為安裝成功的提示:

這里需要注意的是,Toolchain安裝可以不用VPN,但使用VPN可以讓安裝更穩(wěn)定更可靠。

如果你PC里面有多個(gè)版本的Toolchain,你可以選擇任一版本作為當(dāng)前版本,

4.2.4 安裝必須的Python腳本

nRF Connect SDK雖然已經(jīng)預(yù)裝了大部分的Python腳本,但是Matter模塊里面有些Python腳本還沒有安裝。很多人電腦里裝了多個(gè)Python環(huán)境,怎么保證我們現(xiàn)在使用的Python環(huán)境是nRF Connect SDK v2.5.0 Toolchain自帶的?為了確保執(zhí)行的是nRF Connect SDK Toolchain里面的Python,而不是操作系統(tǒng)環(huán)境變量中的Python,推薦大家使用VS code的終端來執(zhí)行命令,即打開如下nRF Connect終端:

wKgZPGjKEZ6ACUEaAACaxxQV0Js20.jpeg

這樣就保證了該命令行的環(huán)境是nRF Connect SDK Toolchain設(shè)置的環(huán)境,在該終端中執(zhí)行的任何命令都是針對(duì)nRF Connect SDK Toolchain環(huán)境來說的。

我們輸入如下命令:

pip3 install -r C:/ncs/v2.5.0/modules/lib/matter/scripts/setup/requirements.nrfconnect.txt

這樣系統(tǒng)就會(huì)自動(dòng)補(bǔ)全nRF Connect SDK Toolchain缺少的Python包,如下所示:

4.2.5 zap工具安裝

nRF Connect SDK安裝成功后,我們就需要開始安裝zap工具,zap工具是用來添加/編輯/刪除前文所述的node/endpoint/cluster,因此它是一個(gè)必須安裝的工具。對(duì)nRF Connect SDK來說,zap工具的安裝是比較簡(jiǎn)單的,Nordic特意提供了如下Python命令幫助大家安裝:

首先進(jìn)入matter倉庫主目錄:

cd C:ncsv2.5.0moduleslibmatter

然后執(zhí)行如下命令,其中“C:NordicToolszap-win-x64”是zap工具安裝的根目錄,大家也可以選擇其他目錄。

python scripts/setup/nrfconnect/get_zap.py -l C:NordicToolszap-win-x64 -o

zap工具安裝成功后,記得把C:NordicToolszap-win-x64這個(gè)目錄添加到操作系統(tǒng)的環(huán)境變量中。

至此,nRF Connect SDK開發(fā)環(huán)境已經(jīng)搭好,下面我們來編譯一個(gè)例子來驗(yàn)證一下開發(fā)環(huán)境是否真得搭成功了。

4.3 使用nRF Connect SDK編譯Matter例程

nRF Connect SDK使用CMakeLists.txt文件來表示項(xiàng)目,并通過CMake命令來取代傳統(tǒng)的通過GUI來添加源文件和目錄,使用Kconfig來配置項(xiàng)目以取代傳統(tǒng)的頭文件配置方式,使用DeviceTree來配置底層驅(qū)動(dòng)文件以取代傳統(tǒng)的頭文件配置方式,如果大家對(duì)CMake/Kconfig/DeviceTree不熟的話,建議閱讀:開發(fā)你的第一個(gè)nRF Connect SDK/Zephyr應(yīng)用程序l,以加深對(duì)nRF Connect SDK的理解。

Matter項(xiàng)目很大,編譯起來特別費(fèi)時(shí)間,有時(shí)為了快速驗(yàn)證你的開發(fā)環(huán)境是否搭好,大家可以跑一個(gè)簡(jiǎn)單的例子,比如zephyr/samples/basic/blinky,以測(cè)試你的開發(fā)環(huán)境是否搭好。這里我們就不跑了,大家自己可以先測(cè)一下。下面我們?yōu)榇蠹抑苯友菔綧atter例子是如何編譯和運(yùn)行的。

我們以nrf/samples/matter/lock為例,詳細(xì)闡述如何使用nRF Connect SDK來編譯和運(yùn)行Matter例子。nrf/samples/matter/lock是一個(gè)門鎖例子,同時(shí)支持Matter over Thread和Matter over Wi-Fi,如果你選擇nrf5340dk_nrf5340_cpuapp或者nrf52840dk_nrf52840,那么這個(gè)例子自動(dòng)編譯成Matter over Thread應(yīng)用;如果你選擇nrf7002dk_nrf5340_cpuapp,那么這個(gè)例子自動(dòng)編譯成Matter over Wi-Fi應(yīng)用。

下面我們以nrf52840dk_nrf52840為例(nrf5340dk_nrf5340_cpuapp和nrf7002dk_nrf5340_cpuapp跟它一模一樣,只需更換板子即可),來編譯和運(yùn)行這個(gè)門鎖例子。

選擇APPLICATIONS標(biāo)簽頁,選擇Open Existing Application,

選擇目錄:nrf/samples/matter/lock,

打開上述項(xiàng)目后,將自動(dòng)跳出Add Build Configuration頁面,在Board列表框中,選擇開發(fā)板:nrf52840dk_nrf52840,

然后選擇Configuration選項(xiàng),如果留空,默認(rèn)選擇prj.conf,大家也可以選擇其他配置項(xiàng)。

其他一些配置項(xiàng)的說明如下所示:

選擇Build Configuration,開始編譯,視你的PC配置情況,編譯有可能耗時(shí)達(dá)10分鐘之久,編譯成功后,你將看到如下輸出:

整個(gè)VS code一覽圖如下所示:

至此,項(xiàng)目編譯成功,大家可以點(diǎn)擊“Flash”將代碼下載到板子里面,然后Matter應(yīng)用就自動(dòng)跑起來了,打開PC串口助手,你將看到如下輸出日志,說明Matter應(yīng)用已經(jīng)在正常運(yùn)行了。

5. Matter SDK開發(fā)環(huán)境搭建

如前所述,搭建Matter SDK開發(fā)環(huán)境之前,必須先搭建好nRF Connect SDK開發(fā)環(huán)境,請(qǐng)大家先按照第4章的要求,搭建好nRF Connect SDK開發(fā)環(huán)境,然后再來讀這一章。

5.1 Matter SDK下載和安裝

5.1.1 Matter SDK下載

Matter SDK是放在GitHub上的,因此必須使用VPN來下載Matter SDK。

首先,打開CMD,進(jìn)入c:/ncs目錄,然后輸入如下命令:

git clone https://github.com/project-chip/connectedhomeip.git

上面命令將把Matter SDK公共的倉庫都下載下來,而且自動(dòng)切換到Matter SDK的master分支,如果你要切換到一個(gè)特定的tag,比如v1.2.0.1,請(qǐng)執(zhí)行:

git checkout v1.2.0.1

由于Matter SDK支持眾多平臺(tái)和廠商,我們還需要下載這些第三方的倉庫,為此,我們?cè)佥斎肴缦旅睿?/p>

cd C:/ncs/connectedhomeip/scripts
python checkout_submodules.py --platform nrfconnect

上面的platform參數(shù)來指明下載哪個(gè)平臺(tái)或廠商的倉庫,如果沒有指明,說明下載所有平臺(tái)或廠商的倉庫,這個(gè)工作量是巨大的(目前是19GB左右),下載的時(shí)間也是很長(zhǎng)的。上面的例子我們指明了nrfconnect平臺(tái),這就意味著它只會(huì)下載Nordic Matter開發(fā)相關(guān)的倉庫,這個(gè)就小多了,大概1.5GB不到。

如果你之前已經(jīng)安裝過Matter SDK,現(xiàn)在只是想更新到最新版本,那么使用下面命令即可:

git pull
git submodule update --init

5.1.2 安裝缺少的Python模塊

然后我們還需要安裝缺少的Python模塊,這個(gè)是針對(duì)于nRF Connect SDK Toolchain來說的。nRF Connect SDK Toolchain是直接為nRF Connect SDK準(zhǔn)備的,因此它不用做任何修改,就可以直接編譯nRF Connect SDK例子,但對(duì)Matter SDK例子,它有一些額外的Python模塊需求,因此我們需要將其補(bǔ)充完整。為了確保執(zhí)行的是nRF Connect SDK Toolchain里面的Python,而不是操作系統(tǒng)環(huán)境變量中的Python,推薦大家使用VS code的終端來執(zhí)行命令,即打開如下nRF Connect終端:

wKgZO2jKEZ6AQVdjAACaxxQV0Js80.jpeg

這樣就保證了該命令行的環(huán)境是nRF Connect SDK Toolchain設(shè)置的環(huán)境,在該終端中執(zhí)行的任何命令都是針對(duì)nRF Connect SDK Toolchain環(huán)境來說的。

我們輸入如下命令:

pip3 install -r C:/ncs/connectedhomeip/scripts/setup/requirements.build.txt

這樣系統(tǒng)就會(huì)自動(dòng)補(bǔ)全nRF Connect SDK Toolchain缺少的Python包,如下所示:

5.1.3 安裝合適的zap工具

雖然前面nRF Connect SDK開發(fā)環(huán)境搭建過程中,已經(jīng)安裝好了zap工具,但是這個(gè)zap工具的版本有可能跟Matter SDK要求的zap工具版本不一樣,為此我們還需要再安裝一次期望版本的zap工具。

首先我們需要先確認(rèn)zap工具的版本對(duì)不對(duì),大家可以通過scripts/setup/zap.version這個(gè)文件確認(rèn):

wKgZPGjKEZ-AbzpFAAAaowfyg-c18.jpeg

這就意味著對(duì)Matter SDK v1.2.0.1來說,它需要的zap工具版本是v2023.10.24-nightly,然后大家可以到如下鏈接下載相應(yīng)版本:https://github.com/project-chip/zap/releases,找到版本“v2023.10.24-nightly”,然后下載自己平臺(tái)的安裝包。

wKgZO2jKEaCAG6vwAABnPOPUYfc68.jpeg

比如Windows,就下載zap-win-x64.zip這個(gè)壓縮包,下載成功后,解壓縮,將其放在某個(gè)目錄下,然后把該目錄添加到Path變量中,如下為我電腦上的解壓縮路徑和Path變量值:

wKgZPGjKEaCAdha1AACdIu1o7kU95.jpegwKgZO2jKEaGAO0G6AAD9YiMhtu877.jpeg

如果你的PC安裝有老的zap工具,那么請(qǐng)記得把上面的環(huán)境變量一定要指向你剛剛解壓縮的目錄,而不是原來的值。另外原來的zap工具會(huì)在如下目錄生成一個(gè)緩沖文件:

為了更好的兼容性,大家可以把這個(gè)文件直接刪掉。

至此,Matter SDK已經(jīng)下載和安裝完畢,下面我們就可以開始用它來編譯和運(yùn)行Matter應(yīng)用了。

5.2 編譯Matter SDK例子

5.2.1 Linux/MacOS平臺(tái)

原生的Matter SDK就支持Linux和MacOS平臺(tái),因此你不要做任何修改,你就可以在Linux和MacOS上編譯Matter SDK例子,大家可以參考4.3節(jié)介紹的步驟,去編譯Matter SDK里面的例子,比如exampleslock-appnrfconnect,這個(gè)是Matter SDK里面自帶的門鎖例子。

5.2.2 Windows平臺(tái)

由于前面已經(jīng)把nRF Connect SDK開發(fā)環(huán)境搭建好,我們可以直接使用nRF Connect SDK開發(fā)環(huán)境來編譯和運(yùn)行Matter SDK例子,整個(gè)步驟跟前述的編譯運(yùn)行nRF Connect SDK例子一模一樣。

5.2.2.1 修改Matter SDK以適配Windows平臺(tái)

由于原生的Matter SDK只能在Linux和MacOS上進(jìn)行編譯,我們需要對(duì)原生的Matter SDK進(jìn)行幾處修改才能直接在Windows上進(jìn)行編譯,修改的地方如下所示:

在connectedhomeip/build_overrides目錄下,新建一個(gè)空文件,文件名為:pigweed_environment.gni。這個(gè)文件創(chuàng)建一次就可以,然后可以適用所有Matter工程。

修改一些編譯腳本。請(qǐng)大家將

https://patch-diff.githubusercontent.com/raw/project-chip/connectedhomeip/pull/30982.diff

對(duì)應(yīng)的文件下載下來,命名為30982.diff,放在c:/ncs目錄下,然后執(zhí)行

git apply c:/ncs/30982.diff

就可以自動(dòng)修改相應(yīng)腳本以支持Windows,如下:

注意:這個(gè)補(bǔ)丁是針對(duì)Matter SDK版本v1.2.0.1的,Matter SDK未來版本有可能會(huì)把這個(gè)PR合并進(jìn)去,這樣這個(gè)補(bǔ)丁就沒有必要再打了。

修改每個(gè)項(xiàng)目的CMakelists.txt文件,只改一個(gè)地方:

把本項(xiàng)目目錄下的third_partyconnectedhomeip這個(gè)文件包含的內(nèi)容直接取代CMakelists.txt中的變量connectedhomeip,即把../../../..取代connectedhomeip,使

get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH)

這句話變成

get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/../../../.. REALPATH)

5.2.2.2使用Matter SDK編譯Matter例程

如果你前面沒有選擇Matter SDK的版本,那么你首先要checkout一個(gè)你期望的版本,一般選擇一個(gè)tag來開發(fā)和測(cè)試,而且一般都是選擇最新的tag來開發(fā)和測(cè)試,如下圖所見,截止本文發(fā)表時(shí),Matter SDK最新的tag是v1.2.0.1。

wKgZPGjKEaKAcLxSAADjOmTsCFE29.jpeg

為此我們選擇v1.2.0.1這個(gè)tag來演示我們下面例子的編譯和測(cè)試。我們?cè)贑MD中輸入如下命令:

git checkout v1.2.0.1
git submodule update

我們還是以Matter SDK原生的lock例子為例:connectedhomeipexampleslock-appnrfconnect,來闡述整個(gè)編譯過程。

首先修改CMakelists.txt文件(前面說得pigweed_environment.gni這個(gè)空文件記得要先創(chuàng)建),得到:

然后像編譯nRF Connect SDK例子一樣去編譯這個(gè)lock例子。由于Matter SDK使用了nRF Connect SDK的工具鏈,因此我們必須要知道當(dāng)前Matter SDK鎖定的nRF Connect SDK的版本是多少。查看Matter SDK要求的nRF Connect SDK版本,大家可以打開這個(gè)文件:C:ncsconnectedhomeipconfignrfconnect.nrfconnect-recommended-revision,如下:

說明它要求的nRF Connect SDK版本是v2.4.0,接下來我們就要在WELCOME標(biāo)簽頁中選擇nRF Connect SDK v2.4.0以及對(duì)應(yīng)的Toolchain,如下:

wKgZO2jKEaOAGlYzAACN-pSVnVc17.jpeg

然后選擇Open Existing Application,找到目錄:connectedhomeipexampleslock-appnrfconnect,如下:

然后選擇開發(fā)板:nrf52840dk_nrf52840

然后選擇“Build Configuration”開始編譯,編譯成功后,將有如下輸出日志:

點(diǎn)擊Flash,將程序下載到開發(fā)板:

程序運(yùn)行起來后,將有如下日志輸出:

按下Button4,設(shè)備就會(huì)開始藍(lán)牙廣播,表示已經(jīng)做好配網(wǎng)準(zhǔn)備,可以接入Matter生態(tài)了:

下面我們就會(huì)講解如何使用HomePod mini來測(cè)試Matter設(shè)備。

6. 使用蘋果HomePod mini測(cè)試你的Matter設(shè)備

不管是用nRF Connect SDK編譯的lock例程(4.3節(jié)),還是用Matter SDK編譯的lock例程(5.2.2.2節(jié)),編譯成功并運(yùn)行后,他們的測(cè)試流程都是一樣的。

首先確保設(shè)備藍(lán)牙廣播已經(jīng)開啟,日志有“advertising started”字樣,如果沒有開啟,請(qǐng)按開發(fā)板最后一個(gè)按鍵以激活藍(lán)牙廣播。

然后我們從日志中可以看到一個(gè)網(wǎng)址,如下:

https://project-chip.github.io/connectedhomeip/qrcode.html?data=MT%3A8IXS142C00KA0648G00

將上面網(wǎng)址拷到瀏覽器中,即可以得到配網(wǎng)用的二維碼,

目前Nordic所有例子默認(rèn)都使用上面二維碼來配網(wǎng),大家只要掃描上面二維碼就可以完成配網(wǎng)。

在開始下面的測(cè)試步驟之前,請(qǐng)確保你的HomePod mini和iPhone或者iPad連接同一個(gè)路由器,而且HomePod mini已經(jīng)跟該iPhone或者iPad的Home app綁定好。

打開iOS設(shè)備上的Home app,點(diǎn)擊右上角的“+”,選擇Add or Scan Accessory,如下:

wKgZPGjKEaOAS6TvAACAT2I9N3w72.jpeg

跳出下面的掃描窗口,將掃描窗口對(duì)準(zhǔn)上面的二維碼,掃描成功后,配網(wǎng)真正開始。

wKgZO2jKEaSAaHwKAACeY5JMcA096.jpeg

大家也可以從日志看出,配網(wǎng)流程正在進(jìn)行中,下面就是截取配網(wǎng)流程的一個(gè)小片段的日志:

過一會(huì),iOS設(shè)備就會(huì)彈出如下對(duì)話框,這個(gè)是因?yàn)槲覀兪褂玫氖菧y(cè)試DAC證書和測(cè)試用PID等,請(qǐng)大家參考第8章如何獲取生產(chǎn)用的證書和ID等信息,這里我們選擇“Add Anyway”。

wKgZPGjKEaWAQhIrAABo6l01FYc63.jpeg

設(shè)備配網(wǎng)成功后,iOS設(shè)備會(huì)連續(xù)出現(xiàn)如下界面:

選擇這個(gè)設(shè)備所在的位置:

wKgZO2jKEaWAaq0sAABWqnflbxo09.jpeg

給這個(gè)設(shè)備取一個(gè)好記的名字:

wKgZPGjKEaaASYyFAABNbxVb35Y85.jpeg

如果是鎖設(shè)備類型,還需要設(shè)置它的訪問密碼:

wKgZO2jKEaeAU6HIAABx2K5Gvng19.jpeg

設(shè)置一些自動(dòng)化的場(chǎng)景:

wKgZPGjKEaiAcYWCAABhHvOwLYI73.jpeg

最后顯示設(shè)備添加成功的界面,如下:

wKgZO2jKEaiACeLnAABVVNOAe5A29.jpeg

同時(shí)大家也可以從Home app的主界面看到這個(gè)添加成功的設(shè)備,如下:

wKgZPGjKEamAe13NAAA5NzpbqIU67.jpeg

除了從iOS設(shè)備上觀察設(shè)備是否添加成功,你也可以從日志輸出來佐證設(shè)備是否添加成功,設(shè)備添加成功后,你一般會(huì)看到如下紅色標(biāo)注的日志:

設(shè)備添加成功后,我們就可以對(duì)設(shè)備進(jìn)行各種操作,比如我們?nèi)ラ_鎖,開鎖可以通過Home app直接操作,也可以通過語音Siri來操作,不過二者有點(diǎn)不一樣。通過Home app操作的話,你直接點(diǎn)擊如下圖標(biāo)即可:

wKgZO2jKEamAS9TGAAAneGHc9es47.jpeg

通過Siri可以發(fā)出開鎖命令,但是它無法開鎖,必須通過Home app確認(rèn)才能開鎖(這個(gè)是出于安全考慮),即Siri發(fā)出開鎖命令后,Home app會(huì)收到如下確認(rèn)信息,確認(rèn)后才能開鎖:

wKgZPGjKEaqAaZ0SAABeh5qMaEE92.jpegwKgZPGjKEauATryTAABSRWKXNj424.jpeg

關(guān)鎖操作相對(duì)安全一些,因此Home app和Siri都可以直接執(zhí)行關(guān)鎖操作,Home app直接就關(guān)鎖成功,而Siri關(guān)鎖成功的同時(shí)會(huì)給Home app發(fā)一條消息,告知鎖已關(guān)閉,如下:

wKgZO2jKEauAFHMKAABkY9EnbdU73.jpeg

大家除了可以從iOS設(shè)備看到開鎖或者關(guān)鎖成功的界面,也可以從輸出的串口日志看到開鎖或者關(guān)鎖成功的標(biāo)志,如下:

7. 開始你的Matter定制開發(fā)之旅

Matter開發(fā)主要包括兩方面的工作:一是Matter應(yīng)用本身的開發(fā),二是非Matter應(yīng)用開發(fā)。Matter應(yīng)用開發(fā)本質(zhì)上就是cluster/endpoint/node的添加、編輯、刪除以及相關(guān)回調(diào)事件處理等,如前所述,這個(gè)需要通過zcl編輯工具zap來生成ember層的代碼,以及手動(dòng)添加或者修改其他c++文件來實(shí)現(xiàn),下面一一對(duì)此進(jìn)行介紹。

下面例子我們是基于nRF Connect SDK v2.5.0例子:

nrfsamplesmattertemplate

來闡述的(v2.5.0是截止本文發(fā)表時(shí)的最高版本,對(duì)于讀者你來說,請(qǐng)選擇當(dāng)下最新版本)。

如果你第一次接觸nRF Connect SDK,建議你先讀完這篇文章:

開發(fā)你的第一個(gè)nRF Connect SDK/Zephyr應(yīng)用程序l,然后再往下看。

首先在VS Code的nRF Connect插件中重新選擇nRF Connect SDK v2.5.0和nRF Connect SDK Toolchain v2.5.0,如下:

wKgZO2jKEayAeEmrAABUSYRxfH426.jpeg

然后選擇Create New Application,并選擇Copy a sample,

選擇例程放置在哪里,

選擇Add to Workspace:

然后就可以按照4.3節(jié)的做法來編譯這個(gè)例子,選擇開發(fā)板:nrf52840dk_nrf52840,

然后選擇Build Configuration,開始編譯,視你的PC配置情況,編譯有可能耗時(shí)達(dá)10分鐘之久,編譯成功后,你將看到如下輸出:

下面我們將在此例程基礎(chǔ)上,對(duì)其進(jìn)行定制開發(fā),開發(fā)的內(nèi)容主要包括兩部分:一是添加Matter on/off light設(shè)備,二是添加藍(lán)牙LBS(LED和Button服務(wù))服務(wù),具體請(qǐng)見下文。

7.1 添加Matter On/Off Light設(shè)備

7.1.1 添加cluster

如前所述,我們可以使用ZAP來添加endpoint和cluster。首先我們確認(rèn)zap版本是否正確(前面我們來回切換nRF Connect SDK和Matter SDK,有可能會(huì)導(dǎo)致zap版本混亂,這里有必要再次確認(rèn)一下),輸入如下兩條命令進(jìn)行確認(rèn):

cd C:\ncs\v2.5.0\modules\lib\matter
python scripts/setup/nrfconnect/get_zap.py -l C:\Nordic\Tools\zap-win-x64 -o

ZAP工具安裝成功后,我們就可以用它來編輯zap文件,在我們這個(gè)項(xiàng)目里面,zap文件就是

C:/ncs/bulb/src/template.zap

template.zap是一個(gè)JSON文件,包含了應(yīng)用所有的cluster,command和attribute。我們可以使用如下命令打開這個(gè)zap文件:

zap C:/ncs/bulb/src/template.zap --zcl C:/ncs/v2.5.0/modules/lib/matter/src/app/zap-templates/zcl/zcl.json --gen C:/ncs/v2.5.0/modules/lib/matter/src/app/zap-templates/app-templates.json

cmd窗口如下所示:

同時(shí)彈出ZCL窗口:

可以看出,例子目前只有Endpoint 0,選擇Endpoint 0,并選擇“Enabled Clusters”,我們可以看到這個(gè)Endpoint使能了哪些cluster,比如Descriptor cluster。

下面我們添加一個(gè)Endpoint以支持Matter On/Off Light設(shè)備,選擇“ADD ENDPOINT”,在彈出的對(duì)話框中,選擇“Matter On/Off Light”,如下:

wKgZPGjKEa2ABqRbAAB82HOQ8Vg26.jpeg

請(qǐng)確認(rèn)on/off cluster已使能,然后點(diǎn)擊配置圖標(biāo)。

在彈出的對(duì)話框中,確認(rèn)On/Off Attribute已經(jīng)使能。

同時(shí)確認(rèn)Off和On命令已使能:

至此,我們的endpoint和cluster就添加成功了。

但上面的添加操作只是修改了zap文件,對(duì)我們SDK沒有做任何修改。接下來,我們就要使用一個(gè)Python腳本將這個(gè)zap文件轉(zhuǎn)成相應(yīng)的c++文件和頭文件,以讓這個(gè)修改操作可以編譯到我們的代碼中去。(大家也可以直接去創(chuàng)建相應(yīng)的c++文件和頭文件,但這個(gè)過程比較枯燥和繁瑣,所以我們才引入了zap工具和相應(yīng)的代碼轉(zhuǎn)換Python腳本)。

打開CMD,輸入如下命令:

cd C:ncsv2.5.0moduleslibmatter
python ./scripts/tools/zap/generate.py C:/ncs/bulb/src/template.zap -t src/app/zap-templates/app-templates.json -o C:/ncs/bulb/src/zap-generated

至此,cluster已經(jīng)添加到我們的應(yīng)用中了。

7.1.2 修改項(xiàng)目代碼

添加完cluster后,我們還需要修改項(xiàng)目代碼,以讓新添加的設(shè)備真正可以工作起來。這個(gè)工作主要包括兩部分:

添加Matter stack回調(diào)函數(shù),以處理controller發(fā)送過來的命令,比如開燈。這個(gè)主要通過覆蓋MatterPostAttributeChangeCallback()來實(shí)現(xiàn)

更新attribute數(shù)值,以讓Matter stack可以將最新的狀態(tài)或者event同步給controller。這個(gè)主要通過Clusters::OnOff::Attributes::OnOff::Set()之類的函數(shù)實(shí)現(xiàn)。

首先我們先實(shí)現(xiàn)MatterPostAttributeChangeCallback(),新建一個(gè)文件:src/zcl_callbacks.cpp,然后將如下代碼拷入:

#include "app_task.h"

#include 
#include 
#include 

using namespace ::chip;
using namespace ::chip::app::Clusters;

void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & attributePath, uint8_t type,
                                       uint16_t size, uint8_t * value)
{
        if (attributePath.mClusterId != OnOff::Id || attributePath.mAttributeId != OnOff::Attributes::OnOff::Id)
                return;

        AppEvent event;
        if (*value) {
            event.Type = AppEventType::TurnOnLED;
            event.Handler = AppTask::TurnOnLEDHandler;
        }
        else {
            event.Type = AppEventType::TurnOffLED;
            event.Handler = AppTask::TurnOffLEDHandler;
        }
        AppTask::Instance().PostEvent(event);
}

本來代碼邏輯可以更簡(jiǎn)單,當(dāng)收到On命令時(shí),調(diào)用sBulbLED.Set(true)開燈;收到Off命令時(shí),調(diào)用sBulbLED.Set(false)關(guān)燈。但這種做法會(huì)影響Matter協(xié)議棧的行為,因此我們把sBulbLED.Set()操作扔到一個(gè)event queue中去執(zhí)行,而AppTask正好有一個(gè)現(xiàn)成的sAppEventQueue,我們正好可以加以利用,這樣當(dāng)收到On命令時(shí),我們把TurnOnLED事件扔到Event queue,然后在AppTask主循環(huán)中取出該事件,并調(diào)用該事件的handler:TurnOnLEDHandler。Off命令的處理情況也類似。我們?cè)赼pp_task.cpp加入如下代碼:

void AppTask::TurnOnLEDHandler(const AppEvent &)
{
    LOG_INF("TurnOnLEDHandler");
    sBulbLED.Set(true);
}

void AppTask::TurnOffLEDHandler(const AppEvent &)
{
    LOG_INF("TurnOffLEDHandler");
    sBulbLED.Set(false);
}

其中sBulbLED定義如下:

LEDWidget sBulbLED;

我們同時(shí)在AppTask::Init()中對(duì)其做如下初始化:

sBulbLED.Init(DK_LED2);
sBulbLED.Set(false);

然后不要忘了在app_task.h中聲明TurnOnLEDHandler和TurnOffLEDHandler,如下:

static void TurnOnLEDHandler(const AppEvent &);
static void TurnOffLEDHandler(const AppEvent &);

為了讓AppTask可以處理上面的TurnOnLED和TurnOffLED事件,我們需要在app_event.h修改如下定義:

enum class AppEventType : uint8_t { None = 0, Button, ButtonPushed, ButtonReleased, Timer, UpdateLedState, TurnOnLED, TurnOffLED};

為了讓app_task.cpp訪問cluster attribute,比如Clusters::OnOff::Attributes::OnOff::Set(),需要加入如下頭文件:(注:本文我們并沒有調(diào)用Clusters::OnOff::Attributes::OnOff::Set(),但實(shí)際應(yīng)用肯定會(huì)調(diào)用它的)

#include 

最后我們把src/zcl_callbacks.cpp文件添加到CMakeLists.txt,如下:

wKgZO2jKEa6AICA5AABOtIpbi1g59.jpeg

然后我們就可以編譯了,成功后會(huì)有如下顯示信息:

7.1.3 測(cè)試

我們可以按照第6章的方式,測(cè)試這個(gè)新的Matter設(shè)備,這里就不再贅述了。設(shè)備配網(wǎng)成功后,iOS Home app將會(huì)看到如下設(shè)備:

wKgZO2jKEa6AKaj4AABzBuMREdo07.jpeg

操作燈泡的界面如下所示:

wKgZPGjKEa-AcAXVAABPfqtZ3Zs64.jpeg

7.2 添加藍(lán)牙LBS服務(wù)(LED和Button服務(wù))

在nRF Connect SDK中,Matter相關(guān)代碼都是用C++撰寫的,除此之外,其他代碼都是使用C代碼編寫的。兩者渾然一體,各自運(yùn)行良好。

因此,我們只要參考nrfsamplesbluetoothperipheral_lbs這個(gè)例子,就可以把LBS服務(wù)加入到例子中。

首先我們把nrfsamplesbluetoothperipheral_lbssrcmain.c,改名為lbs.c,并拷貝到項(xiàng)目的src目錄下,即C:ncsbulbsrc。然后在CMakeLists.txt文件中添加此文件:

wKgZO2jKEbCATuAWAABnfUEEN_o26.jpeg

然后我們需要對(duì)lbs.c文件作幾處修改。首先main()函數(shù)已經(jīng)被C++占用了,

我們需要把lbs.c里面的main()函數(shù)換成一個(gè)普通線程,為此,我們先定義一個(gè)靜態(tài)線程:

K_THREAD_DEFINE(ble_lbs_thread_id, 1024, ble_lbs_thread, NULL, NULL,
  NULL, 7, 0, 0);

然后把int main(void)改成:

int ble_lbs_thread(void)

由于在Matter應(yīng)用部分我們已經(jīng)調(diào)用了bt_enable(),dk_leds_init(),init_button(),bt_le_adv_start(),settings_load()等,因此我們把lbs.c中相關(guān)調(diào)用刪掉。實(shí)際上我們只需要bt_lbs_init()這一個(gè)初始化函數(shù)。

由于Matter應(yīng)用和lbs.c中都使用了LED模塊,為了有一個(gè)更好的直觀效果,我們把lbs.c中的

#define RUN_STATUS_LED DK_LED1
#define CON_STATUS_LED DK_LED2

改成

#define RUN_STATUS_LED DK_LED4
#define CON_STATUS_LED DK_LED4

最后我們合并兩個(gè)項(xiàng)目的prj.conf文件,即把

CONFIG_BT_LBS=y
CONFIG_BT_LBS_POLL_BUTTON=y

添加到項(xiàng)目的prj.conf文件中。

至此項(xiàng)目代碼修改完畢,我們可以編譯了,編譯成功后,下載代碼到板子中,打開手機(jī)app:nRF Connect,將看到如下廣播:

wKgZPGjKEbCAJ4EuAAB-9uz8yFU50.jpeg

點(diǎn)擊“CONNECT”,連接成功后,我們將看到LBS服務(wù),如下:

wKgZPGjKEbGAL06aAAC5y7kTbWw00.jpeg

然后我們可以對(duì)LED這個(gè)特征進(jìn)行操作:ON或者OFF,板子上的LED3將跟隨命令而變化。

wKgZO2jKEbKAFKFYAABE2Ut7ngc03.jpeg

7.3 C代碼與C++代碼混合編程

7.3.1概述

從上面例子大家可以看出,添加Matter設(shè)備的時(shí)候,我們使用的是C++代碼;添加藍(lán)牙LBS服務(wù)的時(shí)候,我們使用的是C代碼。一個(gè)工程中同時(shí)存在C和C++代碼,這是Matter應(yīng)用一個(gè)非常突出的特性,這就要求我們既需要理解C語言代碼,也需要了解一定的C++代碼,所以Matter開發(fā)是一個(gè)比較復(fù)雜而富有挑戰(zhàn)的工作。

在Matter開發(fā)中,大家碰到一個(gè)很常見的問題是:如何讓C代碼調(diào)用外部C++代碼編寫的API,或者如何讓C++代碼調(diào)用外部C代碼編寫的API。

關(guān)于C++代碼調(diào)用外部C代碼API,前面其實(shí)已經(jīng)出現(xiàn)過多次,這個(gè)跟C代碼調(diào)用C代碼API一模一樣,比如在app_task.cpp中,調(diào)用了如下外部C語言API:dk_buttons_init,k_msgq_get,k_timer_start等,可以看出跟普通調(diào)用幾乎沒有區(qū)別。

關(guān)于C代碼調(diào)用外部C++代碼API,這個(gè)處理起來就稍微復(fù)雜一些。如果C代碼只是調(diào)用一個(gè)全局的C++函數(shù),那么我們需要把該函數(shù)申明為extern "C",然后就可以被C代碼調(diào)用了;但是C編譯器又不識(shí)別extern "C",因此我們一般在頭文件中使用如下申明:

wKgZPGjKEbOAOU7FAAAwtui30Mw34.jpeg

其中start_lbs_adv()就是一個(gè)可以被C調(diào)用的C++函數(shù)。

還有一種情況,就是C要調(diào)用C++類里面的函數(shù),這個(gè)時(shí)候我們就需要先獲得類對(duì)應(yīng)的實(shí)例,然后通過實(shí)例去引用本實(shí)例自身的函數(shù)。如何獲得實(shí)例的引用是整個(gè)調(diào)用最關(guān)鍵的部分,好在Matter應(yīng)用中,我們使用了Singleton(單例)模式,也就是說每個(gè)類只會(huì)創(chuàng)建一個(gè)靜態(tài)的全局實(shí)例,這也就意味著類函數(shù)調(diào)用跟全局函數(shù)調(diào)用差不多,通過這個(gè)靜態(tài)全局實(shí)例,我們就可以調(diào)用類里面任何公共(public)函數(shù),比如類AppTask,它的靜態(tài)全局實(shí)例可以通過AppTask::Instance()獲得,得到這個(gè)實(shí)例后,我們就可以調(diào)用AppTask里面任何公共函數(shù)了,比如StartApp(),這樣完整調(diào)用例子就變成:AppTask::Instance().StartApp()。

由于我們不會(huì)去更改SDK任何原始代碼,我們需要建一個(gè)CPP文件作為橋梁去調(diào)用其他CPP文件里面的API,這樣就可以保證SDK原始的CPP文件不會(huì)動(dòng),我們只需要修改該新建的CPP文件就可以完成我們的目標(biāo)。

下面我們結(jié)合實(shí)際應(yīng)用場(chǎng)景來看看C和C++是如何相互交互的。還是以上面的工程為例,我們要添加兩項(xiàng)工作:一是增加LBS原始的廣播,二是當(dāng)Button狀態(tài)變化時(shí),通知到手機(jī)app。

7.3.2 C調(diào)用外部C++函數(shù)示例

本來啟動(dòng)廣播直接調(diào)用bt_le_adv_start()即可,為了演示C調(diào)用外部C++ API,這次我們通過調(diào)用BLEAdvertisingArbiter::InsertRequest來實(shí)現(xiàn)。

首先我們新建兩個(gè)文件:lbs_adv.cpp和lbs_adv.h,在lbs_adv.h我們定義如下可以被C調(diào)用的C++ API:

#pragma once

#ifdef __cplusplus
extern "C"
{
#endif

void start_lbs_adv();

#ifdef __cplusplus
}
#endif

然后我們?cè)趌bs_adv.cpp中實(shí)現(xiàn)start_lbs_adv(),實(shí)現(xiàn)代碼如下所示:

/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

#include "lbs_adv.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 

using namespace ::chip;

constexpr uint8_t kAdvertisingFlags    = BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR;
constexpr uint8_t serviceData[] = {BT_UUID_LBS_VAL};
constexpr uint8_t name[] = "LBS_ADV";

void lbs_adv_started(int rc)
{
    printk("LBS advertising started:%dn", rc);
}

void lbs_adv_stopped()
{
    printk("LBS advertising stoppedn");
}

void start_lbs_adv()
{
    static std::array advertisingData;
    static std::array scanResponseData;
    static chip::DeviceLayer::BLEAdvertisingArbiter::Request lbsAdvRequest = {};

    advertisingData[0]  = BT_DATA(BT_DATA_FLAGS, &kAdvertisingFlags, sizeof(kAdvertisingFlags));
    advertisingData[1]  = BT_DATA(BT_DATA_NAME_COMPLETE, name, sizeof(name));
    scanResponseData[0] = BT_DATA(BT_DATA_UUID128_ALL, serviceData, sizeof(serviceData));
    lbsAdvRequest.priority    = 2;
    lbsAdvRequest.options     = BT_LE_ADV_OPT_CONNECTABLE;
    lbsAdvRequest.minInterval = 360;
    lbsAdvRequest.maxInterval = 500;
    lbsAdvRequest.advertisingData  = Span(advertisingData);
    lbsAdvRequest.scanResponseData = Span(scanResponseData);
    lbsAdvRequest.onStarted = lbs_adv_started;
    lbsAdvRequest.onStopped = lbs_adv_stopped;

    chip::DeviceLayer::BLEAdvertisingArbiter::InsertRequest(lbsAdvRequest);    
}

可以看出start_lbs_adv()最終調(diào)用了Matter C++庫函數(shù): BLEAdvertisingArbiter::InsertRequest()。

最后我們?cè)趌bs.c文件中調(diào)用start_lbs_adv(),這樣當(dāng)Matter配網(wǎng)廣播超時(shí)之后,我們的LBS廣播就會(huì)自動(dòng)啟動(dòng)。為了更快地觀察到效果,大家可以把moduleslibmattersrcincludeplatformCHIPDeviceConfig.h中的CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS定義做如下修改:

#define CHIP_DEVICE_CONFIG_DISCOVERY_TIMEOUT_SECS (3 * 60)

將編譯成功的代碼燒錄到板子,3分鐘超時(shí)過后,大家可以看到如下廣播:

wKgZO2jKEbOAESo3AACmqLgpHCA83.jpeg

同時(shí)串口日志會(huì)有如下顯示:

wKgZPGjKEbSAcmZjAAC4LeAMMvs68.jpeg

這個(gè)時(shí)候我們點(diǎn)擊“CONNECT”,連接這個(gè)設(shè)備,會(huì)發(fā)現(xiàn)設(shè)備只包含LBS服務(wù),之前的CHIPoBLE配網(wǎng)服務(wù)由于超時(shí)已經(jīng)被解除注冊(cè)了,如下:

wKgZO2jKEbWATR2cAABQq_pvEco08.jpeg

7.3.3 C++調(diào)用外部C函數(shù)示例

現(xiàn)在我們完成第二個(gè)工作:當(dāng)Button狀態(tài)變化時(shí),通知到手機(jī)app。

這個(gè)工作在原始的peripheral_lbs例程中,是通過在button_changed回調(diào)函數(shù)中調(diào)用bt_lbs_send_button_state()實(shí)現(xiàn),由于在app_task.cpp中我們已經(jīng)實(shí)現(xiàn)了按鍵的回調(diào)函數(shù):AppTask::ButtonEventHandler,我們將在AppTask::ButtonEventHandler中調(diào)用bt_lbs_send_button_state()來實(shí)現(xiàn)我們的目的。

首先在app_task.cpp中包含如下文件:

#include 

然后直接在AppTask::ButtonEventHandler中調(diào)用bt_lbs_send_button_state(),如下:

至此,代碼已全部更改完畢??梢钥闯鯟++調(diào)用外部C函數(shù)的確比較簡(jiǎn)單,沒有任何多余的操作。

再次編譯代碼,并將新程序燒錄到板子中。跟前面操作一樣,通過手機(jī)app:nRF Connect連上板子后,并使能Button特征對(duì)應(yīng)的CCCD,然后我們按下或者松開板子上的按鍵1,手機(jī)app的Button特征值會(huì)跟隨一起變化,如下:

wKgZPGjKEbWAEGIEAACW8vEEz7Q97.jpeg

項(xiàng)目最終代碼大家可以從這里下載:

matter_bulb.zip

8. Matter產(chǎn)品量產(chǎn)注意事項(xiàng)

nRF Connect SDK或者M(jìn)atter SDK例子默認(rèn)配置都是開發(fā)者模式,這種模式是不能量產(chǎn)的。因此,在產(chǎn)品量產(chǎn)之前,我們還需要做一些額外的配置。

8.1 Matter認(rèn)證(Certification)

純藍(lán)牙或者Wi-Fi產(chǎn)品,即使不通過認(rèn)證,也是可以量產(chǎn)的,因?yàn)樗{(lán)牙和Wi-Fi更強(qiáng)調(diào)他們的連接標(biāo)準(zhǔn)性。跟純藍(lán)牙或Wi-Fi標(biāo)準(zhǔn)不一樣,Matter是一個(gè)應(yīng)用級(jí)別的標(biāo)準(zhǔn),而且Matter使用了PKI技術(shù)進(jìn)行鑒定(authenticate),這就意味著Matter產(chǎn)品必須經(jīng)過認(rèn)證(certification),才能確保產(chǎn)品的互聯(lián)互通性。

對(duì)于藍(lán)牙和Wi-Fi新產(chǎn)品認(rèn)證,如果它完全繼承芯片原廠或者模塊商的認(rèn)證,那么它是可以免除ATL實(shí)驗(yàn)室的測(cè)試。對(duì)于Matter新產(chǎn)品,它必須經(jīng)過ATL實(shí)驗(yàn)室的測(cè)試,然后才能獲得認(rèn)證證書。當(dāng)然Matter也有快速認(rèn)證,前提是你必須有一款產(chǎn)品已經(jīng)獲得過認(rèn)證,新產(chǎn)品是在已認(rèn)證產(chǎn)品的基礎(chǔ)上做微小改動(dòng)情況下,才能免除ATL實(shí)驗(yàn)室的測(cè)試。

前面也提及過,過Matter認(rèn)證之前,你必須先確保你的產(chǎn)品已經(jīng)通過藍(lán)牙和Thread或Wi-Fi認(rèn)證。而且要獲得產(chǎn)品認(rèn)證資格,你還必須加入相關(guān)聯(lián)盟,這也會(huì)產(chǎn)生一定費(fèi)用。

關(guān)于Matter認(rèn)證的詳細(xì)說明,請(qǐng)參考:

https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/protocols/matter/end_product/certification.html。

Matter認(rèn)證過程中,有一份PICS文件非常重要,這個(gè)需要你提交給ATL和CSA。關(guān)于如何生成自己產(chǎn)品對(duì)應(yīng)的PICS文件,還是請(qǐng)參考上面鏈接。

8.2 生態(tài)系統(tǒng)的認(rèn)證

獲得了Matter認(rèn)證,就意味著你的產(chǎn)品跟所有Matter生態(tài)都是互聯(lián)互通的。由于種種原因,每個(gè)生態(tài)還有自己的認(rèn)證,比如Google有Works with Google Home認(rèn)證,Amazon有Frustration-Free Setup(FFS)認(rèn)證。這些認(rèn)證其實(shí)不是必須的,看大家的意愿去選擇要不要過這些認(rèn)證。具體請(qǐng)見:

https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/protocols/matter/end_product/ecosystems_certification.html。

8.3 Certification Declaration(CD)固化

當(dāng)你通過了CSA的Matter認(rèn)證后,CSA會(huì)頒發(fā)一個(gè)CD證書給你。按照Matter規(guī)定,你每升級(jí)一次固件,都需要重做一次認(rèn)證(這個(gè)認(rèn)證是免費(fèi)的哦),每重做一次認(rèn)證,CSA都會(huì)頒發(fā)一個(gè)新的CD證書給你,然后你通過OTA把這個(gè)新CD取代老CD。

CD一個(gè)最重要的作用,就是在設(shè)備配網(wǎng)過程中,充當(dāng)設(shè)備自證(Device Attestation)申明。因此我們需要把CD和固件一起燒入到設(shè)備中。最簡(jiǎn)單的方法,就是定義一個(gè)宏,固化到固件中,但這種方法無法更新CD。

還有一種方法,就是把CD放在一個(gè)特殊Flash區(qū)域,比如Settings或者NVS區(qū)域,這樣我們就可以通過Settings或者NVS API更新它。更多細(xì)節(jié)請(qǐng)見:

https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/protocols/matter/end_product/configuring_cd.html。

8.4 如何獲取PAI和DAC證書/私鑰

DAC,全稱Device Attestation Certificate,即設(shè)備自證證書,DAC證書和DAC私鑰對(duì)每個(gè)設(shè)備來說都是唯一的,也就是大家常說的“一機(jī)一密”。PAI,全稱Product Attestation Intermediate,一般一個(gè)產(chǎn)品類別對(duì)應(yīng)一個(gè)唯一PAI,每個(gè)產(chǎn)品下面有許許多多的設(shè)備,所以PAI是用來簽署前面的DAC證書的。

對(duì)于量產(chǎn)產(chǎn)品來說,你只能使用CSA認(rèn)證過的CA機(jī)構(gòu)簽發(fā)的PAI以及DAC公私鑰對(duì),大家可以聯(lián)系CSA授權(quán)的CA機(jī)構(gòu)去購買相應(yīng)證書和密鑰。

在產(chǎn)品開發(fā)過程中,如果你不想使用SDK默認(rèn)的測(cè)試證書,那么也可以通過chip-cert來生成自己的測(cè)試證書,具體請(qǐng)參見8.3節(jié)和8.5節(jié)的兩個(gè)鏈接里面的介紹。

8.5 Factory data燒寫

Matter產(chǎn)品量產(chǎn)的時(shí)候,有很多信息需要燒入到設(shè)備中,并且整個(gè)產(chǎn)品生命周期不再會(huì)改變,這些信息就稱為出廠數(shù)據(jù)(factory data)。對(duì)于Matter設(shè)備來說,前面所述的DAC證書,PAI證書,供應(yīng)商ID,產(chǎn)品ID,序列號(hào),配網(wǎng)信息等,都屬于出廠信息。

為了保證大家可以生成自己需要的factory data,以及把這些factory data正確燒入到設(shè)備中,nRF Connect SDK準(zhǔn)備了兩個(gè)Python腳本:generate_nrfconnect_chip_factory_data.py用來生成JSON格式的出廠數(shù)據(jù)/配對(duì)碼/配對(duì)二維碼等,以及nrfconnect_generate_partition.py用來把前面的JSON文件轉(zhuǎn)成hex文件,這樣就可以通過nrfjprog等J-link工具把hex文件燒入到設(shè)備中。

具體來說,我們可以按照下面步驟來完成出廠數(shù)據(jù)燒寫工作:

在prj.conf中加入:

CONFIG_CHIP_FACTORY_DATA=y

然后重新編譯項(xiàng)目,待編譯成功后,將代碼燒錄板子中。

打開VS Code的nRF Connect終端,然后輸入如下命令:

cd C:ncsv2.5.0moduleslibmatter
python scripts/tools/nrfconnect/generate_nrfconnect_chip_factory_data.py --sn "99887766554433221100" --vendor_id 65521 --product_id 32774 --vendor_name "Nordic" --product_name "MyLock" --date "2024-02-05" --hw_ver 1 --hw_ver_str "release" --dac_cert "credentials/development/attestation/Matter-Development-DAC-FFF1-8006-Cert.der" --dac_key "credentials/development/attestation/Matter-Development-DAC-FFF1-8006-Key.der" --pai_cert "credentials/development/attestation/Matter-Development-PAI-FFF1-noPID-Cert.der" --spake2_it 1000 --spake2_salt "U1BBS0UyUCBLZXkgU2FsdA==" --discriminator 0x666 --generate_rd_uid --rd_uid e2eb609c5a793e5e9de536c211246a2e --include_passcode --passcode 666888 --product_finish "matte" --product_color "black" --out "c:/ncs/bulb/factory_data.json" --schema "scripts/tools/nrfconnect/nrfconnect_factory_data.schema" --overwrite

注意:上面的DAC和PAI還是測(cè)試用證書,記得換成自己購買的證書。sn/vendor_id/product_id/vendor_name/discriminator/passcode/spake2_it/spake2_salt等等其他參數(shù)也需要按照你們的需求做相應(yīng)調(diào)整。

日志如下所示:

確認(rèn)configurationnrf52840dk_nrf52840(或者其他板子對(duì)應(yīng)目錄)對(duì)應(yīng)的pm_static.yml包含factory_data分區(qū),并記下分區(qū)的起始地址,下面需要用到這個(gè)地址值。

wKgZO2jKEbeAJWTgAADrnqkdp8Y66.jpeg

然后在VS Code nRF Connect終端中執(zhí)行如下命令:

python scripts/tools/nrfconnect/nrfconnect_generate_partition.py -i c:/ncs/bulb/factory_data.json -o c:/ncs/bulb/factory_data --offset 0xf7000 --size 0x1000

offset和size就是前面pm_static.yml文件中的address和size

執(zhí)行結(jié)果如下所示:

把上述生成的出廠數(shù)據(jù)燒錄到設(shè)備中,這可以通過如下命令實(shí)現(xiàn):

nrfjprog -f nrf52 --program c:/ncs/bulb/factory_data.hex --sectorerase --verify --reset

執(zhí)行結(jié)果如下所示:

這時(shí),觀察串口日志,我們發(fā)現(xiàn)設(shè)備的配網(wǎng)信息已發(fā)生改變,如下:

wKgZO2jKD-GAZbssAAIgA-u2yOU550.png

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Matter
    +關(guān)注

    關(guān)注

    1

    文章

    307

    瀏覽量

    6940
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    芯科科技2025年Works With開發(fā)者大會(huì)深圳站Matter技術(shù)專場(chǎng)前瞻

    為了讓更多開發(fā)者深入了解物聯(lián)網(wǎng)互聯(lián)互通的前沿技術(shù)-Matter及其開發(fā)技巧,Silicon Labs(芯科科技)將于10月23日在深圳灣萬麗酒店舉辦“Works With開發(fā)者大會(huì)深圳
    的頭像 發(fā)表于 09-30 09:38 ?355次閱讀

    如何快速開發(fā)符合Matter標(biāo)準(zhǔn)的智能家居設(shè)備?

    Matter是由亞馬遜、蘋果、谷歌等國(guó)際生態(tài)巨頭攜手CSA聯(lián)盟(原Zigbee聯(lián)盟)針對(duì)智能家居行業(yè)開發(fā)種開源性的互操作標(biāo)準(zhǔn),其允許運(yùn)行在不同通信協(xié)議下的、不同類別及品牌的智能家居設(shè)備能在同
    的頭像 發(fā)表于 08-07 17:35 ?2062次閱讀
    如何快速<b class='flag-5'>開發(fā)</b>符合<b class='flag-5'>Matter</b>標(biāo)準(zhǔn)的智能家居設(shè)備?

    Matter相關(guān)術(shù)語的定義

    自2022年Matter發(fā)布以來,產(chǎn)品制造商和消費(fèi)者對(duì)其開發(fā)、設(shè)備集成及應(yīng)用的步伐迅速加快。Matter提供標(biāo)準(zhǔn)化的通用語言,使智能設(shè)備能夠相互通信,為智能家居帶來統(tǒng)性。
    的頭像 發(fā)表于 07-23 11:37 ?814次閱讀
    <b class='flag-5'>Matter</b>相關(guān)術(shù)語的定義

    芯科科技亮相2025 Matter開放日和開發(fā)者大會(huì)

    2025年Matter開放日(MOD)和開發(fā)者大會(huì)(MDC)在上周6月12-13日?qǐng)A滿成功舉辦,Silicon Labs(芯科科技)延續(xù)直以來傾力支持Matter標(biāo)準(zhǔn)發(fā)展的策略,攜
    的頭像 發(fā)表于 06-18 14:22 ?832次閱讀

    Matter采用基于標(biāo)準(zhǔn)的無線技術(shù)

    通過提供主要供應(yīng)商生態(tài)系統(tǒng)之間的互操作性,Matter 承諾讓消費(fèi)者安心,無論他們購買什么智能家居設(shè)備,都能與任何其他通過 Matter 認(rèn)證的設(shè)備起使用,從而推動(dòng)智能家居技術(shù)的廣泛普及
    發(fā)表于 05-19 15:37

    Matter 智能家居的通用語言

    Matter由連接標(biāo)準(zhǔn)聯(lián)盟(CSA)創(chuàng)建,旨在解決智能家居的互操作性問題。Matter 基于簡(jiǎn)單性、互操作性、可靠性和安全性四大核心原則 。 是采用基于 IP 應(yīng)用層的開源協(xié)議,本質(zhì)上是種“通用
    發(fā)表于 05-19 15:35

    代物聯(lián)網(wǎng):芯科科技和Arduino借助邊緣AI和ML簡(jiǎn)化Matter設(shè)計(jì)和應(yīng)用

    Silicon Labs(芯科科技)和Arduino宣布建立合作伙伴關(guān)系,旨在通過Arduino Nano Matter開發(fā)板(基于芯科科技的MGM240系列多協(xié)議無線模塊)的兩階段合作來簡(jiǎn)化Matter協(xié)議的設(shè)計(jì)和應(yīng)用
    的頭像 發(fā)表于 05-19 11:15 ?480次閱讀
    下<b class='flag-5'>一</b>代物聯(lián)網(wǎng):芯科科技和Arduino借助邊緣AI和ML簡(jiǎn)化<b class='flag-5'>Matter</b>設(shè)計(jì)和應(yīng)用

    2025 Matter如何變更好?

    當(dāng)Matter 1.0標(biāo)準(zhǔn)在2022年秋季橫空出世時(shí),智能家居行業(yè)曾為之振奮。這一由蘋果、谷歌、亞馬遜等科技巨頭聯(lián)手打造的開放協(xié)議,立志終結(jié)設(shè)備間互不兼容的混亂現(xiàn)狀,為行業(yè)帶來全新希望。在隨后的兩年
    的頭像 發(fā)表于 05-16 17:12 ?523次閱讀

    Nordic的matter是如何做的

    。 Nordic的參與Nordic 積極參與了 Matter開發(fā),是其主要貢獻(xiàn)者之。我們是首家獲得 Thread 1.3 認(rèn)證徽章的公司。該徽章可由我們的客戶繼承,用于他們的 Thread 產(chǎn)品,并且是
    發(fā)表于 04-27 11:24

    通用Matter over thread 模組

    PTR5415是款通用Matter over thread 模組,它支持接入蘋果等matter over thread 生態(tài),實(shí)現(xiàn)基于matter over thread的連接和控制
    發(fā)表于 03-26 14:42

    倒計(jì)時(shí)8天! 免費(fèi)開發(fā)板申領(lǐng)即將截止|2025 Matter 應(yīng)用開發(fā)比賽

    ?倒計(jì)時(shí)8天! 2025 Matter應(yīng)用開發(fā)比賽 免費(fèi)開發(fā)板申領(lǐng)即將截止 ? “讓你的智能設(shè)備能無縫接入蘋果、谷歌、亞馬遜的生態(tài)系統(tǒng),而這一切只需
    發(fā)表于 02-21 14:56 ?332次閱讀
    倒計(jì)時(shí)8天! 免費(fèi)<b class='flag-5'>開發(fā)</b>板申領(lǐng)即將截止|2025 <b class='flag-5'>Matter</b> 應(yīng)用<b class='flag-5'>開發(fā)</b>比賽

    芯科科技Web-BasedFlash工具助力優(yōu)化Matter開發(fā)流程

    Silicon Labs(芯科科技)獨(dú)家提供Matter開發(fā)流程(Matter Developer Journey)設(shè)計(jì)資源,以作為其不斷努力提升開發(fā)者體驗(yàn),并簡(jiǎn)化該協(xié)議
    的頭像 發(fā)表于 02-20 09:52 ?749次閱讀

    成功案例分享 — 芯科科技助力涂鴉智能打造Matter over Thread模塊,簡(jiǎn)化Matter設(shè)備開發(fā)

    涂鴉智能使用芯科科技的MG24 SoC打造Matter over Thread模塊
    的頭像 發(fā)表于 01-09 16:39 ?772次閱讀

    Arduino Nano Matter開發(fā)板正式上市

    Silicon Labs(芯科科技)和Arduino在近日共同宣布Arduino Nano Matter開發(fā)板現(xiàn)已正式上市。這是延續(xù)今年3 月芯科科技和Arduino釋出Arduino Nano
    的頭像 發(fā)表于 12-10 13:50 ?1255次閱讀

    Matter SVE認(rèn)證經(jīng)驗(yàn)分享

    Matter開發(fā)中,經(jīng)常需要進(jìn)行自測(cè)試,使用連接標(biāo)準(zhǔn)聯(lián)盟(CSA)提供的TestHarness(TH)工具驗(yàn)證Matter設(shè)備的功能,而參加CSA舉辦的Test Event(TE)活動(dòng)以及
    的頭像 發(fā)表于 11-13 09:16 ?1677次閱讀
    <b class='flag-5'>Matter</b> SVE認(rèn)證經(jīng)驗(yàn)分享