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

 

 

Advertisements

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 และรหัสผ่าน

 

 

การใช้คำสั่ง shell_exec ใน php

การใช้คำสั่ง shell_exec ใน php เช่น

$output = shell_exec('sudo /home/seal/bin/reload_iperf.sh');

การใช้คำสั่ง shell_exec ใน php ที่ทำงานบน web server นั้น จำเป็นต้องมีการตั้งค่าสิทธิอนุญาตการทำงานก่อน เพื่อให้คำสั่งดังกล่าวนั้นสามารถทำงานได้ การกำหนดสิทธินั้นทำได้ด้วยการระบุ ในไฟล์ /etc/sudoers ซึ่งสามารถแก้ไขได้ด้วยคำสั่ง sudo visudo

แล้วเพิ่ม โดย www-data คือ user ที่ใช้ run โปรแกรม web

www-data ALL=NOPASSWD: /home/seal/bin/reload_iperf.sh

เข้าไปในไฟล์ดังกล่าว

รายละเอียดเพิ่มเติมอ่านได้จาก http://unix.stackexchange.com/questions/115054/php-shell-exec-permission-on-linux-ubuntu

Audio Streaming Raspberry Pi

How to stream audio (line-in) to icecast — Raspberry Pi 3

Hardware lists:

  • USB Sound Card (Sound BLASTER SBX)
  • Raspberry Pi 3

list usb sound card

pi@raspberrypi:~ $ aplay -L | grep CARD

sysdefault:CARD=ALSA
dmix:CARD=ALSA,DEV=0
dmix:CARD=ALSA,DEV=1
dsnoop:CARD=ALSA,DEV=0
dsnoop:CARD=ALSA,DEV=1
hw:CARD=ALSA,DEV=0
hw:CARD=ALSA,DEV=1
plughw:CARD=ALSA,DEV=0
plughw:CARD=ALSA,DEV=1
sysdefault:CARD=Pro
front:CARD=Pro,DEV=0
surround21:CARD=Pro,DEV=0
surround40:CARD=Pro,DEV=0

capture audio from line-in :

arecord –device=sysdefault:CARD=Pro  –format S16_LE –rate 44100 -c 2

test sound :

aplay -D sysdefault:CARD=Pro

mix command arecord (send to stdin/stdout) and aplay

arecord –device=sysdefault:CARD=Pro  –format S16_LE –rate 44100 -c 2 | aplay -D sysdefault:CARD=Pro

 

Stream audio to icecast

we adopt the solution from https://one-button.org/node/48

convert audio to mp3 : lame -r -s 44.1 -m s -b 128 –cbr – –

stream to icecast : ezstream -c /etc/ezstream.xml

ezstream configuration file :

ezstream.xml

<ezstream>
    <url>http://localhost:8002/stream</url&gt;
    <sourcepassword>hackme</sourcepassword>
    <format>MP3</format>
    <filename>stdin</filename>
    <stream_once>1</stream_once> <!– must do for stdin –>
<!– the rest are optional –>
    <svrinfoname>Raspberry Pi Station</svrinfoname>
    <svrinfourl>http://radio.ogonan.com</svrinfourl&gt;
    <svrinfogenre>geek</svrinfogenre>
    <svrinfodescription>Stream Audio from YouTube</svrinfodescription>
    <!– the following taken from mplayer. not sure if it’s right –>
    <svrinfobitrate>128</svrinfobitrate>
    <svrinfochannels>2</svrinfochannels>
    <svrinfosamplerate>44100</svrinfosamplerate>
    <svrinfopublic>1</svrinfopublic>
</ezstream>

combine command :

arecord –device=sysdefault:CARD=Pro  –format S16_LE –rate 44100 -c 2 | lame -r -s 44.1 -m s -b 128 –cbr – – | ezstream -c /etc/ezstream.xml

Audio monitoring :

mplayer -ao alsa:device=hw=1.0 http://localhost:8002/stream

Notes :

Generate a Playlist

$ cd /path/to/music/dir
$ find -type f -iname \*.mp3 > playlist.txt

$ mplayer -shuffle -playlist playlist.txt

;mplayer -ao alsa:device=hw=1.0 -shuffle -playlist playlist.txt

Control and Monitoring by supervisor

create shell script : capture.sh

#!/bin/bash
arecord –device=sysdefault:CARD=Pro  –format S16_LE –rate 44100 -c 2 | lame -r -s 44.1 -m s -b 128 –cbr – – | ezstream -c /etc/ezstream.xml

create configuration file : /etc/supervisor/conf.d/capturehooks.conf

[program:capturehook]
command=/home/pi/Music/capture.sh
directory=/home/pi/Music
autostart=true
autorestart=true
startretries=3
stderr_logfile=/home/pi/Music/log/capturehook.err.log
stdout_logfile=/home/pi/Music/log/capturehook.out.log
user=pi

see https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps

Record audio file every 1 minute

create shell script  local_record.sh

#!/bin/bash
adate=`date +”%Y%m%d_%H%M%S”`
FILE=”/home/pi/Music/files/radio_$adate.mp3″
arecord –device=sysdefault:CARD=Pro  –format S16_LE –rate 44100 -c 2 | lame -r -s 44.1 -m s -b 128 –cbr – “$FILE” &
sleep 61
kill %1

add to crontab :

* * * * * /home/pi/Music/local_record.sh >/dev/null 2>&1

 backup file to cloud :

rsync -avz -e “ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null” –progress /home/pi/Music/files/radio_20170329*.mp3 CATWEBCASTING @192.168.8.98:/Volumes/storagebkk01/media-cat/files/

