RTC Setup on Raspberry Pi (x300 expansion board)

First enable I2C

pi@register:~ $ sudo raspi-config

RTC_2

RTC_3

RTC_4.PNG

check that the RTC has been detected.

pi@register:~ $ sudo i2cdetect -y 1

The RTC should appear on channel 68.

RTC_1

check file /etc/modprobe.d/raspi-blacklist.conf 

remove or comment line where the I2C is black listed

#blacklist i2c-bcm2708

edit file /boot/config.txt

change dtoverlay=w1-gpio to dtoverlay=i2c-rtc,ds3231

edit /lib/udev/hwclock-set with

pi@register:~ $  sudo nano /lib/udev/hwclock-set

locate three line and  remark it with #

if [ -e /run/systemd/system ] ; then
exit 0
fi

RTC_5

RTC_6

save and exit

reboot your raspberry pi : sudo reboot

set date time : sudo date MMDDHHMMYYYY.SS (MM=Month, DD=Date, HH=Hour, MM=Minute, YYYY=Year, SS=Second example sudo date 05300957201704 = 2017 May 30 09:57:04)

write the system time to expansion board

sudo hwclock -w

read the time to verify

sudo hwclock -r

 

ใช้ Raspberry Pi ทำ Wifi Access Point, Transparent Proxy (web ด้วย)

โจทย์มีว่า ต้องการใช้ผู้ใช้งาน ใช้งานผ่าน wifi

Raspberry Pi 3 มี Wifi ในตัวและมี Ethernet port อีก 1 มี USB อีก 4 ช่อง

การเชื่อมต่อออกเน็ตก็สามารถทำผ่านการเชื่อมทาง Ethernet port ซึ่งก็น่าจะธรรมดาทั่วไป แต่ไม่สะดวกตรงที่ต้องเดินสายเชื่อมต่อ อยู่ที่บ้านก็คงไม่มีประเด็น แต่ถ้าจะเอาไปไหนมาไหนด้วย หรือเอาไปใช้งานในที่ต่าง ๆ เอาไปจัดงานครั้งคราว การเชื่อมต่อผ่าน wifi เพื่อออกอินเทอเน็ตน่าจะสะดวกกว่า ดังนั้นก็จะใช้ wifi ที่มีมาใน pi ต่อออกเน็ต พอใช้ต่อออกเน็ตแล้วจะ share internet ต่ออย่างไร

วิธีที่ 1 share ผ่านทาง  Ethernet port ด้วยการหา wifi access point มาต่ออีกตัว เอาสายต่อจาก WAN Port ของ access point มาที่  Ethernet port ของ pi ระหว่าง port นี้จะตั้งเป็น static ip address ก็ได้ หรือไม่ก็ให้ pi แจก IP ไปให้ access point

ผู้ใช้งานก็เกาะกับ wifi access point ข้อมูลก็วิ่งผ่านออกไปทาง pi ออกเน็ตไปทาง wifi ของ pi

แบบนี้ ลงโปรแกรมพวก แจก IP เช่น dnsmasq หรือ isc-dhcp ก็จบ ที่ใช้ dhcp ก็เพื่อจะได้ไม่ต้องมาตั้งค่า IP ให้ WAN port ของ access point จะได้ง่าย

/etc/dnsmasq.conf

interface=eth0
listen-address=172.24.1.1
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=interface:eth0,172.24.1.10,172.24.1.250,12h

/etc/network/interfaces

allow-hotplug eth0
iface eth0 inet static
address 172.24.1.1
netmask 255.255.0.0

ใช้คำสั่ง iptables เพื่อควบคุมการส่งผ่านข้อมูล

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o eth0 -m state –state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT

อย่าลืมแก้ไขในไฟล์ sudo nano /etc/sysctl.conf ลบเครื่องหมาย # หน้า net.ipv4.ip_forward=1 ออก หรือ พิมพ์ net.ipv4.ip_forward=1 เพิ่มเข้าไปถ้าไม่มี ถ้าอยากให้ทำงานทันทีโดยไม่ต้อง reboot เครื่อง ให้พิมพ์ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

