前幾天花了一些時間將 Raspberry Pi 接上 Cat-M1/NB-IoT,過程中遇到一些障礙,決定寫一篇文章將完整的過程記錄下來。
實驗設備
- Raspberry Pi 3B+
- Waveshare SIM7000C NB-IoT HAT
- 中華電信 NB-IoT SIM 卡一張
SIM7000 能夠支援 CAT-M1 與 NB-IoT,依據支援的頻段有分為四個不同的版本:SIM7000A
, SIM7000C
, SIM7000E
, SIM7000G
,其中 A 代表 America,C 代表 Chinese,E 代表 Europe,而 G 則代表 Global。選購時須要依據所在的地區及當地 ISP 所支援的頻段來購買,否則 SIM 卡插上去可是找不到基地台的。在台灣我選擇的是 SIM7000C,聽說 SIM7000E 也能通。而 SIM7000G 是全頻段支援,因此如果買的到這張應該是最方便,但是在我寫這篇的時候還找不到 SIM7000G 版本的 HAT,所以最後買了 SIM7000C。
除此之外還需要一張 NB-IoT SIM 卡,目前中華電信的方案每月最低只要 10 元,有 5 MB 的傳輸量,不過似乎是企業方案,只能透過公司行號來申請,如果有個人想要申請可能還是打個電話去問問。
目前我附近掃到 NB-IoT/CAT-M1 基地台只有中華電信,其餘的可能是在其他頻段。
頻譜支援列表
晶片 | 支援頻譜 |
---|---|
SIM7000A | B2/B4/B12/B13 |
SIM7000C | B1/B3/B5/B8 |
SIM7000E | B3/B8/B20/B28 |
SIM7000G | B1/B2/B3/B5/B8/B12/B13/B17/B18/B19/B20/B26/B28/B39 |
設備連接
SIM7000C NB-IoT HAT 裝上 SIM 卡之後直接接上 Raspberry Pi。HAT 上有個 Micro-USB 接頭,如果將接上這個 USB 會找到 4 個 Serial Device,透過這樣也能夠操作 SIM7000 相當方便。這個接頭另一個用途是提供額外的電源,SIM7000C 在傳輸資料的時候電流會比較大,如果此時 Raspberry Pi 無法提供足瓦的電源,那麼就必須再接上這個 USB 線,否則板子會一直重啟。
Raspberry Pi Serial 設置
SIM7000C NB-IoT HAT 使用一組 UART,我們需要將 console 關閉才能使用這組 UART。 1
$ sudo raspi-config
接著設定 Interfacing Options
-> Serial
-> no
-> yes
,設定完成後重新啟動 Raspberry Pi。
連線基地台
一切就緒之後就可以開始嘗試操作 SIM7000,先用習慣的 Terminal 連上 SIM7000,我自己喜歡用 screen,也可以用 minicom 等。 1
$ sudo screen /dev/ttyS0 115200
AT
指令來確定設備是否已經準備好。如果沒問題的話會收到 OK。 1
2AT
OK
確認 PIN 狀態
首先第一個動作要解鎖 PIN 碼,要確認是否有鎖上可以透過 AT+CPIN?
來得知。 1
2AT+CPIN?
+CPIN: READY
看到 READY
表示已經解鎖,我拿到的卡預設沒有鎖 PIN 碼,所以可以直接繼續。 如果看到像是 SIM PIN
則可以透過 AT+CPIN=<pin>
指令來解鎖。
部分狀態
狀態 | 說明 |
---|---|
READY | 已經解鎖 |
SIM PIN | 等待輸入 SIM PIN |
SIM PUK | 等待輸入 SIM PUK |
設定 APN
這邊算是我花很多時間的地方,由於我找不到任何關於中華電信 NB-IoT 的設定,同時連絡客服對方也是一頭霧水,所以浪費很多時間在試誤。這邊可以告訴大家最終的結果,中華電信 NB-IoT 使用的 APN
是 internet.iot
。
在連上基地台之前我們需要透過 AT+CGDCONT=
指令將 APN
給設定好。 1
2AT+CGDCONT=1,"IP","internet.iot"
OK
自動設定 APN
當然每一家的 APN
是不一樣的,我後來才知道原來這部分可以讓基地台自動設定,而我也是透過這個方法才找出正確的 APN
。如果跟我一樣,不知道正確的 APN
,而客服也搞不清楚的情況下不妨試試看。 1
AT+CGDCONT=1,"IP",""
直接把 APN
的部分留空
檢查訊號品質
我們可以透過 AT+CSQ
指令來了解所處地區的訊號品質 (0-31) 1
2AT+CSQ
+CSQ: 31,99
我這邊到訊號品質是 31
,訊號相當好,國外網友有分享達到 8 以上就算可用,可以參考。
掃描基地台
在連接基地台以前最後一步就是掃描周圍的基地台,這邊就要使用 AT+COPS=?
來達成,注意這個指令最長可能需要等待 120
秒左右,有點耐心。 1
2AT+COPS=?
+COPS: (3,"466 05","466 05","46605",0),(2,"466 92","466 92","46692",7),(1,"466 92","466 92","46692",9),,(0,1,2,3,4),(0,1,2)
從我的結果可以看到我掃到的基地台分別是 466 05
, 466 92
這兩家 ISP (亞太、中華) ,這兩個數字是 PLMN
分別代表 MCC
與 MNC
,台灣的 MCC
就是 466
,而 MNC
則是用來區別各家 ISP。這邊放上對照表供參考。從這邊也看到目前只剩下亞太有 GSM
的訊號,其他都拆光光了。然後想用 NB-IoT/CAT-M1 選中華可能還是最容易成功。
前三個括號最後面的數字代表基地台的種類
編號 | 基地台種類 |
---|---|
0 | GSM |
7 | CAT-M1 |
9 | NB-IoT |
MCC | MNC | ISP |
---|---|---|
466 | 11 | 中華電信 |
466 | 92 | 中華電信 |
466 | 93 | 台灣大哥大 |
466 | 97 | 台灣大哥大 |
466 | 99 | 台灣電信 |
466 | 03 | 遠傳電信 |
466 | 01 | 遠傳電信 |
466 | 88 | 遠傳電信 |
466 | 89 | 台灣之星 |
466 | 05 | 亞太電信 |
466 | 12 | 亞太電信 |
連上基地台
找到要連上的目標之後,我們透過 AT+COPS=
指令來進行連線。 1
2AT+COPS=1,2,"46692"
OK
第一次註冊基地台會花比較多時間,實測約 1 分鐘左右,要有點耐心。但是之後註冊會比較快一些,多半能在 0~3 秒內完成。 如果回覆是 OK
,則可以透過 AT+CGATT?
及 AT+CPSI?
指令來確認
1 | AT+CGATT? |
上面的 AT+CPSI?
結果會依據你使用 GSM
/NB-IoT
/CAT-M1
等狀況而有所不同,重點是後面的 Online
。
獲取 APN
如果前面不知道自己用的是什麼 APN
,這邊就可以利用 AT+CGNAPN
指令來得到
1 | AT+CGNAPN |
這邊得到的 APN
可以記一下,稍後連上網會需要用到。
連上網路
SIM7000 支援了 TCP/IP,讓我們可以很容易地使用,將 sensor 蒐集到的資訊透過 IP 網路回傳。 我們需要透過幾個指令來連線數據網路:AT+CSTT=
, AT+CIICR
首先利用 AT+CSTT=
設定剛剛得到的 APN
1
2AT+CSTT="internet.iot"
OK
接著利用 AT+CIICR
啟動數據網路 1
2AT+CIICR
OK
如果以上步驟都沒問題,就能連上數據網路,得到一組 IP。我們可以利用 AT+CIFSR
指令來查看我們的 IP。 1
2AT+CIFSR
10.82.128.52
Ping 測試
通常在這個步驟就能正常上網了,先透過簡單的 ICMP
來測試。 1
2
3
4
5AT+CIPPING="8.8.8.8"
+CIPPING: 1,"8.8.8.8",71,118
+CIPPING: 2,"8.8.8.8",76,118
+CIPPING: 3,"8.8.8.8",80,118
+CIPPING: 4,"8.8.8.8",80,118
成功!
TCP 連線
接下來就能夠依據你的應用來操作了,最常見的就是 TCP 連線。TCP 連線可以透過 AT+CIPSTART=
指令來建立。 這邊就來做個簡單的 TCP 連線測試
伺服器 1
$ echo "Hello World!" | nc -l -p 9487
我們在伺服器上 listen 9487 port,當有人連上的時候就會送出 Hello World!
RPI 在樹莓派這邊就來嘗試連線伺服器 1
2
3
4
5
6
7AT+CIPSTART="TCP","123.123.123.123",9487
OK
CONNECT OK
Hello World!
CLOSED
你也可以透過 AT+CIPSEND=
指令來傳送資料到另一端。
總結
做這個小 Project 耗掉我將近一個下午,大部分時間都在找資料跟實驗。這個操作的流程其實很簡單,如果你也苦於讓 SIM7000 動起來,希望這篇能夠幫上忙。在過程中我看到很多很有用的資料,特別把他們放在參考資料中。特別是一些 Manual 的部分。因篇幅有限,許多指令其實有很多細節無法呈現,而這些在使用手冊中都有完整的描述,建議一定要參考一下。