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

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





更多相关文章

  1. 测试Android真机访问电脑主机web项目服务器的问题
  2. Android通过蓝牙获取通讯录
  3. 使用AndServer在Android上搭建Web服务器
  4. Android与PC蓝牙交互
  5. Ubuntu12 64位 阿里云服务器端配置mysql+tomcat+jdk(java web环
  6. 如何在Android设备中创建Web服务器(用于远程访问)
  7. android BluetoothAdapter蓝牙BLE扫描总结
  8. Android(Java)简单发送和接收服务器 - 快速安装挑战
  9. 【边做项目边学Android】手机安全卫士04_02:从服务器下载并安装新

随机推荐

  1. Android intent action大全
  2. mono for android
  3. LottieAnimationView 使用无法显示效果
  4. android单稿
  5. android 配置
  6. Maven uploadArchives命令报错:Could not
  7. Android 蓝牙开发常用UUID表
  8. android 布局 ListView中的列表 Relative
  9. android XML shape 使用
  10. Android BLE ERROR CODE