Pada bab ini akan dijelaskan mengenai implementasi dari security surveillance system. Penjelasan implementasi security surveillance system dibagi menjadi dua yaitu class, interface dan tools yang digunakan serta cara kerja dari security surveillance system.
Berikut adalah persyaratan peralatan minimum untuk security surveillance system :
Sebuah webcam.
Sebuah handphone dengan teknologi GSM yang bisa digunakan untuk mengirimkan MMS dan dapat digunakan sebagai modem (disarankan menggunakan handphone Nokia).
Sebuah handphone dengan teknologi GSM yang bisa digunakan untuk menerima MMS.
Dua buah SIM card GSM (disarankan menggunakan SIM card dari operator yang sama).
Kedua handphone yang akan digunakan hendaknya di-setting terlebih dahulu sesuai dengan operator GSM yang dipakai sehingga bisa mengirimkan dan menerima MMS. Sedangkan komputer/notebook yang diperlukan hendaknya memiliki spesifikasi sebagai berikut :
Processor dengan clock speed 800 MHz dengan memori sebesar 256 MB Infrared device
Java(TM) 2 Runtime Environment, Standard Edition version 1.4.1 Visual basic 6
Software Video OCX
4.1. Tools Yang Digunakan Pada Program Motion detection
Dalam pemrograman motion detection diperlukan software yang bernama Video OCX. Pada Video OCX terdapat dua buah tools yang bernama ”Video OCX” dan “Video OCX Tools”.
45
Berikut adalah method-method yang dipakai dalam motion detection yang terdapat pada “Video OCX” :
Capture : Digunakan untuk melakukan proses capture terhadap video image yang ditangkap oleh webcam.
ToGray : Digunakan untuk merubah sebuah color image menjadi grayscale.
ToPicture : Digunakan untuk menampilkan video image yang ditangkap oleh webcam menjadi sebuah gambar pada picture box yang terdapat di dalam Visual Basic.
SaveJPEG : Digunakan untuk merubah video image yang ditangkap oleh webcam menjadi gambar JPEG dan kemudian menyimpannya.
Show : Digunakan untuk menampilkan video image yang di-capture dengan method capture.
GetColorImageHandle : Digunakan untuk membuat sebuah color image kosong. Hal ini diperlukan untuk dapat melakukan proses capture.
GetGrayImageHandle : Digunakan untuk membuat sebuah grayscale image kosong. Hal ini diperlukan untuk dapat melakukan proses capture.
ReleaseImageHandle : Digunakan untuk membersihkan memory yang terpakai untuk method GetColorImageHandle dan GetGrayImageHandle.
ShowDriverDlg : Digunakan untuk menampilkan kotak dialog yang dapat digunakan user untuk memilih video driver yang akan digunakan.
ShowFormatDlg : Digunakan untuk menampilkan kotak dialog yang berisi pilihan resolusi video.
Init : Digunakan untuk menginisialisasi VideoOCX.
Start : Digunakan untuk menginialisasi background capture process. Start diperlukan pada waktu proses capture dan memproses image.
Stop : Digunakan untuk menghentikan proses capture.
Close : Digunakan untuk menutup koneksi terhadap video driver atau image sequence.
Berikut adalah method-method yang dipakai dalam motion detection yang terdapat pada “Video OCXTools” :
Motion : Digunakan untuk mendeteksi perbedaan antara dua image.
Mean area : Digunakan untuk mengkalkulasikan nilai grayvalue rata-rata pada sebuah gambar.
4.2. Cara Kerja Program Motion detection
Cara kerja motion detection dibagi menjadi tujuh sesuai dengan jumlah form yang ada ditambah dengan inisialisasi global. Berikut adalah ketujuh tahap yang ada yaitu :
Inisialisasi Global Form Menu
Form Configuration Form MMS Settings Form Execute Form Debug Mode Form History
Pada program motion detection juga menjadi satu dengan control program yang mengatur pengiriman MMS secara otomatis. Jadi yang dimaksud dengan program motion detection ialah program yang berisi proses pendeteksian motion detection beserta control program yang mengatur setting MMS dan history dari MMS yang dikirimkan sehingga proses pengiriman MMS dapat berjalan dengan baik dan benar.
4.2.1. Inisialisasi Global
Sebelum melakukan pemrograman motion detection dibutuhkan inisialisasi global. Inisialisasi global dapat digunakan dalam setiap form. Ada dua macam inisialisasi global yang terdapat pada program motion detection yaitu variabel global dan function yang bersifat global. Deklarasi variabel global yang terdapat dalam motion detection dapat dilihat pada segmen program 4.1. berikut :
Segmen program 4.1.deklarasi variabel global
Global result_image As Long Global color_image As Long Global gray_image As Long Global delay, wait As Long Global counter As Long Global filename As String
Selain inisialisasi global juga terdapat function yang bersifat global.
Berikut adalah function-function yang bersifat global yang terdapat program motion detection :
Segmen program 4.2. Function ReadFileContent
Public Function ReadFileContents(FileFullPath As String) As String On Error GoTo ErrorHandler
Dim iFileNumber As Integer Dim sAns As String
If Dir(FileFullPath) = "" Then Exit Function iFileNumber = FreeFile
Open FileFullPath For Input As #iFileNumber sAns = Input(LOF(iFileNumber) - 1, #iFileNumber) ReadFileContents = sAns
ErrorHandler:
Close #iFileNumber End Function
Function readfilecontent berfungsi untuk membuka suatu text file isi dari text file tersebut dikembalikan dalam suatu variabel string. Function readfilecontent dapat dilihat pada segmen program 4.2.
Segmen program 4.3. Function Formatdate
Public Function formatDate() As String formatDate = Format(Now, "dd-mm-yyyy") End Function
Function formatdate berfungsi untuk mengetahui tanggal pada saat function dijalankan dengan format “dd-mm-yyyy”. Function formatdate dapat dilihat pada segmen program 4.3.
Segmen program 4.4. Function Formattime
Public Function formatTime() As String formatTime = Format(Now, "hh.mm.ss") End Function
Function formattime berfungsi untuk mengetahui waktu pada saat function
dijalankan dengan format “hh.mm.ss”. Function formattime dapat dilihat pada
segmen program 4.4.
4.2.2. Cara Kerja Form Menu
Pada form menu terdapat lima menu yaitu : Configuration, MMS settings, Execute, Debug Mode dan History. Bentuk tampilan form menu dapat dilihat pada Gambar 4.1.
Gambar 4.1. Tampilan Form Menu
Pada form menu terdapat inisialisasi variabel yang digunakan untuk menentukan nilai default dari data yang berada pada form configuration. Jadi untuk menjalankan program motion detection pengguna tidak wajib mengakses form configuration terlebih dahulu. Inisialisasi variabel dari data yang ada pada menu configuration yang terdapat pada form menu dapat dilihat pada segmen program 4.5. berikut:
Segmen program 4.5. Inisialisasi Variabel Menu
Public diffx0 As Long Public diffx1 As Long
Public diffy0 As Long Public diffy1 As Long Public treshold As Long Public delay As Long Public times As Long
4.2.3. Cara Kerja Form Configuration
Form configuration mempunyai hubungan erat dengan form menu karena nilai default variabel pada form configuration berada pada form menu. Bentuk form configuration dapat dilihat pada Gambar 4.2. berikut ini :
Gambar 4.2. Tampilan Form Configuration
Cara kerja dari form configuration adalah jika user tidak mengakses form configuration dan langsung menjalankan form execute atau form debug mode maka nilai yang digunakan untuk variabel configuration adalah nilai default yang berada pada form menu. Jika user mengakses form configuration dan merubah nilai variabel pada form configuration maka nilai variabel yang digunakan adalah nilai yang baru di-input-kan oleh user. Untuk lebih jelasnya Listing program dari form configuration dapat dilihat pada segmen program 4.6.:
Segmen program 4.6. Form Configuration
Private Sub cmdOK_Click() Unload Formconf
End Sub
Private Sub Form_Unload(Cancel As Integer) FormMenu.diffx0 = Formconf.diffx0.Text FormMenu.diffx0 = Formconf.diffx0.Text FormMenu.diffx1 = Formconf.diffx1.Text FormMenu.diffy0 = Formconf.diffy0.Text FormMenu.diffy1 = Formconf.diffy1.Text FormMenu.treshold = Formconf.treshold.Text FormMenu.delay = Formconf.delay.Text
FormMenu.times = Formconf.times.Text End Sub
Jika tombol “OK” ditekan maka nilai default yang berada pada form menu akan berubah menjadi nilai yang di-input-kan user.
4.2.4. Cara Kerja Form MMS Settings
Form MMS settings dibuat untuk memudahkan user untuk melakukan konfigurasi pengiriman MMS. Untuk lebih jelasnya, bentuk form MMS settings dapat dilihat pada Gambar 4.3. berikut ini :
Gambar 4.3. Tampilan Form MMS settings
Cara kerja dari form MMS settings adalah menyimpan data yang diperlukan untuk mengirim MMS yang di-input-kan oleh user ke dalam sebuah text file yaitu
“optionfile.txt” (4.7. line 13-22). Data tersebut adalah header dari pesan MMS
yang akan dikirimkan antara lain : to, from, subject, text, dan image. Data yang disimpan dalam bentuk string. Nantinya text file “optionfile.txt” akan digunakan oleh program pengiriman MMS. Jika user tidak meng-input-kan konfigurasi pengiriman MMS (MMS settings) maka setting yang dipakai adalah setting yang tercantum pada file “optionfile.txt”. Untuk lebih jelasnya, Listing program dari form MMS settings dapat dilihat pada segmen program 4.7.
Segmen program 4.7. Form MMSsettings
1. Private Sub cmd_OK_Click() 2.
3. Dim gtway, mmscenter, dari, kepada, subyek, txt As String 4.
5. gtway = cmb_Gateway.Text 6. mmscenter = cmb_MMSC.Text 7. dari = cmb_From.Text 8. kepada = cmb_To.Text 9. subyek = txt_Subject.Text 10. txt = txt_Text.Text
11. gbr = txt_Image.Text 12.
13. Open ("C:\Project\MotionDetect\optionfile.txt") For Output 14. As #1
15. Print #1, "-gateway " & gtway 16. Print #1, "-mmsc " & mmscenter 17. Print #1, "-from " & dari 18. Print #1, "-to " & kepada 19. Print #1, "-subject " & subyek 20. Print #1, "-text " & txt
21. Print #1, "-image " & gbr 22. Close #1
23. Unload FormMMS 24. End Sub
Listing program untuk inisialisasi data pada form MMS settings dapat dilihat pada segmen program 4.8. :
Segmen 4.8. Inisialisasi MMSsettings
Private Sub Form_Load()
cmb_Gateway.AddItem "10.19.19.19"
cmb_Gateway.AddItem "10.1.89.150"
cmb_MMSC.AddItem "http://mmsc.m3-access.com/"
cmb_MMSC.AddItem "http://mms.telkomsel.com/"
cmb_From.AddItem "+628563107813/TYPE=PLMN"
cmb_To.AddItem "+628121660373/TYPE=PLMN"
cmb_To.AddItem "[email protected]"
txt_Subject.Text = "Security_Surveillance_System"
txt_Text.Text = "short_text.txt"
txt_Image.Text = "pic1.jpg"
End Sub
4.2.5. Cara Kerja Form Execute
Form execute merupakan form utama pada program motion detection.
Pada form execute ini terdapat proses motion detection sampai proses untuk menjalankan program pengiriman MMS. Bentuk tampilan form execute dapat dilihat pada Gambar 4.4. berikut :
Gambar 4.4. Tampilan Form Execute
Function shellwait berfungsi untuk melakukan fungsi “run” terhadap suatu string.
Function shellwait digunakan untuk membantu procedure calljwap. Procedure
calljwap berfungsi untuk menjalankan program pengiriman MMS. Listing
program function shellwait dapat dilihat pada segmen program 4.9. sedangkan
listing program procedure calljawap dapat dilihat pada segmen program 4.10.
Segmen program 4.9. Function shellwait
Private Function ShellWait(PathName, Optional WindowStyle As VbAppWinStyle = vbNormalFocus) As Double
Dim hProcess As Long, RetVal As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(PathName, WindowStyle))
Do
GetExitCodeProcess hProcess, RetVal DoEvents: Sleep 100
Loop While RetVal = STILL_ACTIVE End Function
Segmen program 4.10. Procedure Calljwap
Private Sub callJwap(str As String) Ret = ShellWait(str)
txtResult.Text = ReadFileContents("result.txt") End Sub
Procedure savehistory berfungsi untuk menyimpan data tentang status pengiriman MMS ke dalam sebuah file yang bernama “history.txt”. Listing program procedure savehistory dapat dilihat pada segmen program 4.11. berikut :
Segmen program 4.11. Procedure Savehistory
Private Sub saveHistory() Dim kapan, stat As String
filename = FormMMS.gbr kapan = Now
stat = ReadFileContents("result.txt")
Open ("C:\Project\MotionDetect\history.txt") For Append As #1 Print #1, filename & " " & kapan & " " & diff & " " &
stat
Close #1
End Sub
Cara kerja dari form execute secara garis besar adalah melakukan proses motion detection, menyimpan gambar dan kemudian mengirimkannya melalui MMS. Listing program utama dari form execute dapat dilihat pada segmen program 4.12. berikut :
Segmen program 4.12. Program Utama Form Execute
1. Private Sub CaptureTimer_Timer() 2. Dim imagetoshow As Long
3. Dim show_result As Boolean 4. show_result = False
5. Dim cmd As String
6. Dim orgstate As Boolean 7. Dim tgl, wkt As String 8.
9. cmd = "C:\JBuilder9\jdk1.4\bin\java
10. –jar C:\Project\MotionDetect\jwapexe.jar
11. -options optionfile.txt -start -result result.txt -exit"
12.
13. If (VideoOCX.Capture(color_image)) Then 14.
15. If (Not VideoOCX.ToGray(color_image, gray_image)) Then 16. MsgBox VideoOCX.GetLastErrorString,
17. vbOKOnly,"VideoOCXError"
18. End 20. End If 21.
22. If (VideoOCXTools.Motion(gray_image, result_image)) Then 23.
24. mean = VideoOCXTools.MeanArea(result_image,
25. FormMenu.diffx0, FormMenu.diffy0, FormMenu.diffx1, 26. FormMenu.diffy1)
27. If mean < 50 Then m = mean Else m = 50 28. ProgressBar1.Value = m
29. Text1.Text = mean 30.
31. If wait < timeGetTime() Then
32. If mean > FormMenu.treshold Or (counter > 0 And 33. counter < FormMenu.times) Then
34. counter = counter + 1 35.
36. If mean > diff Then diff = mean 37.
38. tgl = formatDate() 39. wkt = formatTime()
40.
41. VideoOCX.SaveJPEG color_image, 80,
42. "C:\Project\MotionDetect\" & "pic" & counter &
43. ".jpg"
44.
45. FileCopy "pic" & counter & ".jpg",
46. "C:\Project\MotionDetect\BackUp\" & "pic_" &
47. tgl & "_" & wkt & "(" & counter & ")" & ".jpg"
48.
49. If counter = FormMenu.times Then 50. orgstate = CaptureTimer.Enabled 51. CaptureTimer.Enabled = False 52. callJwap cmd
53. saveHistory
54. wait = 30000 + timeGetTime() 55. CaptureTimer.Enabled = orgstate 56. counter = 0
57. End If 58. End If 59. End If
60.
61. End If 62.
63. VideoOCX.Show color_image 64.
65. End If 66.End Sub
Cara kerja form execute pertama-tama adalah webcam melakukan proses monitoring dan menampilkannya (4.12. line 13 dan line 63). Selanjutnya image tersebut diubah menjadi grayscale (4.12. line 15-17). Kemudian dilakukan proses membandingkan dua buah image dengan menggunakan method motion pada tools videoocx (4.12. line 22) dan kemudian hasil proses pembandingan kedua image tersebut dihitung nilai rata-ratanya (4.12. line 24). Jika nilai rata-rata lebih tinggi daripada nilai threshold yang ditetapkan maka dianggap telah terjadi adanya suatu gerakan. (4.12. line 32-33) Gerakan tersebut akan disimpan menjadi beberapa gambar (4.12. line 41-43). Jumlah gambar yang ingin disimpan dapat disesuaikan dengan keinginan user. Setelah itu gambar-gambar tersebut akan di-copy dalam folder backup dan di-rename sesuai dengan waktu dan tanggal saat itu. (4.12. line 45-47)
Setelah proses motion detection selesai maka salah satu gambar yang dihasilkan oleh proses motion detection akan dikirimkan melalui MMS ke handphone atau alamat e-mail yang dituju. Proses pengiriman MMS akan dilakukan oleh program pengiriman MMS. Pada program motion detection akan dijalankan program pengiriman MMS (4.12. line 9-11). Gambar yang akan dikirimkan dapat diatur sesuai dengan keinginan user. Setelah gambar dikirimkan maka program motion detection akan membuka dan memperbaharui data pengiriman pada file “history.txt”.
Form execute mempunyai dua buah tombol yaitu ”start” dan ”stop”. Pada tombol ”start” terdapat proses delay yang dapat diatur oleh user (4.13. line 2-3), menyiapkan image handle yang diperlukan untuk proses motion detection (4.13.
line 14-16) dan kemudian menjalankan proses motion detection (4.13. line 24).
Sedangkan tombol ”stop” berfungsi untuk membebaskan image handler yang
telah digunakan (4.14. line 8-10) dan menghentikan program motion detection
(4.14. line 4 dan line 6). Listing program dari tombol ”start” dapat dilihat pada
segmen program 4.13. sedangkan Listing program untuk tombol ”stop” dapat dilihat pada segmen program 4.14.
Segmen program 4.13. Procedure start
1. Private Sub Start_Click(Index As Integer) 2. delay = FormMenu.delay
3. wait = delay + timeGetTime()
4. If (Not CaptureTimer.Enabled) Then 5.
6. VideoOCX.SetErrorMessages False 7.
8. If (Not VideoOCX.Init) Then
9. MsgBox VideoOCX.GetLastErrorString, vbOKOnly, 10. "VideoOCX Error"
11. End 12. End If 13.
14. color_image = VideoOCX.GetColorImageHandle 15. gray_image = VideoOCX.GetGrayImageHandle 16. result_image = VideoOCX.GetGrayImageHandle 17.
18. If (Not VideoOCX.Start) Then
19. MsgBox VideoOCX.GetLastErrorString, vbOKOnly, 20. "VideoOCX Error"
21. End 22. End If 23.
24. CaptureTimer.Enabled = True 25.
26. End If 27. End Sub
Segmen program 4.14. Procedure Stop
1. Private Sub Stop_Click(Index As Integer) 2. If (CaptureTimer.Enabled) Then
3.
4. CaptureTimer.Enabled = False 5.
6. VideoOCX.Stop 7.
8. VideoOCX.ReleaseImageHandle color_image 9. VideoOCX.ReleaseImageHandle gray_image 10. VideoOCX.ReleaseImageHandle result_image 11.
12. VideoOCX.Close 13.
14. End If 15. End Sub
4.2.6. Cara Kerja Form Debug Mode
Secara garis besar form debug mode sama dengan form execute, yang membedakan adalah tampilan form debug mode yang lebih lengkap. Selain itu form debug mode juga memiliki fasilitas-fasilitas yang tidak dimiliki form execute yaitu fasilitas “select camera” dan “format”. Fasilitas “select camera”
berfungsi untuk menampilkan pilihan webcam yang dapat digunakan, sedangkan fasilitas “format” berfungsi untuk menampilkan pilihan resolusi gambar yang akan disimpan. Bentuk tampilan kotak dialog ”select camera” dan kotak dialog
”format” dapat dilihat pada Gambar 4.5. dan Gambar 4.6. berikut :
Gambar 4.5. Tampilan Kotak Dialog Select Camera
Gambar 4.6. Tampilan Kotak Dialog Format
Listing program untuk procedure format dapat dilihat pada segmen program 4.15.
sedangkan listing program untuk procedure camera dapat dilihat pada segmen program 4.16.
Segmen program 4.15. Procedure Format
Private Sub Format_Click() If (Not VideoOCX.Init) Then
MsgBox VideoOCX.GetLastErrorString, vbOKOnly, "VideoOCX Error"
End End If
If (Not VideoOCX.ShowFormatDlg) Then
MsgBox VideoOCX.GetLastErrorString, vbOKOnly, "VideoOCX Error"
End End If End Sub
Segmen program 4.16. Procedure Camera
Private Sub Camera_Click() VideoOCX.ShowDriverDlg End Sub
4.2.7. Cara Kerja Form History
Form history adalah form yang menampilkan isi dari text file history.txt.
Sedangkan untuk membuka dan melakukan proses edit pada text file history.txt telah dilakukan pada form execute (untuk lebih jelasnya, listing program procedure savehistory dapat dilihat pada segmen program 4.11.).
Untuk menampilkan isi dari suatu text file maka dibutuhkan function readfilecontent (Listing program function readfilecontent dapat dilihat pada segmen program 4.2.). Listing program dari form history dapat dilihat pada segmen program 4.17. berikut :
Segmen program 4.17. Form History
Private Sub Form_Load()
txt_History.Text = ReadFileContents("history.txt") End Sub
Bentuk tampilan dari form history dapat dilihat pada Gambar 4.7. berikut :
Gambar 4.7. Tampilan Form History
4.3. Class Dan Interface yang Digunakan Pada Program Pengiriman MMS Ada dua macam package yang digunakan pada program pengiriman MMS yaitu :
MMS java library : Digunakan untuk membuat kerangka MMS, melakukan proses encode, decode, dan pengisian content pada kerangka MMS.
JWAP protocol stack : Digunakan untuk pengiriman MMS ke WAP gateway.
4.3.1. MMS Java Library
MMS java library hanya memiliki satu buah package yaitu com.nokia.mms. Pada package com.nokia.mms terdapat sebuah interface yaitu IMMConstants. com.nokia.mms mempunyai tujuh buah class yaitu :
MMAddress : Bertujuan untuk merepresentasikan generic address dari
pengirim dan penerima MMS.
MMContent : Bertujuan untuk merepresentasikan generic entry dari suatu pesan MMS
MMDecoder : Bertujuan untuk melakukan proses decode pada pesan MMS yang dibuat.
MMEncoder : Bertujuan untuk melakukan proses encode pada pesan MMS yang dibuat.
MMMessage : Bertujuan untuk merepresentasikan suatu MMS.
MMResponse : Berisi method untuk mendapatkan respon dari MMSC.
MMSender : Berisi method untuk mengirimkan MMS kepada MMSC.
Selain mempunyai interface dan class, com.nokia.mms juga mempunyai exception yaitu :
MMDecoderException : Bertujuan untuk mengetahui error yang terjadi pada waktu proses decode suatu pesan MMS.
MMEncoderException : Bertujuan untuk mengetahui error yang terjadi pada waktu proses encode suatu pesan MMS.
MMSenderException : Bertujuan untuk mengetahui error yang terjadi pada waktu proses pengiriman suatu pesan MMS.
4.3.2. JWAP Protocol Stack
Dalam JWAP protocol stack terdiri dari tujuh buah package yaitu : net.sourceforge.jwap
net.sourceforge.jwap.util net.sourceforge.jwap.wsp net.sourceforge.jwap.wsp.pdu net.sourceforge.jwap.wtp net.sourceforge.jwap.wtp.pdu
Pada program pengiriman MMS interface yang digunakan adalah IWSPUpperLayer. Berikut adalah beberapa class yang digunakan dalam program pengiriman MMS :
CWSPMethodManager CWSPSession
CWSPPost
4.4. Cara Kerja Program Pengiriman MMS
Cara kerja program pengiriman MMS meliputi empat tahap yaitu inisialisasi, pembuatan pesan MMS, pengiriman pesan MMS dan state. Berikut adalah penjelasan dari ketiga tahap tersebut :
4.4.1. Inisialisasi
Tahap inisialisasi digunakan untuk melakukan proses inisialisasi obyek dan variabel yang digunakan dalam program pengiriman MMS. Listing program inisialisasi program pengiriman MMS dapat dilihat pada segmen program 4.18.:
Segmen program 4.18. Inisialisasi Pada Program Pengiriman MMS
public static Frame2 LogFrame;
private InetAddress gateway;
private int port;
private byte[] Message;
private String FilePrefix = new String("");
private String LogFile = new String("");
private String ResultFile = new String("");
private String OptionsFile = new String("");
private boolean HideControl = false;
private boolean HideLog = false;
private boolean AutoStart = false;
private boolean Exit = false;
private Vector invokedMethods = new Vector();
private javax.swing.Timer Timer;
private int TimerPeriod = 200; //milliseconds protected ActionListener TimerHandler;
JLabel jLabel2 = new JLabel();
JTextField txtPort = new JTextField();
JLabel jLabel1 = new JLabel();
JLabel jLabel5 = new JLabel();
JTextField txtFrom = new JTextField();
JTextField txtTo = new JTextField();
JLabel jLabel6 = new JLabel();
JTextField txtSubject = new JTextField();
JLabel jLabel7 = new JLabel();
JLabel jLabel8 = new JLabel();
JLabel jLabel9 = new JLabel();
JTextField txtImage = new JTextField();
JCheckBox jCheckBox1 = new JCheckBox();
JCheckBox jCheckBox2 = new JCheckBox();
JTextField txtText = new JTextField();
JComboBox cmbGateway = new JComboBox();
JLabel jLabel3 = new JLabel();
JComboBox cmbMMSC = new JComboBox();
JLabel lblTimeOut = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel10 = new JLabel();
JLabel lblState = new JLabel();
JLabel jLabel11 = new JLabel();
4.4.2. Pembuatan Pesan MMS
Yang dimaksud tahap pembuatan pesan MMS adalah proses pembuatan kerangka MMS (4.19. line 2-4), melakukan set parameter yang dibutuhkan (4.20.
line 1-18), mengisi kerangka MMS dengan content yang diinginkan (4.21. line 1- 18) dan kemudian melakukan encode pesan MMS tersebut (4.19. line 6-9). Listing program pembuatan kerangka MMS dan proses encode dapat dilihat pada segmen program 4.19. berikut:
segmen program 4.19. Pembuatan Kerangka MMS dan Proses Encode
1. int doEncodeMMS() {
2. MMMessage mm = new MMMessage();
3. SetMessage(mm);
4. AddContents(mm);
5.
6. MMEncoder encoder=new MMEncoder();
7. encoder.setMessage(mm);
8. try {
9. encoder.encodeMessage();
10. } catch(Exception ex) { 11. log(ex.getMessage());
12. return(-1);
13. }
14. Message = encoder.getMessage();
15. log("Message encoded, length="+Message.length);
16. return(0);
17. }
Setelah kerangka MMS selesai dibuat maka yang perlu dilakukan kemudian adalah melakukan set parameter. Listing program untuk set parameter dapat dilihat pada segmen program 4.20. berikut :
segmen program 4.20. Set Parameter MMS
1. private void SetMessage(MMMessage mm) { 2. String s;
3. mm.setVersion(IMMConstants.MMS_VERSION_10);
4. mm.setMessageType(IMMConstants.MESSAGE_TYPE_M_SEND_REQ);
5. mm.setTransactionId("0000000123");
6. mm.setDate(new Date(System.currentTimeMillis()));
7. s = txtFrom.getText().trim();
8. if( !s.equals("")) mm.setFrom(s);
9. mm.addToAddress(txtTo.getText().trim());
10. mm.setSubject(txtSubject.getText().trim());
11. if( jCheckBox1.isSelected() ) mm.setDeliveryReport(true);
12. if( jCheckBox2.isSelected() ) mm.setReadReply(false);
13. mm.setSenderVisibility
14. (IMMConstants.SENDER_VISIBILITY_SHOW);
15. mm.setMessageClass(IMMConstants.MESSAGE_CLASS_PERSONAL);
16. mm.setPriority(IMMConstants.PRIORITY_HIGH);
17. mm.setContentType
18. (IMMConstants.CT_APPLICATION_MULTIPART_MIXED);
Setelah semua parameter yang dibutuhkan untuk mengirimkan MMS telah selesai ditentukan maka langkah selanjutnya adalah mengisi kerangka MMS dengan content yang diinginkan. Listing program pengisian content pada kerangka MMS dapat dilihat pada segmen program 4.21. berikut :
Segmen program 4.21. Add MMS content
1. private void AddContents(MMMessage mm) { 2. //teks
3. MMContent part1 = new MMContent();
4. byte[] buf1 = readFile(FilePrefix + txtText.getText().trim());
5. part1.setContent(buf1, 0, buf1.length);
6. part1.setContentId("<0>");
7. part1.setType(IMMConstants.CT_TEXT_PLAIN);
8. mm.addContent(part1);
9.
10. //image
11. MMContent part2 = new MMContent();
12. byte[] buf2 = readFile(FilePrefix + 13. txtImage.getText().trim());
14. part2.setContent(buf2, 0, buf2.length);
15. part2.setContentId("<1>");
16. part2.setType(IMMConstants.CT_IMAGE_JPEG);
17. mm.addContent(part2);
18. }
Pada program pengiriman MMS, content yang dikirimkan hanya berupa teks dan gambar. Selain teks dan gambar sebuah MMS juga dapat berisi sound clip dan video clip. Dalam sebuah MMS setiap jenis content hanya dapat berisi maksimal 1 buah. Jadi pada setiap pesan MMS tidak dapat berisi dua buah gambar, teks, image clip ataupun video clip. Hal ini disebabkan karena masih belum ada handphone yang mendukung fitur tersebut.
4.4.3. Pengiriman Pesan MMS
Pada tahap pengiriman MMS ini, pesan MMS yang telah dibuat akan dikirimkan sesuai dengan form MMS settings pada program motion detection.
Setelah user mengisi form MMS settings maka data yang ada akan disimpan pada text file“optionfile.txt”. Text file tersebut akan dibuka dan data yang ada akan dipindahkan pada form pengiriman MMS. Bentuk tampilan form pengiriman MMS dapat dilihat pada Gambar 4.8. berikut :
Gambar 4.8. Tampilan Form Pengiriman MMS
Untuk membaca ”optionfile.txt” dibutuhkan suatu function yang bernama readoptionsfile (mirip dengan function readfilecontent pada program motion detection) . Listing program untuk function readoptionsfile dapat dilihat pada segmen program 4.22. berikut :
Segmen program 4.22. Function ReadOptionsFile
private String[] ReadOptionsFile(String fname) { int i;
FileReader reader;
ArrayList list = new ArrayList();
int n;
try {
reader = new FileReader(fname);
}
catch(Exception e) {
return (String []) list.toArray(new String[0]);
}
StreamTokenizer st = new StreamTokenizer(reader);
st.resetSyntax();
st.eolIsSignificant(false);
st.whitespaceChars(0,32);
st.wordChars(33,127);
st.quoteChar('"');
st.commentChar('#');
try {
while ( (n = st.nextToken()) != st.TT_EOF) { if( n != st.TT_EOL ) list.add(st.sval);
} }
catch( Exception e ) {}
return (String []) list.toArray(new String[0]); }
Untuk mengetahui proses yang dikerjakan oleh program pengiriman MMS disediakan sebuah logfile. Bentuk tampilan logfile dari program pengiriman MMS dapat dilihat pada Gambar 4.9. berikut :
Gambar 4.9. Tampilan Logfile Program Pengiriman MMS
Untuk dapat mengirimkan MMS maka diperlukan koneksi ke WAP
gateway. Program pengiriman MMS akan mengirimkan perintah yaitu
s_connect.req kepada WAP gateway (4.23. line 1-25). Jika koneksi ke WAP
gateway telah terhubung maka WAP gateway akan mengirimkan sinyal s_connect.cnf (4.23. line 26). Listing program untuk melakukan koneksi ke WAP gateway dapat dilihat pada segmen program 4.23. :
Segmen program 4.23. Koneksi ke WAP Gateway
1. int doConnect() { 2. try{
3. gateway = InetAddress.getByName(
4. (String)cmbGateway.getSelectedItem() );
5. }
6. catch (UnknownHostException ex){
7. log("Gateway address not found");
8. ex.printStackTrace();
9. return(-1);
10. }
11. log("Gateway address found");
12.
13. try {
14. port = Integer.parseInt(txtPort.getText());
15. }
16. catch (NumberFormatException ex) { 17. log("Invalid port number");
18. return(-1);
19. } 20. try{
21. session = new CWSPSession(gateway, 22. port, 23. this, 24. true);
25. log("Connecting to WAP-Gateway");
26. session.s_connect();
27. // akan ada konfirmasi dari s_connect.cnf jika terjadi 28. koneksi ke WAPgateway
29. }
30. catch (SocketException ex){
31. log("UDP socket problem");
32. ex.printStackTrace();
33. return(-1);
34. }
35. return(0);
36. }
Setelah koneksi ke WAP gateway maka yang perlu dilakukan selanjutnya adalah
melakukan proses post MMS dengan menggunakan metode WSP post (4.24. line
1-20). Pada waktu melakukan post MMS juga disertakan content type yang
dipakai yaitu "application/vnd.wap.mms-message" (4.24. line 10). Listing
program post MMS dapat dilihat pada segmen program 4.24. berikut :
Segmen program 4.24. Post MMS
1. int doPostMMS() {
2. if( Message.length == 0 ) {
3. log("No encoded message to send");
4. return(-1);
5. } 6. try {
7. log("sending data (WSP POST)");
8. invokedMethods.addElement(
9. session.s_post(Message,
10. "application/vnd.wap.mms-message", 11. (String)cmbMMSC.getSelectedItem() 12. )
13. );
14. }
15. catch (Exception ex ) { 16. ex.printStackTrace();
17. return(-1);
18. }
19. return(0);
20. }
Setelah proses post MMS dilakukan maka yang perlu dilakukan selanjutnya adalah memutuskan koneksi pada WAP gateway. Listing program disconnect dari WAP gateway dapat dilihat pada segmen program 4.25. berikut :
Segmen program 4.25. Disconnect dari WAP gateway
int doDisconnect() { log("Disconnecting");
session.s_disconnect();
return(0);
}
4.4.4. State
Tahap state adalah tahap otomatisasi program dengan menggunakan beberapa state dan event. Dalam program pengiriman MMS jumlah state yang digunakan ada tujuh buah. Listing program inisalisasi pemakaian state pada program pengiriman MMS dapat dilihat pada segmen program 4.26. berikut :
Segmen program 4.26. Inisialisasi Pemakaian State
private static final byte STATE_IDLE = 0;
private static final byte STATE_WAITBEFORETERMINATE = 1;
private static final byte STATE_WAITFORCONNECT = 2;
private static final byte STATE_WAITBEFOREPOST = 3;
private static final byte STATE_WAITFORPOSTCONFIRM = 4;
private static final byte STATE_WAITBEFOREDISCONNECT = 5;
private static final byte STATE_WAITFORDISCONNECT = 6;
String StateName[] = { "IDLE",
"WAITBEFORETERMINATE", "WAITFORCONNECT", "WAITBEFOREPOST", "WAITFORPOSTCONFIRM", "WAITBEFOREDISCONNECT", "WAITFORDISCONNECT", };
Sedangkan event yang dipakai dalam program pengiriman MMS ada 9 buah.
Listing program inisialisasi pemakaian event pada program pengiriman MMS dapat dilihat pada segmen program 4.27. dibawah ini :
Segmen program 4.27. Inisialisasi Pemakaian Event
private static final byte EVENT_TIMEOUT = 0;
private static final byte EVENT_CONNECT = 1;
private static final byte EVENT_POSTCONFIRM = 2;
private static final byte EVENT_POSTFAILURE = 3;
private static final byte EVENT_DISCONNECT = 4;
private static final byte EVENT_SUSPEND = 5;
private static final byte EVENT_RESUME = 6;
private static final byte EVENT_START = 7;
private static final byte EVENT_CANCEL = 8;
String EventName[] = { "TIMEOUT",
"CONNECT", "POSTCONFIRM", "POSTFAILURE", "DISCONNECT", "SUSPEND", "RESUME", "START", "CANCEL", };
Setelah inisialisasi state-state dan event-event yang dipakai pada program
pengiriman MMS yang perlu dilakukan selanjutnya adalah menentukan waktu
timeout pada setiap state. Waktu timeout akan mencegah terjadinya deadlock.
Listing program untuk menentukan nilai timeout tiap state dapat dilihat pada segmen program 4.28. :
Segmen program 4.28. Waktu Timeout Tiap State
private int TIME_IDLE = 1000;
private int TIME_WAITBEFORETERMINATE = 5000;
private int TIME_WAITFORCONNECT = 60000;
private int TIME_WAITBEFOREPOST = 5000;
private int TIME_WAITFORPOSTCONFIRM = 120000;
private int TIME_WAITBEFOREDISCONNECT = 5000;
private int TIME_WAITFORDISCONNECT = 30000;
Pada setiap state terdiri dari beberapa event, jika suatu event tercapai maka proses akan pindah pada state selanjutnya sampai state yang terakhir. Listing program pada state idle dapat dilihat pada segmen program 4.29.:
Segmen program 4.29. State Idle
private void FSM_IDLE(int event) { int r;
switch( event ) { case EVENT_TIMEOUT:
case EVENT_START:
r = doEncodeMMS();
if( r < 0 ) {
Result = "201 Encoding of message failed";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
}
r = doConnect();
if( r < 0 ) {
Result = "301 Setup WAP session failed";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
}
SetState(STATE_WAITFORCONNECT,TIME_WAITFORCONNECT);
break;
case EVENT_CANCEL:
Result = "401 operation cancelled";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
default:
break;
} }
Pada state idle jika terjadi event start maka program akan melakukan proses encode MMS dan kemudian melakukan connect ke WAP gateway. Jika program telah berhasil mengirimkan perintah untuk connect ke WAP gateway maka proses dilanjutkan ke state wait for connect. Listing program pada state wait for connect dapat dilihat pada segmen program 4.30 berikut :
Segmen program 4.30. State Wait For Connect
private void FSM_WAITFORCONNECT(int event) { int r;
switch( event ) { case EVENT_TIMEOUT:
Result = "303 Setup WAP session timeout";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
case EVENT_DISCONNECT:
Result = "304 Setup WAP session rejected";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
case EVENT_CONNECT:
SetState(STATE_WAITBEFOREPOST,TIME_WAITBEFOREPOST);
break;
case EVENT_CANCEL:
Result = "401 operation cancelled";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
default:
break;
} }
Setelah WAP gateway mengirimkan sinyal bahwa koneksi ke WAP gateway telah berhasil maka proses akan dilanjutkan ke state wait before post. Listing program pada state wait before post dapat dilihat pada segmen program 4.31. berikut :
Segmen program 4.31. State Wait Before Post
private void FSM_WAITBEFOREPOST(int event) { int r;
switch( event ) { case EVENT_TIMEOUT:
TimeOut = 0;
r = doPostMMS();
if( r < 0 ) {
Result = "305 MMS Post failed";
Success = false;
SetState(STATE_WAITBEFOREDISCONNECT,TIME_WAITBEFOREDISCONNECT);
break;
}
SetState(STATE_WAITFORPOSTCONFIRM,TIME_WAITFORPOSTCONFIRM);
break;
case EVENT_DISCONNECT:
Result = "306 Unexpected WAP session disconnect";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
case EVENT_CONNECT:
break;
case EVENT_CANCEL:
Result = "401 operation cancelled";
Success = false;
SetState(STATE_WAITBEFOREDISCONNECT,TIME_WAITBEFOREDISCONNECT);
break;
default:
break;
} }
Pada state ini akan dilakukan proses post pesan MMS ke WAP gateway. Jika pesan MMS sukses dikirim maka proses akan dilanjutkan ke state wait for post confirm. Listing program pada state wait for post confirm dapat dilihat pada segmen program 4.32. berikut :
Segmen program 4.32. State Wait For Post Confirm
private void FSM_WAITFORPOSTCONFIRM(int event) { int r;
switch( event ) { case EVENT_TIMEOUT:
Result = "306 MMS Post timeout";
Success = false;
SetState(STATE_WAITBEFOREDISCONNECT,TIME_WAITBEFOREDISCONNECT);
break;
case EVENT_DISCONNECT:
Result = "304 Unexpected WAP session disconnect";
Success = false;
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
case EVENT_CONNECT:
break;
case EVENT_POSTCONFIRM:
Result = "100 OK";
Success = true;
SetState(STATE_WAITBEFOREDISCONNECT,TIME_WAITBEFOREDISCONNECT);
break;
case EVENT_POSTFAILURE:
SetState(STATE_WAITBEFOREDISCONNECT,TIME_WAITBEFOREDISCONNECT);
Result = "307 MMS Post rejected";
Success = false;
break;
case EVENT_CANCEL:
Result = "401 operation cancelled";
Success = false;
SetState(STATE_WAITBEFOREDISCONNECT,TIME_WAITBEFOREDISCONNECT);
break;
default:
break;
} }
Setelah WAP gateway mengirimkan sinyal bahwa pesan MMS telah diterima oleh WAP gateway maka proses dilanjutkan pada state wait before disconnect. Listing program pada state wait before disconnect dapat dilihat pada segmen program 4.33. berikut :
Segmen program 4.33. State Wait Before Disconnect
private void FSM_WAITBEFOREDISCONNECT(int event) { int r;
switch( event ) { case EVENT_TIMEOUT:
case EVENT_CANCEL:
r = doDisconnect();
if( r < 0 ) {
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break; }
SetState(STATE_WAITFORDISCONNECT,TIME_WAITFORDISCONNECT);
break;
case EVENT_DISCONNECT:
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
default:
break;
} }
Setelah waktu timeout selesai maka proses akan dilanjutkan pada state wait for connect. Listing program pada state wait for disconnect dapat dilihat pada segmen program 4.34. berikut :
Segmen program 4.34. State Wait For Disconnect
private void FSM_WAITFORDISCONNECT(int event) { int r;
switch( event ) { case EVENT_TIMEOUT:
case EVENT_CANCEL:
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
case EVENT_DISCONNECT:
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
case EVENT_CONNECT:
SetState(STATE_WAITBEFORETERMINATE,TIME_WAITBEFORETERMINATE);
break;
default:
break;
} }
Setelah WAP gateway mengirimkan sinyal bahwa program telah disconnect dari WAP gateway maka proses akan dilanjutkan pada state wait before terminate.
Listing program pada state wait before terminate dapat dilihat pada segmen program 4.35. berikut :
Segmen program 4.35. State Wait Before Terminate
private void FSM_WAITBEFORETERMINATE(int event) { int r;
switch( event ) { case EVENT_TIMEOUT:
log("======== " + Result + " ========");
log("======== GOOD BYE ========");
if( Exit ) {
if( LogFrame.FileIsOpen() ) LogFrame.CloseFile();
if( !ResultFile.trim().equals("")) WriteResult(FilePrefix+ResultFile);
System.exit(0);
} break;
case EVENT_START:
SetState(STATE_IDLE,TIME_IDLE);
default:
break;
} }