2008年12月11日

[Java] 運用Eclipse與JDBC連接MySQL資料庫

用Eclipse寫Java程式,目前一切很正常

今天需要連接到MySQL,所以就小試了一下,程式碼如下

import java.sql.*;
public class dbconn {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://ipaddress:3306/dbname";
String user = "taiwanwolf";
String password = "mypassword";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url,user,password);
if (conn != null && !conn.isClosed()) {
System.out.println("test ok");
conn.close();
}
else {
System.out.println("fail");
}
}
catch (ClassNotFoundException e) {
System.out.println("can not found driver class");
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}

}

---我是分隔線---

上面看起來很正常吧,結果按CTRL+F11,居然出現class not found的錯誤

想必是找不到JDBC的Class,google一下找到mysql 的JDBC Driver

下載點

點選Project -> properties
Java Build Path => Libraries -> Add External JARs
再選上面壓縮檔解開的Jar => mysql-connector-java-5.1.7-bin.jar

全部弄好之後居然出現另一個錯誤訊息
not allowed to connect to this MySQL serverConnection closed by foreign host

把 firewall 抽掉也不行,google了一下發現是MySQL預設是只接受localhost的連線

所以必須新增User並且指定可連線的IP,先用console登入, 然後用 grant 新增

一般新增語法
GRANT ALL ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

我是採用這個
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on dbname.* TO 'taiwanwolf'@'123.111.222.%' identified by 'mypass';

FLUSH PRIVILEGES;

再試一次,搞定!

P.S1: 上述的123.111.222.%是表示只允許此段IP網段連入

P.S 2: iptables 裡面開啟3306可被連線的語法為
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

2008年12月5日

如何將Wireshark擷取的封包內的G.729還原?

目前網路電話由於頻寬問題,多半採用G.729當作Codec,而此codec目前並非是open source的授權,所以處理起來較為麻煩,以下為codec還原的方式

前置準備
先下載 open G.729 的 decoder
Windows 下可使用 Goldwave
Linux 下可使用 Perl 的Script

整個轉檔流程大概需經過以下的手續:
Wireshark(raw) -> open G.729 decoder (pcm) -> Goldwave (wav) or perl script (au) -> 播放器


步驟1. Wireshark(raw)

選單 Statistics -> RTP -> Show All Streams, 進入後會找出總共有多少RTP Stream

















RTP封包解開通常會長成這個樣子
-- 2個主叫端的聲音
-- 1個被叫端的聲音

第一個主叫端為接通前的聲音,通常是響鈴或來電答鈴音樂
第二個為被叫端的聲音,也就是接通回應
第三個為主叫端的聲音,也是接通開始說話

選擇要還原的RTP再按 Analyze ,通常是依序一個一個解








接下來的畫面選擇 Save Payload....
再下個畫面
Format 選 .raw
Channel 選 forward
再命名為 filename.raw




















步驟2. open G.729 decoder (pcm)
此時再借助這個opensource的小程式,將raw檔轉成pcm格式
將G729.zip解開,進入Dos模式執行裡面的程式如下:
va_g729_decoder.exe 來源.raw 目的.pcm


步驟3.1 Goldwave (wav), Windows適用
將轉好的pcm檔用Goldwave打開,並選擇下面的格式,打開後即可直接播放或轉成wav檔













步驟3.2 Perl script (au) , Linux適用

請將以下的Perl script存檔,檔名為 pcm2au.pl
--------我是分隔線--------
#
# USAGE: perl pcm2au.pl inputFile outputFile


$usage = "Usage: 'perl $0 ' ";

$srcFile = shift @ARGV || die $usage;
$dstFile = shift @ARGV || die $usage;

open(SRCFILE, "$srcFile") || die "Unable to open file: $!\n";
binmode SRCFILE;

open(DSTFILE, "> $dstFile") || die "Unable to open file: $!\n";
binmode DSTFILE;

###################################
# Write the AU header
###################################

print DSTFILE ".snd";

$foo = pack("CCCC", 0,0,0,24);
print DSTFILE $foo;

$foo = pack("CCCC", 0xff,0xff,0xff,0xff);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,3);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0x1f,0x40);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,1);
print DSTFILE $foo;

#############################
# swap the PCM samples
#############################

while (read(SRCFILE, $inWord, 2) == 2) {

@bytes = unpack('CC', $inWord);
$outWord = pack('CC', $bytes[1], $bytes[0]);
print DSTFILE $outWord;
}

close(DSTFILE);
close(SRCFILE);

--------我是分隔線--------
然後再執行 perl pcm2au.pl 來源.pcm 目的.au
就可產生 au 檔了

PS1. G.711的話,Wireshark可以直接分析之後轉存為 au 檔,就可以直接播放了。
PS2. 參考資料: http://wiki.wireshark.org/HowToDecodeG729

2008年12月4日

[程式] Perl 寄信給gmail的方法 (以網站復原為例)

如果監控的網站斷線恢復了,怎麼發個mail通知呢? 用Perl的做法如下

發信程式前面加上收件者, 這邊是寄給 qqq 跟 abc
chomp($theman="qqq\@gmail.com,abc\@gmail.com");
.
.
.

監控部份省略

.
.
.

需要發信的地方加上, 呼叫mailgood副程式
&mailgood($theman);

.
.
.


寄信的副程式
sub mailgood {
$subject = encode("big5",decode("utf8","網站狀態 - $ip 復原"));
$nowtime = `date +%Y\/%m\/%d-%H:%M:%S`;
$mailcontent = encode("big5",decode("utf8","復原時間 $nowtime"));
$to=shift;
# sendmail program location
my $mailprg = "/usr/sbin/sendmail -t";
# sender Email
my $from = "taiwanwolf\@abc.com";
open (MAIL,"|$mailprg") || die "$!\n";
print MAIL "Content-Type: text/plain; charset=big5\n";
print MAIL "Return-Path: $from\n";
print MAIL "From: $from\n";
print MAIL "To: $to\n";
print MAIL "Subject: $subject\n";
print MAIL "\n";
print MAIL "$mailcontent \n";
}