skip to Main Content

iot protokolü mqtt ve mqtt brokeri mosquitto için başlangıç

yaptığımız iot uygulamalarını bir adım ileri taşımak ve standartlara uydurmak için cihazlar arasında kabul gören standartlardan bir tanesini kullanmakta fayda var.

bu konuda en büyük çalışmaları yapan ibm inde arkasında olduğu mqtt ve amqp, coap, lwm2m gibi bir kaç protokol daha mevcut.

konu hakkında detaylı bilgi edinilmek istenirse

OASIS Committee Categories: IoT/M2M
MQTT

siteleri incelenebilir. maalesef konu hakkında henüz çok fazla Türkçe doküman mevcut değil.

temel olarak yapılan uygulamalarda

– bilgilerin hızlı bir şekilde iletilebiliyor olması
– iletilen bilgilerin sorunsuz olarak iletiliyor olması
– iletimin güvenli bir şekilde olması
– iletimin performansının yüksek olması ve ölçeklendirilebilir olması
– basitleştirilmiş bir yönetim ve denetimin olması
– maliyetin düşük olması
– yazılım dili şartı olmaksızın geliştirilmeye açık olması

vb istenmektedir. bu istekleri karşılayacak bir veri iletim standartı geliştirilmesi zorunluluğundan dolayı mqtt ve benzeri protokoller ortaya çıkmıştır.

mqtt ile çalışmaya başlamadan önce bu kadar temel bilgi yeter.

mqtt de cihazlar doğrudan birbiri ile iletişim kurmak yerine broker olarak isimlendirilen bir sunucu ile irtibata geçer ve bu sunucu üzerinden iletim sağlarlar. bu sunucu ile iletim kuran cihazlar yaptığı işe göre publisher veya subscriber olarak isimlendirilirler. publisher veri sensörler gibi veri gönderen uç birimleri temsil ederken subscriber veri talebinde bulunan veya değer gönderen uç birimdir.

temel mantık bu şekildedir. işin mantığını pratik yaparak öğrenmeye devam edelim. mqtt standartı için yazılmış bir çok kütüphane vb mevcuttur. bunlardan kullanımı oldukça kolay olan mosquitto ile kod yazmadan bir kaç uygulama yapalım.

kullanacağımız yazılımları mosquitto adresinden edineceğiz.

ben test sırasında

gateway – sensor : raspberry pi – 192.168.2.37
broker – sunucu : ubuntu server – 192.168.126.128
istemci – kullanıcı : windows 7 – 192.168.2.23

şeklinde bir ağ kullanacağım.

gerekli yazılımları sırası ile kuralım…

fcicek@ubuntu:~$ sudo apt-get install mosquitto mosquitto-clients

ile ubuntu server için gerekli kurulu yapalım. eğer mosquitto repository niz içerisinde yok ise aşagıdaki şekilde ekleyebilirsiniz.

fcicek@ubuntu:~$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
fcicek@ubuntu:~$ sudo apt-get update

raspberry üzerinde kullandığımız raspbian da debian kökenli olduğu için ubuntuda olduğu gibi raspberry içinde gerekli adımları uygulayalım

pi@cicek ~ $ sudo apt-get install mosquitto mosquitto-clients

şimdi sıra windows için olan kuruluma geldi. şu anki en güncel sürüm olan mosquitto-1.4.2-install-win32.exe ı indirelim ve setup dosyasını çalıştıralım. kurulum sırasında aşagıdaki ekran görüntüsünde görüleceği üzere bağımlı olduğu bir kaç dosyalarıda bilgisayarımıza kurmamız gerekmektedir.

mos_install

Win32 OpenSSL v1.0.2d Light ssl uygulamasını pcmize kuralım pthreadVC2.dll dll dosyasını da mosquitto kurduğumuz dizine ekleyelim.

C:\Program Files (x86)\mosquitto>dir *.exe
 Directory of C:\Program Files (x86)\mosquitto

07.05.2015  16:25           120.832 mosquitto.exe
07.05.2015  16:24            13.824 mosquitto_passwd.exe
07.05.2015  16:24            30.208 mosquitto_pub.exe
07.05.2015  16:24            28.160 mosquitto_sub.exe
26.07.2015  01:27            62.913 Uninstall.exe
               5 File(s)        255.937 bytes
               0 Dir(s)  428.300.537.856 bytes free

gerekli kurulumları yaptıktan sonra her üç sistemimiz üzerinde mosquitto, mosquitto_pub ve mosquitto_sub olarak çalıştırılabilir üç dosyamız olacak. herşey tamam kod yazmadan mosquitto nın nasıl çalıştığını test edelim.

ubuntu üzerinden brokerimizin çalıştığından emin olalım.

fcicek@ubuntu:~$ ps aux | grep mosquitto
mosquit+   4792  0.0  0.0  14912   964 ?        Ss   03:15   0:05 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

raspberry üzerinde cicek isimli bir kanal oluşturarak “test_mesaji_raspberry” şeklinde bir mesaj gönderelim.

