android实现手机与单片机蓝牙模块通信
本文实例为大家分享了android实现手机与单片机蓝牙模块通信的具体代码,供大家参考,具体内容如下
我是参考原博客的内容去写的,由于原博客写的不全,少了关键的几个类,然后我就凭借自己扎实的功底补出来了,现在蓝牙工作正常,能发能收!在看这边文章之前你要先了解一下蓝牙的工作状态,我的代码里面可能解释的不是很详细,但是我自己是能看懂的!
packagecom.example.fsl.bluetooth;
importandroid.app.Activity;
importandroid.bluetooth.BluetoothAdapter;
importandroid.bluetooth.BluetoothDevice;
importandroid.bluetooth.BluetoothSocket;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.support.v7.widget.Toolbar;
importandroid.util.Log;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.ArrayAdapter;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.ListView;
importandroid.widget.ProgressBar;
importandroid.widget.TextView;
importandroid.widget.Toast;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.UUID;
publicclassMainActivityextendsAppCompatActivity{
privateToolbartoolbar;
privateTextViewstatus;
privateStringBuildermstringbuilder;
privatestaticfinalUUIDMY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//没有用到
BluetoothReceiverreceiver;
BluetoothAdaptermBtAdapter;
BluetoothSocketmBtSocket;
privateBlueToothToolclient;
privateListViewmListView;
privateListListDevice;
privateArrayAdaptermAdapter;
privateButtonmbutton;
privateEditTexteditText;
privateProgressBarprogressBar;
privateLoopProgressBarloopProgressBar;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar=(Toolbar)findViewById(R.id.toolbar);
status=(TextView)findViewById(R.id.textView2);
mListView=(ListView)findViewById(R.id.listView);
mbutton=(Button)findViewById(R.id.button);
editText=(EditText)findViewById(R.id.editText);
progressBar=(ProgressBar)findViewById(R.id.progressBar);
progressBar.setVisibility(View.INVISIBLE);
loopProgressBar=(LoopProgressBar)findViewById(R.id.loop);
ListDevice=newArrayList();
mstringbuilder=newStringBuilder();
setSupportActionBar(toolbar);
enablebluetooth();
mbutton.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
BlueToothTool.WriteTaskW=client.newWriteTask(editText.getText().toString());
W.start();
}
});
mListView.setOnItemClickListener(newAdapterView.OnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView>parent,Viewview,intposition,longid){
mBtAdapter.cancelDiscovery();//停止搜索
progressBar.setVisibility(View.INVISIBLE);
Stringstr=ListDevice.get(position);
StringmacAdress=str.split("\\|")[1];
BluetoothDevicedevice=mBtAdapter.getRemoteDevice(macAdress);
client=newBlueToothTool(device,handler);
try{
client.connect();
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
/**
*开启蓝牙且被发现
*/
privatevoidenablebluetooth(){
mBtAdapter=BluetoothAdapter.getDefaultAdapter();
/**
*if(!mBtAdapter.isEnabled()){这里可以先使能,可以在REQUEST_DISCOVERABLE处使能,这样的话可以连使能和请求被发现一块完成
//mBtAdapter.enable();
IntentenableIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent,REQUEST_ENABLE);
}
else{
show("蓝牙已开启");
}*/
Intentenable=newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
startActivityForResult(enable,REQUEST_DISCOVERABLE);
}
/**
*销毁事件,注销广播
*/
@Override
protectedvoidonDestroy(){
unregisterReceiver(receiver);
super.onDestroy();
}
privatefinalHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseBlueToothTool.CONNECT_FAILED:
show("连接失败");
try{
client.connect();
}catch(Exceptione){
Log.e("TAG",e.toString());
}
break;
caseBlueToothTool.CONNECT_SUCCESS:
show("连接成功");
mListView.setVisibility(View.INVISIBLE);
break;
caseBlueToothTool.READ_FAILED:
show("读取失败");
break;
caseBlueToothTool.WRITE_FAILED:
show("写入失败");
break;
caseBlueToothTool.DATA:
mstringbuilder.append(msg.obj.toString());
show(mstringbuilder.toString());
break;
}
}
};
/**
*请求响应结果
*@paramrequestCode
*@paramresultCode
*@paramdata
*/
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
switch(requestCode){
/**
*caseREQUEST_ENABLE:
if(requestCode!=Activity.RESULT_OK){
show("蓝牙未开启");
}
else
show("蓝牙已开启");
break;*/
caseREQUEST_DISCOVERABLE:
if(resultCode==Activity.RESULT_CANCELED){
show("蓝牙未开启");
}
else
show("蓝牙已开启");
break;
default:
break;
}
}
publicbooleanonCreateOptionsMenu(Menumenu){
getMenuInflater().inflate(R.menu.menu,menu);
returntrue;
}
privatestaticfinalintREQUEST_ENABLE=1;
privatestaticfinalintREQUEST_DISCOVERABLE=2;
/**
*注册广播事件
*/
@Override
publicvoidonResume(){
super.onResume();
IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);
receiver=newBluetoothReceiver();
registerReceiver(receiver,filter);
filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(receiver,filter);
}
/**
*广播
*/
privateclassBluetoothReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
Stringaction=intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)){
BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Stringstr=device.getName()+"|"+device.getAddress();
if(ListDevice.indexOf(str)==-1)//防止重复添加
ListDevice.add(str);//获取设备名称和mac地址
if(mAdapter!=null){
mAdapter.notifyDataSetChanged();
}
showDevices();
}
elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
progressBar.setVisibility(View.INVISIBLE);
show("已停止寻找");
}
}
};
/**
*菜单栏点击事件
*@paramitem
*@return
*/
@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId()){
caseR.id.search:
if(!mBtAdapter.isEnabled()){
show("蓝牙未开启");
}
else{
mBtAdapter.startDiscovery();
show("正在寻找设备");
progressBar.setVisibility(View.VISIBLE);
}
break;
caseR.id.about:
Toast.makeText(MainActivity.this,"关于我们",Toast.LENGTH_SHORT).show();
break;
default:
}
returntrue;
}
privatevoidshowDevices(){
mAdapter=newArrayAdapter(this,android.R.layout.simple_list_item_1,
ListDevice);
mListView.setAdapter(mAdapter);
}
/**
*更新UI方法
*@paramstring
*/
privatevoidshow(finalStringstring){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
status.setText(string);
}
});
}
}
然后我的读任务和写任务以及连接任务是在另一个类里面实现的,也就是BlueToothTool类,这个类一个原博客是没有写的,只是MainActivity中用到了这个类的一些方法,但是没有给出,所以就让一些同学很蛋疼。我看完之后是自己补全的这个类!
packagecom.example.fsl.bluetooth;
importandroid.app.Notification;
importandroid.bluetooth.BluetoothDevice;
importandroid.bluetooth.BluetoothSocket;
importandroid.content.Context;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.support.v4.app.NotificationCompat;
importandroid.util.Log;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.lang.reflect.Method;
importjava.util.logging.LogRecord;
/**
*CreatedbyFslon2017/12/22.
*/
publicclassBlueToothTool{
privateBluetoothDevicedevice;
privateHandlermhandler;
BluetoothSocketsocket;
staticfinalintCONNECT_FAILED=1;
staticfinalintCONNECT_SUCCESS=5;
staticfinalintREAD_FAILED=2;
staticfinalintWRITE_FAILED=3;
staticfinalintDATA=4;
privatebooleanisConnect=false;
publicBlueToothTool(BluetoothDevicedevice,Handlerhandler){
this.device=device;
this.mhandler=handler;
}
/**
*开辟连接线程任务
*/
publicvoidconnect(){
Threadthread=newThread(newRunnable(){
@Override
publicvoidrun(){
BluetoothSockettmp=null;
Methodmethod;
try{
method=device.getClass().getMethod("createRfcommSocket",newClass[]{int.class});
tmp=(BluetoothSocket)method.invoke(device,1);
}catch(Exceptione){
setState(CONNECT_FAILED);
Log.e("TAG",e.toString());
}
socket=tmp;
try{
socket.connect();
isConnect=true;
setState(CONNECT_SUCCESS);
Readtaskreadtask=newReadtask();//连接成功后开启读取数据的线程
readtask.start();
}catch(Exceptione){
setState(CONNECT_FAILED);
Log.e("TAG",e.toString());
}
}
});
newThread(thread).start();
}
/**
*开辟线程读任务
*/
publicclassReadtaskextendsThread{
@Override
publicvoidrun(){
byte[]buffer=newbyte[1024];
intbytes;
InputStreaminputStream;//建立输入流读取数据
while(true){
try{
inputStream=socket.getInputStream();
if((bytes=inputStream.read(buffer))>0){
byte[]buf_data=newbyte[bytes];
for(inti=0;i
以上就是我的蓝牙与单片机连接通信的全过程,顺便说一下,这个连接是自动连接的,不需要什么秘钥什么的,直接搜索到HC-05蓝牙直接就可以确定连接,亲测有效。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。