• 讲解了打开蓝牙设备和搜索蓝牙设备,这篇文章来讲解蓝牙配对和蓝牙连接 1.蓝牙配对 搜索到蓝牙设备后,将设备信息填充到listview中,点击listiew则请求配对 蓝牙配对有点击配对和自动配对,点击配对就是我们...

    上篇文章:https://blog.csdn.net/huangliniqng/article/details/82185983

    讲解了打开蓝牙设备和搜索蓝牙设备,这篇文章来讲解蓝牙配对和蓝牙连接

    1.蓝牙配对

       搜索到蓝牙设备后,将设备信息填充到listview中,点击listiew则请求配对

      蓝牙配对有点击配对和自动配对,点击配对就是我们选择设备两个手机弹出配对确认框,点击确认后配对

      自动配对就是搜索到蓝牙设备后自动配对不需要输入pin码,但在基本开发中都不采用这种方式,所以这里说的是第一种配对方式

      点击配对,调用

    BluetoothDevice.class.getMethod
    

    进行配对,代码如下:

    Method method = BluetoothDevice.class.getMethod("createBond");
    Log.e(getPackageName(), "开始配对");
    method.invoke(listdevice.get(position));

    invoke传的参数就是要配对的设备(我这里是存在list中所以从list中取)

    点击之后怎会弹出配对确认框,且必须被配对的手机也点击确认配对才可以配对成功如图:

    同样的,如果我们想要配对的设备取消配对

    只需要将creatBond改为removeBond

    2.蓝牙连接:

      配对成功之后,就可以进行蓝牙连接了,蓝牙连接操作比较耗时,可以在一个线程中进行:

    调用自己定义的

    connect(listdevice.get(position));

    同样传递的参数也是设备device

    首先声明蓝牙套接字:

    private BluetoothSocket mBluetoothSocket;
    mBluetoothSocket = bluetoothDevice.createRfcommSocketToServiceRecord(BltContant.SPP_UUID);

    BltContant.SPP_UUID是一个UUID常量,至于UUID是什么,大家可以自行百度,因为详细的文章已经很多了。

    连接的时候要先判断蓝牙是否在扫描,如果在扫描就停止扫描,并且没有连接才进行连接,代码如下:

    if (bluetoothadapter.isDiscovering()) {
        bluetoothadapter.cancelDiscovery();
    }
    if (!mBluetoothSocket.isConnected()) {
        mBluetoothSocket.connect();
    }

    比如我们让其连接成功后,跳转到消息通讯界面,界面中有edittext输入框并显示当前连接的设备名称如图所示:

    在这里我们需要注意的是,当连接成功时,我们要让被连接的那部手机也自动跳转到聊天页面,所以我们要开启蓝牙服务端等待设备的连接,当设备连接时,自动跳转页面,蓝牙服务端代码如下:

    /**
     * 开启服务端
     */
    public void startBluService() {
    
        while (true) {
            try {
                if (getBluetoothServerSocket() == null){
                    Log.e("在这里获取的为空","在这里获取的为空");
                }
                bluetoothSocket = getBluetoothServerSocket().accept();
                if (bluetoothSocket != null) {
                    APP.bluetoothSocket = bluetoothSocket;
                    EventBus.getDefault().post(new BluRxBean(SERVER_ACCEPT, bluetoothSocket.getRemoteDevice()));
                    //如果你的蓝牙设备只是一对一的连接,则执行以下代码
                    getBluetoothServerSocket().close();
                    //如果你的蓝牙设备是一对多的,则应该调用break;跳出循环
                    //break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    服务端运行也在一个线程中,一直处于等待状态直到有设备连接进来。

    下篇文章 蓝牙通信:https://blog.csdn.net/huangliniqng/article/details/82189735

     

    欢迎关注技术公众号,微信号搜索ColorfulCode 代码男人

    分享技术文章,投稿分享,不限技术种类,不限技术深度,让更多人因为分享而受益。

     

    展开全文
  • 看了很多的博客文章,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧。 首先要知道几个类,...

    看了很多的博客文章的技术,今天也写一写自己的第一篇博客文章,我只说说如何用,具体实现的原理,原谅我不太清楚,但对于大多数人来说,知道怎么做出来就很不错了哈哈!不多说了,开始吧。


    首先要知道几个类,BluetoothAdapter,BluetoothGatt,BluetoothDevice,BluetoothCattService,BluetoothCattCharacteristic。

    第一个是蓝牙设配器,对蓝牙的操作都需要用到它,很重要,BluetoothGatt作为中央来使用和处理数据,使用时有一个回调方法BluetoothGattCallback返回中央的状态和周边提供的数据,BluetoothCattService作为周边来提供数据;BluetoothGattServerCallback返回周边的状态。BluetoothDevice是蓝牙设备,BluetoothCattCharacteristic是蓝牙设备的特征。


    看着有点乱,我们来打个比喻:BluetoothDevice为学校,BluetoothGatt为学校到达某一个班级的通道,BluetoothCattService为学校的某一个班级,BluetoothCattCharacteristic为班级中的某一个学生。那么蓝牙连接通信的过程就是这样,BluetoothAdapter先找到学校(就是连接目的设备),再通过通道找到目标班级,最后从班级中找到目标学生,这个学生就是我们设备之间通信的中介,很重要,学校有唯一的MAC地址,班级有唯一的serviceUUID,学生有唯一的charactersticUUID(相当于学号),所以就是在一所学校找一个学生的问题,好了,应该了解了吧。


    下面正是开始

    1.加上蓝牙访问权限


    2.打开蓝牙,两种方式,一种是询问式,一种是自动式,你百度一下就有很多,很简单,这里就不多说。


    3.搜索周边的蓝牙设备

    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

    adapter.startDiscovery();//此过程会发送广播信息,我们在BroadcastReceiver中去接收即可



     我这里把能搜索到的设备保存在list列表中,名字也保存在一个列表中,然后再UI界面上的listView中显示出来,就可以看到搜索到了几个蓝牙设备,名字各是什么


    4.获取目的设备的MAC地址,因为我们已经搜索到很多设备,所以直接mac = device.getAddress().toString()即获取到设备的MAC地址


    5.既然找到了地址,那就可以开始连接了,注意一点,连接的时候一定要先关闭上面的搜索蓝牙功能,直接adapter.cancelDiscovery就可以了

    知道了MAC地址,那就可以获取到该MAC地址对应的蓝牙设备mDevice = adapter.getRemoteDevice(mac),这个mDevice就是我们的学校,

    学校有了,那就要找到通道,bluetoothGatt = mDevice.connectGatt(this,false,new BluetoothGattCallback() ),bluetoothGatt就是通道,BluetoothGattCallback()是回调类,里面有很多方法,寻找班级和学生就在它的方法里面去实现。

    里面有几个比较重要的方法,分别是onConnectionStateChange(),onServiceDiscovered(),onCharacteristicRead(),onCharacteristicChanged(),几个方法之间是独立的,同时又有联系的,过程是这样,连接通道时最先触发的是onConnectionStateChange()方法,在该方法里面启动服务发现后会触发onConnectionStateChange(),此方就是寻找班级和学生的重点方法,在通道通过UUID找到班级,在班级通过UUID找到学生,每个设备有多个班级UUID,每个班级对应多个学生UUID,所以你可以先打印出来这些信息,获取有用的班级UUID和学生UUID,找到了学生,就可以发出通知了,即把学生通知出去,上面说了学生只是一个通信的中介,此时会触发onCharacteristicChanged()方法,在该方法里面就可以获取到设备那边传过来的数据包了,另外onCharacteristicRead()方法被触发的前提是要在onServiceDiscovered()里面执行readCharacteristic()方法,然后就可以在onCharacteristicRead()里面做自己想要的操作了,整个过程就是这样,下面给出这个过程的完整代码:




    蓝牙连接通信有两种形式,一种是通过socket的形式,另一种就是我这篇文章写的通过MAC地址来实现的,对于数据包的解析就靠你们自己了,这个需要蓝牙协议的,每个协议都不同,解析的过程也不同,在这里无法讲,主要是对数据包的结构要熟悉,这样的话就基本不成问题了。

    好了,第一篇博客就写这么多,谢谢你们的阅读吐舌头

    展开全文
  • android 蓝牙

    Android简单的蓝牙配对与连接

    需要注意的是蓝牙配对不等于连接,这是两个不同的操作,连接是在配对成功的基础上进行的!

    蓝牙搜索

    通过

    BluetoothAdapter.getDefaultAdapter()
    

    获取BluetoothAdapter对象,然后通过

    bluetoothAdapter.startDiscovery()
    

    搜索周围的蓝牙设备

    取消搜索

    bluetoothAdapter.cancelDiscovery()
    

    蓝牙的搜索结果是通过广播进行返回的,所以我们需要注册广播。主要是下面这两个:

    BluetoothDevice.ACTION_FOUND(搜索,搜到一个设备就会发这个广播)
    BluetoothAdapter.ACTION_DISCOVERY_FINISHED(搜索完成时的广播)
    

    搜索完蓝牙后就要进行关键的配对了

    蓝牙配对

    这里有个版本问题,在aip小于19的版本是没有配对方法可供调用的我们这能通过反射的方式配对

    public boolean createBond(Class btClass, BluetoothDevice btDevice)
            throws Exception {
        Method createBondMethod = btClass.getMethod("createBond");
        Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);
        return returnValue.booleanValue();
    }
    

    api高于19的版本就很简单了

    device.createBond();用这个方法直接搞定
    

    蓝牙的配对状态也是通过广播的方式进行通知的,我们需要注册下面这个广播

    BluetoothDevice.ACTION_BOND_STATE_CHANGED
    

    分别有几种状态

    BluetoothDevice.BOND_BONDING//正在配对
    BluetoothDevice.BOND_NONE//配对取消
    BluetoothDevice.BOND_BONDED//配对成功 
    

    如果要取消配对只能通过反射的方式取消

    public boolean cancelBondProcess(ClassbtClass,BluetoothDevice device)
    throws Exception{
        Method createBondMethod = btClass.getMethod("cancelBondProcess");
        Boolean returnValue = (Boolean) createBondMethod.invoke(device);
        return returnValue.booleanValue();
    }
    

    蓝牙连接

    直接一个方法

    final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";
    private void connect(BluetoothDevice btDev) {  
        UUID uuid = UUID.fromString(SPP_UUID);  
        try {  
            BluetoothSocket socket = dev.createRfcommSocketToServiceRecord(uuid); 
            socket.connect();  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }
    

    完了后要把socket关闭

    基本的配对与连接差不多就这样了。

    展开全文
  • Android 蓝牙连接

    2019-05-01 18:09:08
    最多可以同时和7个其它蓝牙设备建立连接,进行通信。蓝牙可分为两大类:传统蓝牙蓝牙3.0规范之前),低功耗蓝牙蓝牙4.0规范之后)。 Android 从4.3版本(API Level 18)开始支持低功耗蓝牙Bluetooth Low Energy...

    一、概述

    蓝牙是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换。最多可以同时和7个其它蓝牙设备建立连接,进行通信。蓝牙可分为两大类:传统蓝牙(蓝牙3.0规范之前),低功耗蓝牙(蓝牙4.0规范之后)。

    Android 从4.3版本(API Level 18)开始支持低功耗蓝牙Bluetooth Low Energy(BLE)通信。Android提供了相应的 API, 应用程序通过这些 API 可以实现 蓝牙设备扫描、配对、连接、传输数据等功能。

    二、Android BLE API几个重要类

    1、BluetoothAdapter

    本地的蓝牙适配器。是所有蓝牙交互操作的入口点。通过这个类可以发现其他蓝牙设备,查询已配对的设备列表,使用一个已知的MAC地址来实例化一个BluetoothDevice,以及创建一个BluetoothServerSocket来为监听与其他设备的通信。

    2、BluetoothDevice

    远程蓝牙设备。使用这个类来请求一个与远程设备的BluetoothSocket连接,或者查询关于设备名称、地址、类和连接状态等设备信息。

    3、BluetoothSocket

    代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过InputStream和OutputStream交换数据。

    4、BluetoothServerSocket

    代表一个开放的服务器socket,它监听接受的请求(与TCP ServerSocket类似)。为了连接两台Android设备,一个设备必须使用这个类开启一个服务器socket。当一个远程蓝牙设备开始一个和该设备的连接请求,BluetoothServerSocket将会返回一个已连接的BluetoothSocket,接受该连接。

    三、蓝牙开发

    1、流程

    2、开启权限

    <uses-permission android:name="android.permission.BLUETOOTH"/> 
    //开启蓝牙时,mBluetoothAdapter.enable()需要以下权限
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

    3、开启蓝牙

    public void isBluetoothEnable() {
            //获取蓝牙适配器
    	mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    	if (mBluetoothAdapter != null){
    		// 蓝牙已打开
    		if (mBluetoothAdapter.isEnabled()){			
    		}else{//未打开则开启,此处可以通过弹框提示来提示用户开启
                mBluetoothAdapter.enable()
            }
        }	
    }

    4、搜索附近蓝牙设备

    /**
     * 注册搜索蓝牙设备的广播
     */
    private void startDiscovery() {
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(receiver, filter);
        IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(receiver, filter1);
        startScanBluetooth();
    }
    
    private void startScanBluetooth() {
        // 判断是否在搜索,如果在搜索,就取消搜索
        if (bluetoothAdapter.isDiscovering()) {
            bluetoothAdapter.cancelDiscovery();
        }
        // 开始搜索
        bluetoothAdapter.startDiscovery();
    }
    
    /**
     * 蓝牙广播接收
     */
    private final BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
        public void onReceive(Context context, Intent intent) {
    
           String action = intent.getAction();
           if (BluetoothDevice.ACTION_FOUND.equals(action)) {
               BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    
               //蓝牙rssi参数,代表蓝牙强度
               short rssi = intent.getExtras().getShort(BluetoothDevice.EXTRA_RSSI);
               //蓝牙设备名称
               String name = device.getName();
               //蓝牙设备连接状态
               int status = device.getBondState();
               ...
            } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
               ...
            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
               Toast.makeText(context, "蓝牙设备搜索完成", Toast.LENGTH_SHORT).show();
            }
        }
    };

    关于蓝牙连接状态:

    BluetoothDevice.BOND_BONDED:已配对

    BluetoothDevice.BOND_BONDING:配对中

    BluetoothDevice.BOND_NONE:未配对或取消配对

    关于蓝牙强度rssi:

    单位是dbm,蓝牙信号的强度RSSI = 10*log P,P代表接收到的信号功率。蓝牙会发送广播,距离大小会影响信号功率强弱。假设发射功率取最大值为1mw,那么RSSI的值为0,也就是说你的距离离蓝牙最近时在理想状态下所获取的RSSI的值为0,但在实际中基本不会存在这个理想状态,因此RSSI的值基本都为负数。

    一般说来,在BLE中,假设信号强度按强、中、弱、差4个等级划分,rssi范围依次是:-60 ~ 0 、-70 ~ -60、-80 ~ -70、<-80。

    5、配对

    //获取已配对设备信息
    public List<BluetoothDevice> getPairedBluetoothDevices() {
    	List deviceList = new ArrayList<>();
    	Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    	if (pairedDevices.size() > 0) {
    		for (BluetoothDevice device : pairedDevices) {
    			deviceList.add(device);
    		}
    	}
    	return deviceList;
    }
    //若已配对设备数为0,跳转到手机系统蓝牙设置界面
    Intent enableBtIntent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
    mContext.startActivity(enableBtIntent);
    //手动配对,完成配对后重新扫描即可
    Method method = BluetoothDevice.class.getMethod("createBond");
    method.invoke(itemlist.get(position).getDevice());
    

    6、连接

    蓝牙连接需要在子线程中完成

    public class BluetoothConnectThread extends Thread {
    
        private static final UUID BluetoothUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        BluetoothSocket bluetoothSocket;
        BluetoothDevice bluetoothDevice;
    
        private boolean connected = false;
        private Object lock = new Object();
    
        //蓝牙连接回调接口
        private BluetoothConnectCallback connectCallback;
    
        public BluetoothConnectThread(BluetoothDevice device,
                                      BluetoothConnectCallback callback) {
            try {
                bluetoothDevice = device;
                bluetoothSocket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(BluetoothUUID);
                connectCallback = callback;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            if (bluetoothSocket != null) {
                if (connected) {
                    cancel2();
                    connected = false;
                }
            }
    
            new Thread() {
                @Override
                public void run() {
                    connect();
                    if (connected) {
                        if (connectCallback != null){
                            connectCallback.connectSuccess(bluetoothSocket);
                        }
                    }
                }
            }.start();
    
        }
    
        public void connect() {
            try {
                synchronized (lock) {
                    bluetoothSocket.connect();
                    connected = true;
                }
            } catch (Exception connectException) {
                connectException.printStackTrace();
                cancel();
                try {
                    Method m;
                    m = bluetoothDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
                    bluetoothSocket = (BluetoothSocket) m.invoke(bluetoothDevice, Integer.valueOf(1));
                    bluetoothSocket.connect();
                    connected = true;
                } catch (Exception ex) {
                    ex.printStackTrace();
                    if (connectCallback != null){
                        connectCallback.connectFailed(ex.getMessage());
                    }
                }
            }
        }
    
        public void cancel() {
            try {
                synchronized (lock) {
                    if (connected) {
                        bluetoothSocket.close();
                        connected = false;
                    }
                }
            } catch (IOException e) {
            }
        }
    
        public void cancel2() {
            try {
                synchronized (lock) {
                    bluetoothSocket.close();
                    connected = false;
                }
            } catch (IOException e) {
            }
        }
    
    }
    public interface BluetoothConnectCallback {
    
        void connectSuccess(BluetoothSocket socket);
    
        void connectFailed(String errorMsg);
    
        void connectCancel();
    }

    注意以上,BluetoothUUID一般为固定的,connect()放在子线程中可以提高连接成功率(不明所以),注意connect失败需要通过反射createRfcommSocket该方法完成,自验目前连接成功率较高。

    7、传输数据

    //获取BluetoothSocket输出流
    OutputStream outputStream = bluesocket.getOutputStream();
    //之后将数据写入输出流完成传输
    outputStream.write(data);
    outputStream.flush();

     

    展开全文
  • 2.手表选择蓝牙调试,手机连接上电脑 配置adb环境变量: 先找到adb.exe路径 我的是:C:\Users\Android_pan\AppData\Local\Android\Sdk\platform-tools 复制后打开环境变量配置 (此电脑 -> 属性 -> ...

    准备:

    1.确保手机和手表都已打开开发者模式

    2.手表选择蓝牙调试手机连接上电脑

     

    配置adb环境变量:

    先找到adb.exe路径

    我的是:C:\Users\Android_pan\AppData\Local\Android\Sdk\platform-tools

    复制后打开环境变量配置

    (此电脑 -> 属性 -> 高级系统设置 -> 环境变量)

    PATH后面添加

    ;C:\Users\Android_pan\AppData\Local\Android\Sdk\platform-tools\

    注意这里前面加了一个分号,后面加了一个斜杠

    点击保存。

     

    Cmd运行:

    adb forward tcp:4444 localabstract:/adb-hub

    adb connect localhost:4444

    执行情况:

    此时再看WearOS App界面(右图为cmd命令执行后)

    此时Android Studio点击运行:

    点击OK,install完成后就能在安卓手表上看到App了(主题类App直接在主题更换列表找)

     

    可是每次都要复制粘贴两次命令,有没有更简易的方式呢?

     

    配置为.sh:

    (前提:1.安装了Git;2.手机已连接至电脑)

    先创建新的文本文件,将cmd指令输入并保存(文件名任意)

    保存后修改文件后缀名为.sh

    以后再调试就不用复制粘贴命令行代码了,直接双击执行就ok了。(执行结束后会自动关闭窗口)

    展开全文
  • android端通过蓝牙地址获得蓝牙设备对象,实现android设备的蓝牙配对、连接与接收数据
  • 本程序能实时监听并检测Android蓝牙连接状态,无论是通过界面上的switch按钮打开/关闭手机蓝牙,还是手动打开/关闭手机蓝牙,程序都能监听当前的状态。 一、软件界面二、程序实现(源码下载)①switch开关—-打开/...
  • android 获取蓝牙连接状态
  • Android 自动连接蓝牙

    2018-12-20 14:29:30
    其中BLE的连接断开等操作可以通过Android SDK中提供的API进行操作,而传统蓝牙部分SDK并没有提供相关的API进行连接断开,只能用户自己通过手机的设置界面连接蓝牙。 那么我们如何做到在代码中自动连接传统蓝牙呢?...
  • android 蓝牙连接通信

    2019-12-02 15:56:50
    2. 准备开发蓝牙,就需要Android对动态权限的处理(这里大家自己解决) 3. 保证动态权限OK,往下执行,需要了解一下蓝牙的知识信息(这里大家可以官网google一下,也可以百度野区撩一眼),现在对蓝牙硬件的开发...
  • 上一篇文章介绍了“蓝牙扫描”,今天来说一下android蓝牙连接过程中133的问题: 我们经常在网上看到一些答案说需要释放gatt资源,这种方式可以在一定程度上减少出现133的概率。个人发现的一个规律是:一般出现蓝牙...
  • 最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结。 在做android蓝牙串口连接的时候一般会使用 BluetoothSocket tmp = null; // ...
  • 前言 讲讲android对于蓝牙耳机连接技术的实现 ...2. 新建广播BluetoothReceiver,用于监听处理蓝牙连接过程中各状态 3. 在MainActivity中调用 4. 注意的点 5. 项目结构图和效果图 下面做以讲解 ...
  • android 低功耗BLE蓝牙连接示例代码
  • 最近开始接触Android蓝牙设备问题,严格意义上来说,也算是第二次接触蓝牙机制了,之前对于蓝牙设备的整个过程,也不是太了解,只是接触了一些自己需要的部分。而这次应该算是比较深入的了解了蓝牙机制的部分吧,...
  • 刚开始也遇到很多133,各种断开连接的问题.android蓝牙搜索有两种方式,一种startLeScan,另一种startDiscovery.因为项目要讲究搜索蓝牙的速度,一开始我一直用的startDiscovery,,但是这个搜索的速度有的手机太慢了,有的...
  • 通过系统广播监听蓝牙设备的连接状态,当蓝牙搜索发现设备时提示对应的蓝牙设备已发现,当蓝牙设备连接或断开显示蓝牙设备连接或断开。
  • 开发功能:Android蓝牙连接A2DP设备,蓝牙耳机设备 功能实现: 本应用提供以下功能: 第一:开启蓝牙 第二:查找过滤掉A2DP设备 第三:连接A2DP设备 第四:断开连接A2DP设备 第五:保存通过本应用连接的A2DP设备 ...
  • 环境:电脑操作系统win7,手机android系统 以手机向win7电脑传输图片为例 1、双击蓝牙按钮,如下图: 2、添加设备   3、打开android手机的蓝牙以及设备可见性,设置-》无限与网络-》蓝牙,设置-》无限与...
  • Android 开发进阶课程蓝牙通信  本教程介绍了Android 蓝牙通信的原理及具体实现,其中包括:客户端服务器结构和对等结构。然后介绍了基于Socket实现的蓝牙通信,以及基于蓝牙实现对等结构网络通讯。我们还...
1 2 3 4 5 ... 20
收藏数 22,544
精华内容 9,017