Friday, November 21

how to use php commnad “shell_exec” as root in RPi

วันนี้ นำเสนอเทคนิคเล็กน้อย สำหรับการเรียกใช้คำสั่ง root ผ่านหน้าเว็บแอพลิเคชั่น อย่างเช่น php บน RPi

ตัวอย่างปัญหา คือ ผมต้องการตั้งค่า วันเวลา บน Rpi

เช่น ผมต้องการให้มีการแก้ไข เวลาของ RPi  แล้ว ปกติ เราสามารถเรียกใช้คำสั่ง

sudo date --set="15 NOV 2014 12:43:10"   โดยพิมพ์ไปที่ terminal ของ Rpi ได้  แต่ ถ้าเราต้องการทำ web application ให้สามารถแก้ไขเวลาของ RPi หล่ะ เราจะทำอย่างไร

โดยปกติแล้ว php จะสามารถรัน shell_exec แล้วตามด้วย linux command ได้ เช่น

<?php

$output = shell_exec(“ls –l”);

echo “<pre>$output</pre>

?>

หากเราเรียกเว็บเพจที่มี สคริปต์ตัวอย่างด้านบน เราก็จะเห็นรายละเอียดไฟล์ในโฟวเดอร์ใน linux นั้น แต่ ถ้าเราต้องการให้ shell_exec เรียกคำสั่งที่เป็นของ root ได้หล่ะ เช่น

shell_exec(‘sudo date --set="15 NOV 2014 12:43:10"’);  แบบนี้ เราจะทำไม่ได้ เพราะ ตัวเว็บเพจนี้ ไม่มีสิทธิ์ทำเช่นนั้นได้ วิธีแก้ไข ก็คือ เราต้องไปกำหนดสิทธิ์ให้เว็บ application นี้ก่อน ทำตามนี้

หากเราต้องการให้เรียกใช้คำสั่ง shell_exec ของ PHP  ใน RPi ให้สามารถเรียกใช้คำสั่ง root ได้ เราจำเป็นต้องแก้ไขสิทธิ ของ application ที่ต้องใช้งานสักหน่อย

พิมพ์  sudo visudo

ทำการเพิ่ม  www-data  ALL=(ALL)  NOPASSWD:ALL  ไปที่ท้ายไฟล์ แล้วทำการบันทึกไฟล์นี้

sudo visudo

จากนั้นเขียนสคริปต์ไฟล์ php แล้วไปวางไว้ที่ /var/www 

<?php

$output = shell_exec(‘sudo date --set="15 NOV 2014 12:43:10"’);

echo “<pre>$output</pre>”;

?>

บันทึกโค๊ดนี้ ตั้งชื่อไฟล์ตามใจชอบ เช่น time.php  เสร็จแล้ว ลองเปิดหน้าเว็บบราวเซอร์ แล้ว เรียกไปที่ time.php โดยใส่ ip ของ RPi เช่น  http://192.168.1.103/time.php  เราก็จะสามารถตั้งค่าเวลาของ RPi ผ่านหน้าเว็บได้  ซึ่งโดยปกติ จะไม่สามารถเรียกใช้คำสั่ง sudo ผ่าน shell_exec ได้ 

ลองเอาไปประยุกต์กันดูนะครับ

ปล. บทความนี้ ไม่อาจเขียนละเอียดมากนัก ผู้ที่ไม่มีพื้นฐานเลย อาจจะงง สักเล็กน้อย ขออภัยไว้ ณ ทีนี้ด้วย

อ่านเพิ่มเติม...

Sunday, March 2

shell script check cpu raspberry pi ‘s temperature

vcgencmd measure_temp

หน้าร้อนใกล้เข้าแล้ว  เริ่มเป็นห่วงว่า Raspberry pi จะร้อนเกินไปหรือเปล่า ก็ลองใช้ shell script เช็คอุณหภูมิของ CPU ของ Raspberry pi สักหน่อย ว่า ตอนนี้อุณหภูมิ อยู่ที่เท่าไหร่แล้ว ใช้คำสั่งง่ายๆ ครับ vcgencmd measure_temp แค่ นี้ ก็จะได้คำตอบแล้ว ว่าอุณหภูมิเท่าไหร่  ถ้าจะให้วนลูปเรื่อยๆ ก็ได้ครับ

while true; do vcgencmd measure_temp; sleep 2; done

วนลูป แล้ว หยุด ทุกๆ 2 วินาที  ลองเอาไปประยุกต์กันดูครับ

อ่านเพิ่มเติม...

Thursday, January 23

Port Forwarding for Raspberry pi from outside world

เผื่อบางท่านที่ยังไม่ทราบ หรือกำลังหาวิธีทำ Port Forwarding จาก Router ไปหา Access point แล้วไปที่บอร์ด Raspberry pi โดยเราจะทำการ Port Forwarding หมายเลขพอร์ท 80 สำหรับเว็บ , หมายเลข 22 สำหรับทำ SSH รีโมทเข้าบอร์ด , หรือพอร์ทอื่นๆ ที่คุณต้องการรันแอพพลิเคชั่น

