Provision statck
下圖是provision的stack架構(gòu),分為三層,左邊基于Adv,右邊基于GATT

Provision bearer layer
bearer,送信人的意思,表示傳輸媒介
兩種bearer構(gòu)成:
- PB-ADV
- PB-GATT
一個(gè)未配對(duì)的設(shè)備應(yīng)該支持上述兩種中的一種,強(qiáng)烈建議都支持。
Provisioner(發(fā)起配對(duì)方)應(yīng)該支持至少一種,強(qiáng)烈建議支持PB-ADV
PB-ADV
通過adv channels傳遞Generic Provisioning PDUs,基于會(huì)話,一個(gè)未綁定的設(shè)備只能同時(shí)支持一個(gè)會(huì)話,Provisioner沒有限制。會(huì)話的建立使用Link Establishment procedure。
MTU(maximum transmission unit)大小是24個(gè)字節(jié)
設(shè)備要能主動(dòng)掃描(close to 100% duty)避免丟包。
任何使用PB-ADV的廣播應(yīng)該是非連接的非定向掃描的。(non-connectable, non-scannable undirected)
PB-ADV數(shù)據(jù)格式:

PB-ADV PDU格式

- Link ID:
區(qū)分每個(gè)link - transaction number:
PDU過長(zhǎng),分段,所有的分段使用同樣的transaction number。
PDU重發(fā)的時(shí)候,分段號(hào)也不變。
Provisioner上該值的范圍0x000x7F,device上該值的范圍0x800xFF。
當(dāng)一個(gè)設(shè)備收到Provisioning PDU,它應(yīng)該把該值設(shè)置為收到的值
當(dāng)一個(gè)設(shè)備發(fā)送Transaction Acknowledgement PDU,該值應(yīng)該被設(shè)為被承認(rèn)的PB-ADV中的值----發(fā)ack的時(shí)候,使用雙方協(xié)定好的transaction number。
PB-GATT
允許綁定設(shè)備,通過Proxy PDUs。
連接間隔建議250ms~1000ms
Proxy Protocol
該協(xié)議允許節(jié)點(diǎn)收發(fā)Network PDUs,mesh beacons,proxy configuration messages and Provisioning PDUs over a connection-oriented bearer。
Proxy PDUs包含Network PDUs,Mesh beacons, proxy configuration messages or provisioning PDU。
mesh消息轉(zhuǎn)發(fā)的協(xié)議
Generic Provisioning layer
傳輸Generic Provisioning PUDs的。
Generic Provisioning PDU types:
- Transaction Start
- Transaction Acknowledgement
- Transaction Continuation
- Provisioning Bearer Control(會(huì)話管理)
- Link Open
- Link ACK
- Link Close
- RFU(reserved for future use)
Link Establishment procedure
不同設(shè)備靠Device UUID區(qū)分
Device UUID,128-bit UUID,因?yàn)閙ac地址太簡(jiǎn)單了,不夠復(fù)雜

- 每個(gè)Generic Provisioning PDU應(yīng)該有20~50ms延時(shí)
- 分段
- segments index 0~63個(gè),第一個(gè)發(fā)transaction start PDU, 其他的發(fā)transaction continuation PDU.
Provisioning protocol
Provisioning PDUs
發(fā)起者和設(shè)備之間交流的媒介。
格式如下:

type如下:

傳輸層協(xié)議使用帶外數(shù)據(jù)(out-of-band,OOB)來發(fā)送一些重要的數(shù)據(jù),如果通信一方有重要的數(shù)據(jù)需要通知對(duì)方時(shí),協(xié)議能夠?qū)⑦@些數(shù)據(jù)快速地發(fā)送到對(duì)方.為了發(fā)送這些數(shù)據(jù),協(xié)議一般不使用與普通數(shù)據(jù)相同的通道,而是使用另外的通道.
Provisioning behavior
Provisioning is performed using a five-step process:
- beaconing
- invitation
- exchanging public keys(ECDH加密用的)
- authentication
- distribution of the provisioning data
ECDH,Deffie-Hellman 算法是 密鑰交換算法,它的作用是解決如何在不安全的信道中安全的傳輸一些信息(主要是交換對(duì)稱加密的密鑰/參數(shù))。ECDH 就是使用橢圓曲線函數(shù)的 DH 算法
a,b都有一對(duì)公鑰,各自根據(jù)公鑰計(jì)算出密鑰,使用該密鑰就行加密
下圖是Provisioning process的整體流程,在下一節(jié)會(huì)對(duì)每個(gè)流程做詳細(xì)描述。

Provisioning errors
一旦中間失敗,沒有恢復(fù)機(jī)制,必須從新開始配對(duì)。
發(fā)起方發(fā)生錯(cuò)誤,會(huì)立即斷開連接。
接收方發(fā)生錯(cuò)誤,發(fā)送一個(gè)Failed PDU給發(fā)起方,由發(fā)起方斷開連接。60s超時(shí)后,可以不同發(fā)送Failed PDU。
流程詳解
基于PB-ADV

- Invitation & Capabilities
建立連接,檢測(cè)device的兼容性。
兼容性主要指:支持什么加密方式,(目前只有一種加密方法FIPS P-256 Elliptic Curve,
就是ECDH),支不支持OOB等一些行為。 - Exchanging public keys
支持加密,即交換公共密鑰,不支持不用
不支持加密的流程

支持加密的流程

-
Authentication
認(rèn)證,主要有三種方式。
1.Output OOB
device上展示一個(gè)Random number,用戶在provisioner上輸入這個(gè)number
2.Input OOB
provisioner上展示一個(gè)Random number,用戶在device上輸入
3.Static OOB/no OOB
沒有Random number
下述是三種方式的流程圖
Output OOB
image.png
Input OOB

Static OOB

-
Distribution of Provisioning data
該環(huán)節(jié)主要用來發(fā)送Network Key,IV index, Unicast Address(分配給節(jié)點(diǎn)的)等信息。然后該環(huán)節(jié)還會(huì)計(jì)算出一個(gè)session key用來加密Provisioning data。
Provisioning data如下:
image.png
加密
目前只支持一種加密方式FIPS P-256 Elliptic Curve,整體加密流程如下:
P是public key


最終算出一個(gè)session key用來加密provisioning data這些信息。

