Pages

Sunday, October 19, 2014

First Java Program

Java program start exacting from main method. In this program we have print "Welcome To Java Programming." Using println methods of System class.

জাভা প্রোগ্রামিং মেন মেথড থেকে প্রোগ্রাম রান করা শোরো  করে।  এখানে মেন মেথড এর মধ্যে System class এর println মেথড কল করে  Welcome To Java Programming. লাইন টি প্রিন্ট করে দেখানো হলো। 
public class WelcomeClass {
    public static void main(String [] args){
        System.err.println("Welcome To Java Programming.");
    }
}

Concepts Of Java Programming

Variable: In programming language variable is a container which contains some known or unknown values. In java programming variable are known as identifier.

programming language এ variable হলো একটি পাত্র  যেখানে কোনো ডেটা রাখা হয় / জাভা প্রোগ্রামিং এ variable কে identifier বলা হয়।  

Operation: In java programming operation is combination of some instruction which are used to process data in the variable.
Operation are include Variable assignment, Variable reading, Loops and conditional statement (if ... else).

Class:  class is the blueprint from which individual objects are created. A class can have fields, constructors and methods.

Interfaces: In java programming Interfaces is a central concept. An interface describes what methods a certain object should have available on it. A class can implement an interface. When a class implements an interface, the class has to must implement all of the methods described in the interface.


Package: - Package is central concept. A package is combination of multiple classes.


Wednesday, October 15, 2014

Send SMS using GSM Modem from Oracle Database

Send SMS using GSM Modem from Oracle Database

 SMSLib:

SMSLib provides a universal texting API, which can be used for sending and receiving messages via GSM modems.

Pre-requisites:

JDK 1.6 or higher
 JAVA Compiler

Configure SMSLib: You need the following files to configure SMSLib. You can find all of this file in Configuration_Files folder.


1.       javax.comm.properties
2.       comm.jar
3.       RXTXcomm.jar
4.       win32com.dll
JAVA_HOME is path where jdk is installed

Step 1:- Copy comm.jar to
·         %JAVA_HOME%/lib  
[ In my case C:\Program Files\ Java\jdk1.7.0_03\lib ]
·         %JAVA_HOME%/jre/lib/ext
[ In my case C:\Program Files\ Java\jdk1.7.0_03\jre\lib\ext ]

Step 2:- Copy win32com.dll to
·         %JAVA_HOME%/bin
[In my case C:\Program Files\ Java\jdk1.7.0_03\bin ]
·         %JAVA_HOME%/jre/bin
      [ In my case C:\Program Files\ Java\jdk1.7.0_03\jre\bin ]
·         %windir%System32
             [ In my case C:\Windows\System32 ]

Step 3 : Copy javax.comm.properties to
·         %JAVA_HOME%/lib
            [ In my case C:\Program Files\ Java\jdk1.7.0_03\lib ]
·         %JAVA_HOME%/jre/lib
            [ In my case C:\Program Files\Java\jdk1.7.0_03\jre\lib ]
Step 4 : Copy RXTXcomm.jar to
·         %JAVA_HOME%/ jre/lib/ext
            [ In my case C:\Program Files\ Java\jdk1.7.0_03\lib ]

1.     Now open your NetBeans IDE

2.     You can find your modem port using CommunicationPortTest class. After finding port and bauds enter your port and bauds in SendSMS class. Please see red color line.

3.     Add the following jar files in your libraries (log4j-1.2.16.jar, ojdbc6.jar, smslib-3.5.1.jar)

4.     Create the following two class (SendSMS, DBCP)

5.     Create one table (SMS_LIST)

6.     Now insert row in SMS_LIST table and run project you can get SMS.

SendSMS Class


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package smsgetway;
import org.smslib.AGateway;
import org.smslib.AGateway.GatewayStatuses;
import org.smslib.IOutboundMessageNotification;
import org.smslib.OutboundMessage;
import org.smslib.Service;
import org.smslib.modem.SerialModemGateway;
import java.sql.*;
/**
 *
 * @author rajib.pradhan
 */

