SMS gateway – integruojam sms į interneto puslapį

No Comments

Kaip visad kai susiduriu su kuo nors įdomiu – pasidalinu patirtim. Šį kart susidūriau su sms integravimu į interneto puslapį. Mano atveju integravimas yra asmeniniem tikslam, be trumpojo numerio, be papildomos įrangos, tiesiog su tuo kas yra po ranka ir kaip įmanoma pigiau ir paprasčiau:)

 

Tikslas: parašyti sms nurodytam numeriui, nurodytu laiku su „on fly“ sugeneruotu turiniu(praktikoj tai ryte sms’u atsiųsti dienos orų prognozę), viskas turi veikt autonomiškai.

Ko reikės:

  • telefono su android OS
  • vietos internete(host’o)

SMS gateway

Telefone įdiegiam programą sms gateway yra ir milijonas kitų programų atliekančių tą patį, bet siūlau tai ką išbandžiau.
Sukonfigūruojam:

Pažymim reikiamus elementus

Sukonfigūruojam POP3 serverį

HTTP -> SMS

Telefone viskas sukonfigūruota, jis lauks el. laiško kurio temoj bus nurodytas telefono numeris, o pačiam laiške sms turinys. Tokį laišką jam ir pasiunčiam. Aš rašiau su php, bet čia jau skonio reikalas:D

mail("akmc@gmail.com","+370609xxxxx","Labas, kaip šeima, vaikai?");

„sms gateway“ kas 10 minučių tikrins el. paštą ir radus naują laišką, nusiųs sms numeriui +370609xxxxx su tekstu „Labas, kaip šeima, vaikai?“. Viskas paprasta ir aišku. Gautas el. laiškas yra ištrinamas.

Praktikoj tai scenarijų nurodytu laiku ir nurodytom dienom įvykdo „cron jobs“.

Realus scenarijus

SMS -> HTTP

SMS gavom, dabar reikia atsakyt.
„SMS gateway“ programoj nustatom http dalį. Gavus sms, programa nueis nurodytu adresu ir GET metodu perduos duomenis.


Apdorojam gautus duomenis:

<?php
$device=$_GET["device"];
$phone=$_GET["phone"];
$center=$_GET["smscenter"];
$text=$_GET["text"];
$stream=fopen("sms.txt","a+");
fwrite($stream,"Įrenginys:$device\nNumeris:$phone\nSms centras:$center\nTekstas:$text\n");
fclose($stream);
?>

Komentarų manau nereik, čia viskas aišku:)
Gauti sms neištrinami ir neperimami programos, tiesiog programa išmeta savo pranešimą ir apdoroja duomenis.

Google Translate – terminale

1 Comment

Google-translate-cli – maža programėlė, leidžianti naudotis Google vertėju terminale nenaudojant naršyklės. More

Laikas

No Comments

„Laikas visada gerbs ir palaikys tai, kas tvirta, bet pavers dulkėmis tai, kas netvirta.“ Anatolis Fransas

Aparatinės įrangos laikrodis ir sistemos laikrodis

Kompiuteris turi du laikrodžius: „aparatinės įrangos laikrodį“  ir „sistemos/programinės įrangos laikrodį“.
Aparatinės įrangos laikrodis (dar žinomas kaip „Real Time Clock (RTC)“ ar „CMOS“ laikrodis) saugo: Metų, mėnesio, valandos, minutės ir sekundės reikšmę. Jis neturi galimybės saugoti laiko standarto („localtime“ ar „UTC“) ar DST(Daylight Saving Time/Vasaros laikas) nustatymo.
Sistemos laikrodis (dar žinomas kaip „programinės įrangos laikrodis“) saugo įrašą apie: laiką, laiko zoną bei DST(jei taikoma). Unix ar POSIX laikas, tai laikas skaičiuojamas nuo 1970, sausio 1 vidurnakčio(UTC pradžia) išreikštas sekundėmis. Pradinė sistemos laikrodžio reikšmė paskaičiuojama pagal aparatinės įrangos laikrodį, remiantis nustatymais iš failo /etc/adjtime. Užsikrovus sistemai, sistemos laikrodis veikia nepriklausomai nuo aparatinės įrangos laikrodžio. Linux branduolys seka laiką skaičiuodamas laikmačio pertraukimus.

Kiek dabar valandų?

Norėdami sužinoti dabartinį sistemos laikrodžio laiką („local time“ ir „UTC“ formatais) galite įvykdyti komandą:

$ timedatectl status

Local time: An 2014-03-04 18:20:36 EET
Universal time: An 2014-03-04 16:20:36 UTC
RTC time: An 2014-03-04 16:20:36
Timezone: Europe/Vilnius (EET, +0200)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: no
Last DST change: DST ended at
Sk 2013-10-27 03:59:59 EEST
Sk 2013-10-27 03:00:00 EET
Next DST change: DST begins (the clock jumps one hour forward) at
Sk 2014-03-30 02:59:59 EET
Sk 2014-03-30 04:00:00 EEST

