蓝牙+客户端服务端

本文探讨了蓝牙页面的设置,详细阐述了如何建立服务器与客户端的连接,并介绍了实现多布局页面的技术要点。
摘要由CSDN通过智能技术生成

蓝牙页面

package com.example.work2;

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
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.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.work2.adapter.MyAdapter;
import com.example.work2.bean.ChatBean;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class MainActivity extends AppCompatActivity {

    private RecyclerView rvChat;

    private String[] permissions = {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.BLUETOOTH_ADMIN,
            Manifest.permission.BLUETOOTH
    };
    private List<ChatBean> chat_list = new ArrayList<>();
    private MyAdapter adapter;

    private BluetoothSocket socket;
    private TextView tt;
    private LinearLayout ll;
    private EditText editSend;
    private Button btSend;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 0){
                chat_list.add(new ChatBean("",String.valueOf(msg.obj),0));
                adapter.notifyDataSetChanged();
            }else{
                chat_list.add(new ChatBean(String.valueOf(msg.obj),"",1));
                adapter.notifyDataSetChanged();
            }
        }
    };
    private UUID uuid = UUID.fromString("00001106-0000-1000-8000-00805F9B34FB");//蓝牙通讯规范
    private BluetoothManager manager;
    private BluetoothAdapter tooth_adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        socket = BlueToothActivity.socket;

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

        initView();
//        startThread();
        server();
        initData();
    }

    private void server() {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    BluetoothServerSocket socket = tooth_adapter.listenUsingInsecureRfcommWithServiceRecord(tooth_adapter.getName(), uuid);
                    while(true) {
                        BluetoothSocket accept = socket.accept();

//                    while(true){
                        new MyThread(accept, handler).start();
//                    }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

    private void startThread() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {
                    try {
                        InputStream inputStream = socket.getInputStream();
                        byte[] b = new byte[1024];
                        int read = inputStream.read(b);

                        String text = new String(b, 0, read);

                        Message msg = Message.obtain();
                        msg.what = 1;
                        msg.obj = text;
                        handler.sendMessage(msg);
                        Log.i("---", "server_run: 接收成功" + text);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }

    private void initData() {
        btSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String text = editSend.getText().toString();

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            OutputStream outputStream = socket.getOutputStream();
                            outputStream.write(text.getBytes());
                            Log.i("---", "run: 发送成功!");

                            Message msg = Message.obtain();
                            msg.what = 0;
                            msg.obj = msg;
                            handler.sendMessage(msg);
                            outputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
                editSend.setText("");
            }
        });


    }

    private LinearLayoutManager linearLayoutManager;

    private void initView() {
        rvChat = findViewById(R.id.rv_chat);
        linearLayoutManager = new LinearLayoutManager(this);
        rvChat.setLayoutManager(linearLayoutManager);
        editSend = findViewById(R.id.edit_send);
        btSend = findViewById(R.id.bt_send);


        adapter = new MyAdapter(chat_list, this);
        rvChat.setAdapter(adapter);
        tt = findViewById(R.id.tt);
        ll = findViewById(R.id.ll);

    }

    private class MyThread extends Thread{

        private BluetoothSocket socket;
        private Handler handler;

        public MyThread(BluetoothSocket socket, Handler handler) {
            this.socket = socket;
            this.handler = handler;
        }

        @Override
        public void run() {
            try {
                InputStream inputStream = socket.getInputStream();
                byte[] b = new byte[1024];
                int read = inputStream.read(b);

                String msg = new String(b, 0, read);

                Message obtain = Message.obtain();
                obtain.what = 1;
                obtain.obj = msg;
                handler.sendMessage(obtain);

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

服务器与客户端

package com.example.work2;

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.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

import com.example.work2.adapter.MyAdapter;
import com.example.work2.adapter.MyToothAdapter;

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

public class BlueToothActivity extends AppCompatActivity {

    private String[] permissions = {
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.BLUETOOTH_ADMIN,
            Manifest.permission.BLUETOOTH
    };
    private Button btOpen;
    private Button btClose;
    private Button btDiscovery;
    private Button btBond;
    private ListView lvDiscovery;
    private ListView lvBond;

    //数据眼
    private List<BluetoothDevice> discovery_list = new ArrayList<>();
    private List<BluetoothDevice> bond_list = new ArrayList<>();

    //适配器
    private MyToothAdapter dis_adapter;
    private MyToothAdapter bond_adapter;

    //蓝牙
    private BluetoothAdapter adapter;
    private BluetoothManager manager;

    private MyReceiver myReceiver;

    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_blue_tooth);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissions, 101);
        }
        manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        adapter = manager.getAdapter();
        myReceiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
        registerReceiver(myReceiver,intentFilter);
        //启动蓝牙
        startBroad();
        initView();

        byListener();
        lvListener();
    }

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

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

    private void lvListener() {

        lvBond.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        BluetoothDevice device = bond_list.get(position);
                        try {
                            socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
                            socket.connect();
                            if(socket.isConnected()){
                                Log.i("---", "client_run: 连接成功!");
                                Intent intent = new Intent(BlueToothActivity.this, MainActivity.class);
                                startActivity(intent);
                            }else{
                                Log.i("---", "client_run: 连接失败");
                            }
                        } catch (IOException e) {
                            Log.i("---", "client_run: 连接失败");
                        }
                    }
                }).start();
            }
        });

    }

    private void startBroad() {
        Intent intent = new Intent();
        intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,200);

        startActivityForResult(intent,102);
    }

    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);
        lvDiscovery = findViewById(R.id.lv_discovery);
        lvBond = findViewById(R.id.lv_bond);

        dis_adapter = new MyToothAdapter(discovery_list,this);
        lvDiscovery.setAdapter(dis_adapter);

        bond_adapter = new MyToothAdapter(bond_list,this);
        lvBond.setAdapter(bond_adapter);
    }

    class MyReceiver 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();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
}

多布局页面

package com.example.work2.adapter;

import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.work2.R;

import java.util.List;

public class MyToothAdapter extends BaseAdapter {

    private List<BluetoothDevice> totalList;
    private Context context;
    private LayoutInflater layoutInflater;

    public MyToothAdapter(List<BluetoothDevice> totalList, Context context) {
        this.totalList = totalList;
        this.context = context;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return totalList.size();
    }

    @Override
    public Object getItem(int position) {
        return totalList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Viewholder viewholder = null;
        if (convertView == null) {
            viewholder = new Viewholder();

            convertView = layoutInflater.inflate(R.layout.layout_tooth,null);
            viewholder.textView_tooth = convertView.findViewById(R.id.text_tooth);

            convertView.setTag(viewholder);
        }else{
            viewholder = (Viewholder) convertView.getTag();
        }

        viewholder.textView_tooth.setText(totalList.get(position).getName());

        return convertView;
    }

    class Viewholder{
        TextView textView_tooth;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值