pi@cicek ~$ mosquitto_pub -h 192.168.126.128 -t cicek -m test_mesaji_raspberry
pi@cicek ~$ mosquitto_pub -h 192.168.126.128 -t cicek -m test_mesaji_raspberry_2
pi@cicek ~$ mosquitto_pub -h 192.168.126.128 -t cicek -m test_mesaji_raspberry_3

windows tarafından cicek kanalından gelen mesajları almak için

C:\Program Files (x86)\mosquitto>mosquitto_sub.exe -h 192.168.126.128 -t cicek
test_mesaji_raspberry
test_mesaji_raspberry_2
test_mesaji_raspberry_3

yukarıdaki komut takımını giriyoruz. artık raspberry tarafından girilen komut satırındaki mesajları windowsda görebiliyoruz…

raspberry pi : motion kullanarak video yayını – basit bir ip kamera

bir önceki yazıda ( raspberry pi üzerinde webcam kullanımı ““ anlık görüntü alınması ) usb bir webcam ile fswebcam kullanılarak görüntünün nasıl aktarılacağı konusunda bir örnek yapmıştık.

bu yazıda ise donanımsal olarak bir değişiklik yapmadan video yayının nasıl yapacağımıza değinelim. bu şekilde bir ip kamera sahibi olmuş olacağız. gerekli düzenlemeleri yaparak eviniz – iş yeriniz için bir güvenlik kamerasına, çocuğunuz için bir çocuk kamerasına dönüştürebilirsiniz.

motion-trans yayın yapmak için motion isimli yazılımı kullanacağız. video stream yayın bir çok uygulama ile benzer işlemi yapılabilir ancak raspberry kullanıcıları tarafında bu uygulama oldukça popüler ve kurulum ve konfigürasyonu benzerlerine göre oldukça kolay.

ilgili uygulamaya yükleyelim.

pi@cicek ~ $ sudo apt-get install motion
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  ffmpeg libpq5
Suggested packages:
  postgresql-client
The following NEW packages will be installed:
  ffmpeg libpq5 motion
0 upgraded, 3 newly installed, 0 to remove and 3 not upgraded.
Need to get 0 B/533 kB of archives.
After this operation, 1,461 kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Preconfiguring packages ...
Selecting previously unselected package libpq5.
(Reading database ... 38800 files and directories currently installed.)
Unpacking libpq5 (from .../libpq5_9.1.16-0+deb7u2_armhf.deb) ...
Selecting previously unselected package motion.
Unpacking motion (from .../motion_3.2.12-3.4_armhf.deb) ...
Selecting previously unselected package ffmpeg.
Unpacking ffmpeg (from .../ffmpeg_6%3a0.8.17-1+rpi1_armhf.deb) ...
Processing triggers for man-db ...
Setting up libpq5 (9.1.16-0+deb7u2) ...
Setting up motion (3.2.12-3.4) ...
Adding group `motion' (GID 114) ...
Done.
Adding system user `motion' (UID 109) ...
Adding new user `motion' (UID 109) with group `motion' ...
Not creating home directory `/home/motion'.
Adding user `motion' to group `video' ...
Adding user motion to group video
Done.
[warn] Not starting motion daemon, disabled via /etc/default/motion ... (warning).
Setting up ffmpeg (6:0.8.17-1+rpi1) ...

ekran çıktısından görüldüğü gibi uygulama kuruldu ancak sunucu başlayamadı.

/etc/motion/motion.conf konfigürasyon dosyasında ben aşağıdaki şekilde gerekli değişiklikleri yaptım

pi@cicek ~ $ sudo nano /etc/motion/motion.conf

daemon on
setup_mode off
output_normal on
output_motion off
ffmpeg_cap_new on
ffmpeg_video_codec swf
target_dir /tmp/motion

webcam_port 8081
webcam_localhost off

control_port 8080
control_localhost off

yukarıdaki ayar ile sunucu modunu aktif ederek yayının localhost dışında alınabilmesi ve ayarlanabilmesi için gerekli konfügrasyon değişiklerini yapmış olduk. konfigürasyon dosyasının içine bakacak olursanız ilave bir dökümana ihtiyaç duymadan gerekli konfigürasyonu yapabilirisiniz.

şimdi ufak bir iki işlem daha yapamız lazım.daemon aktif olması için

pi@cicek ~ $ cat /etc/default/motion 
# set to 'yes' to enable the motion daemon
start_motion_daemon=yes

olarak gerekli değişikliği yapalım.

pi@cicek ~ $ sudo chmod 777 /media

şimdi motion servisini yeniden başlatalım..

pi@cicek ~ $ sudo service motion restart 
[ ok ] Restarting motion...[....] Stopping motion detection daemon: motion.
[ ok ] Starting motion detection daemon: motion.done.

sorunsuz olarak servis aktif oldu. şimdi gerekli testlerimiz yapalım.

