---
# System prepended metadata

title: Lab4 srsRAN gNB with COTS UEs

---

# 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.實驗架構
![Screenshot 2025-12-01 at 11.52.10 AM](https://hackmd.io/_uploads/Hk_gb9q-Wx.png)
# 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裝置
![image](https://hackmd.io/_uploads/ByMVD0wZWx.png)

2. 以uhd_usrp_probe指令測試B210是否插在USB 3.0孔位，請正常運作
![image](https://hackmd.io/_uploads/Sy3N_Rwb-g.png)

----
### 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
![image](https://hackmd.io/_uploads/H1aopADWWl.png)
> vim指令提示:
按i鍵進入編輯模式
修改完成後按Esc鍵
接著輸入 `:wq` (Enter) 保存並退出

- 建構Makefile
``` shell=1
mkdir build
cd build
cmake ..
```
![image](https://hackmd.io/_uploads/rkIARCwZWe.png)

- 編譯 srsRAN_Project 
``` shell=1
make -j $(nproc)
```
![image](https://hackmd.io/_uploads/HkxC1JuW-l.png)

- 安裝 srsRAN_Project 
``` shell=1
sudo make install
```
![image](https://hackmd.io/_uploads/SyNc-kObZe.png)

- 修改 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
![image](https://hackmd.io/_uploads/rJKxQyO-Ze.png)

---
### 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
```
![image](https://hackmd.io/_uploads/HkQXBJd--e.png)

- 安裝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 核心功能是否正常運作，若成功畫面會如下（請確認已以下這些功能是否正常，若不正常請勿執行下一步驟）
![5-1-8 驗證open5gs](https://hackmd.io/_uploads/SJZW_oZGxe.png)
> 核心功能如下
> AMF, SMF, UPF, NRF, UDM, UDR, PCF,AUSF, NSSF

確認核心功能都啟用後，便可以開始設定核心網路的 amf, nrf功能了

- 設定核網 AMF
輸入`sudo vim /etc/open5gs/amf.yaml`進入amf的設定檔，依照圖片設定來編輯amf設定值
![image](https://hackmd.io/_uploads/Hy5qUk_W-e.png)
完成後輸入`sudo systemctl restart open5gs-amfd.service`，重起AMF

- 設定核網 NRF
輸入`sudo vim /etc/open5gs/nrf.yaml`進入nrf的設定檔，依照圖片設定來編輯nrf設定值
![image](https://hackmd.io/_uploads/BJXGvJdb-x.png)
完成後輸入`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

![image](https://hackmd.io/_uploads/SyoAOJuWZl.png)
進入後點選+以新增用戶
![image](https://hackmd.io/_uploads/rJw-FyObWx.png)
- 註冊subscriber
>-IMSI = 001010123456789
-K = 465B5CE8B199B49FAA5F0A2EE238A6BC
-OPc = E8ED289DEBA952E4283B54E88E6183CA
-APN = internet
-Type = IPv4
![image](https://hackmd.io/_uploads/rJg5YkObWl.png)
![image](https://hackmd.io/_uploads/rJuhKJ_W-e.png)

完成後按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
```
![image](https://hackmd.io/_uploads/HJ4-ik_Wbx.png)

---
### 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:請格外注意『`-`』和『`--`』的差別
![image](https://hackmd.io/_uploads/HysuWlOZbg.png)

>./pySim-prog.py -p0 -s 8949440000001230802 --mcc=001 --mnc=01 -a 21864569 --imsi=001010123456789 -k 465B5CE8B199B49FAA5F0A2EE238A6BC --opc=E8ED289DEBA952E4283B54E88E6183CA
![image](https://hackmd.io/_uploads/B1fafed--g.png)


- SUCI Configuration
透過以下指令進入pySim的shell當中，並透過後續的指令將想要設定的內容輸入進去
``` shell=1
./pySim-shell.py -p0
```
![image](https://hackmd.io/_uploads/ry4fEldWWx.png)

在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
```
![image](https://hackmd.io/_uploads/SJAlreubZl.png)

- Check Point
透過`./pySim-read.py -p0`指令檢查USIM的燒錄結果是否符合預期
![image](https://hackmd.io/_uploads/B13KreubZe.png)

---
### 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上的設定一致!
>設定>行動數據設定

![Screenshot_20251201-014323](https://hackmd.io/_uploads/SJf1Su9bZe.png =300x)
>下拉至『存取點名稱』並點選>點選右上角『+』新增>設定名稱、APN、APN通訊協定、APN漫遊通訊協定、開啟APN啟用/停用
![Screenshot_20251201-014417](https://hackmd.io/_uploads/HJfkBd5-be.png =300x)
![Screenshot_20251201-014428](https://hackmd.io/_uploads/B1Co8u5ZZl.png =300x)


### 連線到gNB
- 設定完成後，只要開關飛航就可以連線到gNB，第一次連線可能會花比較久的時間，請耐心等待，連線完成後，就可以看到狀態欄顯示『Open5GS-Magic』
![image](https://hackmd.io/_uploads/S18cwu5bZe.png)
:warning:如果都設定成功，或是連線成功後網路不通，只要多開關幾次飛航模式即可：）

- 查看手機系統資訊
在電話撥號的地方輸入『`*#*#4636#*#*`』，就可以進入工程模式查看手機狀態
![image](https://hackmd.io/_uploads/HJqXK_cWbg.png =300x)

---
### 5-6.問題與討論
1. 截圖工程模式中手機資訊的畫面。
---

## 5-7 UE測試
- ipref3測試
手機可以下載ipref3的app使用ipref3的功能
![image](https://hackmd.io/_uploads/H1H-fF9Zbe.png =300x)
配合terminal指令`ipref3 -s`
![image](https://hackmd.io/_uploads/BJ_Pju9ZZe.png =500x)

- 任意網路功能測試
![image](https://hackmd.io/_uploads/Hy23zYqZbx.png)

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