อันดับแรกเลย ผมจะบอกถึงอุปกรณ์เนตเวิร์กของผมก่อน ผมใช้บริการอินเตอร์เนต จาก 3BB network  ผมมี Huawei router จาก 3BB จากนั้นผมก็ต่อเข้ากับ Enginius ที่เป็นตัวขยาย Port Network และเป็นตัวปล่อยสัญญาณ wifi ภายในบ้าน จากนั้น ผมก็ต่อบอร์ด Raspberry pi เข้ากับ Engenius อีกครั้ง ตามรูป

จากนั้น เราต้องทำการ Fixed หมายเลข IP Address ของที่ Huawei ที่เป็น LAN และที่ Engenius ทั้ง WAN และ LAN เลย ส่วนที่บอร์ด Raspberry pi ก็ให้ Fixed ไว้ด้วยเช่นกัน

Port Forwarding for Raspberry pi from outside world

ทำการ Fixed IP Address ให้ได้ตามรูปด้านบนก่อน 

สำหรับ Huawei

Port Forwarding for Raspberry pi from outside world

 

สำหรับ Engenius 

Port Forwarding for Raspberry pi from outside world

Port Forwarding for Raspberry pi from outside world

จากรูปด้านบน เรามองว่า WAN ของ Huawei คือรับ IP และข้อมูลจากภายนอก แล้ว LAN คือ iP ในวงแลนของเรา แต่ เมื่อเราต่อ Engenius ต่อท้าย Huawei แล้ว จึงทำให้ WAN ของ Engenuis ก็รับข้อมูลจาก LAN ของ Huawei อีกที

ดังนั้น เราต้องทำการบอกที่ Huawei ให้ทำการส่งข้อมูล ที่ต้องการติดต่อกับพอร์ตใดๆ ไว้ที่ Huawei ให้ทำการส่งข้อมูลนั้น ต่อมาที่ WAN IP ของ Engenius  โดยเข้าไปตั้งค่า NAT ในหน้าเว็บของ HUAWEI โดยปกติจะเป็น http://192.168.1.1 แล้วไปที่เมนู Basic->NAT ทำการเพิ่ม Virtual Server ตามรูป ในที่นี้ผมต้องการให้ มีการ Forward port 80,22,8090,900 ไปที่ WAN IP ของ Engenius

Port Forwarding for Raspberry pi from outside world

จากนั้น เราก็ไปตั้งค่า Forwarding Port ที่ Engenius ต่อไปที่บอร์ด Rasbperry pi ของเราอีกที โดยที่บอร์ด Rasbperry pi ของเราถูก Fixed IP Address ไว้ที่ 192.168.2.105

Port Forwarding for Raspberry pi from outside world

ทำการ Fixed IP Address ของบอร์ด Raspberry pi ด้วยการแก้ไขไฟล์ interfaces

nano /etc/network/interfaces

Port Forwarding for Raspberry pi from outside world

แค่นี้ ก็เป็นอันเรียบร้อยแล้ว วิธีทดสอบก็คือ ลอง Connect ผ่าน WAN IP Address ของ Huawei ผ่านหน้าเว็บ (ถ้าเปิด Web service ไว้) หรือผ่าน SSH Terminal จากข้างนอกเข้ามา ซึ่งการหา WAN IP Address ก็ทำตามขั้นตอนจากตอนเก่าๆ ได้ ที่นี่

มาถึงตอนนี้ ผมคิดว่าหลายๆ คน คงเข้าใจดี ว่าตัวเองกำลังทำอะไรอยู่ และจะได้อะไรจากการทำแบบนี้ ซึ่งประโยชน์ที่คุณจะได้ก็คือ คุณจะสามารถเข้ามากับบอร์ด Raspbery pi แม้ว่าคุณอยู่นอกบ้าน ซึ่งก็แล้่วแต่จินตนาการของแต่ละท่านว่าจะทำอะไรต่อ

ปล. สำหรับใครที่ใช้ 3BB แล้ว Forward Port ไม่สำเร็จ โทรไปปรึกษา 3BB ที่เบอร์ 1530 นะครับ เพราะบางที เราอาจจะโดนบล๊อกจาก 3BB อยู่ก่อน บอกให้เขาปล๊อดบล๊อกให้ครับ

อ่านเพิ่มเติม...

Wednesday, January 22

