找回密码
 立即注册

使用微信账号登录

只需一步,快速开始

查看: 12585|回复: 25

[经典蓝牙协议栈] Android实现SPP核心代码

[复制链接]

暂无签到数据

发表于 2013-4-30 12:24:14 | 显示全部楼层 |阅读模式

马上注册,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册  

×
本帖最后由 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其实很简单。
楼主热帖
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
连续签到天数:2天
签到总天数:2316天
签到总奖励:64359金币
发表于 2013-10-9 14:11:31 | 显示全部楼层
LZ  有实例吗?能搞一个就好了
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:2天
签到总天数:434天
签到总奖励:8698金币
发表于 2013-10-9 15:28:46 | 显示全部楼层
放个完整工程上来呀,不试试怎么知道
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:3160天
签到总奖励:108117金币
发表于 2013-10-12 09:38:45 | 显示全部楼层
无可以用的代码啊
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:3天
签到总天数:141天
签到总奖励:794金币
发表于 2013-10-17 17:28:12 | 显示全部楼层
这个确实不错啊
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:7天
签到总奖励:26金币
发表于 2013-10-26 13:42:59 | 显示全部楼层
不错,很好的启发。
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:2天
签到总天数:67天
签到总奖励:479金币
发表于 2013-11-12 08:55:39 | 显示全部楼层
好好学习天天向上
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

暂无签到数据

发表于 2013-11-21 22:58:56 | 显示全部楼层
这个要多学习学习
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

暂无签到数据

发表于 2013-11-27 16:48:57 | 显示全部楼层
身上的发生发多少
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

连续签到天数:1天
签到总天数:341天
签到总奖励:7138金币
发表于 2013-12-24 12:16:03 | 显示全部楼层
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
积分商城 - 让您的金币更有价值!||官方Q群 - 让您的沟通更加及时!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

小黑屋|手机版|我爱蓝牙网 - 52Bluetooth

GMT+8, 2024-4-29 06:59 , Processed in 0.319063 second(s), 23 queries , Gzip On, MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表