จากนั้นใช้คำสั่ง sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" เพื่อเก็บคำสั่งของ iptables ไว้ แล้วเอาไปใส่ไว้ใน rc.local เพื่อที่เวลาเปิดเครื่องใหม่ มันจะได้ทำงานทุกครั้ง (ไม่ต้องมาพิมพ์ใหม่) แก้ไขไฟล์ rc.local ด้วยคำสั่ง sudo nano /etc/rc.local เพิ่มคำสั่งนี้เข้าไปก่อนบรรทัด exit 0

iptables-restore < /etc/iptables.ipv4.nat 

เสร็จแล้วก็

sudo service dnsmasq start

ยังไม่พอใจ แบกเอา access point ไปด้วยมันเกะกะ ต้องมีสองกล่อง

วิธีที่ 2 เพิ่ม wifi เข้าไปที่ Raspberry Pi อีกอัน ไปซื้อ usb wifi มาใส่ ข้อควรระวังคือ ส่วนใหญ่ถ้าใช้ usb wifi สำหรับต่อออก internet ไม่ค่อยมีปัญหากับยี่ห้อ แต่ถ้าจะใช้ แบบในรูป มาต่อแล้วจะให้มันเป็นทำตัวเป็น access point wifi แล้วละก็ ต้องระวังในการเลือกซื้อเป็นอย่างมาก เพราะ software (hostapd) ที่จะใช้มักมีข้อจำกัดเรื่อง driver ที่จะรองรับกับ chip ที่ใช้ใน usb wifi ถ้าเลือกมาไม่ตรงกับที่มันรองรับก็งานงอก ไม่เป็นไร ถ้าหาไม่ได้ เราก็ใช้ wifi on board ที่มีมากับ pi 3 ในการ share เป็น access point แทน

pi_wifi_IMG20170510004001

แล้วก็ออกเน็ตผ่าน usb wifi ที่ใส่เพิ่ม งานนี้ต้องลงโปรแกรมเพิ่มอีกตัวคือ hostapd

# ชื่อของ wifi interface ที่จะใช้ share
interface=wlan0
driver=nl80211

# ชื่อของ wifi access point
ssid=CAT-Register

hw_mode=g

# Use channel 6
channel=6
# Enable 802.11n
ieee80211n=1

# Enable WMM
wmm_enabled=1

# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

มีแค่นี้ ถ้าไม่ต้องการให้มีการเข้ารหัสหรือถามรหัสผ่านเวลาที่จะเชื่อมต่อ

แต่ถ้าอยากให้ใส่รหัสเวลาเชื่อมต่อด้วยก็เพิ่ม

# Accept all MAC addresses
#macaddr_acl=0

# Use WPA authentication
#auth_algs=1

# Require clients to know the network name
#ignore_broadcast_ssid=0

# Use WPA2
#wpa=2

# Use a pre-shared key
#wpa_key_mgmt=WPA-PSK

# The network passphrase
#wpa_passphrase=raspberry

# Use AES, instead of TKIP
#rsn_pairwise=CCMP

ตัวอย่างเอามาจากที่นี่ https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/

ปัญหาที่เจอคือ ถ้า ใส่ผิดใส่ถูก ใส่ขาด ใส่เกิน แม่…ง ไม่ทำงานครับ ท่านผู้ชม อยากรู้ก็ไปลองเองละกัน เพราะปัญหานี้ทำเอาวนไปวนมาลองผิดลองดูมั่วไปเรื่อยอยู่สองวัน อย่าลืมตั้งค่า ip address ให้ wlan0 ด้วย

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.9.1
netmask 255.255.255.0

