物聯網系統整合應用 (六) IOT (Internet Of Things)
課程主題 (Part 6) Web Server 相關介紹 BeagleBone 硬體介紹 BeagleBone 軟體介紹
作業系統 - Linux 程式語言 - Python
BeagleBone之WebServer程式說明
網際網路 (World of Internet)
網路伺服器分類(Internet Server) 依據伺服器提供的服務來分... ※ WebServer 網頁伺服器 ※ Email Server 郵器伺服器 ※ FTP Server 檔案共享伺服器 ※ DNS Server 網址轉換伺服器 ※ Home Server (入口網站)
網路伺服器架構
192.168.1.111
網頁伺服器的輸出阜定義 Official TCP/IP Ports Definition http://www.chebucto.ns.ca/~rakerman/port-table.html#Table
Change Web-port No. "80" to "8000" in BeagleBone.
WebServer 硬體
BeagleBone 硬體開發板 BeagleBone™為本系統的 WebServer 模組,採用 TEXAS INSTRUMENTS 的 AM3358 cortex-A8 為核心,透過 Linux 核心,可簡化在 BeagleBone 上各類感測器和控制的開發 工作,它提供內建乙太網 MAC、 支援 PHY 。
硬體規格 On beaglebone: Peripherial chips are added to make the board more handy to use.
a) 256MB DDR2 @ 400MHz b) USB hub
c) Ethernet phy d) Micro SD slot
e) 2 ports 46 pins expansions header (2.54): a) b) c) d) e) f) g) h) i) j) •
LCD GPMC bus(memory controller) MMC1 (MMC card) SPI x2 IIC x3 UART x6 ADC(1.8V max) GPIO x 66 CAN Bus x2 Timer output x4 PWM x 8
All IO are 3.3V except ADC is 1.8V
BeagleBone 方塊圖
AM3358 CPU 內部方塊圖
BeagleBone I/O 介面分類 1. LCD Interface - 24 bits LCD 介面 2. GPMC (General Purpose Memory Controller) - TI 專 屬的外接記憶體控制介面 3. MMCI - MMC 記憶卡控制介面 4. Uart (6組) - 非同步信號介面 5. I2C (3組) - 非同步信號介面 6. SPI (Serial Periphal Interface) (2組) - 同步信號介面
多功能輸出入阜(Muxing GPIO)
共 2Ports / 46Pins, 根據 Mode(0~7) 來選擇功能
若使用Python PyBBIO之程式庫 ...
常用的 Linux 指令 man "指令" (指令的使用 Manual) mkdir (建立一目錄) rmdir (移除一目錄) cd (改變目前錄位置) cat "file" 或 more "file" (觀看某一檔案內容) cp "file1", "file2" (複製檔案) rm "file" (刪除某一檔案) find "dir" -name "file" (在目錄中尋找某一檔案) grep "name" "file" (在檔案中尋找一串文字) chmod "xxx(755)" "file", xxx: 000 ~ 777 (u, g, o) (改變檔案屬性) ps -aux (觀看目前系統執行多少Process) kill "uid" (清除某一個 Process) vi "file" (使用Linux 的 vi 編輯器) useradd (建立帳號, 資料將存於 /etc/passwd 檔案中) passwd (改變user 之密碼) who (看誰在線上), Whoami (看個人帳號)
請同學安裝:
Juice SSH (Secure Shell) Client 以連接BeagleBone之Linux OS
1. 手機 Wifi 網路開啟 IOT_xxxx 2. 執行Juice SSH app 3. 設定Connection/New Connection ip address:192.168.1.111 4. 設定字體大小Settings/Fone Size
Script Language 的優點 Faster programming (快速) Functions and library sharing (易分享) Possibility of crossing platforms (跨平台) Easy to use for Web application
Python Script 語法摘要 1. 程式邏輯以縮排當作段落 e.g.,
e.g.,
e.g.,
if number == 5 : print ( "Right numer) //縮排至少兩空格 else print ("Wrong number) while answer == "no" : answer = input ("your answer") print ("Right answer") for i in range (1,10) : print i
2. 導入程式庫用 import指令 (如同C 語言之 #include) e.g., import time time.sleep (900) #delay 0.9s
3. 函數使用定義: def func() e.g., def get_answer() : answer = input ("Your answer") print (answer)
4. 程式段落類似 Arduino 語法 - Python BBIO 程式庫 e.g., def setup() : # 執行一次的程式放此, 但setup名稱可以改變 def loop() : # 永久執行的程式放此, 但loop名稱可以改變
執行程式用指令: run (setup, loop)
使用Python直譯(Interpreter)環境 1. 登入 Linux - 手機或平板請使用 SSH 登入 [註] PC Window OS 則使用 Putty, 或 WinSCP
2. 進入 python 環境 (Python <cr> 或 !/usr/bin/env python <cr> ) 螢幕將出現Python直譯環境之提示游標 ">>>"
3. 可直接當作計算器使用 e.g., 113+232, 23121-1212, 232*232
4. 或執行Python程式 e.g., for i in range (1,10): < 空2格以上 > print i <cr> 5. 離開 python環境, 執行 quit()
於Python直譯環境執行GPIO指令 from bbio import * // 使用PyBBIO 程式庫 pinMode(GPIO1_6, OUTPUT) // 連接P8第3腳至 任何一顆LED, 且LED 另一端接地 digitalWrite (GPIO1_6, HIGH) // GPIO 設為高電 壓 toggle (GPIO1_6) // GPIO 設定電壓反向
於Linux環境執行Python程式 - guess.py from random import randint secret = randint (1,10) guess = 0 while guess != secret : g = input ("Guess No") guess = int (g) if guess == secret : print ("you win ! ") else : print ("You loss !") print ("Game Over")
1. 若於SSH 環境使用Linux 指令: cat > guess.py 2. 離開編輯環境使用: <CRTL>+C, 存入 guess.py 3. 執行程式: python guess.py
Python 程式範例(blink.py) # blink.py # Blinks two of the Beagleboard's on-board LEDs until CTRL-C is pressed. # This example is in the public domain # Import PyBBIO library: from bbio import * # Create a setup function: 執行程式 : def setup(): python blink.py <cr> # Set the two LEDs as outputs: 以 <CTRL>C 離開 pinMode(USR2, OUTPUT) pinMode(USR3, OUTPUT) # Start one high and one low: digitalWrite(USR2, HIGH) digitalWrite(USR3, LOW) # Create a main function: def loop(): # Toggle the two LEDs and sleep a few seconds: toggle(USR2) toggle(USR3) delay(500) # Start the loop run(setup, loop)
BeagleBone網頁 程式架構圖
Initial Uart Initial Webserver
No
Press button Data from Arminno? Send command to Arminno
Display
執行指令
接收資料與顯 示
BeagleBone物 聯網首頁 透過有線或無線網路,使用 者可利用手機或PC 等裝置, 經由物聯網首頁,得知各感 知器的即時狀態 ,或透過網 頁去遠端遙控各種裝置。 IOT Server 使用說明
WebServer UI 控制指令 1. add Text # Create a new page home = Page("PyBBIO Test") # Add some text to the page: home.add_text ("This is a test of the BBIOServer library for PyBBIO. Follow the links at the left to test the different pages.")
3. add a Text Input # Create a new pag text = Page("Text Input") # Add one Text and one Text Input text.add_text ("Press submit to send the text in entry box:") text.add_entry (lambda text:print_entry(text), "Submit", newline=True)
Python 物聯網程式-1 (IOT_Server.py)
def setup(): # Start the serial port at 38400 baud: Serial2.begin(38400) Serial2.flush() # Create the web page: myServer = Page("IOT server") myServer.add_button(lambda: serial_get_color(), "Get Color", newline=True) myServer.add_button(lambda : serial_set_mp30(), "Music1", newline=True) myServer.add_button(lambda : serial_set_mp31(), "Music2", newline=False) myServer.add_button(lambda : serial_set_mp32(), "Music3", newline=False) myServer.add_button(lambda : serial_set_servo0(), "Servo Left", newline=True) myServer.add_button(lambda : serial_set_servo1(), "Servo Center", newline=False myServer.add_button(lambda : serial_set_servo2(), "Servo Right", newline=False) myServer.add_monitor(lambda: serial_rx(), "", newline=True) # Start the server: server.start(myServer) def loop(): # Server has stopped; exit happily: stop() run(setup, loop)
Python 物聯網程式-2 (IOT_Server.py) # serial_server.py # Creates a simple web interface to the Serial2 port. # Serial2 TX = pin 21 on P9 header # Serial2 RX = pin 22 on P9 header
from bbio import * from BBIOServer import * # Create a server object server = BBIOServer() # Define a global buffer for received data: data ='' def serial_get_color(): """ Sends given string to Serial2. """ Serial2.println("$c000") def serial_set_mp30(): """ Sends given string to Serial2. """ Serial2.println("$m000") def serial_set_mp31(): """ Sends given string to Serial2. """ Serial2.println("$m100") def serial_set_mp32(): """ Sends given string to Serial2. """ Serial2.println("$m200") def serial_set_servo0(): """ Sends given string to Serial2. """ Serial2.println("$v000")
Python 物聯網程式-3 (IOT_Server.py) def serial_set_servo1(): """ Sends given string to Serial2. """ Serial2.println("$v500") def serial_set_servo2(): """ Sends given string to Serial2. """ Serial2.println("$v900") def serial_rx(): """ Returns received data
global data if (Serial2.available()): # There's incoming data data = '' while(Serial2.available()): data += Serial2.read() if(Serial2.available() == 0): delay(20) return data