public class SendSMS extends Thread {
    OutboundNotification outboundNotification;
    StringBuffer sql1;  
    SerialModemGateway gateway;
    String smsGatewayStatus = "";
    GatewayStatuses status;
    int i=0;
    public SendSMS() {
        try {
           
            outboundNotification = new OutboundNotification();
            SerialModemGateway gateway = new SerialModemGateway("modem.COM27", "COM27", 9600, "", "");
            gateway.setInbound(true);
            gateway.setOutbound(true);
            Service.getInstance().setOutboundMessageNotification(outboundNotification);
            Service.getInstance().addGateway(gateway);
            Service.getInstance().startService();
            status = gateway.getStatus();
            smsGatewayStatus = status.toString();
        } catch (Exception e) {
            System.out.println("EXCEPTION gateway.getStatus : "+gateway.getStatus());
            status = gateway.getStatus();
            smsGatewayStatus = status.toString();
            e.printStackTrace();
            System.out.println("Exception e.getMessage: " + e.getMessage());
            System.out.println("Exception cause: " + e.getCause());
        }
    }

    public void sendSMStoMobile() throws Exception {
        if (smsGatewayStatus.equals("STOPPED")) {
            return;
        }

        DBCP dbcp = DBCP.getInstance();
        Connection connection = dbcp.getConnection();
        Statement statement = connection.createStatement();
        ResultSet resultSet = null;
       
        try {
            sql1 = new StringBuffer();
            sql1.append("SELECT MOBILE_NUMBER, MESSAGE, TRANUM ");
            sql1.append("FROM SMSGATEWAY.SMS_LIST ");
            sql1.append("WHERE SEND_STATUS = 'N' ");
            resultSet = statement.executeQuery(sql1.toString());
           
            while (resultSet.next()) {
              
                String destMobileNo = resultSet.getString(1);
                System.out.println("Phone Number "+resultSet.getString(1));
                String message = resultSet.getString(2);
                String tranNumber = resultSet.getString(3);
                OutboundMessage sms = new OutboundMessage(destMobileNo, message);
                Service.getInstance().sendMessage(sms);
                //Update Table After Send Message
                String updateQuery = "UPDATE SMSGATEWAY.SMS_LIST SET SEND_STATUS = 'Y' WHERE TRANUM = " + tranNumber ;
                if(i<20)
                {
               System.out.print(tranNumber+": Y, ");
               
                }
                if(i==20){
                System.out.print(tranNumber+": Y, "+"\n");
                i=0;
                }
                statement.executeUpdate(updateQuery);
                connection.commit();
                i=i+1;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            dbcp.releaseConnection(connection);
        }
    }

    public class OutboundNotification implements IOutboundMessageNotification {

        public void process(AGateway gateway, OutboundMessage msg) {
            System.out.println(msg);
        }
    }

    public void run() {
        while (true) {
            try {
                sendSMStoMobile();
                this.sleep(1000);
            } catch (Exception e) {
            }
        }
    }

    public static void main(String[] args) throws Exception {
        SendSMS sendSMSFromDB = new SendSMS();
        sendSMSFromDB.start();
    }

    private void getModemInformation(SerialModemGateway gateway) throws Exception{
        System.out.println();
        System.out.println("Modem Information:");
       
        System.out.println("  Model: " + gateway.getModel());
        System.out.println("  Serial No: " + gateway.getSerialNo());
        System.out.println("  SIM IMSI: " + gateway.getImsi());
        System.out.println("  Signal Level: " + gateway.getSignalLevel() + " dBm");
        System.out.println("  Battery Level: " + gateway.getBatteryLevel() + "%");
        System.out.println("  Manufacturer: " + gateway.getManufacturer());
        System.out.println();
    }
}

Database Connection (DBCP) Class


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package smsgetway;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;
import java.util.Stack;

/**
 *
 * @author rajib.pradhan
 */
/*
 *
 * Database Connection Information
 *
 */

public class DBCP implements Runnable {

    private static DBCP connectionPool;
    private Stack pool;
    private Vector busyConnections;
    private int MAX_CONNECTIONS = 10000;
    private int MIN_CONNECTIONS = 1;
    private long timeout;
    private String sDriver;
    private String sDBUrl;
    private String sUsername;
    private String sPassword;

