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; privateArrayAdapter mAdapter; 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蓝牙直接就可以确定连接,亲测有效。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。