Raspberry Pi 1- Wire Digital Thermometer Sensor

    สวัสดีครับ ไม่ได้อัพเดทซะนาน มัวแต่ไปเล่นไมโครคอนโทรลเลอร์อยู่ ต้องกลับมารื้อฟื้นปัดฝุ่น Raspberry pi สักหน่อย ทิ้งช่วงไปนาน เริ่มจะลืมแหละ และก็ไม่รู้ตอนนี้โลก Linux Embedded เขาไปถึงไหนกันแล้ว บอร์ด Linux Embedded กำลังทยอยออกมาอย่างต่อเนื่อง ถ้าไม่กลับมาเล่น Linux Embedded มีหวังตามไม่ทันแน่ๆ

     ช่วงนี้่อากาศก็ยังหนาวอย่างต่อเนื่อง ดึกๆ ยิ่งอากาศเย็น ระวังเรื่องสุขภาพกันด้วย พอพูดถึงเรื่องอากาศเย็น เราก็อยากจะรู้เหมือนกัน ตอนนี้มันเย็นกี่องศาแล้ว งั้นเราก็มาลองให้ Raspberry pi อ่านค่าอุณหภูมิผ่านไอซีดิจิตอล เบอร์ DS18B20 ผ่าน Protocol แบบ 1-wire ดูสักหน่อยสิ ว่าอุณหภูมิตอนนี้มันเท่าไหร่

เนื่องจากไม่ได้อัพเดทเฟิร์มแวร์ของ Raspbian นานแล้ว ก็เอาสักหน่อย ทั้ง update และ upgrade กันไปเลย

sudo apt-get update
sudo apt-get upgrate

ไอ้ตอน upgrade นี่นานเลยหล่ะ ถ้าใครไม่เคยอัพเกรดนานๆ เหมือนผม

เสร็จแล้ว ก็หาไอซีดิจิตอล DS18B20 สักตัว ไม่แพงแล้วทุกวันนี้ ถูกมาก แล้วก็ตัวต้านทาน ค่า 4.7k โอห์ม เอามา Pull-up ขา Data ของไอซี DS18B20 (ตามคำแนะนำดาต้าชีท)

Raspberry Pi 1- Wire Digital Thermometer Sensor

ที่มารูปวงจร http://www.raspberrypi-spy.co.uk/

เมื่อต่อวงจรเสร็จแล้ว ก็ต้องมาทำการเพิ่มโมดูล 1-wire ไปที่ kernel ของ Linux ด้วยคำสั่ง

sudo modprobe w1-gpio
sudo modprobe w1_therm

ถ้าสำเร็จเราจะเห็นข้อมูลการรายงานค่าอุณหภูมิที่ directory /sys/bus/w1/devices ลองเข้าไปที่ directory นี้ดูครับ

cd /sys/bus/w1/devices
ls

ถ้าปรากฏ serial number ของเซ็นเซอร์ คล้ายๆ แบบนี้ก็ใช้ได้ครับ
28-0000031280c7  w1_bus_master1

ให้เราเข้าไปที่ 28-0000031280c7 แล้วอ่านไฟล์ w1_slave ที่อยู่ข้างในดูครับ
cd 28-0000031280c7
ls
cat w1_slave

มันจะรายงานค่าอุณหภูมิที่อ่านได้จากเซ็นเซอร์ DS18B20 มีหน่วยเป็นเซลเซียส


58 01 1e 00 1f ff 08 10 d9 : crc=d9 YES
58 01 1e 00 1f ff 08 10 d9 t=21500

มีค่าประมาณ 21.5 องศาเซลเซียส  สำหรับผม ก็ถือว่าหนาวแล้วขนาดนี้ บรื๊ออออออก็ลองเอาไปประยุกต์กันดูครับ ง่ายๆ อุ่นเครื่องกันเท่านี้ก่อนหล่ะกัน สวัสดีครับ

image

ที่มา raspberrypi-spy.co.uk

เสร็จแล้ว ก็ลอง Polling data ด้วย Python ดูสักหน่อยสิ

python_read_ds18b20

ปล. ลืมไปว่าเราสามารถแทรก คำสั่ง modprobe ในโค๊ดนี้ก็ได้ จะได้ว่า


import os
from time import sleep

os.system('sudo modprobe w1-gpio')
os.system('sudo modprobe w1_therm')

while True:
    tfile = open("/sys/bus/w1/devices/28-0000031280c7/w1_slave")
    text = tfile.read()
    tfile.close()
    temperature_data = text.split()[-1]
    temperature = float(temperature_data[2:])
    temperature = temperature / 1000
    print temperature
    sleep(2)

อ่านเพิ่มเติม...
 

แจกฟรี พื้นที่ฝากไฟล์ 15 GB

ติดตามข่าวสารผ่าน Twitter

ติดตาม Blog นี้

About Me

My photo

สวัสดีครับ ชื่อเปิ้ลนะครับ ถ้ามีอะไรให้ช่วยเหลือได้ ก็จะช่วยครับ
ผมได้สร้างบล๊อกไว้ เพื่อเก็บรวบรวมความรู้ และประสบการณ์ในการทำงานครับ แวะไปเยี่ยมชมกันได้ครับ http://mechacity.blogspot.com และบล๊อก http://faker-programmer.blogspot.com ครับ

Blog อื่นๆของฉัน

Microcontroller Electronics update

สถิติเยี่ยมชมบล๊อก