yukarıda konfigürasyon sırasında parola korumasız olarak web üzerinden konfigürasyonuda aktif etmiştik. bir web tarayıcı açarak http://raspberryip:8080 yazarak gerekli testi gerçekleştirelim ve konfigürasyon servisinin düzgün şekilde çalıştığından emin olalım.

motion_config

şimdi sıra esas amacımız olan görüntüyü alıp alamadığımızın testine geldi. vlc uygulamasını açarak http://raspberrypi-ipadresi:8081 adresini yazarak görüntümüzü bakalalım

motion_vlc_ac

motion_vlc_ekran

raspberry pi üzerinde webcam kullanımı – anlık görüntü alınması

raspberry pi üzerinde özel bir kamera için arayüz olsa da uygulamanızı ucuza getirmek istiyorsanız linux altında sorun çıkarmayan ucuz bir usb2 webcam işinizi görecektir.

ben eskilerden goldmaster v-52 diye uyduruk bir webcam buldum. ve onunla yapacağım uygulamaları…

öncelikle usb arayüzünü

pi@cicek ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 1908:2310 GEMBIRD 

ve sonrasında video arayüzünü kontrol edelim.

pi@cicek ~ $ ls -al /dev/video*
crw-rw---T 1 root video 81, 0 Jan  1  1970 /dev/video0

her şey yolunda görülüyor. şimdi video0 dan amacımızı uygun olarak veri toplayan ve bunu yayın yapan yazılımları raspberry üzerine kurmaya sıra geldi.

sadece anlık görüntüyü resim formatında kaydetmek istiyorsanız fswebcam uygulaması fazlasıyla işinizi görecektir.

pi@cicek ~ $ sudo apt-get install fswebcam
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  fswebcam
0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
Need to get 0 B/52.3 kB of archives.
After this operation, 141 kB of additional disk space will be used.
Selecting previously unselected package fswebcam.
(Reading database ... 38843 files and directories currently installed.)
Unpacking fswebcam (from .../fswebcam_20110717-1_armhf.deb) ...
Processing triggers for man-db ...
Setting up fswebcam (20110717-1) ...

ilgili paketi kurduktan sonra bir örnek ile kameradan görüntü yakalayalım.

pi@cicek /var/www/wcam $ sudo fswebcam --no-title /var/www/wcam/test.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Error selecting input 0
VIDIOC_S_INPUT: Device or resource busy

yukarıda görüldüğü gibi bir hata aldık. bunun nedeni video0 in başka bir uygulama tarafından kullanıldığını gösteriyor. eğer kamera ile ilgili bir uygulama yapacaksanız mutlaka anlık kamera için bu kontrolleri ve cpu ve ram kullanım durumlarını kontrol ediniz. diğer uygulamayı kapattıktan sonra fswebcami yeniden çalıştıralım.

pi@cicek /var/www/wcam $ sudo fswebcam --no-title /var/www/wcam/test.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Clearing title.
Unable to load font 'sans': Could not find/open font
Disabling the the banner.
Writing JPEG image to '/var/www/wcam/test.jpg'.

font yüklenirken bir hata meydana geldi ancak test.jpg dosyamz web dizinimiz altında oluştu. web tarayıcı ile http://192.168.2.37/wcam/test.jpg adresine girerek gerekli kontrolleri yapalım. elde ettiğim görüntü aşağıdaki gibidir.

wcam_test

raspberry üzerinden okunan verinin python ile mysqle eklenmesi ve google chart ile bu verinin grafiğinin oluşturulması örneği

daha önceki örneklerimizde raspberry nin sistem özelliklerini okumayı ve bu verileri rrd veri tabanına kaydetmeyi ve izlemesi konusunda örnekler yapmıştık.

bu yöntemin uygun olmayacağı veya istenmeyeceği durumlar olabilir. böyle bir durum olduğunu düşünerek okuduğumuz cpu sıcaklık değerini bir veri tabanına (örneğimizde mysql olacak) kaydedelim ve dinamik bir arayüz ile veri tabanına kaydettiğimiz verileri kullanıcılarımız sunacağımız bir uygulama geliştirelim.

öncelikle veri tabanımızda hangi verilerin olacağını belirlemeli ve veritabanımızı oluşturmalıyız. raspberry pinin klasik dağıtımları üzerinde mysql, php, apache gibi sunucu yazılımları mevcut değil. bunları kurmanız gerektiğini unutmayınız. internette konu hakkında dokümanlar mevcut. uygun bir zamanda detaylı olarak onuda ekleyebiliriz. bunların olduğunu var sayarak esas konumuza dönelim.

bu örneğimizde tarih ve saat verisinin yanında sadece sıcaklık değerini tutmamız yeterli olacaktır.

sudo mysql -u root -p

CREATE DATABASE raspberry_sistem;
USE raspberry_sistem;

CREATE TABLE cpu_temp ( id INT NOT NULL AUTO_INCREMENT,
                      tarih DATE NOT NULL,
                      saat TIME NOT NULL,
                      sicaklik varchar(50),
                      PRIMARY KEY ( id ));

