相信各位一定也遇過這種事吧,家裡的 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 的「設定」。
點選「行動網路」。
確認「行動數據」已經被開啟。
回上一層選單,再點選「個人熱點」,如果沒有開啟「行動數據」的話,會是反灰的狀態,無法點選。
「個人熱點」支援了三種連結方式。
- Wi-Fi
- Bluetooth
- 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 ?」
原因很簡單:
- iPhone 用 Wi-Fi 分享個人熱點比用 USB 更耗電。
- iPhone 的 Wi-Fi 同時連線人數比 Raspberry Pi 還少。
- 可以串接 Raspberry Pi 上面的服務,如:Samba、TOR、Proxy ... 等,可以參閱 Raspberry Pi 的所有文章。
- 可以讓連上 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 的關係,期待其他的勇者也來實驗一下。
也有其他網友反應是沒有相關套件升級到最新版,或是線材的問題。
系列文章
參考資料
- Dave Conroy - How to Tether Your Raspberry Pi with your iPhone 5
- Dave Conroy - Ditch Your Cable Modem/ISP With a Tethered iPhone and Raspberry Pi
- https://gist.github.com/keyvanfatehi/8922430
- libimobiledevice
- ㄘㄊ的根莖類成長記錄: 樹莓派 Raspberry Pi 使用iPhone連線上網 & 橋接至IP分享器當作緊急備用WAN使用
參考資料
- 2015/05/09 撰文。
如你所述,安裝完所有套件,將/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)
好一陣子沒用到這個了,沒辦法實際驗證。
刪除不過當時實作的時候,似乎沒有這個問題,直接就會連起來,不知道是套件改版了還是iOS端有修改...
或許你可以試試先開好 iPhone 的分享並插上 RPi,再打開 RPi 的電源呢?
已解決.就是去設定udev的.rules設定檔,當USB插入iPhone時,自動去執行一個script,將eth1加入br0就可運作了了...(試過開好iphone分享再開RPi電源也無法解決)
回覆刪除感謝你的回覆,原來醬子可以自動橋接了....^^
刪除感谢博主分享,我急需这个方法,明天我也来试试
回覆刪除希望幫得上你的忙....^^
刪除你好,
回覆刪除我試了幾次按照您的方式設定,但是在script執行後卻出現
adduser : The group ‘fuse’ does not exist.
並且iphone插上去之後不是信任電腦的選項,而是 要允許此裝置取用照片及影片嗎?
請問版主有遇過嗎?
謝謝