---
# System prepended metadata

title: G3-PLC Study Note
tags: [PLC, Power Line Communication, G3]

---

# G3-PLC Study Note
![](https://i.imgur.com/TzBrXVD.png)

此為G3聯盟所制定的規格，主要是用在窄帶的電力線通訊上。
制定的範疇只包含Physical和Data Link。

![](https://i.imgur.com/96m4dHC.png)

資料鏈結層(Data Link)主要又分為
* 6LoWPAN
    * Bootstrap
    * IPv6 Header Compression
    * Fragmentation
    * Mesh
* MAC
    * CSMA/CA
    * Segmentation & Reassembly
    * ToneMap
    * Security

分了四種Bandplan：
1. FCC (美規)
2. ARIB (日規)
3. CENELEC A (歐規)
4. CENELEC B (義大利)

## CSMA/CA mechanism
### Inter-Frame spacing

   * **Response IFS (RIFS)**
   回ACK的反應時間，每個Bandplan各有不同規範。
   ![](https://i.imgur.com/yFPX4eT.png)
       * Specification規範的時間：
        FCC: **10** symbols * **0.232** symbol time(ms) = **2.32** ms
        ARIB: **10** symbols * **0.232** symbol time(ms) = **2.32** ms
        CENELEC A: **8** symbols * **0.695** symbol time(ms) = **5.56** ms
  
   * **Contention IFS (CIFS)**
       * 需要回ACK
       ![](https://i.imgur.com/AprZl3M.png)
       * 不需要回ACK
       ![](https://i.imgur.com/d6cdpYV.png)
       * Specification規範的時間：
       FCC: **10** symbols * **0.232** symbol time(ms) = **2.32** ms
       ARIB: **108** symbols * **0.232** symbol time(ms) = **25.056** ms
       CENELEC A: **8** symbols * **0.695** symbol time(ms) = **5.56** ms
       
   * **Extended IFS (EIFS)**
   EIFS = Symbol Time * (N~FCH~ + MaxFrameSize + CIFS + RIFS) + ACK Time
        * MaxFrameSize：252 for CENELEC A, 511 for FCC 

### Contention Window

![](https://i.imgur.com/F3IYTdP.png)
**CFS**：Contention Free Slot
**NPCW**：Normal Priority Contention Window
**HPCW**：High Priority Contention Window
**Specification規範的時間：**
   * **FCC Bandplan**
   ![](https://i.imgur.com/jXAL6DZ.png)
       * Symbol Duration = **0.232** ms
       * aSlotTime = **2** * Symbol Duration = **2** * **0.695** = **0.464** ms
       * CFS = aSlotTime = **0.464** ms
       * HPCW = macHighPrioityWindowSize * aSlotTime = **7** * **0.464** = **3.248** ms
       * NPCW = (**2^macMinBE^ - 1**) * aSlotTime = (**2^3^** - **1**) * **0.464** = **3.248** ms

   * **ARIB Bandplan**
   ![](https://i.imgur.com/uIcrGNf.png)
       * Symbol Duration = **0.232** ms
       * aSlotTime = **2** * Symbol Duration = **2** * **0.695** = **0.464** ms
       * CFS = aSlotTime = **0.464** ms
       * HPCW = macHighPrioityWindowSize * aSlotTime = **7** * **0.464** = **3.248** ms
       * NPCW = (**2^macMinBE^ - 1**) * aSlotTime = (**2^3^** - **1**) * **0.464** = **3.248** ms
      
   * **CENELEC A Bandplan**
   ![](https://i.imgur.com/JiV0kBn.png)
       * Symbol Duration = **0.695** ms
       * aSlotTime = **2** * Symbol Duration = **2** * **0.695** = **1.39** ms
       * CFS = aSlotTime = **1.39** ms
       * HPCW = macHighPrioityWindowSize * aSlotTime = **7** * **1.39** = **9.73** ms
       * NPCW = (**2^macMinBE^ - 1**) * aSlotTime = (**2^3^** - **1**) * **1.39** = **9.73** ms   

### Flow Chart
**Specification規範建議值**
* macMinBE = **3**
* macMaxBE = **8**
* macMaxCSMABackoffs = **50**
* macCSMAFairnessLimit = **25**
* macA = **8**
* macK = **5**
* macMinCWAttempts = **10**
* macHighPriorityWindowSize = **7**

**Normal Priority Contention Window**
![](https://i.imgur.com/H98iAUD.png)

**High Priority Contention Window**
![](https://i.imgur.com/zq2vXRY.png)

### ARQ
**ARQ：Automatic Repeat reQuest
Transmit ARQ**
![](https://i.imgur.com/ajz5fpB.png)

**Receive ARQ**
![](https://i.imgur.com/Mm76pjU.png)


## Segmentation & Reassembly
**MAC frame format**
![](https://i.imgur.com/J0naj8U.png)

**Segment Control**
![](https://i.imgur.com/qtcSjPI.png)

**Frame Control**
![](https://i.imgur.com/8cRnQz5.png)

**Frame Type**
![](https://i.imgur.com/4sDeLYZ.png)

**Command Frame**
![](https://i.imgur.com/FoI8HmM.png)

**如何計算PHY PDU大小**
如果MAC層的Frame很大，以至於放不下PHY的PDU，這時候必須切割成適合的大小，而PHY層可以支援不同型態的modulation和Tonemap，因此PHY層最大可以乘載的資料也會隨著改變。


![](https://i.imgur.com/qTbyBXM.png)

1. 計算出最大Symbol數
    ![](https://i.imgur.com/s1xjK0I.png)
    * MaxRSBlockSize = **255** bytes
    * N~s~ is the number of symbols in the PHY packet
    * CC~Rate~ = **0.5**
    * CC~Zero~ ~Tail~ = **6**
    * FL~Band~ = **4** for CENELEC & FL~Band~ = **1** for FCC
    * FL~max~ = **63** for CENELEC & FL~max~ = **511** for FCC
    * Rep_Code denotes the repetition coding
        * Rep_Code = **4** for ROBO
        * Rep_Code = **1** for all other modes
    * mode~size~
        * **1** for ROBO, DBPSK, BPSK
        * **2** for DQPSK, QPSK
        * **3** for D8PSK, 8PSK
        * **4** for 16QAM

2. 需要判斷是否超過最大Reed Solomon Block Size

![](https://i.imgur.com/oziIUZC.png)

3. 計算最大PHY PDU

![](https://i.imgur.com/nWRnB5m.png)

4. 範例
    假設我們已經得到PHY訊框有40個symbol，用ROBO mode調變，CENELEC A band，可以求出實際上的byte數。ROBO Parity為8，其餘的Parity為16。
    
    N~s~ * N~car~ * mod~size~ = (40 * 36 * 1) = 1440 bits
    CC~Rate~ / Rep_Code = 0.5 / 4 = 0.125
    floor((1440 * 0.125 - 6) / 8) = floor(21.75) = 21 
    Data Byte = 21 - 8 = 13 bytes


**切割封包的規則**
* 每筆Segment都必須包含MAC Header和FCS。
* 同一個MAC frame切割出來多個Segments，每筆Segment都設定相同的Sequence number，只有Segment Count會從0開始一直遞增。
* 如果需要加密的MAC frame，應該先做完加密流程再進行切割，當Receiver收到之後先進行重組，再做解密。
* 除了第一筆Segment正常執行CSMA來競爭Channel以外，其餘的Segment使用Contention free slot。
* 如果需要進行ToneMap機制，在最後一筆Segment的Segment Control TMR欄位設1。
* 最後一筆Segment應該在Segment Control LSF欄位設1。
* Segment Length(SL)指的是目前Segment的長度，排除MAC Header、補零和PCS。


**隱藏節點問題**
![](https://i.imgur.com/MSwQyxk.png)
節點A和節點C傳輸距離剛好是互相接收不到的，節點B可以接收到節點A和節點C，如果節點A想傳送資料給節點B，當節點B送出資料後，節點C也想傳送資料給節點B且啟動載波偵測，也剛好沒偵測到節點A的，這時候節點C傳送資料到網路上就會和節點A的資料發生碰撞，此為隱藏節點問題。

**切割多個封包的碰撞避免**
為了減少碰撞的機率，當節點B收到節點A的資料以後，回傳ACK，其中ACK SSCA欄位設置1，接下來還有資料要傳輸，告知附近節點不要在這時候傳送資料。

![](https://i.imgur.com/lS262Jr.png)


## ToneMap mechanism
### Procedure
* 每當Transmitter想要傳送資料時，首先，必須要檢查自己的Neighbor Table是否有Receiver的紀錄。
* Neighbor Table主要是紀錄每個Receiver的Short Address、ToneMap、Modulation Type、每個Tone的Gain值和Neighbor Table生存時間。
* 如果Neighbor Table不存在，MAC層就會在傳送出去的資料中Segment Control TMR欄位設定1，等待接收端偵測目前通道品質之後，回覆ToneMap Response，其中此筆MAC Frame先用ROBO傳送。
* 當Transmitter接收到Receiver回傳的ToneMap Response後，必須更新自己的Neighbor Table，只要Neighbor Table的生存時間還沒超時，下次要傳資料給同一個Receiver，就可以用Neighbor Table裡的參數來傳送資料。

### Neighbor Table
![](https://i.imgur.com/o1mGJhR.png)


## Security mechanism
### AES - Wikipedia
https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86

### Auxiliary Security Header
![](https://i.imgur.com/6HZhXUW.png)
* Security Level：
    * 0x00："none"
    * 0x05："ENC=MIC-32"
* Key Indentifier Mode：
    * 0x01表示只使用1個Byte當作Key Index表示，有0x0和0x1。
* Example：(0x0D)~16~ = (00001101)~2~
    * Security Level：(101)~2~
    * Key Indentifier Mode：(01)~2~

![](https://i.imgur.com/DYUNxvj.png)

### Security Control
![](https://i.imgur.com/oQKGu5t.png)


### CCM mode
可以參考RFC3610 https://tools.ietf.org/html/rfc3610

**CCM Nonce**
以下是CCM Nonce擺放的內容，總共有13個Bytes。

![](https://i.imgur.com/45Zdzj2.png)

**CCM Input Transformation**
![](https://i.imgur.com/ONuLzhT.png)
* Inputs are
    * **Key** - Block Cipher Key
    * **N** - Nonce
    * **a** data - Additional authenticated data
    * **m** data - Message to authenticate and encrypt
    * **l(a)** - Length of a data
    * **l(m)** - Length of m data

![](https://i.imgur.com/kpSe5mE.png)

* Output is **c** data

![](https://i.imgur.com/WoNqOZT.png)

**CCM Authentication Transformation**
![](https://i.imgur.com/QcXGU9K.png)

計算B_0, B_1, ..., B_n
其中B_0欄位如下：
![](https://i.imgur.com/uxvr9rT.png)

B_0裡的Flags欄位如下：
![](https://i.imgur.com/vQHVQTv.png)
* Adata bit
    * 0, if l(a)=0
    * 1, if l(a)>0
* M'=(M-2)/2
* L'=L-1

B_1, B_2, ..., B_n => l(a) || a || m

CBC-MAC計算流程如下：
* X_1 := E(K, B_0)
* X_i+1 := E(K, X_i XOR B_i) for i = 1, ..., n
* T := first-M-bytes(X_n+1)
* where E() is the block cipher encryption function, and T is the MAC value

**CCM Encryption Transformation**
![](https://i.imgur.com/NrCmGMA.png)

先計算A_i
![](https://i.imgur.com/iP44W7H.png)

其中A_i裡的Flags欄位
![](https://i.imgur.com/Z7xJSfl.png)
* L'=L-1

利用Counter Mode來加密密文
* S_i := E(K, A_i) for i = 0, 1, 2, ...

計算Authentication value U
* U := T XOR first-M-bytes(S_0)

最後產出的結果C是密文，然後緊接著4個Byte的U
###### tags: `G3` `PLC` `Power Line Communication`