GRANT INSERT,SELECT ON raspberry_sistem.* TO 'raspberry'@'localhost' IDENTIFIED BY 'pi';
FLUSH PRIVILEGES;

artık veritabanımız hazır. sıra sıcaklık değeri okuyarak veri tabanına eklemeye geldi. ben örneğimi python kullanarak yapacağım. benim kullandığım python kütüphaneleri sizin raspberry üzerinde olmayabilir. kodun çalışması için eksik kütüphaneleri yüklemeniz gerekmektedir.

#sicaklik_cpu.py  dosyasi
import time
import os
import fnmatch
import MySQLdb as mdb
import logging
import time
import datetime

#cpu sicaklik degerinin okunmasi
def cpu_sicaklik_oku():
 res = os.popen('vcgencmd measure_temp').readline()
 return(res.replace("temp=","").replace("'C\n",""))


#mysql veritabanina veri eklenmesi
def insertDB(cpu_sicaklik):
  sql = "INSERT INTO cpu_temp (tarih, saat, sicaklik) VALUES ('%s', '%s', '%s' )" % (time.strftime("%Y-%m-%d"), time.strftime("%H:%M"), cpu_sicaklik)

  try:

    con = mdb.connect('localhost', 'raspberry', 'pi', 'raspberry_sistem');
    cursor = con.cursor()
    cursor.execute(sql)
    con.commit()
    con.close()

  except mdb.Error, e:
    logger.error(e)

#sicaklik okuma ve veritabanina yazma fonksiyonlarini calistiralim
cpu_sicaklik = float(cpu_sicaklik_oku())
print cpu_sicaklik
insertDB(cpu_sicaklik)

kodun oldukça sadece ve anlaşılır olduğunuz düşüyorum. temel olarak sıcaklık verisinin okunmasını ve bu verinin veri tabanına eklenmesini sağlayarak iki ayrı fonksiyon oluşturduk. ve bu fonksiyonları sırası ile çağırıyoruz.

komut satırından kodumuzu test edelim.

pi@cicek /var/www/raspberry $ sudo python sicaklik_cpu.py 
54.1

sıcaklık değeri okundu ve ekrana yazıldı ve herhangi bir hata vermedi. kontrol için eklediğimiz kodu “print cpu_sicaklik” her şey tamam olduktan sonra kaldıracağız. veri tabanına gerekli veri girişi doğru şekilde yapıldığının kontrolünü de yapalım.

mysql> select * from cpu_temp;
Empty set (0.01 sec)

mysql> select * from cpu_temp;
+----+------------+----------+----------+
| id | tarih      | saat     | sicaklik |
+----+------------+----------+----------+
|  1 | 2015-07-19 | 22:35:00 | 54.1     |
+----+------------+----------+----------+
1 row in set (0.00 sec)

kodumuz sağlıklı olarak çalışıyor. şimdi bu işlemi otomatikleştirmek için crontab içine yerleştirelim.

pi@cicek /etc $ cat /etc/crontab 

*/5 *  * * *   root    sudo python /var/www/raspberry/sicaklik_cpu.py

5 dakika bir çalışacak şekilde gerekli ilavemizi de yaptıktan sonra sıra kullanıcı arayüzüne geldi. grafik çizimi için google chart servisini line chart kullanacağım. detaylı bilgiyi https://developers.google.com/chart/interactive/docs/gallery/linechart adresinden alınabilir.

bu servis sayesinde grafik kütüphaneleri ile fazla uğraşmayacağım ve işimi kolayca halledeceğim.

<!DOCTYPE html>


	<script type="text/javascript" src="https://www.google.com/jsapi"></script>
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
		<script type="text/javascript">
			google.load('visualization', '1', {'packages':['corechart']});
			google.setOnLoadCallback(drawChart);

			function drawChart() {
				var json = $.ajax({
					url: 'get_json.php', 
					dataType: 'json',
					async: false
				}).responseText;
				
				var data = new google.visualization.DataTable(json);
				var options = {
					title: 'Raspberry CPU Sicaklik',
					width: 600,
					height: 400
				};
				var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
				chart.draw(data, options);

				setInterval(drawChart, 500 );
			}
		</script>  



  <div id="chart_div" style="width: 600px; height: 400px;"></div>

yukarıdaki kodu index.html olarak kaydelim ve esas işi yapacak get_json.php php dosyamızı da oluşturalım

<?php

$con = mysql_connect('localhost', 'raspberry', 'pi') or die('veri tabani baglanti hatasi');
mysql_select_db('raspberry_system', $con); 
$query = mysql_query('SELECT * FROM cpu_temp');

$table = array();
$table['cols'] = array(
    array('label' => 'saat', 'type' => 'string'),
	array('label' => 'sicaklik', 'type' => 'number')
);

$rows = array();
while($r = mysql_fetch_assoc($query)) {
    $tempa = array();
	$tempa[] = array('v' => $r['saat']);
	$tempa[] = array('v' => (int) $r['sicaklik']); 
    $rows[] = array('c' => $tempa);
}

$table['rows'] = $rows;

