Raspberry Pi 的應用 - 透過 iPhone 的傳輸線,分享 3G/4G 行動網路

by 5月 09, 2015 6 意見                

相信各位一定也遇過這種事吧,家裡的 ADSL 或光纖網路突然不通,只剩 iPhone 可以用 3G / 4G 上網 !!!

那是不是可以讓 Raspberry Pi 透過 iPhone 來上網 ?! 而且順便將 3G/4G 的訊號分享出來,轉成有線或無線的網路介面,讓其他設備也可以上網 !!!

簡介


因為 Apple 官方只有提供 Windows 及 OS X 的 iTunes 程式,卻不支援 Linux,所以強大的網友們只好自立自強,用逆向工程法解析出通訊協定,搞出了 libimobiledevice 這套非官方的函數庫及工具集。


它支援了 iPhone、iPad、iPod Touch 及 Apple TV 等設備,至 2015/05/08 為止,最新的版本是 1.2.0,支援的 iOS 版本是 8.2,支援的作業系統有 Windows、OS X 及 Linux。

這些是它所支援的所有功能,綠色代表已完全,黃色代表部份完成,我們這次要用的功能就是其中的「USB Internet Tethering」。


事前準備

  • Raspberry Pi Model B / B+,Model A / A+ 請自行加上 USB 網路卡。
  • Raspbian 作業系統。
  • iPhone,不需要越獄 (JB / JailBreak),這次是用 iPhone 4S + iOS 8.2。
  • 3G / 4G 門號必須已申辦行動上網。
  • 30 Pin 或 Lightning 的 USB 傳輸線,最好是原廠或是通過 MFI 認證的線,因為在 iOS 7 之後,Apple 已經在系統裡加入了驗證的程式。
  • 這次實作還沒有辦法同時分享給有線及無線介面,只能選擇其中一種。

安裝套件


先從 Raspbian 套件庫安裝需要的套件。
sudo apt-get -y install ipheth-utils libimobiledevice-utils ifuse

不過,為了讓相容性的問題減到最低,我們要將這些套件全部更新到最新的版本,並做一些相關的設定。

由於步驟不少,所以我們直接把它們寫成 script 來執行。
vi ~/update.sh

貼上這些指令。

##### 我是分隔線 #####
#!/bin/bash

sudo apt-get -y install git build-essential libxml2-dev python2.7 python2.7-dev fuse libtool autoconf libusb-1.0-0-dev libfuse-dev

mkdir ~/libimobiledevice && cd ~/libimobiledevice

git clone https://github.com/libimobiledevice/libplist.git
git clone https://github.com/libimobiledevice/libusbmuxd.git
git clone https://github.com/libimobiledevice/usbmuxd.git
git clone https://github.com/libimobiledevice/libimobiledevice.git
git clone https://github.com/libimobiledevice/ifuse.git

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig" | sudo tee -a /etc/bash.bashrc

cd libplist && ./autogen.sh && make && sudo make install && cd ..
cd libusbmuxd && ./autogen.sh && make && sudo make install && cd ..
cd libimobiledevice && ./autogen.sh && make && sudo make install && cd ..
cd usbmuxd && sed -i 's/.\/configure/LDFLAGS\=-lrt .\/configure/g' autogen.sh && ./autogen.sh && make && sudo make install && cd ..
cd ifuse && ./autogen.sh && make && sudo make install && cd ..

groupadd -g 140 usbmux &> /dev/null
useradd -c 'usbmux user' -u 140 -g usbmux -d / -s /sbin/nologin usbmux &> /dev/null
passwd -l usbmux &> /dev/null

echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/libimobiledevice-libs.conf
sudo ldconfig
sudo modprobe fuse
sudo adduser pi fuse

##### 我是分隔線 #####

設定可執行的權限。
chmod +x ~/update.sh

開始更新。
~/update.sh

更新的時間大約是 5 到 10 分鐘,視 CPU 及 SD 卡的速度而定,就請喝杯咖啡稍候一下。

更新完畢之後,修改一下網路介面的設定。
sudo vi /etc/network/interfaces

在最下方加入這些指令。
allow-hotplug eth1
iface eth1 inet dhcp


Raspbain 2015-05-05 版之後,改用 dhcpcd 服務來處理 DHCP Client 的工作,請將「iface eth1 inet dhcp」改成「iface eth1 inet manual」,否則會導致 eth0 拿不到 IP。

建立給 iPhone 掛載用的目錄。
sudo mkdir /media/iPhone


新增給 udev 用的 iPhone 連線腳本。
sudo vi /lib/udev/iphoneconnect

輸入這些指令。
#!/bin/bash
umount /media/iPhone
ifuse /media/iPhone
ipheth_pair


加入執行權限。
sudo chmod +x /lib/udev/iphoneconnect
修改 iPhone Tether 規則的內容,把「ipheth-pair」改成「iphoneconnect」。
sudo sed -i 's/ipheth-pair/iphoneconnect/g'  /lib/udev/rules.d/90-iphone-tether.rules

啟動 iPhone 的個人熱點


打開 iPhone 的「設定」。

點選「行動網路」。

