• 我是参考原博客的内容去写的,由于原博客写的不全,少了关键的几个类,然后我就凭借自己扎实的功底补出来了,现在蓝牙工作正常,能发能收!在看这边文章之前你要先了解一下蓝牙的工作状态,我的代码里面可能解释的...

            我是参考原博客的内容去写的,由于原博客写的不全,少了关键的几个类,然后我就凭借自己扎实的功底补出来了,现在蓝牙工作正常,能发能收!在看这边文章之前你要先了解一下蓝牙的工作状态,我的代码里面可能解释的不是很详细,但是我自己是能看懂的!

    package com.example.fsl.bluetooth;
    
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
    
    public class MainActivity extends AppCompatActivity {
        private Toolbar toolbar;
        private TextView status;
       private StringBuilder mstringbuilder;
        private static final UUID MY_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//没有用到
        BluetoothReceiver receiver;
        BluetoothAdapter mBtAdapter;
        BluetoothSocket mBtSocket;
        private  BlueToothTool client;
        private ListView mListView;
        private List<String> ListDevice;
        private ArrayAdapter<String> mAdapter;
        private Button mbutton;
        private EditText editText;
        private ProgressBar progressBar;
        private LoopProgressBar loopProgressBar;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            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=new ArrayList<String>();
            mstringbuilder=new StringBuilder();
            setSupportActionBar(toolbar);
            enablebluetooth();
            mbutton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   BlueToothTool.WriteTask W=client.new WriteTask(editText.getText().toString());
                   W.start();
                }
            });
            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    mBtAdapter.cancelDiscovery();//停止搜索
                    progressBar.setVisibility(View.INVISIBLE);
                    String str = ListDevice.get(position);
                    String macAdress = str.split("\\|")[1];
                    BluetoothDevice device = mBtAdapter.getRemoteDevice(macAdress);
                    client=new BlueToothTool(device,handler);
                    try{
                        client.connect();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }
    
        /**
         *开启蓝牙且被发现
         */
       private void enablebluetooth(){
            mBtAdapter=BluetoothAdapter.getDefaultAdapter();
           /*if(!mBtAdapter.isEnabled()){这里可以先使能,可以在REQUEST_DISCOVERABLE处使能,这样的话可以连使能和请求被发现一块完成
              // mBtAdapter.enable();
               Intent enableIntent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
               startActivityForResult(enableIntent,REQUEST_ENABLE);
           }
           else {
               show("蓝牙已开启");
           }*/
               Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
               enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
               startActivityForResult(enable, REQUEST_DISCOVERABLE);
       }
    
        /**
         * 销毁事件,注销广播
         */
       @Override
       protected void onDestroy() {
           unregisterReceiver(receiver);
           super.onDestroy();
       }
        private final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case BlueToothTool.CONNECT_FAILED:
                       show("连接失败");
                        try {
                            client.connect();
                        } catch (Exception e) {
                            Log.e("TAG", e.toString());
                        }
                        break;
                    case BlueToothTool.CONNECT_SUCCESS:
                        show("连接成功");
                        mListView.setVisibility(View.INVISIBLE);
                        break;
                    case BlueToothTool.READ_FAILED:
                        show("读取失败");
                        break;
                    case BlueToothTool.WRITE_FAILED:
                       show("写入失败");
                        break;
                    case BlueToothTool.DATA:
                        mstringbuilder.append(msg.obj.toString());
                       show(mstringbuilder.toString());
                        break;
                }
            }
        };
        /**
         * 请求响应结果
         * @param requestCode
         * @param resultCode
         * @param data
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
           switch (requestCode){
              /* case REQUEST_ENABLE:
                   if(requestCode!= Activity.RESULT_OK){
                     show("蓝牙未开启");
                   }
                   else
                       show("蓝牙已开启");
                   break;*/
               case REQUEST_DISCOVERABLE:
                   if(resultCode==Activity.RESULT_CANCELED){
                       show("蓝牙未开启");
                   }
                   else
                       show("蓝牙已开启");
                    break;
                   default:
                       break;
           }
        }
        public boolean onCreateOptionsMenu(Menu menu){
            getMenuInflater().inflate(R.menu.menu,menu);
            return true;
        }
       private static final int REQUEST_ENABLE=1;
        private static final int REQUEST_DISCOVERABLE=2;
    
        /**
         * 注册广播事件
         */
        @Override
        public void onResume(){
            super.onResume();
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            receiver = new BluetoothReceiver();
            registerReceiver(receiver, filter);
            filter=new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
            registerReceiver(receiver,filter);
        }
    
        /**
         * 广播
         */
        private class BluetoothReceiver extends BroadcastReceiver {
             @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    String str = device.getName() + "|" + device.getAddress();
                    if (ListDevice.indexOf(str) == -1)// 防止重复添加
                        ListDevice.add(str); // 获取设备名称和mac地址
                    if (mAdapter != null) {
                        mAdapter.notifyDataSetChanged();
                    }
                    showDevices();
                }
                else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
                    progressBar.setVisibility(View.INVISIBLE);
                    show("已停止寻找");
                }
    
            }
        };
        /**
         * 菜单栏点击事件
         * @param item
         * @return
         */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){
                case R.id.search:
                    if(!mBtAdapter.isEnabled()){
                        show("蓝牙未开启");
                    }
                    else {
                        mBtAdapter.startDiscovery();
                        show("正在寻找设备");
                        progressBar.setVisibility(View.VISIBLE);
                    }
                    break;
                case R.id.about:
                    Toast.makeText(MainActivity.this,"关于我们",Toast.LENGTH_SHORT).show();
                    break;
                    default:
            }
            return true;
        }
        private void showDevices() {
            mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
                    ListDevice);
            mListView.setAdapter(mAdapter);
        }
        /**
         * 更新UI方法
         * @param string
         */
        private void show(final String string){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    status.setText(string);
                }
            });
        }
    }
    
    然后我的读任务和写任务以及连接任务是在另一个类里面实现的,也就是BlueToothTool类,这个类一个原博客是没有写的,只是MainActivity中用到了这个类的一些方法,但是没有给出,所以就让一些同学很蛋疼。我看完之后是自己补全的这个类!

    package com.example.fsl.bluetooth;
    
    import android.app.Notification;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.Context;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v4.app.NotificationCompat;
    import android.util.Log;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.lang.reflect.Method;
    
    import java.util.logging.LogRecord;
    
    /**
     * Created by Fsl on 2017/12/22.
     */
    
    public class BlueToothTool {
        private BluetoothDevice device;
        private Handler mhandler;
        BluetoothSocket socket;
        static final int CONNECT_FAILED=1;
        static final int CONNECT_SUCCESS=5;
        static final int READ_FAILED=2;
        static final int WRITE_FAILED=3;
        static final int DATA=4;
        private boolean isConnect=false;
    
        public BlueToothTool(BluetoothDevice device,Handler handler){
            this.device=device;
            this.mhandler=handler;
        }
       /**
       *开辟连接线程任务
       */
        public void connect(){
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    BluetoothSocket tmp = null;
                    Method method;
                    try {
                        method = device.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
                        tmp = (BluetoothSocket) method.invoke(device, 1);
                    } catch (Exception e) {
                        setState(CONNECT_FAILED);
                        Log.e("TAG", e.toString());
                    }
                    socket = tmp;
                    try {
                        socket.connect();
                        isConnect = true;
                        setState(CONNECT_SUCCESS);
                        Readtask  readtask = new Readtask();  //连接成功后开启读取数据的线程
                        readtask.start();
                    } catch (Exception e) {
                        setState(CONNECT_FAILED);
                        Log.e("TAG", e.toString());
                    }
                }
                });
                new Thread(thread).start();
            }
    		/**
    		*开辟线程读任务
    		*/
            public class Readtask extends Thread{
            @Override
                public void run(){
                byte[] buffer = new byte[1024];
                int bytes;
                InputStream inputStream ;   //建立输入流读取数据
                while (true) {
                    try {
                         inputStream = socket.getInputStream();
                         if ((bytes = inputStream.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);
                              Message msg = mhandler.obtainMessage();
                              msg.what = DATA;
                              msg.obj = s;
                              mhandler.sendMessage(msg);
                         }
                    } catch (IOException e) {
                        setState(READ_FAILED);
                        Log.e("TAG", e.toString());
                        break;
                    }
                }
    
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        Log.e("TAG", e.toString());
                    }
                }
              }
            }
    		/**
    		*开辟线程写任务
    		*/
            public  class WriteTask extends Thread{
                private String srt;
                public  WriteTask(String str){
                this.srt=str;
                }
                @Override
                public void run(){
                  OutputStream outputStream=null;
                  byte[] st=srt.getBytes();
                  try{
                     outputStream=socket.getOutputStream();
                     outputStream.write(st);
                     }catch (Exception e){
                      setState(WRITE_FAILED);
                      e.printStackTrace();
                  }
                }
    
            }
    
        
        private void setState(int mes){
             Message message=new Message();
             message.what=mes;
             mhandler.sendMessage(message);
    
        }
    	/**
    	*下面这个方法目前还没有用到
    	*/
        private byte[] getHexBytes(String message) {
            int len = message.length() / 2;
            char[] chars = message.toCharArray();
            String[] hexStr = new String[len];
            byte[] bytes = new byte[len];
            for (int i = 0, j = 0; j < len; i += 2, j++) {
                hexStr[j] = "" + chars[i] + chars[i + 1];
                bytes[j] = (byte) Integer.parseInt(hexStr[j], 16);
            }
            return bytes;
        }
    
    }
    
            以上就是我的蓝牙与单片机连接通信的全过程,顺便说一下,这个连接是自动连接的,不需要什么秘钥什么的,直接搜索到HC-05蓝牙直接就可以确定连接,亲测有效。我这个程序自己写了两遍,第一遍的时候由于我的硬盘坏了,结果修了一个星期大费周折都没有修好,4年的东西全都没有了,当然也包括这个项目,在这里提醒一下大家,在工作的时候要有备份重要数据的习惯!!真他妈日了狗了!最终当然选择坦然面对啊,一切从头开始,硬盘坏之后,我那几天的感觉就是——我两手空空,除了我的脑子,关于一切记忆都没有了,只剩下我的脑子了,20多年来的同学照片,视频,家人照片,和女朋友的记忆,我做的课题与项目,所有的一切都没有了,只剩下我的脑子能回忆了!相当惨!

        最后我又把自己之前做到一半的项目凭借仅有的记忆重新写了一遍!很惨!




    展开全文
  • ·简介:由于业务关系,需要开发一个向单片机发送数据的应用,不过由于需求很简单,只  需要发送数据即可,所以该dome的功能只有发送数据功能,并没有对输入的数据  做进一步的处理 这里有蓝牙开发的基本...
  • 51单片机蓝牙模块的串口51单片机蓝牙模块的串口通信C程序通信C程序
  • 51单片机蓝牙模块连接 2018-02-22 12:17:38
    不久前开始学习使用蓝牙模块,在模块与51单片机连接的过程中出现了非常多的问题,我想应该也是很多新手我一样会遇到这样的问题,因此特地写这篇文章,想分享下在学习过程中遇到的问题以及解决方法。此次学习用到...
  • HC-05蓝牙串口通信模块应该是使用最广泛的一种蓝牙模块之一了。为什么呢? 因为HC05模块是一款高性能主从一体蓝牙串口模块,可以不用知道太多蓝牙相关知识就可以很好的上手。说白了,只是个蓝牙转串口的设备,你...
  • 使用蓝牙模块也有段时间了,更新…… 现在市面上用的蓝牙芯片大部分是ble的了,也就是低功耗透传模式。最近用到蓝牙SOC(片上系统),大家分享下。 我们平时用蓝牙,一般是单片机的串口与蓝牙的串口连接,实现...
  • 蓝牙模块怎么与stm32单片机通信,可以通过蓝牙模块发送数据给单片机
  • 3、单片机TxD RxD+蓝牙模块RxD TxD与手机蓝牙 只能收不能发 电路查了又查,单片机和app的程序改了又改,在第三点里连最简单的一个字符都收不到,前面两点进行长字符串传输毫无问题。现在求大神给个思路。 补充一下...
  • HC05 蓝牙模块单片机 2017-05-27 08:34:24
    请问HC05 蓝牙模块怎么 让手机与单片机通信 程序要怎写 蓝牙模块要怎么设置
  • 这次期末的课程设计做了一个智能灯光控制系统,系统整体的功能不在此赘述,系统主要是要实现下位机同上位机的通信,上位机选用的是Android手机端,下位机是52单片机,通过蓝牙模块实现通信。虽然系统很简单,但还是...
  • 蓝牙模块:BT08(兼容HC-06、HC-05) 参考代码:这里 说明 该App功能为通过蓝牙接收单片机采集的温度传感器数据,同时可以通过蓝牙发送预设温度数据给单片机 蓝牙通信代码仿照参考代码进行编写,不再提供...
  • 基于CC2541蓝牙模块单片机的串口通信,包括 APP与源码、PCB封装、串口调试助手工具等
  • 打算利用蓝牙芯片HC06实现手机和单片机之间的简单通信。工具包括淘宝上淘的stc单片机实验板一块,hc-06蓝牙模块一个,杜邦线,win7电脑一部,安卓手机一部,相关软件:单片机小精灵,串口通讯助手,keil以及单片机...
  • STC89C52通过HC-06蓝牙模块与Android手机通信   如需转载请标明出处:http://blog.csdn.net/itas109  QQ技术交流群:129518033  2017-11-04补充 注意问题: 1.确保上位机波特率为9600 2.确保下位机的波特...
  • 首先将HC-06蓝牙通信模块单片机串口通过杜邦线连接,接线如图所示:RX-P30 TX-P31tips:淘宝购买HC06模块的时候,卖家表示蓝牙模块的TX,RX端的丝印搞反了,所以如果你发现蓝牙模块无法和单片机通信的话,可以尝试...
  •  手机端打开编写的蓝牙通信软件,与单片机蓝牙串口模块连接,而后,手机通过蓝牙发送读数据命令到单片机单片机开始读取传感器信息,将采集到得传感器信息通过蓝牙发送到手机端,手机端软件接收到后,显示。...
  • 系列博文: (1)安卓手机与蓝牙模块联合调试(一)——蓝牙模块的串口...本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机通过蓝牙与单片机通信-发送指令/接收数据​​​​​​​ 忙里偷闲,承接上一篇文...
  • 最近自己在做一个项目,用到了STC15F2K08S2这一型号的单片机和JDY-10蓝牙模块,并用它们进行了串行通信,今天就在这里向大家介绍一下串行通信方法。 硬件部分 首先,是STC15F2K08S2单片机的引脚图: 我用的是P...
  • 项目中使用到了蓝牙模块,但是很多时候我们是从别人手里购买核心模块,然后进行二次开发使用,究竟如何使用核心模块,在所给资料甚少的情况下,还真的要费一番功夫去研究如何使用开发哦。这两天正好做完超声波后,要...
  • 两个蓝牙模块通信,首先是要让两个蓝牙模块进入命令响应工作模式即五下面说说的AT模式(EN接上USB转TTL的VCC或者3.3V,再长按蓝牙模块上的那个键,上电,红灯一秒钟闪一下即进入了AT模式) ...
1 2 3 4 5 ... 20
收藏数 1,915
精华内容 766