เอาบรรทัดนี้ที่อยู่ใต้ wlan0 ออกด้วย  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf ของ wlan1 ไม่ต้องเอาออก

หน้าตาก็จะประมาณนี้

source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
address 172.24.1.1
netmask 255.255.0.0

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.9.1
netmask 255.255.255.0

allow-hotplug wlan1
iface wlan1 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

อีกนิด แก้ไขไฟล์ sudo nano /etc/dhcpcd.conf ด้วยการเพิ่มคำสั่ง

denyinterfaces wlan0 denyinterfaces eth0

เอาไว้ก่อนคำสั่ง interface อื่นใด (ถ้ามี) เพื่อไม่ให้ interface เหล่านี้มันรับค่าจาก dhcp

แล้วก็ sudo service dhcpcd restart จากนั้นก็สั่ง

sudo ifdown wlan0

sudo ifup wlan0

sudo ifdown eth0

sudo ifup eth0

ถ้าไม่ได้ทำจาก console แล้ว remote เชื่อมเข้าไปผ่าน สายหรือ, Wifi ก็ระวังละกันตอน ifdown มันก็จะหลุดแล้วท่านก็จะเข้าไม่ได้ ดังนั้นยังไม่ทำตอนนี้ก็ได้ ให้เสร็จทุกอย่างแล้ว reboot เครื่องทีเดียว

เพิ่ม config ของ dnsmasq ให้จ่าย ip address ไปทาง wlan0 จะได้หน้าตาประมาณนี้

listen-address=172.24.1.1
listen-address=192.168.9.1
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=interface:eth0,172.24.1.10,172.24.1.250,12h
dhcp-range=interface:wlan0,192.168.9.1,192.168.9.250,1h

จัดการรับส่งข้อมูลระหว่าง interface ด้วย

sudo iptables -A FORWARD -i wlan1 -o wlan0 -m state –state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT

จากนั้นก็ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" เพื่อ save ค่า

จากนั้น (ถ้า config ip address eth0, wlan0 แล้ว) ก็ลอง

sudo service hostapd start  
sudo service dnsmasq start 

หรือไม่ก็ sudo reboot รอ boot เสร็จก็ลองดูว่า มีสัญญาณ CAT-Register ปรากฎขึ้นไหมแล้วก็ลองเชื่อมต่อดูว่าเล่นเน็ตได้หรือไม่ สำหรับการเชื่อมต่อให้ wifi (wlan1) ออกเน็ตนั้นจะทำผ่าน GUI ของ rasbian pixel ก็ได้ (ง่ายดี) หรือ

ใส่ ssid ของ wifi เข้าไปในไฟล์   /etc/wpa_supplicant/wpa_supplicant.conf เช่น

network={
ssid=”CAT-Mobile”
key_mgmt=NONE
}

network={
ssid=”seal”
psk=”12345678″
key_mgmt=WPA-PSK
}

แล้วก็ restart networking (sudo service networking restart)

ท่อง web ได้แล้ว แต่กลัวช้า กลัวไม่แรงพอ ยัด proxy ลงไป ด้วย nginx

ใน /etc/nginx/sites-available/default

เพิ่ม

# Proxy server
#
server {
resolver 192.168.9.1;
access_log off;
listen 8080;
listen [::]:8080;

location / {
proxy_pass      $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers   256 4k;
proxy_max_temp_file_size        0k;

}

}

จากนั้นก็ sudo service nginx restart

บังคับให้การเข้า web (ดัก 80 port) ให้วิ่งเข้า proxy ของ nginx ทาง 8080 port

sudo iptables -t nat -A PREROUTING -s 192.168.9.0/24 -p tcp –dport 80 -j DNAT –to 192.168.9.1:8080

อย่าลืม sudo sh -c "iptables-save > /etc/iptables.ipv4.nat" จะได้ไม่มีปัญหาเวลา boot เครื่องใหม่

จบข่าว