Ref. https://www.digitalocean.com/community/tutorials/how-to-copy-files-with-rsync-over-ssh

Uninstalling McAfee Enterprise in Windows

from https://it.uoregon.edu/node/4094

It’s work but in my computer FrmInst.exe is in C:\Program Files\McAfee\Agent\x86 directory.

You should run cmd.exe in Administrator Mode.

use command : cd C:\Program Files\McAfee\Agent\x86

run : FrmInst.exe /remove=agent

after finished you should follow the instruction in https://it.uoregon.edu/node/4094

uninstall mcafee agent

Passwordless ด้วย auth0

ไปสมัครลองใช้ได้ที่

https://auth0.com/

จากนั้น สร้าง app ขึ้นมา ส่วน code แล้วแต่ความถนัด สามารถเลือกได้เกือบที่มีอยู่ในโลกนี้ ตัวอย่างนี้ใช้เขียนด้วย php ซึ่งสามารถดูตัวอย่างได้ผ่าน console หลังจากสร้าง app กรณีใช้ php ต้องลง library เพิ่มด้วยคำสั่ง

composer require auth0/auth0-php:"~4.0"

คำสั่ง composer ไปเอาที่นี่ https://getcomposer.org/doc/00-intro.md

สร้างหน้า Login

login.html

<html>
<body>

https://cdn.auth0.com/js/lock-passwordless-2.2.min.js

  var lock = new Auth0LockPasswordless('Client ID', 'kaebmoo.auth0.com
');
    lock.emailcode({
      callbackURL: 'http://auth.ogonan.com/callback.php',
      authParams: {
        scope: 'openid email'  // Learn about scopes: https://auth0.com/docs/scopes
      }
    });


</html>

Client ID = Client ID ของ App ที่สร้างขึ้นใน auth0 ส่วน

kaebmoo.auth0.com

kaebmoo ก็เป็น user ที่สร้างขึ้นใน auth0

กรณีนี้เป็นการใช้ passwordless แบบส่ง email ผ่าน mail server (SMTP) ของ SendGrid ซึ่งต้องไปเอา API Key มาใส่ไว้ใน Config (ผ่าน web console) ของ auth0 ด้วย ในกรณีที่ใช้ smtp อื่น ก็ขึ้นอยู่กับ smtp แต่ละเจ้า (ลองของ google app gmail แล้ว แต่ส่งไม่ได้ ไม่แน่ใจว่าติดปัญหาอะไร error ฟ้องมาว่า Invalid …) ซึ่งทั้งการส่งผ่าน sms และ email ทาง auth0 ไม่มีการให้บริการตรงนี้ให้ ไม่เหมือน Account Kit ของ Facebook ที่มีบริการส่งทั้ง SMS และ email ให้

สำหรับการส่ง sms ลองใช้ของ Twilio ก็สามารถใช้งานได้ แต่จะต้องมีการระบุหมายเลขผู้ใช้งานที่ Twilio ด้วยจึงจะสามารถใช้งานได้ (แบบทดลองใช้) สิ่งที่ต้องใช้จาก Twilio ได้แก่

  • Account SID
  • Auth Token

เพื่อเอามาระบุให้กับ auth0 สามารถส่ง SMS มายัง มือถือ ตอนที่ทำงาน Login สรุปก็คือ auth0 ไม่มี SMS Gateway, Mail Gateway ให้ auth0 ทำหน้าที่ Authen อย่างเดียว การส่ง SMS, email ต้องไปอาศัย gateway ที่อื่นส่ง

สร้าง Callback เพื่อทำการรับค่าจาก auth0 ก็คือเมื่อมีการ Login ใส่ Password หรือ Pin Code แล้ว auth0 จะมีการเรียกกลับมายัง server ที่ร้องขอการ authen เราจำเป็นต้องระบุ url หรือ code ที่เราจะต้องเขียนขึ้นเพื่อรับค่า code (key, token) ซึ่งจะนำเอาไปใช้งาน (ถ้า login สำเร็จ)

callback.php

<?php

// code ตัวอย่างใน dashboard ไม่มีบรรทัดนี้ ทำเอาปวดหัว ให้เพิ่มเข้าไปด้วย 
// แต่ตัวอย่างใน github เหมือนจะมี ถ้าไม่ใส่บรรทัด ถัดไปจะ error 
// /vendor จะได้มาตอนที่ใช้ composer ลง library ที่เกี่ยวข้องเพิ่ม 
require __DIR__ . '/vendor/autoload.php';

use Auth0\SDK\Auth0;

$auth0 = new Auth0(array(
    'domain'        => 'kaebmoo.auth0.com',
    'client_id'     => 'Client ID',
    'client_secret' => 'Client Secret',
    'redirect_uri'  => 'http://auth.ogonan.com/callback.php'
));

        $userInfo = $auth0->getUser();
        if (!$userInfo) {
    // We have no user info
    // redirect to Login
                echo "Login";
        } else {
    // User is authenticated
    // Say hello to $userInfo['name']
    // print logout button
                echo "Hello " . $userInfo['name'];
        }

?>

<html>
  <body class="home">
    
</body> </html>

Client ID, Client Secret เอามาจากค่าที่ได้จากการสร้าง App ใน auth0

ใน Callback นี้ จะมีการเรียก user information ขึ้นมาแสดง ถ้า Login สำเร็จ พร้อม พิมพ์ Hello ทักทาย ใน callback ก็เป็นหน้าที่ของผู้พัฒนา app จะเขียนเพิ่มเติมให้ไปทำงานในส่วนต่าง ๆ ที่เกี่ยวข้องต่อไป

อยากลอง? เชิญ  http://auth.ogonan.com/login.html