蓝牙结合适配器

本文详细介绍了一种基于Android平台的蓝牙通信实现方案,包括客户端和服务端的建立、设备发现、配对及数据传输过程。通过示例代码展示了如何使用BluetoothAdapter进行设备搜索、连接以及数据收发,适用于移动开发和嵌入式设备间的数据交互。

客户端

package com.example.day1107_re_bluetooth;

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.day1107_re_bluetooth.adapter.MyAdapter;
import com.example.day1107_re_bluetooth.listener.MyListener;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "---";

    private Button btOpen;
    private Button btClose;
    private Button btDiscovery;
    private Button btBond;
    private RecyclerView rvDiscovery;
    private RecyclerView rvBond;

    private String[] permission = {
            Manifest.permission.BLUETOOTH,
            Manifest.permission.BLUETOOTH_ADMIN,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };
    //适配器
    private MyAdapter dis_adapter;
    private MyAdapter bond_adapter;
    //数据源
    private List<BluetoothDevice> discovery_list = new ArrayList<>();
    private List<BluetoothDevice> bond_list = new ArrayList<>();

    public static BluetoothAdapter adapter;
    public static BluetoothManager manager;
    //蓝牙通讯规范
    private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");

    //
    public static BluetoothSocket socket;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            requestPermissions(permission,100);
        }
        manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        adapter = manager.getAdapter();

        MyBroadCast myBroadCast = new MyBroadCast();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BluetoothDevice.ACTION_FOUND);

        registerReceiver(myBroadCast,intentFilter);
        initView();
    }

    private void initView() {
        btOpen = findViewById(R.id.bt_open);
        btClose = findViewById(R.id.bt_close);
        btDiscovery = findViewById(R.id.bt_discovery);
        btBond = findViewById(R.id.bt_bond);
        rvDiscovery = findViewById(R.id.rv_discovery);
        rvBond = findViewById(R.id.rv_bond);

        rvDiscovery.setLayoutManager(new LinearLayoutManager(this));
        rvBond.setLayoutManager(new LinearLayoutManager(this));

        dis_adapter = new MyAdapter(discovery_list,this);
        bond_adapter = new MyAdapter(bond_list,this);
        rvBond.setAdapter(bond_adapter);
        rvDiscovery.setAdapter(dis_adapter);

        buttonListener();
        myClickListener();
    }

    private void myClickListener() {
        bond_adapter.MyAdapter(new MyListener() {
            @Override
            public void onItemClick(int position) {
                BluetoothDevice device = bond_list.get(position);
                try {
                    socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
                    socket.connect();
                    if(socket.isConnected()){
                        Toast.makeText(MainActivity.this, "连接成功!", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(MainActivity.this, ClientActivity.class);
                        startActivity(intent);
                    }else{
                        Toast.makeText(MainActivity.this, "连接失败!", Toast.LENGTH_SHORT).show();
                    }
                } catch (IOException e) {
                    Log.i(TAG, "onItemClick: 连接失败");
                }
            }
        });
    }

    private void buttonListener() {
        btOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        btDiscovery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                discovery_list.clear();
                adapter.startDiscovery();
            }
        });

        btBond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices();
                bond_list.addAll(bondedDevices);
                bond_adapter.notifyDataSetChanged();
            }
        });
    }

    class MyBroadCast extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                discovery_list.add(device);
                dis_adapter.notifyDataSetChanged();
            }
        }
    }
}

发送页面
package com.example.day1107_re_bluetooth;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

public class ClientActivity extends AppCompatActivity {

    private EditText editSend;
    private Button buttonSend;
    private Button buttonImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client);

        initView();

        buttonListener();
    }

    private void buttonListener() {
        buttonSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String text = editSend.getText().toString().trim();

                try {
                    OutputStream outputStream = MainActivity.socket.getOutputStream();
                    outputStream.write(text.getBytes());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        buttonImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ClientActivity.this, "我执行了", Toast.LENGTH_SHORT).show();
               new Thread(new Runnable() {
                   @Override
                   public void run() {
                       try {
                           FileInputStream fileInputStream = new FileInputStream("/sdcard/youyou.jpg");
                           OutputStream outputStream = MainActivity.socket.getOutputStream();
                           int len = 0;
                           byte[] b = new byte[1024];
                           while((len = fileInputStream.read(b)) != -1){
                               outputStream.write(b, 0, len);
                               Log.i("---", "onClick: "+len);
                           }
                           fileInputStream.close();
                           outputStream.close();
                           Log.i("---", "runs: 发送成功");
                       } catch (Exception e) {
                           e.printStackTrace();
                       }
                   }
               }).start();
            }
        });
    }

    private void initView() {
        editSend = findViewById(R.id.edit_send);
        buttonSend = findViewById(R.id.button_send);
        buttonImage = findViewById(R.id.button_image);
    }
}

服务端

package com.example.day1107_re_bluetooth;

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

public class ServerActivity extends AppCompatActivity {
    private TextView tvServer;
    private BluetoothManager manager;
    private BluetoothAdapter adapter;

    private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");//蓝牙通讯规范

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                tvServer.setText(msg.obj.toString());
            }
        }
    };

    String[] permissions = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_server);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            requestPermissions(permissions,101);
        }

        initView();

        manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        adapter = manager.getAdapter();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    BluetoothServerSocket socket = adapter.listenUsingInsecureRfcommWithServiceRecord(adapter.getName(), uuid);
                    while (true) {
                        BluetoothSocket accept = socket.accept();
                        new MyImageThread(accept,handler).start();
//                        new MyJsonThread(accept, handler).start();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

    private void initView() {
        tvServer = findViewById(R.id.tv_server);
    }

    private class MyImageThread extends Thread {
        private BluetoothSocket accept;
        private Handler handler;

        public MyImageThread(BluetoothSocket accept, Handler handler) {
            this.accept = accept;
            this.handler = handler;
        }

        @Override
        public void run() {
            byte[] b = new byte[1024];
            int len = 0;
            try {
                FileOutputStream fileOutputStream = new FileOutputStream("/sdcard/xxx.png");
                InputStream inputStream = accept.getInputStream();
                int available = inputStream.available();
                Log.i("---", "run: "+available);
                while ((len = inputStream.read(b)) != -1) {
                    fileOutputStream.write(b, 0, len);
                    Log.i("---", "run: "+len);
                }
                fileOutputStream.close();
                inputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    private class MyJsonThread extends Thread {
        private BluetoothSocket accept;
        private Handler handler;

        public MyJsonThread(BluetoothSocket accept, Handler handler) {
            this.accept = accept;
            this.handler = handler;
        }

        @Override
        public void run() {
            try {
                byte[] b = new byte[1024];
                InputStream inputStream = accept.getInputStream();
                int read = inputStream.read(b);
                String message = new String(b, 0, read);
                Log.i("yy", "run: "+message);
                Message msg = Message.obtain();
                msg.what = 0;
                msg.obj = message;

                handler.sendMessage(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值