Kovo 30 persuksime laikrodį valanda į priekį:D

Laiko nustatymas

Nustatyti sistemos laikrodį galite su komanda:

# timedatectl set-time "2014-03-04 18:22:16"

RTC laikrodis

Daugumai operacinių sistemų įprasta elgsena yra:

  • Sistemos laikrodis nustatomas, įkeliant sistemą, pagal aparatinės įrangos laikrodį
  • Tikslus sistemos laikas palaikomas su NTP tarnyba
  • Išjungiant nustatyti aparatinės įrangos laikrodį pagal sistemos laikrodžio parodymus

Laiko standartas

Yra du laiko standartai: „localtime“ ir „Coordinated Universal Time (UTC)“. „Localtime“ standartas yra priklausomas nuo laiko zonos, tuo tarpu UTC yra globalus laiko standartas ir nepriklausomas nuo laiko zonos nustatymo. Nors iš esmės visiškai kitoks, bet UTC dar žinomas kaip GMT (Greenwich Mean Time).
Aparatinės įrangos laikrodžio(CMOS laikrodis, laikas kuris rodomas BIOS) naudojamas standartas yra nustatomas operacinės sistemos. Pagal nutylėjimą, Windows naudoja localtime, Mac OS naudoja UTC ir UNIX tipo operacinės sistemos įvairiai. OS naudojanti UTC standartą, CMOS laiką laikys UTC laiku(GMT, Greenwich laiku) ir įkeliant sistemą, sistemos laikrodį nustatys pagal jūsų laiko zoną.
Naudojant Linux, būtų protinga aparatinės įrangos laikrodį nustatyti į UTC, taip visos OS sugebės jį atpažinti. Naudojant UTC, laikrodis bus automatiškai persuktas pagal DST. Naudojant „localtime“ standartą, sistemos laikrodis nebus persuktas įvedus/atšaukus vasaros laiką, darant prielaidą jog tai padarys kita OS.
Aparatinės įrangos laikrodžio standartą galite nustatyti ir komandinėje eilutėje. Taipogi galima pažiūrėti koks standartas nustatytas jūsų distributyve:

$ timedatectl status | grep local

Aparatinės įrangos laikrodis gali būti užklaustas ir nustatytas naudojant „timedatectl“ komandą. Norėdami pakeisti aparatinės įrangos laikrodžio standartą į „localtime“:

# timedatectl set-local-rtc true

Norėdami sugrąžinti UTC:

# timedatectl set-local-rtc false

Turėkite omeny jog nustačius laikrodį „localtime“ standartu bus problemų su vasaros laiku. Jei vasaros laikas įvedamas/atšaukiamas kai jūsų kompiuteris išjungtas, kitą kart įjungus kompiuterį bus rodomas klaidingas laikas. Naujausi branduoliai nustato sistemos laikrodį iš RTC tiesiogiai, įkraunant sistemą, daroma prielaida jog laikrodis nustatytas UTC. Tai reiškia jog jei RTC yra nustatytas vietiniu laiku pirmą kartą sistema nustatys klaidingą laiką ir kiekvieną kart pataisys tą klaidingą laiką. Tai yra daugelio keistų klaidų priežastis(retai laikas einantis atgal yra geras dalykas).
Bus sugeneruotas /etc/adjtime daugiau nieko konfigūruoti nereiks.
Paleidžiant branduolį, RTC tvarkyklės įkėlimo metu, sistemos laikrodis gali būti nustatytas pagal aparatinės įrangos laikrodį. Ar tai įvyks ar ne priklauso nuo aparatinės įrangos, branduolio versijos ir branduolio kompiliavimo parinkčių. Jei tai įvyksta, šioje įkėlimo stadijoje aparatinės įrangos laikrodis laikomas UTC ir /sys/class/rtc/rtcN/hctosys (N=0,1,2,..) reikšmė bus nustatyta „1“. Vėliau, sistemos laikrodį nustatant dar kartą pagal aparatinės įrangos laikrodžio parodymus, systemd remsis reikšmėmis iš /etc/adjtime. Nustačius aparatinės įrangos laikrodį naudoti „localtime“ gali kilti problemų įkeliant sistemą,  pvz. sistemos laikrodis eina atgal.

UTC ir Windows

Viena priežastis kodėl naudotojai RTC nustato „localtime“ tai kelių OS naudojimas su Windows(Windows naudoja localtime). Windows sugeba susidoroti su RTC nustatytu į UTC, tiesiog reikia pritaikyti paprastą registro pataisymą(žemiau). Rekomenduojama sukonfigūruoti Windows naudoti UTC, tai bus geriau nei kai Linux naudos „localtime“. Jei priversite Windows naudoti UTC, nepamirškite išjungti „Internet Time Update“, kitu atveju Windows sugadins aparatinės įrangos laikrodžio parodymus. RTC sinchronizacijai naudokite NTP.
Naudojant „regedit“ pridėkite DWORD reikšmę su šešioliktaine reikšme 1:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal
Taipogi galite sukurti *.reg failą (ant darbastalio) su tokiu turiniu:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation] "RealTimeIsUniversal"=dword:00000001

