Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Raspberry Pi as a Wireless Router

31,155 views

Published on

Published in: Technology

Raspberry Pi as a Wireless Router

  1. 1. 用 Raspberry Pi 體驗嵌入式系統開發 - 自己動手做無線路由器 台灣樹莓派 <sosorry@raspberrypi.com.tw> Oct 28, 2013/Raspberry Pi #1
  2. 2. 相關議程 ● Raspberry Pi 好好玩 - 應用篇 ● Raspberry Pi 好好玩 - GPIO 篇
  3. 3. Raspberry Pi 是什麼 ? ● 信用卡大小般的電腦 http://www.flickr.com/photos/fotero/7697063016/
  4. 4. Raspberry Pi 硬體規格 (Model B) ● SoC Broadcom BCM2835 CPU: ARM11 family, 700 MHz ● GPU: Broadcom VideoCore IV, OpenGL ES 2.0, 1080p30 H.264/MPEG-4 AVC decoder ● Memory: 512 Mb SDRAM Video outputs: Composite, HDMI ● ● ● Audio outputs: 3.5 mm jack, HDMI ● Onboard storage: SD, MMC, SDIO card slot ● Onboard 10/100 Ethernet RJ45
  5. 5. 週邊 + OS http://www.raspberrypi-tutorials.co.uk/starting-up-your-raspberry-pi-device/set-raspberry-pi/
  6. 6. Raspberry Pi 怎麼玩 ?
  7. 7. Raspberry Pi 還可以怎麼玩 ?
  8. 8. 看了很多 還是不知道怎麼開始
  9. 9. Raspberry Pi 的軟硬整合之道
  10. 10. 用 Raspberry Pi 體驗嵌入式系統開發 - 自己動手做無線路由器
  11. 11. 嵌入式系統 ● ● ● 為特定應用而設計的專用計算機系統 通常執行的是帶有特定要求的預先定義的任務 - wikipedia 常見作法 : 特製硬體 + 嵌入式 Linux+Driver+ 客製 化應用程式
  12. 12. 嵌入式系統開發流程 ● 硬體設計 & 驗證 ● 軟體開發 & 系統整合 ● 測試
  13. 13. 無線路由器 ● 無線 (wireless) + 路由器 (router)
  14. 14. 使用情境 http://www.techiestate.com/how-to-set-up-a-wireless-router/
  15. 15. 使用情境 實做目標 http://www.techiestate.com/how-to-set-up-a-wireless-router/
  16. 16. 情境 = 問題 ● ● ● ● ● ● 取得對外網路 有線 / 無線? 如何發射訊號? 網路的分配? 使用者介面? … 未知的問題
  17. 17. 使用情境 3. 發射無線訊號 2. 有線 / 無線介接 1. 取得對外網路 5. 使用者介面 4. 網路的分配 http://www.techiestate.com/how-to-set-up-a-wireless-router/
  18. 18. 使用情境 3. 發射無線訊號 2. 有線 / 無線介接 1. 取得對外網路 5. 使用者介面 + 很多未知的問題 4. 網路的分配 http://www.techiestate.com/how-to-set-up-a-wireless-router/
  19. 19. 一個我們熟悉的裝置 背後是許多知識 & 功能的集合
  20. 20. 學習目標 ● ● ● ● ● ● 建構嵌入式系統開發環境 設定無線 / 有線封包轉送 設定 DHCP/Wireless Access Point 移植小型的網頁伺服器 撰寫 CGI 程式 以 Python 控制硬體
  21. 21. 體驗 1 - 建構嵌入式系統開發環境
  22. 22. 指令集架構 ● x86, ARM, MIPS, PowerPC ● 效能 ? 省電 ? 價格 ? 80386 ● 真八核 PS2 Power Macintoshes 一個 ARM 架構 ● ● 有 ARMv1, ARMv2..., ARMv8 ARM v6: Raspberry Pi Broadcom BCM2835
  23. 23. Porting( 移植 ) ● ● ● 同樣的程式碼在不同的平台 ( 架構 ) 上執行 問題? ● addressing space ● little endian/big endian ● alignment ● … 編譯器 ( 們 ) 會幫我們解決一切?
  24. 24. Toolchain ● 一堆工具 + library ● ● ● ● ● ● Compiler Linker Assembler Debugger Libraries ... http://www.aboutdebian.com/compile.htm
  25. 25. Cross Compile 交叉式編譯 ● ● 在完善的開發平台下開發其他平台的軟體 Ex: 在 x86 平台下開發 ARM 的軟體 ● gcc foo.c -o foo ● arm-linux-gnueabi-gcc foo.c -o foo
  26. 26. 利用 autotools ● ./configure --build --host --target ● ● --host: the architecture that you want the file to run on ● ● --build: the architecture of the build machine --target: the machine that GCC will produce code for 在 build 下編好 , 在 host 執行 target 版本 Ex: ./configure --build=i686-pc-linux-gnu --host=arm-linux --target=mips-linux
  27. 27. 建構 cross-compiling 環境 ● 下載 Raspberry Pi 的 toolchain ● ● ● https://github.com/raspberrypi/tools 三個選擇 ● arm-bcm2708-linux-gnueabi ● arm-bcm2708hardfp-linux-gnueabi ● gcc-linaro-arm-linux-gnueabihf-raspbian( 推薦 ) 加到環境變數 ● echo 'export PATH=$PATH:/path/to/toolchain' >> ~/.bashrc
  28. 28. 體驗 2 - 開發嵌入式系統所需功能
  29. 29. 想像所需要的功能 ● 假設 ● 有一個東西可以介接有線和無線 ● 有一個東西可以發射無線網路的訊號 ● 有一個東西可以分配網路 ● 做一個控制的使用者介面
  30. 30. 想像所需要的功能 ● 假設 ● 有一個東西可以介接有線和無線 – iptables & ip forwarding ● 有一個東西可以發射無線網路的訊號 ● 有一個東西可以分配網路 ● 做一個控制的使用者介面
  31. 31. iptables
  32. 32. Linux 封包過濾概念 ● netfilter( 封包過濾機制 ) ● ● 根據封包的表頭採取動作 iptables( 用戶空間程式 ) ● 封包過濾軟體
  33. 33. 封包過濾規則動作與分析流程 http://linux.vbird.org/linux_server/0250simple_firewall.php
  34. 34. iptables http://linux.vbird.org/linux_server/0250simple_firewall.php
  35. 35. NAT Table ● NAT = Network Address Translation ● ● 來源與目的之間的 IP 和 port 轉換 POSTROUTING – SNAT/MASQUERADE
  36. 36. 封包轉送規則 ● ● ● iptables -A INPUT -i wlan0 -j ACCEPT iptables -t nat -A POSTROUTING -s 192.168.77.0/24 -o eth0 -j MASQUERADE sysctl net.ipv4.ip_forward=1
  37. 37. 想像所需要的功能 ● 假設 ● 有一個東西可以介接有線和無線 – iptables & ip forwarding ● 有一個東西可以發射無線網路的訊號 – AP mode ● 有一個東西可以分配網路 ● 做一個控制的使用者介面
  38. 38. 無線網卡工作模式 ● Station (STA) infrastructure mode ● AccessPoint (AP) infrastructure mode ● Monitor (MON) mode ● Ad-Hoc (IBSS) mode ● Wireless Distribution System (WDS) mode ● Mesh http://wireless.kernel.org/en/users/Documentation/modes
  39. 39. 選擇可以做 AP 的無線網卡 ● AP(Master) mode ● ● ● ● ● ● ● Ralink rt2400 / rt2500 Broadcom 43xx Realtek RTL8180 Texas Instruments ACX100/ACX111 Intel PRO/Wireless (ipwXXXX) series ZyDAS ZD1211 ... https://help.ubuntu.com/community/WifiDocs/MasterMode
  40. 40. hostapd ● User space daemon for access point ● Support IEEE 802.1X/WPA/WPA2/EAP ● 硬體的支援 + 軟體的實做 http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
  41. 41. Cross Compile hostapd ● 下載 hostapd(RTL8188CUS) ● ● 設定編譯參數 configure CC=arm-linux-gnueabihf-gcc ./configure --host=armlinux --prefix=/path/to/install 編譯 ● make && make install ● ● http://bit.ly/t0HWH1
  42. 42. 想像所需要的功能 ● 假設 ● 有一個東西可以介接有線和無線 – iptables & ip forwarding ● 有一個東西可以發射無線網路的訊號 – AP mode ● 有一個東西可以分配網路 – dhcp daemon ● 做一個控制的使用者介面
  43. 43. DHCP Daemon ● 分派 IP, 給予相關資訊 ● 管理租約 ● isc-dhcp-server http://linux.vbird.org/linux_server/0340dhcp.php
  44. 44. Cross Compile dhcpd ● 下載 dhcpd ● ● 設定編譯參數 configure ● ● wget ftp://ftp.isc.org/isc/dhcp/4.1-ESV-R8/dhcp-4.1-ESV-R8.tar.gz CC=arm-linux-gnueabihf-gcc ./configure --host=arm-linux --prefix=/path/to/install 編譯 ● make && make install
  45. 45. 想像所需要的功能 ● 假設 ● 有一個東西可以介接有線和無線 – iptables & ip forwarding ● 有一個東西可以發射無線網路的訊號 – AP mode ● 有一個東西可以分配網路 – dhcp daemon ● 做一個控制的使用者介面
  46. 46. 體驗 3 – 在適合的環境下開發 UI
  47. 47. App 在嵌入式系統是如何顯示的 ? Application GUI-ToolKit Framebuffer Hardware
  48. 48. Native App vs. Browser Based App /dev/fb driver SoC
  49. 49. Native App 1. 根據 toolkit 寫 ap 2. 執行速度快 3. 可以和系統直接以 IPC 溝通 /dev/fb driver SoC
  50. 50. Browser Based App 1. 可支援 HTML5 和 CSS3 2. 開發速度快 3. 需要以 plugin 方式擴充 /dev/fb driver SoC
  51. 51. 看看別人怎麼做
  52. 52. 主要功能表
  53. 53. Browser based = web server + 程式
  54. 54. 網頁伺服器 ● ● 一個軟體 回應從 80/8080 port 進來的 HTTP 要求 ● 可透過 CGI 或 module 方式擴充 ● 如 Apache, Nginx, Boa http://www.resultantsys.com/index.php/general/what-is-a-web-application-server/
  55. 55. Boa Web Server (~2005) ● ● ● ● 一個小型的網頁伺服器 優點 ● 小 , 25 支 C 共 6899 行 缺點 ● 沒有 access control(authentication) ● 無法 chroot ● 不支援 SSL GPLv2 License
  56. 56. Cross Compile Boa ● 下載 boa ● ● 設定編譯參數 configure ● ● wget http://www.boa.org/boa-0.94.13.tar.gz CC=arm-linux-gnueabihf-gcc ./configure --host=armlinux 編譯 ● make && make install
  57. 57. 有了 web server 再找一個配合的動態語言
  58. 58. Python ● Raspberry Pi 內建 ● Script 語言 ● ● ● 強大的數學功能 穩定的套件管理 可結合多種 web server ● 以 CGI 方式執行 , 存取硬體資源
  59. 59. CGI ● CGI = Common Gateway Interface ● 一個讓程式可以在 web server 被執行的標準 C, Perl, Python, PHP... 輸出 / 輸入轉向 ● ● ● Python CGI
  60. 60. 體驗 4 - 存取硬體資源
  61. 61. 以 Python 做控制 ● 控制硬體 (GPIO) ● 讀寫 shell command ● 用 AJAX 做畫面
  62. 62. General Purpose Input Output(GPIO) ● A generic pin on an IC http://raspberrypihobbyist.blogspot.tw/2012/09/so-many-inputs-so-few-gpio-pins.html
  63. 63. Raspberry Pi 的 GPIO SPI / I2C / UART / PWM http://elinux.org/RPi_Low-level_peripherals
  64. 64. 線路圖
  65. 65. Python Code Flow ● Import module ● Define pin numbering ● Setup up a channel ● Input/Output ● Cleanup
  66. 66. Python Code Example green = 26 , red = 24 # Define pin numbering try: import RPi.GPIO as GPIO # Import module except RuntimeError: print ("import RPi.GPIO error!!") GPIO.setmode(GPIO.BOARD) # Setup up a channel cmd = "sudo sysctl net.ipv4.ip_forward=1" result = commands.getstatusoutput(cmd) GPIO.output(green, GPIO.HIGH) # Input/Output GPIO.output(red, GPIO.LOW) # # Input/Output
  67. 67. DEMO
  68. 68. 總結 ● ● ● 建構嵌入式系統開發環境 開發嵌入式系統所需功能 ● 設定 iptables 和封包轉送 ( 介接有線和無線 ) ● 交叉編譯 hostapd( 發射無線網路的訊號 ) ● 交叉編譯 isc-dhcp-server( 分配網路 ) 在適合的環境下開發 UI 交叉編譯 Boa( 使用者介面 ) ● 交叉編譯 Python( 動態語言 ) 存取硬體資源 ● 接線 , 用 Python 存取硬體 (GPIO) ● ●
  69. 69. Raspberry Pi Rocks the World Thanks

×