一,概述

蓝牙是一种短距离的无线通信技术标准。

蓝牙协议分为4层,即核心协议层,电缆替代协议层,电话控制协议层,和      采纳的其它协议层。

这4中协议中最重要的是核心协议。蓝牙的核心协议包括基带,链路管理,逻辑链路控制和适应协议四部分。其中链路管理(LMP)负责蓝牙组件间连接的建立。逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个为高层传输和应用层协议屏蔽基带协议的适配协议。

二,代码打开蓝牙的方式

方式一:

  if(bluetoothAdapter==null || !bluetoothAdapter.isEnabled()){
                    Intent enableBtIntent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(enableBtIntent,1);
                }

第二种方式:

 <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

 BluetoothAdapter bluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
        bluetoothAdapter.enable();
        bluetoothAdapter.disable();

三,通过代码搜索蓝牙设备

1,搜索普通蓝牙设备

//3,扫描附近的设备

                if(bluetoothAdapter.isDiscovering()){
                    bluetoothAdapter.cancelDiscovery();
                }else{
                    //每次扫描之前都先判断一下是否存在已久配对的设备
                    Set<BluetoothDevice> paireDevices=bluetoothAdapter.getBondedDevices();
                    if(paireDevices.size()>0){
                        for(BluetoothDevice device :paireDevices){
                            Map map=new HashMap();
                            map.put("deviceName",device.getName());
                            map.put("deviceAddress",device.getAddress());
                            map.put("bluetooth_status","已配对");

                            deviceList.add(map);

                        }
                        Log.i("之前已经绑定过的设备:",deviceList.toString());
                    }
                    bluetoothAdapter.startDiscovery();//开始搜索

/*监听扫描过程中的变化*/
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action))
            {
                // Get the BluetoothDevice object from the Intent
                // 通过EXTRA_DEVICE附加域来得到一个BluetoothDevice设备
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                // If it's already paired, skip it, because it's been listed already
                // 如果这个设备是不曾配对过的,添加到list列表
                if (device.getBondState() != BluetoothDevice.BOND_BONDED)
                {
                    Message msg=new Message();
                    msg.what=1;
                    Bundle bundle=new Bundle();
                    bundle.putString("deviceName",device.getName());
                    bundle.putString("deviceAddress",device.getAddress());
                    msg.setData(bundle);
                    handler.sendMessage(msg);

                    Map map=new HashMap();
                    map.put("deviceName",device.getName());
                    map.put("deviceAddress",device.getAddress());
                    Log.i("扫描到的新设备:",map.toString());
                    Log.i("加入新设备之后,扫描到的总设备:",deviceList.toString());
                }
                // When discovery is finished, change the Activity title
            }
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action))
            {
                Log.i("扫描结束------扫描到的总设备:",deviceList.toString());
               handler.obtainMessage(0).sendToTarget();
            }
        }
    };

2,搜索BLE设备

 // Device scan callback.
    private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() {
                @Override
                public void onLeScan(final BluetoothDevice device, int rssi,
                                     byte[] scanRecord) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Map map=new HashMap();
                            map.put("deviceName",device.getName());
                            map.put("deviceAddress",device.getAddress());
                            map.put("bluetooth_status","BLE设备");
                            Log.i("扫描到新的BLE设备:",map.toString());
                            deviceList.add(map);
                        }
                    });
                }
            };

    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 10000;
    private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    bluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            bluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            bluetoothAdapter.stopLeScan(mLeScanCallback);
        }

    }

四,如何用蓝牙进行数据传输

通过蓝牙传输数据与Socket类似。在网络中使用Socket和ServerSocket控制客户端和服务端的数据读写。而蓝牙通讯也由客户端和服务端Socket来完成。蓝牙客户端Socket是BluetoothSocket,蓝牙服务端Socket是BluetoothServerSocket。这两个类都在android.bluetooth包中。

无论是BluetoothSocket,还是BluetoothServerSocket,都需要一个UUID来标识,格式如下:

此UUID是一个8-4-4-4-12的字符串。

UUID相当于Socket的端口,而蓝牙地址相当于Socket的IP。

两个蓝牙设备进行连接时,需要使用同一个UUID。一些时候,很多型号的手机(可能是安卓机和水果机)之间使用了不同的程序也可以使用蓝牙进行通讯。表面上看,他们之间几乎不肯能使用同一个UUID。

实际上,UUID和TCP的端口一样,也有一些默认的值。例如,讲蓝牙模拟成串口的服务就使用了一个标准的UUID:00001101-0000-1000-8000-00805F9B34FB.除此之外,还有很多标准的UUID,比如:

信息同步服务:00001104-0000-1000-8000-00805F9B34FB.

文件传输服务:00001106-0000-1000-8000-00805F9B34FB。

PS:附加上写的BLE设备扫描apk:http://download.csdn.net/detail/lhc2207221755/9629293