    private DBCP(String sDriver,
                 String sUrl,
                 String sUserName,
                 String sPassword,
                 int sMaxConnection,
                 int sMinConnection,
                 long sTimeOut) throws SQLException {
       
        this.timeout = sTimeOut;
        this.sDriver = sDriver;
        this.sDBUrl = sUrl;
        this.sUsername = sUserName;
        this.sPassword = sPassword;
        this.MAX_CONNECTIONS = sMaxConnection;
        this.MIN_CONNECTIONS = sMinConnection;
        busyConnections = new Vector();
        pool = new Stack();
        for (int i = 0; i < MIN_CONNECTIONS; i++) {
            pool.push(makeNewConnection());
        }
    }

    public static DBCP getInstance() {
        if (connectionPool == null) {
            try {
                connectionPool =
                        new DBCP(
                        "oracle.jdbc.OracleDriver",
                       "jdbc:oracle:thin:@localhost:1521:ORCL",
                        "SMSGATEWAY",
                        "SMSGATEWAY",
                        10,
                        5,
                        30000);
            } catch (SQLException _sqlex) {
                _sqlex.printStackTrace();
            }
        }
        return connectionPool;
    }

    public synchronized Connection getConnection() throws SQLException, InterruptedException {
        Connection connection = null;
        if (connectionPool != null) {
            if (pool.size() != 0) {
                connection = (Connection) pool.pop();
                busyConnections.add(connection);
            } else {
                if (getTotalConnections() >= MAX_CONNECTIONS) {
                    while (busyConnections.size() < MAX_CONNECTIONS) {
                        connection = (Connection) pool.pop();
                        if (connection != null) {
                            connection.close();
                        }
                    }
                } else {
                    makeBackgroundConnection();
                    wait();
                    connection = getConnection();
                }
            }
        }
        return connection;
    }

    protected int getTotalConnections() {
        return pool.size() + busyConnections.size();
    }

    private void makeBackgroundConnection() throws SQLException {
        try {
            Thread connectionThread = new Thread(this);
            connectionThread.start();
        } catch (Exception _ex) {
            throw new SQLException("Max Limit of connections exceeded");
        }
    }

    private synchronized Connection makeNewConnection() throws SQLException {
        try {
            Class.forName(sDriver);
            Connection connection =
                    DriverManager.getConnection(sDBUrl, sUsername, sPassword);
            connection.setAutoCommit(false);
            return connection;
        } catch (ClassNotFoundException cnfe) {
            throw new SQLException("Can't find class for driver: " + sDriver);
        }
    }

    /**
     * run() function for making a new connection from the
     * backgroud called by makeBackgroundConnection()
     */
    public void run() {
        synchronized (this) {
            try {
                Connection con = makeNewConnection();
                pool.push(con);
                notifyAll();
            } catch (Exception _ex) {
            }
        }
    }

    /**
     *
     * @return Information about this connection pool
     */
    public synchronized void releaseConnection(Connection con) {
        pool.push(con);
        busyConnections.remove(con);
        notifyAll();
    }

    public synchronized String toString() {
        String info =
                "ConnectionPool("
                + sDBUrl
                + ","
                + sUsername
                + ")"
                + ", available="
                + pool.size()
                + ", busy="
                + busyConnections.size()
                + ", max="
                + MAX_CONNECTIONS;
        return info;
    }

    /**
     *
     * @throws SQLException
     */
    private synchronized void closeAllConnections() throws SQLException {
        while (!pool.isEmpty()) {
            try {
                ((Connection) pool.pop()).close();
            } catch (Exception _ex) {
                throw new SQLException("Unable to close the Connection");
            }
        }
        pool = new Stack();
        for (int i = 0; i < busyConnections.size(); i++) {
            try {
                ((Connection) busyConnections.get(i)).close();
                busyConnections.remove(i);
            } catch (Exception _ex) {
                throw new SQLException("Unable to close the Connection");
            }
        }
        busyConnections = new Vector();
    }

    /**
     *
     * @throws java.lang.Throwable
     */
    protected void finalize() throws java.lang.Throwable {
        try {
            closeAllConnections();
        } catch (Exception _ex) {
        }
        super.finalize();
    }
}

Port finding class (CommunicationPortTest.class)

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package smsgetway;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Formatter;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import org.smslib.helper.CommPortIdentifier;
import org.smslib.helper.SerialPort;

/**
 *
 * @author rajib.pradhan
 */

public class CommunicationPortTest {

