Showing posts with label j2me. Show all posts
Showing posts with label j2me. Show all posts

Wednesday, August 5, 2009

How to send file to mobile from computer using java application through bluetooth

Here is the source code for the sending files to mobiles from computer/pc using java application or j2me code through bluetooth as transmission medium.Many of us means amateur java and j2me programmer find it difficult to use bluetooth in java application as java development kit has no bluetooth library to use. As I have mentioned in my previous posts Bluecove is a J2SR-82 project meant for acessing bluetooth stack from java (java standard edition) .





So, for sending files from pc to mobile using java application through bluetooth. You must download Bluecove() and place it in both the runtime library extension folder of jre and jdk i.e "C:\Programs Files \Java\jre1.6.0\lib\ext" and "C:\Programs Files \Java\jdk1.6.0\jre\lib\ext" or the place where you have installed java under that find these two paths "jre1.6.0\lib\ext" and "jdk1.6.0\jre\lib\ext".

Before starting you must have bluetooth stack installed in your computer as mentioned in my previous post "Bluetooth Mobile Webcam - A Java & J2me based Project"


Change one thing in the code :

"File file = new File("D:/cmd.jpg");
InputStream is = new FileInputStream(file);
byte filebytes[] = new byte[is.available()];
is.read(filebytes);
is.close();"

Find this part in the code "File file = new File("D:/cmd.jpg")" and change the file path to your desired file path that you want to send to mobile.
eg: C:\test.txt

Now, compile this code and run it ....
Source Code Started:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector;

import javax.bluetooth.DataElement;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.Connection;
import javax.microedition.io.Connector;
import javax.obex.ClientSession;
import javax.obex.HeaderSet;
import javax.obex.Operation;