งานนี้ก็จะได้ raspberry pi 3 เก๋ หนึ่งเครื่อง บวก usb wifi หิ้วไปไหนมาไหนได้ เอาไว้ share net ได้สบายสบาย ทำอย่างอื่นได้ไหม ทำได้ อยู่แล้ว เพราะที่ทำไว้แบบนี้ ก็เพื่องานบางอย่าง ซึ่งอาศัยพื้นฐานของการตั้งค่าแบบนี้ ส่วนจะเอาไปทำอะไรได้นั้น ก็แล้วแต่ญาติโยมละเน้อ ยกตัวอย่างให้อันหนึ่ง เช่น เรามีสิทธิใช้งาน wifi แบบที่ต้องตรวจสอบ MAC Address และเราก็มีสิทธิให้ใช้ได้แค่ 10 อุปกรณ์ (10 ยังไม่พออีกเหรอ) พอมันครบสิบแล้ว แต่ถ้าเรามีอุปกรณ์ตัวที่ 11 มาจะทำอย่างไร ไอ้กล่องนีี้ช่วยได้ ก็เอาเจ้ากล่องนี้ไปลงทะเบียน 1 ใน 10 ของอุปกรณ์ที่เขาให้สิทธิ แล้วก็ให้มัน share wifi ต่อมาให้อุปกรณ์อื่นของเรา เท่านี้ก็สบายแล้ว ไชโย 😛

ปล. ถ้าออกเน็ตผ่าน 3G ล่ะ ทำไง ไปย้อนอ่านบทความก่อนหน้า แล้วประยุกต์เอาเอง มันทำได้อยู่แล้ว

Register System by WIFI

ระบบลงทะเบียน ระบบ check-in ระบบลงเวลา ระบบกรอกแบบสอบถาม หรืออื่น ๆ ผ่านระบบ wifi

ทำไมต้องใช้ระบบนี้? เหตุผลที่จัดทำระบบนี้ก็คือการลงทะเบียนออนไลน์ ที่ต้องการให้ผู้ลงทะเบียนอยู่ในพื้นที่หรือสถานที่ ที่กำหนดเท่านั้นที่จะสามารถกรอกข้อมูลได้ เพราะจุดอ่อนของระบบออนไลน์ทั่วไปผู้ใช้งานสามารถเชื่อมต่อเข้า Internet ก็จะสามารถเข้าถึงระบบจากที่ไหนก็ได้ จึงเป็นข้อกังวลของการตรวจสอบได้ ทางออกของการแก้ไขปัญหานี้สามารถทำได้หลายวิธี เช่น การตรวจสอบตำแหน่งผ่านระบบ GPS หรือ Geo-location ซึ่งเราสามารถเขียน web application เพื่อตรวจสอบตำแหน่งของผู้ใช้ ว่าอยู่ในพื้นที่ ที่เรากำหนดไว้หรือไม่ แต่การใช้วิธีดังกล่าวก็ต้องเขียน software เพิ่มเติมซึ่งก็มีความยุ่งยากในการทำพอสมควร อีกวิธีที่ง่ายกว่าก็คือการทำระบบให้สามารถเข้าถึงได้ผ่าน wifi ที่กำหนด ซึ่งด้วยรัศมีของ wifi ที่ไม่ไกลมากนัก ระยะใช้งานได้อยู่ที่ประมาณ 50-70 เมตร ซึ่งก็จะสามารถใช้จำกัดพื้นที่ ว่าผู้ที่จะใช้งานระบบลงทะเบียนจะต้องอยู่ในพื้นที่รัศมีของสัญญาณ wifi ที่กำหนด ซึ่งก็จะเป็นการแก้ปัญหาการตรวจสอบตำแหน่งได้แบบหนึ่ง ในวิธีแบบนี้จำเป็นต้องใช้ hardware เข้ามาช่วย (ถ้าไม่ใช้ harware ก็ต้องใช้การเขียน software แบบวิธีแรก) ซึ่ง hardware นี้เราสามารถใช้อุปกรณ์เช่น raspberry pi มาทำได้ด้วยต้นทุนประมาณ สองพันบาทนิดนิดก็สามารถทำได้แล้ว หรือถ้าเป็นระบบที่ไม่ต้องการความยืดหยุ่นมาก เป็นระบบที่จำเพาะเจาะจงก็สามารถใช้อุปกรณ์ micro controller อื่นมาใช้งานก็ได้เหมือนกันเช่น บอร์ด ESP32, ESP8266 เป็นต้น แต่อาจจะมีความยุ่งยากมากกว่าเพราะระบบนี้ต้องการการเชื่อมต่อกับเครือข่ายอินเทอร์เน็ตด้วย