Ir dukart spustelėkite ant to failo ir ta reikšmė bus importuota į registrą.
Windows XP ir Windows Vista SP1 gali naudoti UTC laiko standartą. Tačiau yra klaida grįžtant iš sustabdymo/užmigdymo, laikrodis grąžinamas į „localtime“. Šioms OS rekomenduojama naudoti „localtime“.
Jei Windows prašys atnaujinti laikrodį dėl vasaros laiko įvedimo/atšaukimo, leiskite. Laikrodis bus paliktas UTC standarte, bus pataisytas tik rodomas laikas.
Po šios reikšmės pakeitimo gali tekti pataisyti aparatinės įrangos ir sistemos laikrodžius.
Jei kilo problemų su laiko nuokrypiu, pabandykite iš naujo įdiegti „tzdata“ ir nustatyti savo laiko juostą:

# timedatectl set-timezone Europe/Vilnius

Logiška būtų Windows sistemoje išjungti laiko sinchronizavimą, kitu atveju bus sugadinti aparatinės įrangos laikrodžio parodymai.

Laiko zona

Norėdami sužinoti esamą laiko zoną įvykdykite:

$ timedatectl status

Norėdami pažiūrėti prieinamas laiko zonas įvykdykite:

$ timedatectl list-timezones

Norėdami pakeisti laiko zoną įvykdykite:

# timedatectl set-timezone Zone/SubZone

Pavyzdžiui:

# timedatectl set-timezone Europe/Vilnius

Bus sukurta /etc/localtime simbolinė nuoroda į „zoneinfo“ aplanke /usr/share/zoneinfo/. Jei sugalvosite nuorodą sukurti rankiniu būdu, turėkite omeny jog nuoroda turi būti reliatyvi, ne absoliuti taip kaip nurodyta archlinux(7).
Norėdami sužinoti daugiau peržiūrėkite man 1 timedatectl, man 5 localtime ir man 7 archlinux.

Laiko sinchronizavimas naudojant NTP

Parašysiu tik esmę. Naudoju NTP su numatytąja konfigūracija ir vargo nematau.
Paleisti kaip tarnybą
Paleisti NTP tarnybą galima su komanda:

# ntpd

Tačiau ji bus vykdoma kaip „root“ naudotojo procesas. Visada reiktų paleisti tarnybą nurodant naudotoją:

# ntpd -u ntp:ntp

Patikrinimas ar tarnyba tinkamai veikia
Pamatyti sukonfigūruotų serverių sąrašą galima su komanda:

$ ntpq -p

„Delay“, „offset“ ir „jitter“ stulpeliai turėtų būti ne nuliai.  Serveriai su kuriais „ntpd“ sinchronizuoja laiką pažymėti žvaigždute. Gali tekti palaukti kelias minutes kol „ntpd“ pasirinks ir sinchronizuos laiką su serveriu, pabandykite pažiūrėti po 17minučių (1024 sekundžių).

Be tarnybos

Sistemos laikrodis gali būti sinchronizuojamas ir be tarnybos. Tačiau toks variantas netiks kompiuteriams kurie be perkrovimo veikia kelias dienas ar ilgiau. Norėdami sinchronizuoti sistemos laikrodį nepaleidžiant ntpd fone, galite įvykdyti komandą:

# ntpd -q

Žymė „-q“ pasako jog ntpd tarnyba nustatytų laiką vieną kartą ir užsidarytų, o ne pereitų į foninį režimą. Jei operacija bus nesėkminga, jūsų laikrodis taip ir liks nesinchronizuotas.
Sistemos laikas nebus sinchronizuotas jei sistemos ir ntp serverio laikas skiriasi daugiau nei nustatyta riba. Tačiau galima panaudoti parinktį „-g“ ir nepaisyti tos ribos, pvz. jei laikas nustatomas pirmą kartą arba aparatinės įrangos laikrodis rodo nesąmones.

Automatinis paleidimas

Systemd tarnyba

„Ntpd“ galima paleisti kartu su kompiuteriu naudojant „systemd“.
Tarnybos paleidimas kartu su kompiuteriu:
„Ntp“ pakete yra failas ntpd.service. Įjunkite tarnybą su systemctl:

# systemctl enable ntpd

Taipogi tą patį galima padaryti su komanda:

# timedatectl set-ntp 1

Šaltinis: tai yra archwiki vertimas. Viskas kas čia parašyta, rašyta žvelgiant iš „archlinux“ perspektyvos.