RF Giriş, CC1101 + Arduino ve OOK

rf1100

Kendime nasıl bir sıkıntı yaratırım, beynimi nasıl patlatabilirim diye düşünürken, aklıma uzun bir süre önce aldığım ve kenarda yatan CC1101 modülüyle oynamak geldi.

İşin zorluklarını özetlemek gerekirse: kısıtlı C bilgim, mikroişlemci seviyesinde iletişim, OOK modülasyonunun CC1101 ile neredeyse hiç kullanılmaması diyebilirim.

CC1101, Texas Instruments tarafından üretilen, oldukça kabul görmüş ve çok gelişmiş özelliklere sahip bir Sub-1 GHz, yani 1 GHz altı frekanslarda çalışan bir RF (radyofrekans) modülüdür.

Buradan satın alabileceğiniz modül, 315/433/868/915MHZ frekanslarında çalışabiliyor, yani ISM bandını kapsıyor.

ISM = industrial, scientific, medical.

ISM bandında çalışan uygulamalara örnek verecek olursak: otopark kapıları, spor/kalp monitörleri, kablosuz oyuncaklar ve benzerleri şeklinde liste uzar gider. Özetle, kullanımı için izin gerektirmeyen bir frekans aralığı diyebiliriz. Avrupa, Amerika ve tüm dünyada kullanılan ortak bir banddır ve ülkeden ülkeye farklı frekanslar kullanılır.

Örneğin, Amerika’da 315 MHz çok yaygın kullanılır, Avrupa’da daha çok 433 ve 868 MHz tercih edilir.

Bizim ülkemizin -tabi ki- bu konuda bir standartı olmamakla birlikte, genelde 433 MHz kullanılır. Bu genellemeyi otopark bariyer sistemlerine dayanarak yapıyorum tabi. (her şey bitti de ISM mi kaldı?)

Aslında, tüm bu bandlar, frekanslar ve diğer bilgiler çok daha uzun konular ve daha sonra bunlara da yer vermeye çalışacağım.

Peki bu modül ile neler yapabiliriz?

2 ya da daha fazla Arduino arasında iletişim kurabiliriz, otopark/garaj kapımızı açıp kapatabiliriz, ISM bandında yayın yapan cihazlarımızı dinleyebiliriz, kablosuz kapı zilimizi çaldırabiliriz 🙂

Arduinolar arasında iletişim sağlamak için bir çok library var, bunları araştırarak kolaylıkla bulabilirsiniz. Modülden 1 tane olduğu için, Arduino konuşturma şansım olmadı ama şöyle bir mesafe testi videosu var. Mesh ya da başka uygulamalar düşünüyorsanız, CC1101 gayet uygun ve düşük maliyetli bir çözüm olabilir.

Gelelim benim olayıma 🙂

Eski model bir arabam olduğu için, daha doğrusu donanım paketi de düşük olduğu için uzaktan kumanda, merkezi kilit gibi bir olay yoktu arabada.

Araba işlerinden iyi anlayan bir arkadaşımın yardımıyla, oto sanayide bir yere bu düzeneği taktırmıştık.

Sonrasında tabi ki bitmek bilmeyen merakla, sistemi ve kumandayı söküp detaylıca incelemeye karar vermiştim.

Çok basitçe özetlemek gerekirse, belli bir frekans üzerinden 8 haneli bir şifrenin aktarımıyla araba açıp kapanıyordu.

Kilitle komutu için: 00011000

Kilidi aç komutu için: 00010001

Kumanda (RF vericisi) her 2 hareket için 2 ayrı SABİT* şifre gönderiyordu.

*Sabit kısmına dikkat edelim, çünkü yeni model arabalarda, kendi kumandası olan arabalarda SABİT (fixed) bir kod/şifre yok. Her tuşa basıldığında değişen bir şifreleme tekniği kullanılıyor. Buna da rolling code diyoruz.

Doğru şifreler arabadaki RF alıcısına ulaştığında, kilit mandalı açıp kapanıyordu.

Şifreler (veriler) belli olduğuna göre ve frekans belli olduğuna göre, aynı iletişimi tekrarlarsam arabayı açıp kapatabilecektim.

