最近正在做一个蓝牙传输的应用,其实对于蓝牙的要求很简单,和一般用socket做echo system的感觉差不多,不过自己怎么编都玩不转。分两部分,客户端和服务器,客户端为了省电,一律只听不搜,搜索和connect的活儿都是服务器做的,为了满足客户端和服务器都是多个且异步的要求,在传输的基础上应用了多线程,下面是我的大致流程:client                server
开始监听
                      开始发现
                      发现的所有设备保存到一个ArrayList里
                      发现开始10秒后取消发现
                      对ArrayList里的每个设备尝试验证UUID和connect
                      
(新线程)            (新线程)          
accept到设备          connect成功
获取相应socket        获取相应socket
发送数据              接收数据
等待0.5秒             处理数据
接收数据              发送数据
关闭socket            关闭socket
(结束新线程)        (结束新线程)我的问题出现在服务器处理完数据后的送回数据失败,用是抛出IOException,客户端也抛。这还没做多个测试,还只是一对一呢就传不明白了,请明白的兄弟帮一把,我查了不少介绍蓝牙编程的网页了,也都是说说用法讲讲理论,这种实际出的问题根本没什么帮助……

解决方案 »

  1.   

    感觉好难啊,你是用java写的?
      

  2.   

    这个是服务器在connect成功后开启的线程,在里面分别进行接收、等待处理和发送,由于接收发送进程都是block的,说不好万一连不上了卡成了僵尸进程,所以用join(int)方法来对这两个线程进行限时。在接收后通过Log可以看到已经有东西传过来了,可是想再发出去就会在发送的进程中,getOutputStream()的时候报出IOException。难道是在接收线程结束的时候socket也被自动关闭了?大牛们继续帮帮忙~
    private class ConnectTimeOut extends Thread{
    private BluetoothSocket oneSocket;
    private BluetoothDevice oneDevice;
    private int id;

    public ConnectTimeOut(BluetoothSocket oneSocket){
    this.oneSocket = oneSocket;
    this.id = (int)Thread.currentThread().getId();
    Log.i(TAG, Thread.currentThread().getName()+" started");
    }

    @Override
    public void run() {
    ReceiveOne receiveOne = new ReceiveOne(oneSocket, id);
    try {//receive section with time out 1 second
    receiveOne.start();
    receiveOne.join(1000);
    } catch (InterruptedException e) {
    Log.i(TAG, "receive time out");
    }
    if(receiveOne.isAlive()){
    receiveOne.interrupt();
    this.interrupt();
    }
    //process shopping list
    try {
    sleep(300);
    } catch (InterruptedException e1) {
    e1.printStackTrace();
    }

    for(Message oneProduct:shoppingChoiceList){
    Log.i(TAG, "processed one product: "+oneProduct.obj);
    }

    TransmitOne transmitOne = new TransmitOne(oneSocket, id);
    try {//transmit section with time out 1 second
    transmitOne.start();
    transmitOne.join(1000);
    } catch (InterruptedException e) {
    Log.i(TAG, "transmit time out");
    }
    if(transmitOne.isAlive()){
    transmitOne.interrupt();
    }
    }
    }
      

  3.   

    如果怀疑socket被关闭,在TransmitOne transmitOne = new TransmitOne(oneSocket, id);就检查有没有new成功。至于
                try {//transmit section with time out 1 second
                    transmitOne.start();
                    transmitOne.join(1000);
                } catch (InterruptedException e) {
                    Log.i(TAG, "transmit time out");
                }
    不清楚你的IOException具体点是什么Exception,这段代码究竟是做什么。
      

  4.   

    Android的蓝牙没玩过,J2ME玩过一次,出现的问题,真机测试,数据传输完蓝牙不关闭,连接会自动断开,还没解决