# Lab4 srsRAN gNB with COTS UEs
## Outline
- [1. 實驗內容](#1.實驗內容)
- [2. 相關知識](#2.相關知識)
- [3. 相關建置環境/設備規格](#3.相關建置環境/設備規格)
- [4. 實驗架構](#4.實驗架構)
- [5. 實驗流程](#5.實驗流程)
-----
## 1.實驗內容
- 使用srsRAN架設gNB
- 使用實體主機架設Open5GS核心網路
- 實用民用UEs設備連接自架的gNB
----------
## 2.相關知識
- srsRAN:srsRAN是一套開源的 4G/5G 無線接取網路(RAN)軟體套件,由 SRS(Software Radio Systems)開發。它的目標是讓研究人員、電信工程師與開發者能在一般電腦上,以 SDR(Software Defined Radio)快速建置 eNB、gNB、UE 等完整的行動網路元件,而不需要昂貴的電信級設備。主要特色如下:
- 完全遵循 3GPP 標準,支援 LTE 與 5G NR 的 L1/L2/L3 協定堆疊。
- 5G 架構採用 CU/DU 拆分,支援 NG-RAN 與 F1 介面,方便做 O-RAN 研究。
- 與 USRP、BladeRF、LimeSDR 等 SDR 完全相容,可直接用來收發無線訊號。
- UHD:USRP Hardware Driver是 Ettus Research / NI 為 USRP 系列 SDR 裝置所提供的官方通用驅動程式與 API。任何想控制 USRP 的軟體,如 GNU Radio、**srsRAN**、MATLAB、Python script,都必須透過 UHD 來進行操作。
- USIM:UMTS Subscriber Identity Module,USIM為用於UMTS中的使用者身分辨識模組,USIM還可儲存使用者資料、電話號、認證資料、簡訊儲存空間
## 3.相關建置環境/設備規格
### 3-1 硬體清單
| 軟體名稱 | 規格 | 數量 |
|:----------- | ------------------------ |:----:|
| PC | 任一可安裝Ubuntu主機即可 | 1 |
| SDR | USRP B210 | 1 |
| UE | Google Pixel 8 | 1 |
| USIM | Sysmocom SJA5-S17 | 1 |
| Card Reader | HID OMNIKEY | 1 |
### 3-2
| USIM編號 | 學生 |
|:--------------- | ---- |
| 999700000123080 | 蘇翰庭、曹莛宥、Farhan |
| 999700000123081 | 李明銳 |
| 999700000123082 | 王祈皓 |
| 999700000123083 | 吳昕叡 |
| 999700000123084 | 謝東諺 |
| 999700000123085 | 周承誌、吳亞倫 |
| 999700000123086 | 蘇洋銘 |
| 999700000123087 | 吳晉毅 |
| 999700000123088 | 郭峻里 |
| 999700000123089 | 蘇仕偉 |
### 3-3 軟體規格
| 軟體名稱 | 軟體版本 |
|:-------- |:-------------- |
| Ubuntu | 22.04 LTS |
| Open5gs | v2.7.1-jammy |
| srsRAN | srsRAN Project |
| Android | 16 |
-----
### 3-4[Ubuntu安裝](https://github.com/TTU-CWBT/Ubuntu-install-tutorial)
:warning:這次實驗需要安裝實體Ubuntu主機,所以請自備一個燒錄Ubuntu映像檔的USB,此USB會被刷新,使用前請先將確認。
:warning:這次的實驗需要安裝 Ubuntu Desktop,請在安裝完 Ubuntu 後在終端機輸入安裝桌面的指令,這個指令會需要花一些時間,請耐心等待。
``` shell=1
sudo apt install ubuntu-desktop
```
# 4.實驗架構

# 5.實驗流程
## 問題與討論
### 問題與討論
1. 截圖lsusb畫面,確認有USRP B210
2. 截圖uhd_usrp_probe確認B210功能是否正常
3. 截圖gNB修改完之畫面
4. 解釋修改amf addr & tac以及cell_cfg tac的意義是什麼?
5. 截圖驗證 Open5GS 安裝成功的畫面
6. 截圖WebUI註冊UE的畫面
7. 截圖gNB正常啟動的畫面
8. 請問此gNB是用什麼樣的天線配置?什麼頻段?UL/DL頻率多少?且截圖並標示以示證明
9. 請問你的USIM IMSI與ICCID是多少?
10. 解釋IMSI與ICCID的差別。
11. 截圖`./pySim-read.py -p0`設定成功的畫面。
12. 截圖工程模式中手機資訊的畫面。
13. 請自定義任意網路功能測試,並拍照紀錄
14. 請UE測量最大DL/UL是多少?
15. 請測量三種UE到gNB的距離,觀察距離對bitrate的影響。(請拍照紀錄)
## 5-0前製設定
1. 請先執行以下指令,先將Ubuntu更新到最新的狀態
``` shell=1
sudo apt update
sudo apt upgrade
```
2. 安裝以下需要用到的指令,在終端機輸入以下指令,詢問是否(y/n)時,請按y。
``` shell=1
sudo apt-get install cmake make gcc g++ pkg-config libfftw3-dev libmbedtls-dev libsctp-dev libyaml-cpp-dev libgtest-dev
```
3. 請將USRB B210 插上電腦,並確認插在USB 3.0的孔位
## 5-1 安裝 UHD
- 執行以下指令安裝UHD
``` shell=1
sudo add-apt-repository ppa:ettusresearch/uhd
sudo apt-get update
sudo apt-get install libuhd-dev uhd-host
sudo /usr/lib/uhd/utils/uhd_images_downloader.py
```
> :warning:On Ubuntu 22.04, the uhd_images_downloader.py is located in the /usr/lib/uhd/utils folder, but on other Ubuntu versions it may be located in the /usr/libexec/uhd/utils folde.
- Check List
1. 利用lsusb指令確定可以識別USRP B210裝置

2. 以uhd_usrp_probe指令測試B210是否插在USB 3.0孔位,請正常運作

----
### 5-1.問題與討論
1. 截圖lsusb畫面,確認有USRP B210
2. 截圖uhd_usrp_probe確認B210功能是否正常
----
## 5-2 安裝 srsRAN-Project
- 複製srsRAN 原始碼
``` shell=1
sudo apt install git
git clone https://github.com/srsran/srsRAN_Project.git
```
- 檢查CMakeLists.txt
``` shell=1
cd srsRAN_Project
vim CMakeLists.txt
```
確定有啟用UHD, 如果也需要使用 ZEROMQ, 也可以同時設為ON

> vim指令提示:
按i鍵進入編輯模式
修改完成後按Esc鍵
接著輸入 `:wq` (Enter) 保存並退出
- 建構Makefile
``` shell=1
mkdir build
cd build
cmake ..
```

- 編譯 srsRAN_Project
``` shell=1
make -j $(nproc)
```

- 安裝 srsRAN_Project
``` shell=1
sudo make install
```

- 修改 gNB設定檔
將gnb_rf_b200_tdd_n78_20mhz.yml複製到home目錄下,以方便後續執行
``` shell=1
cp ~/srsRAN_Project/configs/gnb_rf_b200_tdd_n78_20mhz.yml ~/
```
- 編輯gnb_rf_b200_tdd_n78_20mhz.yml
``` shell=1
cd ~
vim gnb_rf_b200_tdd_n78_20mhz.yml
```
需要更改的內容有`amf`的 addr & tac,以及cell_cfg的tac

---
### 5-2.問題與討論
1. 截圖gNB修改完之畫面
2. 解釋修改amf addr & tac以及cell_cfg tac的意義是什麼?
---
## 5-3 安裝 Open5GS
- 導入公開金鑰:在終端機逐次輸入以下指令
``` shell=1
sudo apt update
sudo apt install gnupg
sudo apt install curlcurl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor
```
- 建立 deb 儲存庫
``` shell=1
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
```
- 安裝MongoDB套件
``` shell=1
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
```
- Check List
MongoDB版本,如果有出現,那基本上就是安裝成功
``` shell=1
mongosh --version
```

- 安裝Opne5G Project
``` shell=1
sudo add-apt-repository ppa:open5gs/latest
sudo apt update
sudo apt install open5gs
```
### 驗證 Open5GS 安裝成功
如果 Open5GS 安裝成功後,每次重新開機後都會自動在背景執行,輸入`ps aux | grep open5gs` 可以確認 Open5GS 核心功能是否正常運作,若成功畫面會如下(請確認已以下這些功能是否正常,若不正常請勿執行下一步驟)

> 核心功能如下
> AMF, SMF, UPF, NRF, UDM, UDR, PCF,AUSF, NSSF
確認核心功能都啟用後,便可以開始設定核心網路的 amf, nrf功能了
- 設定核網 AMF
輸入`sudo vim /etc/open5gs/amf.yaml`進入amf的設定檔,依照圖片設定來編輯amf設定值

完成後輸入`sudo systemctl restart open5gs-amfd.service`,重起AMF
- 設定核網 NRF
輸入`sudo vim /etc/open5gs/nrf.yaml`進入nrf的設定檔,依照圖片設定來編輯nrf設定值

完成後輸入`sudo systemctl restart open5gs-nrfd.service`
---
### 5-3.問題與討論
1. 截圖驗證 Open5GS 安裝成功的畫面
---
## 5-4安裝 WebUI
- 下載Nodesource GPG key
``` shell=1
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
```
- 建立 deb 儲存庫
``` shell=1
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
```
- 安裝WebUI
``` shell=1
sudo apt update
sudo apt install nodejs -y
curl -fsSL https://open5gs.org/open5gs/assets/webui/install | sudo -E bash -
```
- 登入WebUI
在FireFox的網址欄中輸入`http://127.0.0.1:9999`
>帳號預設為: admin
密碼預設為: 1423

進入後點選+以新增用戶

- 註冊subscriber
>-IMSI = 001010123456789
-K = 465B5CE8B199B49FAA5F0A2EE238A6BC
-OPc = E8ED289DEBA952E4283B54E88E6183CA
-APN = internet
-Type = IPv4


完成後按SAVE
- 設定網路規則
:warning: 這兩個指令只要重新開機就要重新輸入
>啟用 IPv4 Forwarding
``` shell=1
$sudo sysctl -w net.ipv4.ip_forward=1
```
>加入 NAT Rule
``` shell=1
sudo iptables -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE
```
### 啟動gNB
``` shell=1
cd ~
sudo gnb -c gnb_rf_b200_tdd_n78_20mhz.yml
```

---
### 5-4.問題與討論
1. 截圖WebUI註冊UE的畫面
2. 截圖gNB正常啟動的畫面
3. 請問此gNB是用什麼樣的天線配置?什麼頻段?UL/DL頻率多少?且截圖並標示以示證明
---
## 5-5燒錄USIM
### USIM用戶表格
| IMSI | ICCID | ACC | PIN1 | PUK1 | PIN2 | PUK2 | Ki | OPC | ADM1 |
|-------------------|-----------------------|------|------|----------|------|----------|----------------------------------------|-------------------------------------------|----------|
| 999700000123080 | 89494400000001230802 | 0001 | 0000 | 08703177 | 0000 | 45260138 | 8C9961848DAA585D050FAB591F4276E3 | D7F0CEC46CCB75C37A759CDD98606D67 | 21864569 |
| 999700000123081 | 89494400000001230810 | 0002 | 0000 | 95973474 | 0000 | 08950111 | 61358AB9C491FFFB59AE50D2EB9A6C2C | 904CFF670336D92F634EA2ECBC7C00C3 | 64731141 |
| 999700000123082 | 89494400000001230828 | 0004 | 0000 | 86355500 | 0000 | 56026461 | 23E90A58C1812FBCBCF825E0F17848A8 | D261CF29BEC37F9688B3EF25D7536992 | 45438380 |
| 999700000123083 | 89494400000001230836 | 0008 | 0000 | 89728335 | 0000 | 46256102 | EF753BA4140CD93F885E3A09FBAC7293 | 50626393F8BCA1FF1B11CF9A7868C50B | 81820960 |
| 999700000123084 | 89494400000001230844 | 0010 | 0000 | 13098206 | 0000 | 20635957 | 3306B7A38F2261AB15653DCC14AED52E | 8109AA55B350F3164F8421E13BEA0390 | 04279297 |
| 999700000123085 | 89494400000001230851 | 0020 | 0000 | 93314241 | 0000 | 11509590 | 52055049E55A843C37B2EC4F28AC539E | A5E7EB5A30AC6469A0D5794A78F4921C | 44440693 |
| 999700000123086 | 89494400000001230869 | 0040 | 0000 | 70631814 | 0000 | 20238703 | CEA2AFF2E4B4606CF3B4A9F726875EC7 | D94B0AC1A503EF22C8C1B022F8A4166C | 94255361 |
| 999700000123087 | 89494400000001230877 | 0080 | 0000 | 18908969 | 0000 | 22132097 | 92398FE1F2F3B6BDA41F38C66FA70A5 | 7896A00BD749FDC9D5E952B20115A82B | 36137799 |
| 999700000123088 | 89494400000001230885 | 0100 | 0000 | 19476117 | 0000 | 37149093 | 9522DA9224F0CC3277FCDFEA12074A9F | EBC6A13393A08DBBCD20C4B0051CEE40 | 52599472 |
| 999700000123089 | 89494400000001230893 | 0200 | 0000 | 64917072 | 0000 | 56246574 | 792A857D82996D7A1BEFEBB07DFC80D | 50EC29E8983BFE58FC8849A7077CCA6D | 67514285 |
- 安裝 pySim
``` shell=1
git clone https://github.com/osmocom/pysim
cd pysim
sudo apt-get install --no-install-recommends pcscd libpcsclite-dev python3 python3-setuptools python3-pyscard python3-pip
pip3 install -r requirements.txt
```
- 燒錄資料到USIM
這部份需要細心一點,並且會需要根據你拿到的USIM編號,查詢對應的表格
```
./pySim-prog.py -p0 -s [ICCID] --mcc=[MCC] --mnc=[MNC] -a [ADM-KEY] --imsi=[IMSI] -k [KI] --opc [OPC]
```
在這部份,只有[**ICCID**]跟[**ADM-KEY**]會需要改,其他都複製貼上就可以了!
``` shell=1
mcc=001
mnc=01
imsi=001010123456789
key= 465B5CE8B199B49FAA5F0A2EE238A6BC
opc=E8ED289DEBA952E4283B54E88E6183CA
```
以下是範例,請參考
:warning:請格外注意『`-`』和『`--`』的差別

>./pySim-prog.py -p0 -s 8949440000001230802 --mcc=001 --mnc=01 -a 21864569 --imsi=001010123456789 -k 465B5CE8B199B49FAA5F0A2EE238A6BC --opc=E8ED289DEBA952E4283B54E88E6183CA

- SUCI Configuration
透過以下指令進入pySim的shell當中,並透過後續的指令將想要設定的內容輸入進去
``` shell=1
./pySim-shell.py -p0
```

在pySIM--Shell中,輸入以下指令完成設定
``` shell=1
pySIM-shell (MF)> select MF
pySIM-shell (MF)> select ADF.USIM
pySIM-shell (MF/ADF.USIM)> select EF.UST
pySIM-shell (MF)> verify_adm <ADM-KEY>
pySIM-shell (MF/ADF.USIM/EF.UST)> ust_service_deactivate 124
pySIM-shell (MF/ADF.USIM/EF.UST)> ust_service_deactivate 125
pySIM-shell (MF/ADF.USIM/EF.UST)> quit
```

- Check Point
透過`./pySim-read.py -p0`指令檢查USIM的燒錄結果是否符合預期

---
### 5-5.問題與討論
1. 請問你的USIM IMSI與ICCID是多少?
2. 解釋IMSI與ICCID的差別。
3. 截圖`./pySim-read.py -p0`設定成功的畫面。
---
## 5-6 設定COTS UE
- UE密碼:0000
- Configure COTS UE (Google Pixel 8)
須將USIM置入手機並編輯存取點,此處的設定值必須與WebUI上的設定一致!
>設定>行動數據設定

>下拉至『存取點名稱』並點選>點選右上角『+』新增>設定名稱、APN、APN通訊協定、APN漫遊通訊協定、開啟APN啟用/停用


### 連線到gNB
- 設定完成後,只要開關飛航就可以連線到gNB,第一次連線可能會花比較久的時間,請耐心等待,連線完成後,就可以看到狀態欄顯示『Open5GS-Magic』

:warning:如果都設定成功,或是連線成功後網路不通,只要多開關幾次飛航模式即可:)
- 查看手機系統資訊
在電話撥號的地方輸入『`*#*#4636#*#*`』,就可以進入工程模式查看手機狀態

---
### 5-6.問題與討論
1. 截圖工程模式中手機資訊的畫面。
---
## 5-7 UE測試
- ipref3測試
手機可以下載ipref3的app使用ipref3的功能

配合terminal指令`ipref3 -s`

- 任意網路功能測試

---
### 5-7.問題與討論
1. 請自定義任意網路功能測試,並拍照紀錄
2. 請UE測量最大DL/UL是多少?
3. 請測量三種UE到gNB的距離,觀察距離對bitrate的影響。(請拍照紀錄)
---