市內電話

自製市話版的來電捕手 不在家也能過濾重要的市內電話來電 或是詐騙電話

有智慧型手機的出現,很多事情在手機上面都可以完成,然後它又可以直接放在口袋裡面戴出去,真的很方便,那…市話呢?只要一出門上班,或是去買東西,這個時間點內,有人打電話來,就會接不到,如果在加上回到家,沒有養成看市話話機上的來電號碼,很容易就會漏接電話了。其實市話是可以做來電轉接的,或是安裝答錄機,都可以解決這個問題,但是大部份的電話,都是不重要的、或是打來詐騙的,如果你只是想知道是誰打的電話,而不用馬上接聽,依照重要性,可以選擇馬上回電、或是不用回電,因為市面上我沒有看到符合我需求的產品,所以付爸就自己動手來了。

為了實現這個作法,我找了很多方式,想從中挑一個好實現、好維護的方式來做,但一直都沒找到,例如:
1. 架設主機,插上網路電話的語音卡並接上電話線,並安裝IPPBX,在裡面寫trigger通知
2. 買一台網路電話硬體設備,看看裡面有沒有額外的功能可以做來電的記錄或是通知
3. 架設CDR(Call Detail Record)
4. 看看市面上有沒有比較親民的設備可以弄 等

其實以上的方式,要不然就是花時間、花錢,或是太複雜,我只是想弄一個比較簡單的,有人打市話來的時候,可以通知我就可以了。

後來終於我找到另一種比較簡單的方式,就買一台便宜的網路電話的設備,並且架設syslog server,然後把syslog的log導向到那台主機做記錄,最後寫一個Daemon,定時去找,有沒有來電記錄,有的話就發通知給我。以為很美好的想法,結果發現syslog的層級,要開到debug才有來電通知,而debug層級的log量太大了,很吃效能,Daemon也會因為存取這麼大量的訊息,而效率很差,最後的結果,就是要等很久才會通知,失去它的意義。

本來想要放棄的,後來突發奇想,要不然我自己寫syslog server,不需要的log就drop掉它就好了,想到文字的處理,就會先想到Perl,找了一下套件,還真的可以,而且很簡單,整體的作法如下:

1. 購買設備,並把電話線插到FXO,你的話機接到FXS
Grandstream HT813

ADVANCED SETTINGS的設定頁面,Syslog server的欄位,設定你所架設的那台主機,而Level就照上面那張圖的選擇

2. 架設主機,建議是用Ubuntu 16.04,記得要以apt安裝mailutils套件

3. Perl程式碼如下,這支程式是要運作在背景的

use Net::Syslogd;

my $syslogd = Net::Syslogd->new()
  or die "Error creating Syslogd listener: ", Net::Syslogd->error;

while (1) {
    my $message = $syslogd->get_message();

    if (!defined($message)) {
        printf "$0: %s\n", Net::Syslogd->error;
        exit 1
    } elsif ($message == 0) {
        next
    }

    if (!defined($message->process_message())) {
        printf "$0: %s\n", Net::Syslogd->error
    } else {
        if($message->message =~ /CID Caller Number\ (\d+)$/){
                my $ggg = $1;
                #print "$ggg\n";
                `php notify.php $ggg`;
        }
    }
}

4. PHP程式碼,這支程式是負責通知的
* 收件人的部份,建議是使用yahoo信箱,而不要用Gmail

<?php
$ggg = $argv[1];

`echo $ggg | mail -s "[市話來電] $ggg" -aFrom:XXX\<XXX\@XXX.com\> "ZZZ@yahoo.com.tw"`;

實際運作的情況,人不在家的時候,如果有人撥市話來的時候,大約三秒內,手機可以收到信件寄來的通知,收到信件以後,可以知道是誰撥過來的,如果重要,可以在回撥,如果不知道是誰打的,可以去網路上、或是自己的手機電話簿搜尋這支電話號碼?是詐騙的話,就直接忽略,這樣子就不用擔心會掉漏任何重要的市內電話。

有一個小插曲,其實剛開始付爸不是買HT813的,而是買Linksys SPA3000,結果通電沒幾天,它就燒掉了,害我又要重新買設備,因為這樣子的使用情境,通常都是7*24在開機的,所以穩定性和安全性也是一個重要的考量點,寫這篇文章的時候,HT813已經開機52天了,依舊很聽話的在運作,沒有當機,而Linksys SPA3000…那就安息吧。

歡迎交流討論