蓝牙技术(BlueTooth)——(一)的更多相关文章

  1. 安卓蓝牙技术Bluetooth使用流程(Bluetooth详解)

    一:蓝牙设备之间的通讯首要包含了四个进程 设置蓝牙设备 寻觅局域网内也许或许匹配的设备 衔接设备 设备之间的数据传输 二:详细编程完结 1. 发动蓝牙功用 首要经过调用静态办法getDefaultAd ...

  2. Android蓝牙技术Bluetooth使用流程(具体解释)

    一:蓝牙设备之间的通信主要包含了四个步骤 设置蓝牙设备 寻找局域网内可能或者匹配的设备 连接设备 设备之间的传输数据 二:详细编程实现 1. 启动蓝牙功能 首先通过调用静态方法getDefaultAd ...

  3. 蓝牙技术BlueTooth

    转载网址:http://blog.csdn.net/dxdxsmy/article/details/7790568 蓝牙核心架构概念的理解请参考上面的网址.

  4. Android使用BLE(低功耗蓝牙,Bluetooth Low Energy)

    背景 在学习BLE的过程中,积累了一些心得的DEMO,放到Github,形成本文.感兴趣的同学可以下载到源代码. github: https://github.com/vir56k/bluetooth ...

  5. Android 蓝牙技术 实现终端间数据传输

    蓝牙技术在智能硬件方面有很多用武之地,今天我就为大家分享一下蓝牙技术在Android系统下的使用方法技巧.蓝牙是一种短距离的无线通信技术标准,蓝牙协议分为4层,即核心协议层.电缆替代协议层.电话控制协 ...

  6. Android4.42-Settings源代码分析之蓝牙模块Bluetooth总体实现(总)

    本文为博主原创,转载请注明出处:http://blog.csdn.net/zrf1335348191/article/details/50995466 蓝牙相关代码已在另两篇文章中介绍,有须要的能够查 ...

  7. Android4.42-Setting源代码分析之蓝牙模块Bluetooth(下)

    接着上一篇Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上) 继续蓝牙模块源代码的研究 THREE.蓝牙模块功能实现 switch的分析以及本机蓝牙重命名和可见性的分 ...

  8. 蓝牙协议(bluetooth spec)

    1.概述:   蓝牙协议规范遵循开放系统互连参考模型(OSI/RM),从低到高地定义了蓝牙协议堆栈的各个层次. SIG(Session Initiation Protocol)所定义的蓝牙技术规范的目 ...

  9. Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上)

    继上一篇Android系统源代码剖析(一)---Settings 接着来介绍一下设置中某个模块的源代码.本文依然是基于Android4.42源代码进行分析,分析一下蓝牙模块的实现.建议大致看一下关于S ...

  10. BLE——低功耗蓝牙(Bluetooth Low Energy)

    1.简介 以下蓝牙协议特指低功耗蓝牙协议. 蓝牙协议是由SIG制定并维护的通信协议,蓝牙协议栈是蓝牙协议的具体实现. 各厂商都根据蓝牙协议实现了自己的一套函数库——蓝牙协议栈,所以不同厂商的蓝牙协议栈 ...

随机推荐

  1. makefile 编译指定目录

    makefile 编译指定目录 sub1=test1 sub2=test2 subs = sub1 sub2 SUBDIRS =$(foreach i, $(subs), $($(i))) .PHON ...

  2. 使用字面量或者绑定变量在HANA Studio里执行SQL语句

    在SAP note 2000002 – FAQ: SAP HANA SQL Optimization里提到了SQL语句的两种执行方式,具体差异体现在where语句里搜索条件的指定方式上. 所谓Lite ...

  3. 模拟栈的回溯,完全二叉树搜索,(ZOJ1004)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1004 解题报告: ①方法:完全二叉树的搜索方式,回溯法. ②代码 ...

  4. Angular 引用库

    <!doctype html> <html ng-app> <head> <script src="http://code.angularjs.or ...

  5. genil层

    genil 层将底层的业务逻辑封装成一个接口(例如 get_dynamic_result这种),供ui层调用(ui点击 search dynamic result按钮,会调用 get_dynamic_ ...

  6. 【luogu P2984 [USACO10FEB]给巧克力Chocolate Giving】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2984 练习SPFA,把FJ当做起点,求出到所有牛的最短路,再把两个牛的相加. #include <cs ...

  7. android jni 之C语言基础

    *含义 1.乘法 3*5 2.定义指针变量 int * p://定义了一个名字叫p的变量,能够存放int数据类型的地址 3.指针运算符, //如果p是一个已经定义好的指针变量则*p表示以p的内容为地址 ...

  8. EJB 配置多个数据源

    1.修改jboss-6.simple\server\default\deploy\transaction-jboss-beans.xml 配置文件 <bean name="CoreEn ...

  9. python logging—模块

    python logging模块 python logging提供了标准的日志接口,python logging日志分为5个等级: debug(), info(), warning(), error( ...

  10. CSS实战2

    1. 鼠标样式 Cursor: pointer   鼠标变成小手 Cursor: default;   小白 Cursor : move;   移动 Cursor : text ;    文本输入 网 ...