$jsonTable = json_encode($table);

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

echo $jsonTable;
?>

adres satırına raspberry adresini yazdığımızda göreceğimiz grafik aşağıdaki gibi olacaktır.

raspberry pi sıcaklığının değerinin öğrenilmesi ve rrd ile izlenmesi

basit bir örnekle raspberry pi üzerinde rrdtool kullanımı  yazıda rrd kullanımına değinmiştim. yazıdaki örnekte kayseri şehrinin sıcaklık değeri kullanılmıştı.

bu yazıda ise raspberry pi nin iç sıcaklık değerlerini kullanalım. kit üzerinden sıcaklık değerini iki yöntemle öğrenebiliriz.

1. yöntem  vcgencmd komutunu kullanarak

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp
temp=56.2'C

çıktısı yukarıdan görüldüğü gibi doğrudan rrd veritabanına göndermeye uygun değil bunun için aşağıdaki şekilde çıktımızı kırpalım.

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "'" -f1
56.2

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -c6-9
56.2

2. yöntem ise cpu log çıktısına bakmak.

pi@raspberrypi ~ $ cat /sys/class/thermal/thermal_zone0/temp
56224

bu yapıda tam işimize yaramayabilir. çıktıyı okunabilir bir duruma getirmemiz gerekiyor.

root@raspberrypi:~# /opt/vc/bin/vcgencmd measure_temp | sed "s/temp=\([0-9]\+\.[0-9]\+\)'C/\1/"
56.2

root@raspberrypi:~# awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp
56.2

artık raspberry nin sıcaklık değerinin nasıl öğrenileceğini bildiğimize göre örneğimizde yer alan

sicaklik ="curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'";

satırı yerine uygun kodu yazarak raspberrynin sıcaklık değerini rrd grafikleri üzerinden takip edebiliriz.

linux makinelerde cpu log dizin yapısından ufak farklılıklar olabilir ancak 2. yöntemle linux kullanan tüm cihazlarda cpu sıcaklık değeri öğrenebiliriz.

basit bir örnekle raspberry pi üzerinde rrdtool kullanımı

rrdtool un kullanma mantığının temel olarak

  • veri tabanının  oluşturulması.
  • veriyi toplayacak yazılımın gerçekleştirilmesi
  • düzenli aralıklarla bu veriyi toplanması ve veri tabanına eklenmesi
  • veri tabanına giriş yapıldıktan sonra görüntülenmesi istenilen grafikleri oluştur
  • oluşturulan grafiklerin görüntüleneceği bir arayüz  meydana getirilmesi

adımlarından oluşturuğu söylenebilir. şimdi bu adımları uygulayacağımız basit bir sıcaklık uygulaması örneği yapalım. rrd uygulamamızda kullanacağımız rdd veri tabanı yapısını oluşturalım.

#!/bin/bash
rrdtool create sicaklik_rrd.rrd --start N --step 300 \
DS:sicaklik_veri:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365

sıra geldi veri toplama ve elde edilen veriyi veritabanına ekleyecek yazılım kısmına.

#!/bin/bash
DIZIN="/var/www/sicaklik"

sicaklik ="curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'";

$rrd = `/usr/bin/rrdtool update $DIZIN/sicaklik_rrd.rrd N:$sicaklik`;

ile kayseri-erkilet için sıcaklık bilgisi çekilerek rrd dosyasına ekleniyor. şimdi sıra bu işlemi otomatik olarak yaptırmaya geldi.

pi@raspberrypi $ cat /etc/crontab 
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/5 *  * * *   root    /var/www/sicaklik/sicaklik.sh

artık 5 dakikada bir bu script çalışarak rrd veritabanı dosyamız güncellenecek. şimdi sıra veritabanından kullanacağımız grafiklerin oluşturulmasına geldi.

#!/bin/bash
DIZIN="/var/www/sicaklik"

sicaklik_birimi="C"
sicaklik_cizgi_rengi="#0000FF"

#saat
rrdtool graph $DIZIN/sicaklik_saat.png --start -4h \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]" \
GPRINT:sicaklik_veri:LAST:"Anlik Sicaklik\:%8.2lf %s"

#gun
rrdtool graph $DIZIN/sicaklik_gun.png --start -1d \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]" \
GPRINT:sicaklik_veri:LAST:"Anlik Sicaklik\:%8.2lf %s" \
GPRINT:sicaklik_veri:MAX:"Maksimum Sicaklik\:%8.2lf %s" \
GPRINT:sicaklik_veri:MIN:"Minimum Sicaklik\:%8.2lf %s"

#hafta
rrdtool graph $DIZIN/sicaklik_hafta.png --start -1w \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

#ay
rrdtool graph $DIZIN/sicaklik_ay.png --start -1m \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

#yil
rrdtool graph $DIZIN/sicaklik_yil.png --start -1y \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

artık işlem neredeyse bitti. burada grafik oluşturmayı farklı bir dosya gibi gösterdim ancak sicaklik verisini çektiğimiz ve veritabanına eklediğimiz script içinde olması işimi kolaylaştıracaktır. aksi halde bu dosyası da belirli zaman aralıkları ile çalıştırmamız gerekecektir.