/**
*
* Class that discovers all bluetooth devices in the neighbourhood,
*
* Connects to the chosen device and checks for the presence of OBEX push service in it.
* and displays their name and bluetooth address.
*
*
*/
public class BluetoothServiceDiscovery implements DiscoveryListener{
//object used for waiting
private static Object lock=new Object();
//vector containing the devices discovered
private static Vector vecDevices=new Vector();
//vector containing the services discovered
private static Vector vecServices=new Vector();
private static String connectionURL=null;

/**
* Entry point.
*/
public static void main(String[] args) throws IOException
{
BluetoothServiceDiscovery bluetoothServiceDiscovery=new BluetoothServiceDiscovery();
//display local device address and name
LocalDevice localDevice = LocalDevice.getLocalDevice();
System.out.println("Address: "+localDevice.getBluetoothAddress());
System.out.println("Name: "+localDevice.getFriendlyName());
//find devices
DiscoveryAgent agent = localDevice.getDiscoveryAgent();
System.out.println("Starting device inquiry...");
agent.startInquiry(DiscoveryAgent.GIAC, bluetoothServiceDiscovery);
try {
synchronized(lock){
lock.wait();
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Device Inquiry Completed. ");
//print all devices in vecDevices
int deviceCount=vecDevices.size();
if(deviceCount <= 0){
System.out.println("No Devices Found .");
}
else{
//print bluetooth device addresses and names in the format [ No. address (name) ]
System.out.println("Bluetooth Devices: ");
for (int i = 0; i < devicecount; i++)
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(i);
System.out.println((i+1)+". "+remoteDevice.getBluetoothAddress());//+" ("+remoteDevice.getFriendlyName(true)+")");
}
}

// System.out.print("Choose the device to search for Obex Push service : ");
// BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
// String chosenIndex=bReader.readLine();
// System.out.println(chosenIndex);

// int index=Integer.parseInt(chosenIndex);

// System.out.println(chosenIndex);

for(int j = 0; j < deviceCount; j++)
{
//check for obex service
RemoteDevice remoteDevice=(RemoteDevice)vecDevices.elementAt(j);

UUID[] uuidSet = {new UUID("1105", true)};


int[] attrSet = {0x0100, 0x0003, 0x0004};
System.out.println("\nSearching for service...");

int transID = agent.searchServices(attrSet,uuidSet,remoteDevice,bluetoothServiceDiscovery);
System.out.println("Service Search in Progress ("+transID+")");
try {
synchronized(lock)
{
lock.wait();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}

//System.out.println("Service Discovery Completed. ");


System.out.println("Opening a connection with the server.... ");
// connection creation & sending file
try
{
Connection connection = Connector.open(connectionURL);
System.out.println("Connection obtained");

ClientSession cs = (ClientSession)connection;
HeaderSet hs = cs.createHeaderSet();

cs.connect(hs);
System.out.println("OBEX session created");

//System.out.println("Response code of the server after connect..." +hs.getResponseCode());

File file = new File("D:/cmd.jpg");
InputStream is = new FileInputStream(file);
byte filebytes[] = new byte[is.available()];
is.read(filebytes);
is.close();

hs = cs.createHeaderSet();
hs.setHeader(HeaderSet.NAME, file.getName());
hs.setHeader(HeaderSet.TYPE, "image/jpeg");
hs.setHeader(HeaderSet.LENGTH, new Long(filebytes.length));

Operation putOperation = cs.put(hs);
System.out.println("Pushing file: " + file.getName());
System.out.println("Total file size: " + filebytes.length + " bytes");

OutputStream outputStream = putOperation.openOutputStream();
outputStream.write(filebytes);
System.out.println("File push complete");

outputStream.close();
putOperation.close();

cs.disconnect(null);

connection.close();
}
catch(Exception e)
{
System.out.println("connection:"+e);
}
}


}
/**
* Called when a bluetooth device is discovered.
* Used for device search.
*/
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
//add the device to the vector
if(!vecDevices.contains(btDevice))
{
vecDevices.addElement(btDevice);
}
}
/**
* Called when a bluetooth service is discovered.
* Used for service search.
*/
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
/*if(servRecord!=null && servRecord.length>0)
{
connectionURL=servRecord[0].getConnectionURL(0,false);
System.out.println(connectionURL+"--"+servRecord);
}*/
for(int i = 0; i < servRecord.length; i++)
{
//vecServices=servRecord[i].getConnectionURL(0,false);
DataElement serviceNameElement = servRecord[i].getAttributeValue(0x0100);
String _serviceName = (String)serviceNameElement.getValue();
String serviceName = _serviceName.trim();
System.out.println(_serviceName);

if(serviceName.equals("OBEX Object Push"))
{

System.out.println("[client:] A matching service has been found\n");

try
{
connectionURL = servRecord[i].getConnectionURL(0,false);
System.out.println(connectionURL+"\n");
} catch (Exception e)
{
System.out.println("[client:] oops");
}
}
}


}
/**
* Called when the service search is over.
*/
public void serviceSearchCompleted(int transID, int respCode) {
/*synchronized(lock)
{
lock.notify();
}*/
String searchStatus = null;

if (respCode == DiscoveryListener.SERVICE_SEARCH_DEVICE_NOT_REACHABLE) {
searchStatus = "SERVICE_SEARCH_DEVICE_NOT_REACHABLE\n";
}
else if (respCode == DiscoveryListener.SERVICE_SEARCH_NO_RECORDS) {
searchStatus = "SERVICE_SEARCH_NO_RECORDS\n";
}
else if (respCode == DiscoveryListener.SERVICE_SEARCH_COMPLETED) {
searchStatus = "SERVICE_SEARCH_COMPLETED\n";
}
else if (respCode == DiscoveryListener.SERVICE_SEARCH_TERMINATED) {
searchStatus = "SERVICE_SEARCH_TERMINATED\n";
}
else if (respCode == DiscoveryListener.SERVICE_SEARCH_ERROR) {
searchStatus = "SERVICE_SEARCH_ERROR\n";
}

System.out.println("[client:] " + searchStatus);

synchronized(lock)
{
lock.notify();
}
}
/**
* Called when the device search is over.
*/
public void inquiryCompleted(int discType) {

switch (discType)
{
case DiscoveryListener.INQUIRY_COMPLETED :
System.out.println("INQUIRY_COMPLETED");
break;
case DiscoveryListener.INQUIRY_TERMINATED :
System.out.println("INQUIRY_TERMINATED");
break;
case DiscoveryListener.INQUIRY_ERROR :
System.out.println("INQUIRY_ERROR");
break;
default :
System.out.println("Unknown Response Code");
break;
}
synchronized(lock)
{
lock.notify();
}
}//end method
}//end class