    private static final String _NO_DEVICE_FOUND = "No Device Found.";
    private final static Formatter _formatter = new Formatter(System.out);
    static CommPortIdentifier portId;
    static Enumeration<CommPortIdentifier> portList;
    static int bauds[] = {9600, 14400, 19200, 28800, 33600, 38400, 56000, 57600, 115200};

    /**
     * Wrapper around {@link CommPortIdentifier#getPortIdentifiers()} to be
     * avoid unchecked warnings.
     */
    private static Enumeration<CommPortIdentifier> getCleanPortIdentifiers() {
        return CommPortIdentifier.getPortIdentifiers();
    }

    public static void main(String[] args) {
        System.out.println("\nSearching for devices...");
        portList = getCleanPortIdentifiers();
        while (portList.hasMoreElements()) {
            portId = portList.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                _formatter.format("%nFound port: %-5s%n", portId.getName());
                for (int i = 0; i < bauds.length; i++) {
                    SerialPort serialPort = null;
                    _formatter.format("       Trying at %6d...", bauds[i]);
                    try {
                        InputStream inStream;
                        OutputStream outStream;
                        int c;
                        String response;
                        //serialPort = portId.open("SMSLibCommTester", 1971);
                        serialPort = portId.open("SMSAPP", 1971);
                        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
                        serialPort.setSerialPortParams(bauds[i], SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                        inStream = serialPort.getInputStream();
                        outStream = serialPort.getOutputStream();
                        serialPort.enableReceiveTimeout(1000);
                        c = inStream.read();
                        while (c != -1) {
                            c = inStream.read();
                        }
                        outStream.write('A');
                        outStream.write('T');
                        outStream.write('\r');
                        Thread.sleep(1000);
                        response = "";
                        StringBuilder sb = new StringBuilder();
                        c = inStream.read();
                        while (c != -1) {
                            sb.append((char) c);
                            c = inStream.read();
                        }
                        response = sb.toString();
                        if (response.indexOf("OK") >= 0) {
                            try {
                                System.out.print("  Getting Info...");
                                outStream.write('A');
                                outStream.write('T');
                                outStream.write('+');
                                outStream.write('C');
                                outStream.write('G');
                                outStream.write('M');
                                outStream.write('M');
                                outStream.write('\r');
                                response = "";
                                c = inStream.read();
                                while (c != -1) {
                                    response += (char) c;
                                    c = inStream.read();
                                }
                                System.out.println(" Found: " + response.replaceAll("\\s+OK\\s+", "").replaceAll("\n", "").replaceAll("\r", ""));
//                                JOptionPane.showMessageDialog(null," Found: " + response.replaceAll("\\s+OK\\s+", "").replaceAll("\n", "").replaceAll("\r", ""), "Warning",
//                                JOptionPane.WARNING_MESSAGE);
                            } catch (Exception e) {
                                System.out.println(_NO_DEVICE_FOUND);
//                                JOptionPane.showMessageDialog(null, _NO_DEVICE_FOUND, "Warning",
//                                JOptionPane.WARNING_MESSAGE);
                            }
                        } else {
                            System.out.println(_NO_DEVICE_FOUND);
//                            JOptionPane.showMessageDialog(null, _NO_DEVICE_FOUND, "Warning",
//                                JOptionPane.WARNING_MESSAGE);
                        }
                    } catch (Exception e) {
                        System.out.print(_NO_DEVICE_FOUND);
//                        JOptionPane.showMessageDialog(null, _NO_DEVICE_FOUND, "Warning",
//                                JOptionPane.WARNING_MESSAGE);
                        Throwable cause = e;
                        while (cause.getCause() != null) {
                            cause = cause.getCause();
                        }
                        System.out.println(" (" + cause.getMessage() + ")");
                    } finally {
                        if (serialPort != null) {
                            serialPort.close();
                        }
                    }
                }
            }
        }
        System.out.println("\nCommunication Test Completed.");
//        JOptionPane.showMessageDialog(null, "Communication Test Completed.", "Information",
//                                JOptionPane.INFORMATION_MESSAGE);
    }
}

Table Scripts

CREATE TABLE SMS_LIST
(
  MOBILE_NUMBER  VARCHAR2(20 BYTE),
  MESSAGE        VARCHAR2(300 BYTE),
  SEND_STATUS    CHAR(1 BYTE)                   DEFAULT 'N',
  TRANUM         VARCHAR2(30 BYTE)
)