Sonrasında Raspberry ile bunu gerçekleştirdim. (baya da kolay oldu :p)

Şimdi yine hepsi için ayrı ve uzun konular diyeceğm ama anahtar kelimeleri vererek, neyi araştırmanız gerektiğini söyleyebilirim: sdr, rtl-sdr, rtl_433, ook, on-off keying, ask, fixed code, rolling code

Ayrıca bir önceki yazıda çok geniş bir kütüphane var. Onları da incelerseniz, olayın içine tepeden düşmüş olursunuz 🙂 –> 433 Resources

İletişimi tekrarlamak için gerekenler: raspberry ya da arduino + 433 modülü + rcswitch kütüphanesi

İletişimi dinlemek için de aynı donanımı kullanabilirsiniz. (kumandanızın ne gönderdiğini görmek için)

Belirttiğim kaynakları okuyacağınızı düşünüyorum.

Her neyse, araba açıp kapatma işini CC1101 ile yapmaya karar verdim ve Arduino ile çalışacak hem de OOK modülasyonunu destekleyecek bir kütüphane oluşturmaya çalıştım.

PanStamp kütüphanesini alarak, chip registerlarıyla oynaya oynaya ve baya da zorlana zorlana sonunda çözebildim.

Bu vesileyle de ilk github repomu yaratmış oldum.

Kodlara buradan ulaşabilirsiniz.

Gerçekten beyin yakan bir deneyimdi, fakat mikroişlemci (bildiğin küçücük çip) seviyesinde iletişimi anlayabilmek için çok öğretici oldu.

Bu yazının devamı olarak ve teknik detaylara çok daha fazla değineceğim bir yazı hazırlayacağım.

Sorularınızı yorum bölümünden bana gönderebilirsiniz.

Bu arada, gerçekten ilginizi çekebilecek OpenSesame projesine bakmanızı şiddetle tavsiye ediyorum 🙂

RF Resources (433 MHz)

http://www.electronika.fr/blog/?p=913 cool prototype
https://hackaday.io/project/2403-ooklone another one
http://andrewmohawk.com/2012/09/06/hacking-fixed-key-remotes/
http://samy.pl/dingdong/
http://spencerwhyte.blogspot.com.tr/2014/03/delay-attack-jam-intercept-and-replay.html (rolling code PoC)
https://ilias.giechaskiel.com/posts/rtl_433/index.html
http://mightydevices.com/?p=300
http://geekdistillery.blogspot.it/2012/12/a-cheap-ti-ez430-chronos-watch-to.html
http://rurandom.org/justintime/index.php?title=Cheapest_ever_433_Mhz_transceiver_for_PCs
http://hackaday.com/2012/07/02/decoding-rf-link-using-a-pc-soundcard/
http://www.hoagieshouse.com/RaspberryPi/RCSockets/RCPlug.html
http://www.princetronics.com/how-to-read-433-mhz-codes-w-raspberry-pi-433-mhz-receiver/
http://www.robertoinzerillo.com/wordpress/?p=74
http://www.kukk.org/blog/sdr/messing-with-433mhz-equipment/
http://www.wes.id.au/2013/07/decoding-and-sending-433mhz-rf-codes-with-arduino-and-rc-switch/
http://www.pembo.co.uk/2014/02/23/lightwave-rf-arduino-and-raspberry-pi-awsomeness/
http://leetupload.com/blagosphere/index.php/2014/02/24/non-return-to-zero-askook-signal-replay/
http://adamsblog.aperturelabs.com/2013/03/you-can-ring-my-bell-adventures-in-sub.html
http://goughlui.com/2013/12/20/rtl-sdr-433-92mhz-askook-decoding-of-various-devices-with-rtl_433/
http://blog.luftek.si/2014/04/software-defined-radio-sniffing.html
http://www.swharden.com/blog/2013-05-19-wireless-microcontroller-pc-interface-for-3-21/
http://rayshobby.net/reverse-engineer-wireless-temperature-humidity-rain-sensors-part-1/
http://rayshobby.net/interface-with-remote-power-sockets-final-version/
https://wolfgangklenk.wordpress.com/2013/03/19/rf1100se-transceiver-wired-to-breadboard/

http://www.ni.com/example/13192/en/

