goldenwater 发表于 2013-4-30 12:24:14

Android实现SPP核心代码

本帖最后由 goldenwater 于 2013-4-30 12:40 编辑

    Android使用的是bluez开源蓝牙协议栈,bluez是C的,通过JNI(JAVA的Native调用),把底层C接口封装为JAVA接口。所以,android蓝牙开发即可以使用android SDK提供的java的API接口,也可以直接native调用bluez底层的C接口或者android封装的非sdk的java接口。但后者有一个风险,就是android不同版本使用的bluez版本不同,封装的接口也不同,造成版本的适配性很差。所以,最好是基于android的sdk提供的api开发。
    android的sdk基于RFCOMM封装了bluetoothsocket,使得对rfcomm的访问比较简单,和tcp的socket类似。

    下面简单介绍下Android实现SPP主、从机的主要代码。
    可以同时实现SPP主从机,当然需要不同的线程,因为有的方法是阻塞的。

1、实现SPP的服务端,即SPP主机。实现后,处于SPP的监听状态,等待从机连接。
    连接后,就可以值机使用inputstream和outputstream进行数据传输了。
private class SppServer extends Thread {//监听方法是阻塞方法,所以需要单独线程
    public SppServer() {
            try {
                btServerSocket = btAdapt.listenUsingRfcommWithServiceRecord("SPP", spp_uuid);
                         //SPP_UUID="00001101-0000-1000-8000-00805F9B34FB"
      } catch (IOException e) {
                        e.printStackTrace();
                }
      }

      public void run() {
                btAdapt.cancelDiscovery();//退出搜索
                try {
                        bs = btServerSocket.accept();//BluetoothSocket bs = null; 此方法为阻塞方法,有连接进来后返回。
                        synchronized (Spp.this) {
                              if (sppConnected) return;      //如果已经连接,则返回。
                              btIn = bs.getInputStream();          //InputStream btIn;
                              btOut = bs.getOutputStream();          //OutputStream btOut;
                              ....//此时SPP已经连接,可以通过btout/btin收发消息了。      
                              }
                        } catch (IOException e) {
                              // TODO Auto-generated catch block
                              e.printStackTrace();
                        }
      }

      public void cancel() {
      //退出时的操作
      }

2、实现SPP从机。
    相对简单,就是发起连接即可。
   public void sppConnect(){
            if (btAdapt.isDiscovering()) {
                  btAdapt.cancelDiscovery();
            };
            try {
                btSocket = btAdapt.getRemoteDevice(sCurdev)
                                        .createRfcommSocketToServiceRecord(spp_uuid);
                btSocket.connect();
                synchronized (Spp.this) {
                        if(btServerSocket!=null) btServerSocket.close();//关闭之前可能保持的socket
                        btIn = btSocket.getInputStream();
                        btOut = btSocket.getOutputStream();
                        .......//需另起一个线程接收消息,同样因为阻塞。
                        }
                } catch (IOException e) {
                // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e1) {
                              // TODO Auto-generated catch block
                              e1.printStackTrace();
                        }
                }
    }

    大家可以发现,确切来说,android实现SPP实际上绝大部分工作是底层完成的。在RFCOMM启动SPP监听时,底层的SDP服务注册、端口协商等在SPP Profile中定义的动作,android已经替我们完成了。所以,android实现SPP其实很简单。

mupro 发表于 2013-10-9 14:11:31

LZ有实例吗?能搞一个就好了

dengxindieying 发表于 2013-10-9 15:28:46

放个完整工程上来呀,不试试怎么知道

tyro_2003 发表于 2013-10-12 09:38:45

无可以用的代码啊

dvtsh 发表于 2013-10-17 17:28:12

这个确实不错啊

whljsh 发表于 2013-10-26 13:42:59

不错,很好的启发。

dragon20100708 发表于 2013-11-12 08:55:39

好好学习天天向上

cnc2020 发表于 2013-11-21 22:58:56

这个要多学习学习:)

时子 发表于 2013-11-27 16:48:57

身上的发生发多少

hangkzhou 发表于 2013-12-24 12:16:03

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
页: [1] 2 3
查看完整版本: Android实现SPP核心代码