ระบบนี้ทำงานอย่างไร

ให้เรากำหนดชื่อสำหรับการเชื่อมต่อ wifi (SSID) เพื่อแจ้งให้ผู้ใช้งานทราบว่าจะต้องเชื่อมต่อกับ wifi ไหน เช่น Register-Wifi เป็นต้น

สำหรับตัวระบบ เราสามารถใช้หลักการดักจับได้หลายแบบ เช่น การใช้หลักการของ captive portal หรือ DNS อย่างใดอย่างหนึ่งหรือทั้งสองก็ได้ ในกรณีที่ใช้ DNS เราสามารถระบุชื่อ Host หรือ domain ที่เราตั้งขึ้นมาเอง และแจ้งผู้ใช้ทราบว่าจะต้องเข้า url อะไรในการลงทะเบียน เช่น http://register.event เป็นต้น

เมื่อผู้ใช้ระบุ url ดังกล่าวใน browser ระบบก็จะ redirect ไปยัง web server ที่สร้างขึ้นไว้ในตัวระบบเองหรือไปยัง web server ตัวอื่นก็ได้ โดยที่ web server ดังกล่าว ก็จะทำหน้าสำหรับกรอกข้อมูลหรือใส่เงื่อนไขต่าง ๆ ตามที่เราต้องการได้ เช่น การกำหนดเวลาให้ลงทะเบียนได้เฉพาะช่วงเวลาใดเวลาหนึ่ง เป็นต้น ทั้งนี้ระบบที่อยู่ที่ web server ก็สามารถเขียนโปรแกรมเพื่อทำงานตามเงื่อนไขการใช้งานได้อย่างอิสระด้วยภาษาคอมพิวเตอร์ หรือ ไม่ว่าจะเป็นการเชื่อมต่อกับระบบฐานข้อมูล หรือเชื่อมกับระบบงานอื่นที่จำเป็น อาจจะมีประเด็นเพิ่มเติมว่าถ้าผู้ใช้งานทราบ url สุดท้ายหลังจากที่ มีการ redirect จากระบบลงทะเบียนไปแล้ว เช่น ถ้าเราใช้ google form ในการเก็บข้อมูล ผู้ใช้จะเห็น url ของ form ดังกล่าว และสามารถผ่านเข้าไปใช้งานได้โดยตรงโดยไม่ผ่านระบบลงทะเบียนนั้น การแก้ไขก็สามารถทำได้ด้วยการทำระบบกรอกข้อมูลขึ้นเองและทำอยู่ภายในระบบ Register นี้หรือทำบนระบบ Server ที่จะต้องต้องอาศัยการทำ VPN เข้าไปเท่านั้น โดยกำหนดให้มีการทำ VPN ระหว่าง ระบบ register นี้กับ Server ก็จะสามารถป้องกันไม่ใช้ผู้ใช้งานเข้าถึงระบบกรอกข้อมูลได้โดยตรง

ดูตัวอย่างแผนภาพการทำงาน

register_system

ตัวอย่างการเขียน code ด้วย php เพื่อตรวจสอบช่วงเวลาและส่งค่า url ตามที่กำหนด