http://www.acasper.org/2012/05/02/garage-door-hack/

http://bellard.org/pi/pi2700e9/pipcrecord.pdf

– reference
http://greatscottgadgets.com/sdr/
http://blog.solidremote.com/post/identify-rf-remote-control.aspx

– tools/software

https://github.com/jimstudt/ook-decoder
https://github.com/merbanan/rtl_433
http://wiki.nethome.nu/doku.php/analyzer/start
https://github.com/kevinmehall/rtlsdr-433m-sensor
https://github.com/eT0M/rtl_sdr_FS20_decoder
http://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/

nginx ve Incapsula

nginx ve Incapsula CDN kullananlar, gelen IP’leri düzgün alabilmek için

# Incapsula
set_real_ip_from 199.83.128.0/21;
set_real_ip_from 198.143.32.0/19;
set_real_ip_from 149.126.72.0/21;
set_real_ip_from 103.28.248.0/22;
set_real_ip_from 185.11.124.0/22;
real_ip_header X-Forwarded-For;

kullanabilirler.

nginx üzerinde WordPress URL Rewrite (.htaccess)

nginz üzerinde WordPress çalıştırmak için aşağıdaki rewrite rule’ları kullanıyorum.

umarım işinize yarar.

    location / {

    #yoast seo pack icin
    rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
    rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;

        if (!-f $request_filename){     
        set $rule_1 1$rule_1;
        }
        if (!-d $request_filename){     
        set $rule_1 2$rule_1;
        }
        if ($rule_1 = "21"){     
        rewrite /. /index.php last;
    } 
        try_files $uri $uri/ =404;
    }

Asterisk 1.4 + chan_ss7 + Sangoma Kurulumu

Merhaba,

Bu yazımda sizlere Ubuntu Server 11.04 üzerinde, Asterisk 1.4 ve chan_ss7 kurulumunu anlatacağım.
Kullandığım paket ve versiyonlar biraz eski gözükebilir. Ben en stabil bulduğum halini yazıyorum. Sizin senaryonuzda versiyonlar değişse bile, kurulum adımları hemen hemen aynı olacaktır.

Kurulumdaki donanım & yazılım özellikleri:

  • Ubuntu 11.04
  • Sangoma A108 / E1/T1 card

Okumaya devam…

Google Hesapları için çift taraflı doğrulama Google Authenticator

2 ay önce tamamen tesadüfen Google Authenticator uygulamasından haberdar oldum.
Sistem çok basit.

Google’a (gmail ve diğer servisler) her giriş yaptığınızda, sistem size bir kod soruyor. Cep telefonunuzdan bir kod üreterek hesabınıza giriş yapabiliyorsunuz.

Böylelikle, kullanıcı adınızı ve şifrenizi başkası bir bilse bile, kod üretmeden hesaba giriş sağlayamıyor.

Aslında şuan bankaların kullandığı “tek kullanımlık şifre ya da şifrematik” dediğimiz OTP cihazlarıyla aynı mantıkta çalışıyor.

Android kullandığım için, iPhone ve BlackBerry üzerinde test etmedim. Fakat hepsinde uygulama aynı.

Cep telefonunuzu kaybeder ya da unutursanız, sistem size giriş yapabileceğiniz 10 adet kod veriyor. Bunları bir yere not etmeyi ihmal etmeyin.

Kurulum ve daha fazla bilgi için: Google Yardım

nginx üzerinde SMF 2.0 + Pretty URLs

Merhaba,

Nginx üzerinde geliştirme yapmaya devam ediyorum. Tabi ki URL rewrite konusu Apache’ye göre biraz daha farklı işliyor.

Alıştığımız .htaccess maalesef nginx üzerinde yok. (Tabi ki include yaparak web root’a .htaccess koyabilirsiniz)

En son denememi SMF 2.0 ve Pretty URLs plugini ile gerçekleştirdim.

Eğer nginx üzerinde SMF çalıştırmak istiyorsanız, aşağıdaki rewrite rule’ları kullanabilirsiniz.

# Profil sayfalari icin
rewrite ^/forum/profile/([^/]+)/?$ "/forum/index.php?pretty;action=profile;user=$1" last;