şimdi sıra oluşturdugumuz grafikleri göstereceğimiz html dosyasını oluşturmaya geldi.



  

Raspberry Pi ile RRD örneği

Last Modified: < ?=$lastmod?>

Hourly

Daily

Weekly

Monthly

Yearly

olay aslında bu kadar basit. daha dinamik bir arayüz vb istiyorsak yapımızı buna göre oluşturmamız gerekmektedir. elde edeceğimiz günlük grafik ise aşağıdaki gibi olacaktır.

sicaklik_gun

hava durumu : linux komut satırı

linuxde komut satırından hava durumu bilgisine nasıl ulaşacağımızı ve bunu nasıl kullanacağımıza bakalım.

ücretli ve ücretsiz olarak hava durumu bilgisini sunan bir çok servis mevcut. yük doğruluk lu veri istiyorsanız bir miktar ücreti gözden çıkarmanız da fayda var. bu örnekte “National Weather Service” tarafından herkese açık olan kaynaklardan faydalanacağız. akıllı telefonlar ile hava durumu uygulamaları oldukça popüler hale geldi. her cihazda arka planda çalışan bir hava durumu uygulaması mevcut. bu şekilde bir uygulama yapmak geçiyorsa aklınızdan yapılacak temel işlemler aynı.

http://weather.noaa.gov/weather/TR_cc.html adresinden ülkemizde bilgi alınabilecek yerlerin listesini bulabilirsiniz. ben örneğimde Kayseri – Erkilet havaalanı için verileri kullanacağım.  http://weather.noaa.gov/weather/current/LTAU.html adresinden  gün sayfalara ulaşabilirsiniz. burada LTAU kodu istasyona ait verilmiş özel bir kod.

buradaki kullanılan dosya formatları konusunda  http://www.ofcm.gov/fmh-1/fmh1.htm adresinden detaylı bilgi alabilirsiniz.

biz tabiki bu html dosyasını kullanmayacağız. yukarıda belirtilen standart çerçevesinde  http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.txt  adresinde dosya her 5 dakika bir güncellenmektedir.

2015/07/05 14:20
LTAU 051420Z 27007KT 240V300 9999 FEW040 28/08 Q1016 NOSIG

dosyanın içeriği yukarı şekilde. 28/08 yazan kısımdaki 28 bizim sıcaklık değerimiz. bu verinin doğruluğunu kontrol etmek için akıllı telefondan alınan ekran görüntüsünüde aşağıda paylaşalım

2015-07-05-17-45-54-1_resized

şimdi sıra LTAU.TXT dosyasından veriyi almak gerekli scripti yazmaya geldi.

curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2}/M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'

ben yukarıdaki gibi bir script yazdım. sizde farklı yöntemlerle istediğiniz veriyi ( nem, rüzgar gibi ) tabiki alabilirsiniz..

pi@raspberrypi ~ $ curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
> grep -Po ' M?\d{2}/M?\d{2} ' |  \
> sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'
 28 
pi@raspberrypi ~ $

bu veriyi raspberry ile yapacağımız diğer uygulamalarda kullanacağımız için not etmekte fayda var.

raspberry pi – raspbian : kablosuz bağlantı ayarları

raspberrypimodelb

raspberry pi oldukça kullanışlı bir board ancak ne yazıkkı eski  modellerin üzerinde dahili bir wi-fi mevcut değil.

bu kısa yazıda elimizde “raspberry pi model b” olduğunu düşünerek piyasadan aldığımız bir usb wi-fi adaptör kullanarak kablosuz ağ bağlantısını gerçekleştirelim.

edineceğiniz adaptör ne kadar kaliteliyse ve tabiki linux driver desteği mevcuttsa bu işlem sırasında o kadar az sıkıntı ile karşılacağız.

bu işte kullanmak üzere girdiğimiz bir teknoloji marketinden bulduğum en ucuz adaptör olan tp-link tl-wn725n dan aldım. TL-WN725Nbu adaptör için alırken kontrol etmedim ancak linux altında gerekli driver ve patchler  varmış. yani ben kurulum sırasında çok fazla bir sorun yaşamaycağım. eğer sizde benzer bir iş için uğraçacaksanız öncelikle

http://elinux.org/RPi_USB_Wi-Fi_Adapters#Working_USB_Wi-Fi_Adapters

adresinden veya alternatif adreslerden alacağınız adaptörün uyumluluğunu kesinlikle kontrol edin.

raspberry nizi dış cihazlara bağlayacaksanız kesinlikle güç kaynağı ile birlikte kullanın. pc vb cihazlara usb den bağlayarak güç sağlarsanız raspberry boot olabilir ancak yeterli güç elde edilemezce wi-fi adaptörünüz v.b. düzgün çalışmayabilir, raspberry bu cihazları görmeyebilir.

bu kadar ön bilgiden sonra uygulaya gelelim.