(Read more inside ..)

Tuesday, August 4, 2009

Bluetooth Mobile Webcam - A Java & J2me based Project

This project is designed to broadcast live JPEG still images from Java 2 Micro Edition MIDP 2.0 enabled mobile device with camera like Nokia Series 60 v2.0 and Series 60 v3.0 phones over Bluetooth as a transmission medium onto the PC or Laptop. This project is developed in Java and Java 2 Micro Edition, which makes this software platform independent.

All the questions like:

  • How to connect mobile to PC through bluetooth by java ?
  • How to transmit pictures or data from mobile to PC using java/j2me through bluetooth ?
  • How to access mobile information from PC using java/j2me through bluetooth ?
  • What drivers are required to use bluetooth services in java ?
You will get all the answers here. So don't panic friends just wait and watch.






Prerequisites:
  • Bluetooth Enabled PC/Laptop or Bluetooth USB Device
  • One Java Enabled Bluetooth Mobile Phone like Nokia Series 60 v2.0 and Series 60 v3.0 phones
  • Java Development Kit 6 or above - Download it.
  • Java MicroEdition 2.5.2 or above - Download it.
  • BlueCove (bluecove-2.x.x.jar or above) is a JSR-82 J2SE implementation: is used to make our project applicable on any platform. BlueCove is used for the server part i.e. PC to receives images over Bluetooth and J2ME (JSR-82) is used for the client part i.e. the mobile phone. BlueCove currently interfaces with the Mac OS X, WIDCOMM, BlueSoleil and Microsoft Bluetooth stack found in Windows XP SP2 and newer. - Download it.
  • Mac OS X, WIDCOMM, BlueSoleil ,Microsoft Bluetooth stack ( Windows XP SP2 ) or BlueZ which is the Bluetooth stack for Linux. Any one of this must be installed.
  • Netbeans or Eclipse IDE (for advance user who want to add feature to this project)
It consists of two software components:
  • Mobile component that resides on phone and streams still images to PC. (Client part).
  • PC component that receives images over Bluetooth. (Server part)

This project is now in its beta version. So all of you can modify and optimize the code. Some bugs are also their I am working on them. As now a days I am not getting time to enhance the code.
I am not a genius in java that's why you will find little bugs in my code and in the application. So you all are invited to make this project a good one.


Steps:
  1. First ensure that you have java development kit and j2me installed in you PC, otherwise install it.
  2. Second ensure that any bluetooth stack is installed in your PC like WIDCOMM, BlueSoleil ,Microsoft Bluetooth stack or BlueZ.
  3. Place bluecove-2.x.x.jar in both the runtime library extension folder of jre and jdk C:\Program Files\Java\jre1.6.0\lib\ext and C:\Program Files\Java\jdk1.6.0\jre\lib\ext .
  4. Now extract the BlueServer.rar(Server Part).
  5. Server jar file is in dist folder which directly can be executed and the source files are in source folder.
  6. Extract pic_transmit_client.rar(Client Part).
  7. pic_transmit.jar and transmit.jad are there in deployed folder and the source files are in source folder.
  8. Send this pic_transmit.jar and transmit.jad files to you java enabled bluetooth mobile phone and install it.
  9. Start the Server part BlueServer.jar and click the start button.It will wait for the client to connect and transmit Jpeg files.
  10. Now start the bluetransmit application (client part) from the mobile.
  11. Select search from the bluetransmit application (client part) and wait, it will find the server and will connect to the server.It will display server name along with all the bluetooth devices in the surrounding and bluetooth address of the devices respectively in screen.

  12. Connection status in the server application will change to connected.
  13. After that select transmit from the bluetransmit application (client part).
  14. It will start sending the Jpeg image from the mobile to the PC and the images will be stored in c:\ServerBishwajeet folder.
  15. Images will be displayed in the a new window in PC.
  16. Select Stop from mobile when you want to stop. Don't stop it from the server part there is some bug. Which I am trying to remove.
It is a nice application for college projects. So keep developing the code and keep adding new features.



(Read more inside ..)