<?php
$local_time = date(‘YmdHis’);
$start_morning_time = ‘20170520080000’;
$end_morning_time = ‘20170520081500’;
$start_afternoon_time = ‘20170520130000’;
$end_afternoon_time = ‘20170520131500’;

if ($local_time >= $start_morning_time && $local_time <= end_morning_time) {
header(“Location: https://goo.gl/forms/OWD7oeb8Uh7oYa9m2&#8221;);
}
else if ($local_time >= $start_afternoon_time && $local_time <= end_afternoon_time) {
header(“Location: https://goo.gl/forms/D9eTTUpHIXbTGpKp1&#8221;);
}
else {
header(“Location: https://catevent.dyndns.info/event/seminar-finance2017&#8221;);
}
?>

ตัวอย่างของการใช้ nginx และให้มีการ redirect ไปยัง url ที่กำหนด

# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;

server_name register;
rewrite ^/$ http://register.event/index.php redirect;

.

.

}

ตัวอย่างการใช้ dnsmasq ในการกำหนดชื่อ dns หรือ host ที่ให้ผู้ใช้ระบุเพื่อเข้าระบบลงทะเบียนโดยมีการส่งต่อไปยังเครื่องที่กำหนด (เช่น web server) – /etc/dnsmasq.conf

interface=eth0 # Use interface eth0 wlan0
listen-address=172.24.1.1 # Explicitly specify the address to listen on
bind-interfaces # Bind to the interface to make sure we aren’t sending things elsewhere
server=8.8.8.8 # Forward DNS requests to Google DNS
domain-needed # Don’t forward short names
bogus-priv # Never forward addresses in the non-routed address spaces.
dhcp-range=172.24.1.10,172.24.1.250,1h # Assign IP addresses between 172.24.1.10 and 172.24.1.250 with a 12 hour lease time

address=/register.event/www.finance.register/finance.register/register/172.24.1.1

 

 

How to run shell_exec command in php

https://unix.stackexchange.com/questions/115054/php-shell-exec-permission-on-linux-ubuntu

The Apache’s user www-data need to be granted privileges to execute certain applications using sudo.

  1. Run the command sudo visudo. Actually we want to edit the file in etc/sudoers.To do that, by using sudo visudo in terminal ,it duplicate(temp) sudoers file to edit.
  2. At the end of the file, add the following ex:-if we want to use command for restart smokeping and php command for another action in your question,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(This is assuming that you wish to run restart and php commands using super user (root) privileges.And you use php command in usr/bin/ path )

However, if you wish to run every application using super user privileges, then add the following instead of what’s above.You might not want to do that, not for ALL commands, very dangerous.

www-data ALL=NOPASSWD: ALL

3.After edit the sudoers file(by visudo we edit the temp file of sudoers so save and quit temp file(visudo) to write in sudoers file.(wq!)

4.That’s it, now use exec() or shell_exec in the following manner inside your xxx.phpscript.keep remember to use sudo before the command use in the php script.

ex:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

or

shell_exec("sudo php -v"); 

So in your problem,add the commands that you wish to use in to the step no (2.) as I add and change your php script as what you want.

here is the same problem as yours http://stackoverflow.com/a/22953339/1862107

ติดตั้ง webmin บน Raspberry Pi

Download ตัวโปรแกรมติดตั้ง

wget http://prdownloads.sourceforge.net/webadmin/webmin_1.831_all.deb

ติดตั้ง library และโปรแกรมที่เกี่ยวข้อง

sudo apt-get install  libnet-ssleay-perl libauthen-pam-perl  libio-pty-perl  apt-show-versions  libapt-pkg-perl

หรือ sudo apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python

ติดตั้ง webmin

sudo dpkg --install webmin_1.831_all.deb

Login เข้า webmin ด้วยคำสั่ง https://ชื่อเครื่องหรือไอพี:10000

ใส่ user: pi และรหัสผ่าน