öncelikle raspberrymiz usb portlarının durumuna bakalım.

pi@raspberrypi ~ $ lsusb 
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 

yukarıdan görüldüğü gibi raspberrymiz wi-fi adaptörümüzü görmemiş. öncelikle raspberry üzerindeki tüm güncellemelerimizi yapalım.

pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ sudo rpi-update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10185  100 10185    0     0  17477      0 --:--:-- --:--:-- --:--:-- 25590
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** We're running for the first time
 *** Backing up files (this will take a few minutes)
 *** Remove old firmware backup
 *** Backing up firmware
 *** Remove old modules backup
 *** Backing up modules 3.18.11+
#############################################################
WARNING: This update bumps to rpi-4.0.y linux tree
Be aware there could be compatibility issues with some drivers
Discussion here:
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=113753
##############################################################
Would you like to proceed? (y/N)
 *** Downloading specific firmware revision (this will take a few minutes)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168    0   168    0     0    203      0 --:--:-- --:--:-- --:--:--   280
100 46.7M  100 46.7M    0     0   520k      0  0:01:31  0:01:31 --:--:--  282k
 *** Updating firmware
 *** Updating kernel modules
 *** depmod 4.0.7-v7+
 *** depmod 4.0.7+
 *** Updating VideoCore libraries
 *** Using HardFP libraries
 *** Updating SDK
 *** Running ldconfig
 *** Storing current firmware revision
 *** Deleting downloaded files
 *** Syncing changes to disk
 *** If no errors appeared, your firmware was successfully updated to 19debdef5d132a12bf8df73d5e77e607066c8757
 *** A reboot is needed to activate the new firmware

 

rasrpberymizide reboot ettikten sonra usb üzerindeki kontrollerimiz yeniden yapalım.

pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0bda:8179 Realtek Semiconductor Corp. 

yukarıdaki şekilde bir çıktı ile karşılaşırsanız sorununuz düzelmiş ve raspberry wi-fi adaptörünüzü görüyor demektir. eğer sorun devam ediyorsa dogru driveri yükleyebilmek için kernel sürümü gerekecek.

pi@raspberrypi ~ $ uname -a
Linux raspberrypi 4.0.7+ #801 PREEMPT Tue Jun 30 18:15:24 BST 2015 armv6l GNU/Linux

şimdi doğru yazılımı bulalalım.

google ufak bir arama sonucu https://www.raspberrypi.org/forums/viewtopic.php?p=462982 adresine ulaşıyoruz. ve bu adresden “4.0.7+ #801” bilgisini kullanarak

4.0.7+ #801 – https://dl.dropboxusercontent.com/u/80256631/8188eu-20150630.tar.gz

dosyası bilgisine ulaşıyoruz. bu dosyayı indirdikten sonra içinen çıkan install.sh dosyasını çalıştırıp işlem sonrası raspberry mizi bir kez reboot ediyoruz.
 

pi@raspberrypi ~ $ wget https://dl.dropboxusercontent.com/u/80256631/8188eu-20150630.tar.gz
--2015-06-30 22:52:25--  https://dl.dropboxusercontent.com/u/80256631/8188eu-20150630.tar.gz
Resolving dl.dropboxusercontent.com (dl.dropboxusercontent.com)... 54.225.142.77, 54.235.132.16, 54.243.111.126, ...
Connecting to dl.dropboxusercontent.com (dl.dropboxusercontent.com)|54.225.142.77|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 389721 (381K) [application/octet-stream]
Saving to: `8188eu-20150630.tar.gz'

100%[=====================================================================================================================================================>] 389,721      531K/s   in 0.7s    

2015-06-30 22:52:34 (531 KB/s) - `8188eu-20150630.tar.gz' saved [389721/389721]

pi@raspberrypi ~ $ ls
8188eu-20150630.tar.gz  
pi@raspberrypi ~ $ tar -zxvf 8188eu-20150630.tar.gz 
8188eu.ko
8188eu.conf
install.sh
pi@raspberrypi ~ $ sudo ./install.sh 
sudo cp 8188eu.conf /etc/modprobe.d/.
sudo install -p -m 644 8188eu.ko /lib/modules/4.0.7+/kernel/drivers/net/wireless
sudo depmod 4.0.7+

Reboot to run the driver.

If you have already configured your wifi it should start up and connect to your
wireless network.

If you have not configured your wifi you will need to do that to enable the wifi.

bu işlemlerden sonra hata almaya devam ediyorsanız kontrol edilmesi gereken noktalar “modules” dosyası ve wi-fi ile ilgili konfigürasyon dosyalarıdır. benim kendis raspberry imdeki modules dosya içeriği aşagıdaki şekildedir.

pi@raspberrypi ~ $ cat /etc/modules 
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
8188eu 
8192cu

kablosuz ağ yapılandırması ile ilgili dosya konfigürasyonlarım ise aşağıdaki şekilde.

pi@raspberrypi ~ $ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf


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

 

