使用J2ME搜索蓝牙设备,并与搜到的设备通信

http://blog.csdn.net/hellogv/archive/2008/04/24/2323313.aspx

由于代码来自我目前的项目,所以不能给出完整代码(非常多),只给出关键代码,对于一般J2ME程序员绝对看得懂!

        首先,给出J2ME搜索蓝牙设备的代码:

        public void commandAction(Command command, Displayable displayable)
        {
             if(command==cmd_Search)
             {
                 try
                 {
                     LocalDevice localDevice = LocalDevice.getLocalDevice();
                     DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent();
                     discoveryAgent.startInquiry(DiscoveryAgent.GIAC,new MyDiscoveryListener(this));
                 }
                 catch (Exception e)
                 {
                     MyClass.MessageBox("搜索出错,找不到蓝牙设备!", display);
                     return;
                 }
                
                 Menu.removeCommand(cmd_Search);
             }
        }
}


class MyDiscoveryListener implements DiscoveryListener {
    //用于保存搜索到的设备
    Vector devices = new Vector();
    SearchDevices midlet;
   
    public MyDiscoveryListener(SearchDevices midlet) {
        this.midlet = midlet;
    }
   
    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
        devices.addElement(btDevice);
    }
   
    public void inquiryCompleted(int discType) {
            for (int i=0;i<devices.size();i++)
            {
                RemoteDevice btDevice = (RemoteDevice)devices.elementAt(i);
                try
                {
                    String device_address=btDevice.getBluetoothAddress();//取得蓝牙设备的全球唯一地址
        }
                catch (Exception e) {e.printStackTrace();}
            }
    }
    public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {}
    public void serviceSearchCompleted(int transID, int responseCode) {}
   
}

接下来就是根据搜索所得的蓝牙设备地址来连接设备,并与设备通信:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.bluetooth.ServiceRecord;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class MIDlet_ConnDevice extends MIDlet
implements  Runnable, CommandListener {
    private Display display = null;

   
    private Form form = new Form("蓝牙 ");
    //用于输入要发送的消息
    private TextField tfData = new TextField("请输入发送的消息",
            "",255,TextField.ANY);
   
    private Command cmdExit = new Command("退出", Command.EXIT, 0);
    private Command cmdSend = new Command("发送", Command.SCREEN, 1);
    private Command cmdConnect = new Command("连接", Command.SCREEN, 1);
   
    //线程运行标志
    private boolean isRunning = true;
   
    StreamConnection client = null;
    //服务器服务记录
    ServiceRecord record=null;
    private DataInputStream dis = null;
    private DataOutputStream dos = null;
  
    public MIDlet_ConnDevice() {
        super();
        form.append(tfData);
        form.addCommand(cmdExit);
        form.addCommand(cmdConnect);
        form.setCommandListener(this); 
    }
    protected void startApp() throws MIDletStateChangeException {
        display = Display.getDisplay(this);
        display.setCurrent(form);
    }

    protected void pauseApp() {
        isRunning = false;
        close();
    }

    protected void destroyApp(boolean arg0)
        throws MIDletStateChangeException {
        isRunning = false;
        close();
    }
   
    /**
     * 处理命令按钮事件
     */
    public void commandAction(Command cmd, Displayable d) {
        if (cmd == cmdExit) { 
            isRunning = false;
            notifyDestroyed();
        } else if(cmd == cmdSend) {
            //发送数据
            new Thread() {
                public void run() {
                    if (dos == null) {
                        return;
                    }
                    //把输入的字符串变为数字
                        try {  
                                
                            dos.writeUTF(tfData.getString());                    
                            dos.flush();                   
                        } catch (IOException e) {                       
                            form.append("Send error");        
                    }
                }
            }.start();
        } else if (cmd == cmdConnect) {
            //开始服务器线程
            new Thread(this).start();
        }
    }    
   
    /**
     * 客户端接收线程
     */
    public void run() {
        isRunning = true;
        client = null;
        String device_address;//搜索所得的设备地址
        String conURL = "btspp://"+device_address+":1";
        try {
            client = (StreamConnection)Connector.open(conURL);
            form.append("Connected!/n");
            dis = client.openDataInputStream();
            dos = client.openDataOutputStream();
            form.removeCommand(cmdConnect);
            form.addCommand(cmdSend);
        } catch (Exception e) {
                form.append("connect error");
                close();
            return;
        }
        while(isRunning) {
            try {
                        if(dis.available()>1)
                        {
                            byte[] rec_package=new byte[dis.available()];//强烈建议这里使用byte[]
                            dis.read(rec_package);
                            String str=new String(rec_package);
                        }
            }
                catch (Exception e) {
                       form.append("rec error");
                break;
            }
        }
        close();
        form.removeCommand(cmdSend);
        form.addCommand(cmdConnect);
    }
   
    /**
     * 关闭连接
     */
    public void close() {
        try {
            if (dis != null) {
                dis.close();
                dis = null;
            }
           
            if (dos != null) {
                dos.close();
                dos = null;
            }
           
            if (client != null) {
                client.close();
                client = null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值