# Actions icin
rewrite ^/forum/(activate|admin|ads|announce|attachapprove|ban|boardrecount|buddy|calendar|clock)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(collapse|convertentities|coppa|credits|deletemsg|detailedversion|display|dlattach|editpoll|editpoll2)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(emailuser|featuresettings|findmember|groups|help|helpadmin|im|jseditor|jsmodify)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(jsoption|lock|lockvoting|login|login2|logout|manageboards|managecalendar|managesearch|manageattachments|maintain|markasread|mascot)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(membergroups|mergetopics|mlist|moderate|modifycat|modifykarma|movetopic|movetopic2|news|notify)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(notifyboard|optimizetables|openidreturn|packages|permissions|pm|post|postsettings|post2|printpage|profile|quotefast)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(quickmod|quickmod2|recent|regcenter|register|register2|reminder|removepoll|removetopic2)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(repairboards|reporttm|requestmembers|restoretopic|reports|search|search2|sendtopic|serversettings|smileys|smstats|suggest)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(spellcheck|splittopics|stats|sticky|theme|trackip|about:mozilla|about:unknown)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(unread|unreadreplies|verificationcode|viewErrorLog|viewmembers|viewprofile|vote|viewquery|viewsmfile|who)/?$ "/forum/index.php?pretty;action=$1" last;
rewrite ^/forum/(\.xml|xmlhttp)/?$ "/forum/index.php?pretty;action=$1" last;

