Raspberry Pi 的應用 - 用 4G LTE 網路卡變身成攜帶式行動分享器

by 12月 20, 2017 2 意見        


出門在外,沒有無線基地台可以連線,樹莓派是不是可以用 4G 網卡來連線,甚至用 Wi-Fi 分享給別人連線呢?

身為「可以不走路,不能沒網路」症候群重度患者,偏偏因為阮囊羞澀的關係,手機網路只用得起吃不飽的專案,眼看流量就要爆了,這可怎麼辦是好 ......

剛好朋友手邊有個閒置的台灣大哥大 4G 吃到飽門號,外加一片 4G 網卡,就把腦筋動到他的頭上,動動手接到樹莓派上面來用囉。


事前準備


驅動 4G 網卡


將 D-Link DWM-222 插上 Raspberry Pi 之後,作業系統直接就偵測到了,雖然並沒有顯示型號。
lsusb

在 /dev 目錄裡,也出現了 4個 ttyUSB 開頭的設備。
ls /dev/tty*

核心模組也正確的載入了 4G 網卡的相關模組。
lsmod

因為直接就驅動了,所以不必再做任何動作。

要查詢手上的 3G/4G 網卡是否支援,可以參閱支援清單:USB_ModeSwitch - Known working hardware
如果發現作業系統偵測不到,但是在支援清單裡找的到時,再執行下列步驟,手動將 USB_ModeSwitch 升級最新的版本。

確認一下是否已安裝過相關模組。
dpkg -l usb-modeswitch*

有的話,就先移除。
sudo apt-get -y remove usb-modeswitch usb-modeswitch-data

從 USB_ModeSwitch 官網下載最新的版本,在 2017/12/20 的版號是 2.5.1。
wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-2.5.1.tar.bz2
wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20170806.tar.bz2

下載之後解壓縮。
tar jxf usb-modeswitch-2.5.1.tar.bz2
tar jxf usb-modeswitch-data-20170806.tar.bz2

安裝必要的相依套件。
sudo apt-get -y install libgusb-dev

因為這是原始碼,所以要先編譯後才能安裝。
cd ~/usb-modeswitch-2.5.1
make
sudo make install
cd ~/usb-modeswitch-data-20170806/
sudo make install


載入核心模組。
sudo modprobe qmi_wwan
sudo modprobe option



安裝及設定 4G LTE 連線


先安裝主程式。
sudo apt-get -y install ppp pppconfig

開始設定 4G 連線參數。
sudo pppconfig

建立一個新連線,Create a connection。

為這個連線自訂一個名稱,之後連線時會用到。

直接使用 ISP 指定的 DNS Server,Use dynamic DNS。

使用 PAP 驗證協定,Peer Authentication Protocol。

因為用不到帳號,所以直接用預設值不必改。

因為用不到密碼,所以直接用預設值不必改。

通訊埠的傳輸速度設定成 115200。千萬別誤會,這不是 4G 上網的連線速度。

撥號模式指定為 TONE (複頻)。

撥接號碼設定為 *99#,這組是台灣大哥大的號碼,其他 ISP 業者別忘了問一下客服。

手動選擇通訊埠,No。

指定通訊埠的路徑為 /dev/ttyUSB1。

儲存設定參數,Finished Write files and return to main menu。

這是相關設定檔的位置。

退出設定程式。

編輯 PAP 驗證協定檔。
sudo vi /etc/ppp/pap-secrets

刪除或註解掉這一行。
"replace_with_your_login_name" 4GLTE "replace_with_password"

調整撥接參數設定。
sudo vi /etc/ppp/peers/4GLTE

刪除或註解掉這一行。
connect "/usr/sbin/chat -v -f /etc/chatscripts/4GLTE"
改成
connect "/usr/sbin/chat -v -T internet -f /etc/chatscripts/4GLTE"

刪除或註解掉這一行。
replace_with_your_login_name

在最下方增加這兩行。
persist
replacedefaultroute


調整撥接指令字串。
sudo vi /etc/chatscripts/4GLTE

在 '' ATZ 的下一行增加
OK-AT-OK AT+CGDCONT=1,"IP","\T","",0,0

註解或刪除這一行。
OK-AT-OK "ATDT*99#"
改成這一行。
OK "ATDT*99#"

恭禧老爺,賀禧夫人,咱們可以用 4G 網卡連上 Internet 了。
sudo pon 4GLTE

玩夠了就中斷連線吧。
sudo poff 4GLTE


開機自動連上 4G 網路


新增一個 4G 網卡的介面。
sudo vi /etc/network/interfaces

增加這三行,4gppp0 是自訂的網路介面名稱,4GLTE 是先前連線參數裡的自訂連線名稱。
allow-hotplug 4gppp0
iface 4gppp0 inet ppp
provider 4GLTE


測試一下是否正確運作。
sudo ifup 4gppp0
sudo ifdown 4gppp0



編輯服務設定檔。
sudo vi /lib/systemd/system/ifup@4gppp0.service

刪除或註解掉這一行。
After=sys-subsystem-net-devices-%i.device

啟動 4G 連線服務並讓它開機自動執行。
sudo systemctl daemon-reload
sudo systemctl restart ifup@4gppp0
sudo systemctl enable ifup@4gppp0



插上 4G 網卡後自動連線


因為我們不一定會一直把 4G 網卡插在 Raspbery Pi 上面,可是一但拔起來之後,再插回去時還要用 SSH 連線輸入連線指令,這實在是太麻煩了,所以加上一些設定,讓系統可以自動辨識並連上 4G 網路。

新增一個設備設定檔。
sudo vi /etc/udev/rules.d/99-dwm222.rules

增加這一行,ttyUSB1 是先前連線參數裡指定的通訊埠,idVendor 跟 idProduct 的數字要依據不同廠牌型號的 4G 網卡,會有不同的設定值。
KERNEL=="ttyUSB1", ATTRS{idVendor}=="2001", ATTRS{idProduct}=="7e35", ENV{SYSTEMD_WANTS}+="ifup@4gppp0.service"

最後,重新載入 udev 管理程式的設定值即可。
sudo udevadm control --reload


改造 Wi-Fi 無線基地台功能


最後,再配合上 多了WiFi,價格不變,輕鬆打造隨身無線基地台 這篇文章的步驟,只要把原來的對外的 LAN 有線網路,改成這次使用的 4G 網卡,就變身成自製的攜帶式行動分享器了。



參考資料


圖片來源
  • https://pixabay.com

更新紀錄
  • 2017/12/20 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

2 則留言 :

  1. 請問可以用在Raspberry Pi b+嗎?

    回覆刪除
  2. 你好,請問為什麼我在設定開機自動連線的階段時,在使用指令:sudo systemctl enable ifup@4gppp0後,會出現以下的錯誤?

    The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
    settings in the [Install] section, and DefaultInstance for template units).
    This means they are not meant to be enabled using systemctl.
    Possible reasons for having this kind of units are:
    1) A unit may be statically enabled by being symlinked from another unit's
    .wants/ or .requires/ directory.
    2) A unit's purpose may be to act as a helper for some other unit which has
    a requirement dependency on it.
    3) A unit may be started when needed via activation (socket, path, timer,
    D-Bus, udev, scripted systemctl call, ...).
    4) In case of template units, the unit is meant to be enabled with some
    instance name specified.

    回覆刪除