確認「行動數據」已經被開啟。

回上一層選單,再點選「個人熱點」,如果沒有開啟「行動數據」的話,會是反灰的狀態,無法點選。

「個人熱點」支援了三種連結方式。
  1. Wi-Fi
  2. Bluetooth
  3. USB

啟動「個人熱點」。

插上 iPhone 的傳輸線,接到 Raspberry Pi 的 USB 埠上面。

出現「信任這部電腦」的對話框時 ,點選「信任」,這個選項在 iOS 7.0 之後的版本才有,每次接上 Raspberry Pi 的時候都會出現。

當 iPhone 與 Raspberry Pi 成功連線後,狀態列變成藍色,並顯示「個人熱點:1 個連線」。

而在 Raspberry Pi 會多出一個 eth1 網路介面。
ifconfig -s

這樣子,Raspberry Pi 本機就可以用 iPhone 的行動網路上網了。


無線網路分享


只有 Raspberry Pi 本機可以上網,實在沒什麼實用性,所以讓我們用 Wi-Fi 來分享吧。


或許有些朋友會問:「iPhone 自己就可以用 Wi-Fi 分享了,為什麼還要經過 Raspberry Pi ?」

原因很簡單:
  1. iPhone 用 Wi-Fi 分享個人熱點比用 USB 更耗電。
  2. iPhone 的 Wi-Fi 同時連線人數比 Raspberry Pi 還少。
  3. 可以串接 Raspberry Pi 上面的服務,如:Samba、TOR、Proxy ... 等,可以參閱 Raspberry Pi 的所有文章
  4. 可以讓連上 Raspberry Pi 的所有設備變成在同一個網段裡。

請參閱 Raspberry Pi 的應用 - Wi-Fi 無線基地台 的內容,依照路由模式的步驟實作,再讓設備用 Wi-Fi 連上 Raspberry Pi 即可。


有線網路分享


只要將橋接套件安裝完畢。
sudo apt-get -y install bridge-utils

修改一下網路介面的設定。
sudo vi /etc/network/interfaces

在最下方加入橋接的設定值,並且把先前加入的 eth1 設定值註解掉。
#allow-hotplug eth1
#iface eth1 inet dhcp


auto br0
iface br0 inet dhcp
bridge_ports eth0 eth1

再把 RJ-45 網路線連上 Raspberry Pi 和 PC / Mac 就可以了。


異常排除

  • 編譯 usbmuxd 時出現下列的錯誤訊息???

    /usr/bin/ld: usbmuxd-utils.o: undefined reference to symbol 'clock_gettime@@GLIBC_2.4'
    //lib/arm-linux-gnueabihf/librt.so.1: error adding symbols: DSO missing from command line
    collect2: ld returned 1 exit status
    Makefile:349: recipe for target 'usbmuxd' failed
    make[2]: *** [usbmuxd] Error 1
    make[2]: Leaving directory '/iphone_libs/usbmuxd/src'
    Makefile:353: recipe for target 'all-recursive' failed
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory '/iphone_libs/usbmuxd'
    Makefile:284: recipe for target 'all' failed
    make: *** [all] Error 2

    請參考 stackoverflow - Official V4L2 Driver for raspberry pi, how do I add lrt flags to a makefile? 的內容,將 autogen.sh 裡的「./configure」改成「LDFLAGS=-lrt ./configure」。
      
  • iPhone 上面重覆出現「信任這部電腦」的對話框???

    之前用 iPhone 5 + iOS 7.12 + JB,一直遇到這個問題;可是在改用 iPhone4S + iOS 8.2 卻是一次就成功,所以懷疑是 JB 的關係,期待其他的勇者也來實驗一下。

    也有其他網友反應是沒有相關套件升級到最新版,或是線材的問題。

系列文章


參考資料


參考資料

  • 2015/05/09 撰文。

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

IT 技術家 - 創站部落客

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

6 則留言 :

  1. 如你所述,安裝完所有套件,將/etc/network/interfaces,加入
    auto br0
    iface br0 inet manual
    bridge_ports eth0 eth1
    iPhone插上後,Raspberry本身可上網,eth1不會自動加入br0,
    需在iphone plug in以後,要下brctl addif br0 eth1,eth0才能獲取IP聯網,請問須設定哪裡讓iphone插上時,eth1自動加入br0?(Raspberry Pi 3 Model B+ iphone 5S)

    回覆刪除
    回覆
    1. 好一陣子沒用到這個了,沒辦法實際驗證。
      不過當時實作的時候,似乎沒有這個問題,直接就會連起來,不知道是套件改版了還是iOS端有修改...
      或許你可以試試先開好 iPhone 的分享並插上 RPi,再打開 RPi 的電源呢?

      刪除
  2. 已解決.就是去設定udev的.rules設定檔,當USB插入iPhone時,自動去執行一個script,將eth1加入br0就可運作了了...(試過開好iphone分享再開RPi電源也無法解決)

    回覆刪除
    回覆
    1. 感謝你的回覆,原來醬子可以自動橋接了....^^

      刪除
  3. 感谢博主分享,我急需这个方法,明天我也来试试

    回覆刪除