# Forumlar icin
rewrite ^/forum/([-_!~*'()$a-zA-Z0-9]+)/?$ "/forum/index.php?pretty;board=$1.0" last;
rewrite ^/forum/([-_!~*'()$a-zA-Z0-9]+)/([0-9]*)/?$ "/forum/index.php?pretty;board=$1.$2" last;

# Topicler icin
rewrite ^/forum/([-_!~*'()$a-zA-Z0-9]+)/([-_!~*'()$a-zA-Z0-9]+)/?$ "/forum/index.php?pretty;board=$1;topic=$2.0" last;
rewrite ^/forum/([-_!~*'()$a-zA-Z0-9]+)/([-_!~*'()$a-zA-Z0-9]+)/([0-9]*|msg[0-9]*|new)/?$ "/forum/index.php?pretty;board=$1;topic=$2.$3" last;

Yandex.Mail Kurumsal – Gönderim Hatası

Merhabalar,

Yandex’in yeni servisi, “Kurumlar için Mail”i yakın zamanda test etme fırsatım oldu.

Servisi, yönettiğim bazı sitelerde iletişim formu ve diğer formlardan alınan bilgileri göndermek için kullanmayı denedim. Hem iletişim formunu dolduran kişiye, hem de iletişim formundan alınan verilerin gönderileceği kişiye bir bildirim e-maili gönderen ve bu verileri ayrıca veritabanına kaydeden ufak bir script yazdım.

Tüm gönderiler için PHPMailer class’ı kullandım.
Mail içerikleri HTML olarak, charset olarak UTF-8, subject “İletişim Formu Bildirim” olarak set edildi. Gönderen (from) header’ı olarak da “Benimsitem.com İletişim” set edildi.

Host: smtp.yandex.ru – Port: 25

Sistem bir süre stabil çalıştı, her 2 partiye de mail gönderimi başarılı oldu.

Fakat bir süre sonra bazı iletişim formlarının iletilmediğini keşfettim. Veritabanında kayıt olmasına rağmen mail gelmiyordu. PHPMailer ile debug çalıştırdım. Fakat yeteri kadar bilgi dönmediği için direk sunucu üzerinde capture yapmaya karar verdim.

tcpdump -s 65535 -w mail.pcap port 25

 

Mail gönderimi sırasında aşağıdaki hatanın döndüğünü farkettim:

554 5.7.1 Message rejected under suspicion of SPAM

Cevap direk Yandex mail serverından geliyordu. Neyi spam olarak algıladığını anlayabilmek için, veritabanında olup da maili gitmeyen verileri iletişim formuna girdim. Belli kelimeler kullanıldığında ve uzunluk arttığında mailin gitmediğini farkettim.

Konuyla alakalı araştırma yapmama rağmen kimsenin bu sorunu yaşamadığını ya da denk gelmediğini farkettim. Yandex’e konuyla alakalı yazdım ama henüz bir dönüş alamadım.

Özetle sonuç hüsran 🙂 Google Apps ile karşılaştırıldığında, maalesef yetersiz kalıyor.
Bence en büyük eksiklikler:

  • DKIM (DomainKeys) desteği yok. Bu nedenle Yahoo bazen mailleri hiç almayabiliyor.
  • SMTP üzerinden gönderilen mailler, Yandex.Mail’in giden kutusuna düşmüyor. Bu Google Apps’ın en sevdiğim özelliği sanırım. Hangi yöntemle mail giderse gitsin, webmailden Sent Items’a ulaşıp, giden tüm mailleri görebiliyorsunuz.
  • SPF kayıtları standarta uygun değil. Doğrusu nedir ne değildir, hiç bir yerde yazmıyor. Özellikle sorunlu SPF kaydı ve DKIM olmayışı mailin spam olarak işaretlenmesine neden oluyor.
  • Tüm bu eksiklikler teknik olsa da, esas yönetim gücü ve kabiliyeti Google Apps özelliklerinin yakınından bile geçmiyor.

Şunu anladım ki, web geliştiricileri için en büyük sorunlardan biri mail göndermek.

Kendi sunucuma mail server kurarım, her şeyi konfigüre ederim, eksiksiz çalışır diyorsanız da Inbox’a mail ulaştırmanın da çok zor olduğunu unutmayın.

Maalesef Google Apps artık Free account alımını kapattı. Tavsiye edebileceğim 2 servis: MailJet ve MailChimp.

Bu servisler üzerinden sorunsuz gönderim yapabilirsiniz. Tabi para ödemedikçe, aylık ve günlük limitleri var.

Sizin de önerebileceğiniz alternatifler ya da sorunuz varsa yorumlarınızı beklerim.

PHP mail() çalıştırırken “sh: -t: not found” hatası

Merhaba,

PHP ile mail() çalıştırırken

sh: -t: not found

hatası alıyorsanız, sendmail_path set etmemiş olabilirsiniz.
Muhtemelen php.ini dosyanız olması gerektiği yerde değildir ya da sendmail yüklü olmayabilir.
php.ini var mı, öncelikle onu kontrol edelim (command line kullanabilenler, dedicated vps vs kullananlar icin)

php -i | grep php.ini

Eğer command line olarak erişim sağlayamıyorsanız, web sunucunuz üzerinden phpinfo(); ile aynı değerleri alabilirsiniz.

Çıktı şöyle olmalı:

Configuration File (php.ini) Path => /usr/local/php/lib

Loaded Configuration File => /usr/local/php/lib/php.ini

Buradaki /usr/local/php path’i sizde değişkenlik gösterebilir. Fakat bakılması gereken en önemli alan “loaded configuration file”, burada bir php.ini göremiyorsanız, configuration path içine php.ini oluşturabilirsiniz.
Default bir php.ini yüklemeniz yeterli olacaktır.
Ayrıca, php.ini olmadan phpnin çalışması da normaldir. Default değerlerle çalışmaktadır.

Sendmail yüklü mü?

whereis sendmail

çalıştırdığınızda

sendmail: /usr/sbin/sendmail /usr/lib/sendmail /usr/share/sendmail /usr/share/man/man8/sendmail.8.gz

çıktısı almanız lazım.php.ini varsa ve sorun düzelmiyorsa, php.ini’de sendmail_path değerini “/usr/sbin/sendmail -i -t”  olarak set edebilirsiniz. “-i ve -t” parametresini unutmayın. “man sendmail” ile ne işe yaradıklarına bakabilirsiniz.

Eğer hosting müşterisiyseniz ve buradaki çözümleri uygulamak istiyorsanız, hosting firmanızın teknik ekibine bildirmeniz gerekebilir. Buradaki değişikliklein tamamı sunucu tabanlıdır. Eğer böyle bir erişiminiz yoksa,

ini_set(“sendmail_path”, “/usr/sbin/sendmail -i -t”);

ile her php scriptinizde sendmail_path set edebilirsiniz…

Umarım yararlı olur.