Android学习笔记之蓝牙

来源:互联网 发布:卖家开通淘宝客条件 编辑:程序博客网 时间:2024/06/05 14:24
蓝牙:短距离无线通讯技术标准。蓝牙协议分为4层,即核心协议层、电缆替代协议层、电话控制协议层和其他协议层。其中核心协议层包括基带、链路管理、逻辑链路控制和适应协议四部分。链路管理(LMP)负责蓝牙组件间的建立。逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个高层传输和应用层协议屏蔽基带协议的适配协议。
1>第一种打开蓝牙的方式:
 Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
 startActivityForResult(enableIntent,1);
2>第二种打开蓝牙方式(静默)
权限配置:<uses-permission android:name=”android.permission.BLUETOOTH”/>
  <uses-permission android:name=”android.permission.BLUETOOTH_ADMIN”/>
  BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    adapter.enable();//打开
  adapter.disable();//关闭
3>通过代码搜索蓝牙

蓝牙数据传输:与Socket类似,网络中使用Socket和ServerSocket控制客户端和服务端,蓝牙通讯客户端为BluetoothSocket,服务端为BluetoothServerSocket。二者需要一个UUID(全局唯一标示符),格式如下:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,被分为5段,其中3段字符数相同,都为4,第1段是8字符,最后一段12字符,UUID相当于Socket的端口,而蓝牙地址相当于Socket的IP。

一>搜索蓝牙设备

import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.Window;import android.widget.TextView;import java.util.Set;public class MainActivity extends AppCompatActivity {    private BluetoothAdapter bluetoothAdapter;    private TextView tvDevices;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);        setContentView(R.layout.activity_main);        tvDevices = (TextView) findViewById(R.id.tvDevices);        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();        Set<BluetoothDevice> paireDevices = bluetoothAdapter.getBondedDevices();        if (paireDevices.size()>0){            for (BluetoothDevice devices:paireDevices){                tvDevices.append(devices.getName()+":"+devices.getAddress());            }        }        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);//找到一个设备,发送一个广播        this.registerReceiver(receiver,filter);        filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//整个搜索完后发送广播        this.registerReceiver(receiver,filter);    }    public void onClick_Search(View view){        setProgressBarIndeterminateVisibility(true);        setTitle("正在扫描...");        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);                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {                    tvDevices.append(device.getName() + ":" + device.getAddress() + "\n");                }            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {                setProgressBarVisibility(false);                setTitle("搜索完成");            }        }    };}

真机测试效果图:


二>通过搜索,将搜到的设备连接并实现传输数据

import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothServerSocket;import android.bluetooth.BluetoothSocket;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.Window;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import java.util.Set;import java.util.UUID;public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {    private BluetoothAdapter bluetoothAdapter;//蓝牙适配器    private ListView lvDevices;//显示蓝牙搜索控件    private List<String> bluetoothDevices = new ArrayList<String>();//存储搜索到的所有蓝牙设备    private ArrayAdapter<String> arrayAdapter;    private final UUID MY_UUID = UUID.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");//手动输入UUID码    private final String NAME = "Bluetooth_Socket";    private BluetoothSocket clientSocket;//服务端    private BluetoothDevice device;    private OutputStream os;    private AcceptThread acceptThread;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);        setContentView(R.layout.activity_main);        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//初始化        lvDevices = (ListView) findViewById(R.id.lvDevices); //显示配对的蓝牙信息        Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();        if (pairedDevices.size() > 0) {            for (BluetoothDevice device : pairedDevices) {                bluetoothDevices.add(device.getName() + ":" + device.getAddress() + "\n");            }        }        //显示设备在列表上        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,                android.R.id.text1, bluetoothDevices);        lvDevices.setAdapter(arrayAdapter);        lvDevices.setOnItemClickListener(this);        acceptThread = new AcceptThread();        acceptThread.start();    }    public void onClick_Search(View view) {        setProgressBarIndeterminateVisibility(true);        setTitle("正在扫描...");        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);                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {                    bluetoothDevices.add(device.getName()+":"+device.getAddress()+"\n");                    arrayAdapter.notifyDataSetChanged();//                    tvDevices.append(device.getName() + ":" + device.getAddress() + "\n");                }            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {                setProgressBarIndeterminateVisibility(false);                setTitle("连接蓝牙设备");            }        }    };    /*    * 客户端设置    * 单击事件    * */    @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        String s = arrayAdapter.getItem(position);        String address = s.substring(s.indexOf(":") + 1).trim();//获取蓝牙IP        try {            if (bluetoothAdapter.isDiscovering()) {                bluetoothAdapter.cancelDiscovery();//若当前蓝牙被使用,则关闭重新启用            }            try {                if (device == null) {//若未连接,则获得远程设备                    device = bluetoothAdapter.getRemoteDevice(address);                }                if (clientSocket == null) {                    clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID);                    clientSocket.connect();//连接蓝牙                    os = clientSocket.getOutputStream();//客户端向服务端输出文本                }            } catch (IOException e) {                e.printStackTrace();            }            if (os != null) {                os.write("发送信息到其他设备".getBytes("utf-8"));            }        } catch (Exception e) {            e.printStackTrace();        }    }/** 服务端设置* 设置一个Handler,用来显示* */    private android.os.Handler handler = new android.os.Handler() {        public void handleMessage(Message msg) {            Toast.makeText(MainActivity.this, String.valueOf(msg.obj), Toast.LENGTH_LONG).show();            super.handleMessage(msg);        }    };//线程类    private class AcceptThread extends Thread {        private BluetoothServerSocket serverSocket;        private BluetoothSocket socket;        private InputStream is;        private OutputStream os;        public AcceptThread() {            try {                serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);            } catch (IOException e) {                e.printStackTrace();            }        }        public void run() {            try {                socket = serverSocket.accept();                is = socket.getInputStream();                os = socket.getOutputStream();                while (true) {                    byte[] buffer = new byte[128];                    int count = is.read(buffer);                    Message msg = new Message();                    msg.obj = new String(buffer, 0, count, "utf-8");                    handler.sendMessage(msg);                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}

真机测试效果图:



0 0
原创粉丝点击