Android蓝牙通讯/蓝牙聊天的实现(二)_含demo下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/laozhuxinlu/article/details/73457613

Android蓝牙通讯/蓝牙聊天之聊天通讯的实现


    本系列的文章主要介绍Android设备基于蓝牙通讯实现实时聊天,文章系列主要包括两个部分:android蓝牙的基本操作,Android蓝牙的聊天实现。


     本博客资源免费下载:

蓝牙工具:http://download.csdn.net/detail/laozhuxinlu/9870880

蓝牙畅聊:http://download.csdn.net/detail/laozhuxinlu/9870878


    首先来看看聊天效果:


    通讯聊天实现的这一块的基础是实现设备的连接,就这一快可参见Android蓝牙通讯/蓝牙聊天之基本操作的实现的实现。

    聊天的实现首先我们要有一个概念,就是master设备和salve设备的概念,角色的不同,具体的实现也是不同的。

首先我们来看一下Master的客户端建立:

//建立客户端

    private class clientThread extends Thread {
        @Override
        public void run() {
            try {
                //创建一个Socket连接:只需要服务器在注册时的UUID号
                socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
                //连接
                Message msg1 = new Message();
                msg1.obj = "请稍候,正在连接服务器:";
                msg1.what = 1;
                LinkDetectedHandler.sendMessage(msg1);

                socket.connect();

                Message msg2 = new Message();
                msg2.obj = "已连接";
//	                + BluetoothMsg.BlueToothAddress;
                msg2.what = 1;
                LinkDetectedHandler.sendMessage(msg2);

                Message msg = new Message();
                msg.obj = "已经连接上服务端!可以发送信息。";
                msg.what = 1;
                LinkDetectedHandler.sendMessage(msg);
                //开启定时器
                new Thread(new ThreadShow1()).start();
                //启动接受数据
                mreadThread = new readThread();
                mreadThread.start();
//	                sendMessageHandle("对方已上线");
//	                //close InputMethodManager
//	                InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
//	                imm.hideSoftInputFromWindow(message.getWindowToken(), 0);
            }
            catch (IOException e)
            {
                Log.e("connect", "", e);
                Message msg = new Message();
                msg.obj = "连接服务端异常!断开连接重新试一试。";
                msg.what = 1;
                LinkDetectedHandler.sendMessage(msg);

                Message msg1 = new Message();
                msg1.obj = "服务器建立失败,请确认服务器已建立后重建客户端";
                msg1.what = 1;
                LinkDetectedHandler.sendMessage(msg1);
            }
        }
    };

Master的客户端建立是有一个前提的,这个前提是salve端的服务器必须要建立完毕:

//建立服务器
    private class ServerThread extends Thread {
        @Override
        public void run() {

            try {
	                /* 创建一个蓝牙服务器
	                 * 参数分别:服务器名称、UUID   */
                mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("Clay_Server",
                        UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

                Log.i("server", "wait cilent connect...");

                Message msg1 = new Message();
                msg1.obj = "请稍候,正在等待客户端的连接...";
                msg1.what = 1;
                LinkDetectedHandler.sendMessage(msg1);

                Message msg3 = new Message();
                msg3.obj = "通讯已建立,请建立客户端";
                msg3.what = 5;
                LinkDetectedHandler.sendMessage(msg3);

	                /* 接受客户端的连接请求 */

                socket = mserverSocket.accept();
                Log.i("server", "accept success !");

                Message msg2 = new Message();
                String info2 = "已连接";
                msg2.obj = info2;
                msg2.what = 1;
                LinkDetectedHandler.sendMessage(msg2);

                Message msg = new Message();
                String info = "客户端已经连接上!可以发送信息。";
                msg.obj = info;
                msg.what = 1;
                LinkDetectedHandler.sendMessage(msg);
                //开启定时器
                new Thread(new ThreadShow1()).start();
                //启动接受数据
                mreadThread = new readThread();
                mreadThread.start();
            } catch (IOException e) {
                Message msg = new Message();
                msg.obj = "客户端连接异常!断开连接重新试一试。";
                msg.what = 1;
                LinkDetectedHandler.sendMessage(msg);

                Message msg3 = new Message();
                msg3.obj = "通讯建立失败,请重建服务器";
                msg3.what = 5;
                LinkDetectedHandler.sendMessage(msg3);

                e.printStackTrace();
            }
        }
    };

在这个基础上,便能实现客户端和服务器的连接实现,完成了连接对接,下面就是数据发送的实现了:


发送数据的实现:

//发送数据
    private void sendMessageHandle(String msg)
    {
        if (socket == null)
        {
            Toast.makeText(MasterChat2.this, "没有连接", Toast.LENGTH_SHORT).show();
            return;
        }
        try {
            OutputStream os = socket.getOutputStream();
            os.write(msg.getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
        if(msg.equals("100101100001")){
            msgList.add("正在呼叫对方……");
            mAdapter.notifyDataSetChanged();
            mListView.setSelection(msgList.size() - 1);

        }else
        if(msg.equals("010111001010")){
            msgList.add("已重建");
            mAdapter.notifyDataSetChanged();
            mListView.setSelection(msgList.size() - 1);
        }else
        {
            msgList.add("我:"+msg);
            mAdapter.notifyDataSetChanged();
            mListView.setSelection(msgList.size() - 1);
        }
    }

接收读取数据的实现//读取数据
  
//读取数据
    private class readThread extends Thread {
        @Override
        public void run() {

            byte[] buffer = new byte[1024];
            int bytes;
            InputStream mmInStream = null;

            try {
                mmInStream = socket.getInputStream();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            while (true) {
                try {
                    // Read from the InputStream
                    if( (bytes = mmInStream.read(buffer)) > 0 )
                    {
                        byte[] buf_data = new byte[bytes];
                        for(int i=0; i<bytes; i++)
                        {
                            buf_data[i] = buffer[i];
                        }
                        String s = new String(buf_data);
                        if(s.equals("100101100001")){
                            Message msg = new Message();
                            String info = "对方正在呼叫您……";
                            msg.obj = info;
                            msg.what = 0;
                            LinkDetectedHandler.sendMessage(msg);
                            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
                            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
                            r.play();
                        }else
                        if(s.equals("010111001010")){

                            shutdownClient();
                            Message msg = new Message();
                            msg.obj = "已断开";
                            msg.what = 2;
                            LinkDetectedHandler.sendMessage(msg);

                            //关闭定时器(终结其他线程的方法)实现错误
//		        	                new Thread(new ThreadShow1()).stop();

                        }else
                        if(s.equals("101011001001")){
                            Message msg1 = new Message();
                            msg1.obj = "服务器已退出,请先建立服务器";
                            msg1.what = 5;
                            LinkDetectedHandler.sendMessage(msg1);

                            //关闭定时器
//			        	                new Thread(new ThreadShow1()).stop();

                        }else
                        {
//	                        	notifi(s);    //在状态栏点击有bug
                            Message msg = new Message();
                            msg.obj = "他:"+s;
                            msg.what = 0;
                            LinkDetectedHandler.sendMessage(msg);

                            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                            Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
                            r.play();
                        }

                    }
                } catch (IOException e) {
                    try {
                        mmInStream.close();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    break;
                }
            }
        }
    };

当然,过程中如果想实现设备的notification的实现,可参加以下方式:

//notification
    private void notifi(String s){

        // 创建一个启动其他Activity的Intent
        Intent intent = new Intent(this
                , MasterChat2.class);
        PendingIntent pi = PendingIntent.getActivity(
                this, 0, intent, 0);
        Notification notify = new Notification.Builder(this)
                // 设置打开该通知,该通知自动消失
                .setAutoCancel(true)
                // 设置显示在状态栏的通知提示信息
                .setTicker("有新消息")
                // 设置通知的图标
                .setSmallIcon(R.drawable.lovechat)
                // 设置通知内容的标题
                .setContentTitle("一条新通知")
                // 设置通知内容
                .setContentText(s)
                // // 设置使用系统默认的声音、默认LED灯
//				 .setDefaults(Notification.DEFAULT_SOUND
//				 |Notification.DEFAULT_LIGHTS)
                // 设置通知的自定义声音
                .setSound(Uri.parse("android.resource://org.crazyit.ui/"
                        + R.raw.msg))
                .setWhen(System.currentTimeMillis())
                // 设改通知将要启动程序的Intent
                .setContentIntent(pi)
                .build();
        // 发送通知
        nm.notify(NOTIFICATION_ID1, notify);
    }

   基于以上的方式,便可实现设备间简单的通讯聊天了。相对网络通讯而言,更加稳定快速。





猜你喜欢

转载自blog.csdn.net/laozhuxinlu/article/details/73457613