interface dosyasında ip adresinin routeriniz dağıtıyor – otomatik almasını istiyorsanız ” iface wlan0 inet dhcp” olması gerekmektedir.

pi@raspberrypi ~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="elektrik.gen.tr"
key_mgmt=WPA-PSK
psk="kablosuz_ag_sifrem"
}

tüm bu işlemlerden sonra ağ ayarlarının durumu izleyelim.
 

pi@raspberrypi ~ $ ifconfig 
eth0      Link encap:Ethernet  HWaddr 11:11:11:11:11:11
          inet addr:192.168.2.37  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2576 errors:0 dropped:2 overruns:0 frame:0
          TX packets:116 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:162187 (158.3 KiB)  TX bytes:8763 (8.5 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr 22:22:22:22:22:22
          inet addr:192.168.2.24  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1124 errors:0 dropped:2 overruns:0 frame:0
          TX packets:2587 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:254667 (248.6 KiB)  TX bytes:301342 (294.2 KiB)

pi@raspberrypi ~ $  iwconfig 
wlan0     IEEE 802.11bgn  ESSID:"elektrik.gen.tr"  Nickname:""
          Mode:Managed  Frequency:2.447 GHz  Access Point: 18:28:61:38:49:9D   
          Bit Rate:72.2 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=100/100  Signal level=100/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

lo        no wireless extensions.

eth0      no wireless extensions.

sonuç olarak kablosuz ağımız aktif durumda. umarım yardımcı olur.

raspberry pi – raspbian ssh aktif edilmesi

raspberry ile çalışıyorsanız ssh in aktif olması olmazsa olmazlardan biridir. şimdi raspberry üzerine ssh sunucusu nasıl aktif edeceğimize bakalım.

raspberry nin konfigürasyon arayüzünü aktif çalıştıralım. bu arayüz ile konfigürasyon dosyaları ile uğraşmaya gerek kalmayacak. yazılım sürümüne göre ekran görüntüleri farklılık gösterebilir.

pi@raspberrypi ~ $ sudo raspi-config

açılan arayüzden “advanced options” seçilir

raspiconfigssh1

yeni açılan pencereden ssh seçilerek
raspiconfigssh2

açılan pencereler takip edilerek ssh aktif edilir.

raspiconfigssh3

raspiconfigssh4

ssh ımız aktif oldu. artk arayüzden “finish” diyerek çıkabilir.

raspiconfigssh5

arayüzden çıktıktan sonra komut satırını aşagıdaki şekilde göreceğiz.

pi@raspberrypi ~ $ sudo raspi-config 
update-rc.d: using dependency based boot sequencing
[ ok ] Starting OpenBSD Secure Shell server: sshd.

herşey güzel.. gerçekten ssh sunucumuz aktif mi kontrol edelim.

pi@raspberrypi ~ $ /etc/init.d/ssh status 
[ ok ] sshd is running.

ile sunucumuzun çalıştığı bilgisi alıyoruz. ip bilgisini ögrenelim ve gerçek bağlantı testimizi yapalım.

pi@raspberrypi ~ $ ifconfig
eth0 Link encap:Ethernet HWaddr 11:11:11:11:11:11
 inet addr:192.168.2.37 Bcast:192.168.2.255 Mask:255.255.255.0
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
 RX packets:777 errors:0 dropped:1 overruns:0 frame:0
 TX packets:557 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:1000 
 RX bytes:60040 (58.6 KiB) TX bytes:89779 (87.6 KiB)

bundan sonra ssh bağlantımızı yapalım…

[c:\~]$ ssh pi@192.168.2.37


Connecting to 192.168.2.37:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Linux raspberrypi 3.18.11+ #781 PREEMPT Tue Apr 21 18:02:18 BST 2015 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jun 30 20:39:17 2015 from fcicek.local


pi@raspberrypi ~ $

artık raspberry de diğer işlerle uğraşabiliriz.

linux – ip adresinin öğrenilmesi

linux de bir ethernet arayüzünün ip adresinin ifconfig çıktısından inceleyerek bulabiliriz. ancak nokta atışı yapılması gereken zamanlar olabilir.

aşagıdaki örnekte adım adım incelenebilir.

fcicek@ubuntu:~$ ifconfig eth0 
eth0      Link encap:Ethernet  HWaddr 00:0c:29:68:00:00  
          inet addr:192.168.126.128  Bcast:192.168.126.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe68:0000/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:388668 errors:0 dropped:0 overruns:0 frame:0
          TX packets:226787 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:506708018 (506.7 MB)  TX bytes:22826593 (22.8 MB)
fcicek@ubuntu:~$ ifconfig eth0 | grep 'inet addr:'
          inet addr:192.168.126.128  Bcast:192.168.126.255  Mask:255.255.255.0
fcicek@ubuntu:~$ ifconfig eth0 | grep 'inet addr:' | awk '{print$2}' 
addr:192.168.126.128
fcicek@ubuntu:~$ ifconfig eth0 | grep 'inet addr:' | awk '{print$2}' | cut -d: -f2
192.168.126.128
Back To Top