单片机蓝牙与android_android与单片机蓝牙通讯 - CSDN
精华内容
参与话题
  • android开发之手机与单片机蓝牙模块通信

    千次阅读 多人点赞 2018-04-19 11:19:57
    我是参考原博客的内容去写的,由于原博客写的不全,少了关键的几个类,然后我就凭借自己扎实的功底补出来了,现在蓝牙工作正常,能发能收!在看这边文章之前你要先了解...import android.app.Activity; import andr...

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

    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多年来的同学照片,视频,家人照片,和女朋友的记忆,我做的课题与项目,所有的一切都没有了,只剩下我的脑子能回忆了!相当惨!

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




    展开全文
  • android手机接收并波形图显示单片机通过蓝牙传输的传感器数据
  • 最近辛辛苦苦的终于把落下了七八个月的Android蓝牙开发搞完了,其中的痛苦不堪回首啊。感谢那些帮了大忙的老师和同学们!辛苦归辛苦,收获总是有的,...而单片机上的蓝牙模块手机蓝牙连接有点不同,它的UUID号需要

           本文来自CSDN博客,转载请标明出处http://blog.csdn.net/xiluoduyu/

           最近辛辛苦苦的终于把落下了七八个月的Android蓝牙开发搞完了,其中的痛苦不堪回首啊。感谢那些帮了大忙的老师和同学们!辛苦归辛苦,收获总是有的,因而在此总结一下关键所在,以勉励自己!

           网上说的好多的Android蓝牙开发多是基于同类设备之间的通讯,大多需要建立一个服务端和客户端,客户端连接服务器需要服务端的UUID号。而单片机上的蓝牙模块与手机蓝牙连接有点不同,它的UUID号需要用well-know的“"00001101-0000-1000-8000-00805F9B34FB”,AndroidAPI里面强调过。

           接下来的通讯就简单了,跟一般的蓝牙通讯差不多,网上很多文章都有详细介绍,所以偷偷懒啦。。。

           由于蓝牙串口端的开发不是偶负责的,就不好说啥了。不过目测同学的开发调试过程好像也蛮简单的,就是个串口通信过程。我们用的是HWW-S1800蓝牙模块,因为手机端有蓝牙,所以实际上我们只用到了从模块而已,价格也不贵,主从模块才不到三百块。这个模块功能比较简单,但对我们足够用了,而且使用起来很简单。只需要将蓝牙串口模块和单片机连接起来,再在Keil和STC-ISP两个软件上开发就行了,好像这两开发环境都是c语言的,也比较简单,接收一下蓝牙模块发过来的字符信息,判断和处理一下给个回应就行了。具体过程还得请教学过单片机开发的同学了。

           (没想到会有怎么多的人需要,呵呵,看来当初的选题也还好呢,文档放到我的资源里面了 ,需要的可以下载)

            

    展开全文
  • android 手机与单片机之间的蓝牙通信

    万次阅读 多人点赞 2015-09-29 14:25:16
    刚好碰到这蓝牙通信方面的项目,上网也看过其他人在蓝牙这方面写的博客,但大多都不全,给一些初触蓝牙的开发者造成一定的麻烦,自己当初也费了不少劲。所以把自己参考网上的一些资料用Android studio写的代码完全放...

    刚好碰到这蓝牙通信方面的项目,上网也看过其他人在蓝牙这方面写的博客,但大多都不全,给一些初触蓝牙的开发者造成一定的麻烦,自己当初也费了不少劲。所以把自己参考网上的一些资料用Android studio写的代码完全放出来,分享一下。菜鸟初写博客,若有不恰之处,请指出,必改正。下面我会把自己的思路和代码一一呈现。(PS:由于后期做了些逻辑操作,代码可能有点臃肿,请勿怪。还好完整的代码是会有的,里面有多出来的一两个类没有用的,但懒得重新打包了)

    第一篇博客写完,感觉好菜。资源下载:http://download.csdn.net/detail/u013168302/9146907

    1.添加权限

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    

    2.成员变量跟onCreate()方法,为了方便阅读,把这些摆出来

    public class PipelineActivity extends Activity {
        public static BluetoothSocket btSocket;
        private BluetoothAdapter bluetoothAdapter;
        private ArrayAdapter<String> deviceAdapter;
        private List<String> listDevices;
        private ListView listView;
        private LinearLayout btContent;
        private TextView btAllData;
        private Button openBT;
        private Button searchBT;
        final private static int MESSAGE_READ = 100;
        int i = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.pipeline);
    
            listView = (ListView) this.findViewById(R.id.list);
            btContent = (LinearLayout) findViewById(R.id.bt_content_llt);
            btAllData = (TextView) findViewById(R.id.all_data);
            btAllData.setText(btAllData.getText(), TextView.BufferType.EDITABLE);//这行可实现TextView尾部追加http://blog.csdn.net/u013168302/article/details/48785927
    
            openBT = (Button) findViewById(R.id.open_btn);
            searchBT = (Button) findViewById(R.id.search_btn);
    
            listDevices = new ArrayList<String>();
            bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            if (bluetoothAdapter.isEnabled()) {
                openBT.setText("关闭蓝牙");
            }
            deviceAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item, listDevices);
    
            openBT.setOnClickListener(new BTListener());
            searchBT.setOnClickListener(new BTListener());
    
            listView.setAdapter(deviceAdapter);
            listView.setOnItemClickListener(new ItemClickListener());//添加监听
        }
    


    3.注册广播(因为下面搜索时要用到,所以现在前面注册)

    private BroadcastReceiver receiver = new BroadcastReceiver() {
    
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                
                //下面几行是为了在logcat里面看到搜索到的设备细节,需要的话,可以将注释打开
    //            Bundle b = intent.getExtras();
    //            Object[] lstName = b.keySet().toArray();
    //            // 显示所有收到的消息及其细节
    //            for (int i = 0; i < lstName.length; i++) {
    //                String keyName = lstName[i].toString();
    //                Log.e("-----" + keyName, String.valueOf(b.get(keyName)));
    //            }
                
                //搜索设备时,取得设备的MAC地址
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice device = intent
                            .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    String str = device.getName() + "|" + device.getAddress();
                    if (listDevices.indexOf(str) == -1)// 防止重复添加
                        listDevices.add(str); // 获取设备名称和mac地址
                    if (deviceAdapter != null) {
                        deviceAdapter.notifyDataSetChanged();
                    }
                }
            }
        };
    



    
    
    
    4.点击开启蓝牙,搜索蓝牙设备。 将搜索到设备名称和mac地址通过BroadcastReceiver保存到list集合,再在listview中展示
    

    /**
         * 蓝牙开启与搜索按钮点击监听
         */
        class BTListener implements View.OnClickListener {
            @Override
            public void onClick(View view) {
                if (view.getId() == R.id.open_btn) {
                    if (!bluetoothAdapter.isEnabled()) {
                        bluetoothAdapter.enable();//开启蓝牙
                        Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                        enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); //300秒为蓝牙设备可见时间
                        startActivity(enable);
                        openBT.setText("关闭蓝牙");
    
                    } else {
                        bluetoothAdapter.disable();//关闭蓝牙
                        openBT.setText("开启蓝牙");
                        if (btSocket != null) {
                            try {
                                btSocket.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } else if (view.getId() == R.id.search_btn) {
                    if (!bluetoothAdapter.isEnabled()) {
                        Toast.makeText(getApplicationContext(), "请先开启蓝牙", Toast.LENGTH_SHORT).show();
                    } else {
                        btContent.setVisibility(View.GONE);
                        listView.setVisibility(View.VISIBLE);
                        if (listDevices != null) {
                            listDevices.clear();
                            if (deviceAdapter != null) {
                                deviceAdapter.notifyDataSetChanged();
                            }
                        }
                        bluetoothAdapter.startDiscovery();
                        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                        registerReceiver(receiver, filter);
    
                    }
                }
            }
        }



    5.点击listview的item,通过反射连接设备。连接设备之前需要UUID来配对。查看网上的例子和自己的一些实践发现,通过UUID会出现一些问题,当然也有可能只是我自己的代码有问题。所以在此采取反射来获取蓝牙socket对象。

    /**
         * 蓝牙选项,listview列表点击监听
         */
        class ItemClickListener implements AdapterView.OnItemClickListener {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
    
                if (!bluetoothAdapter.isEnabled()) {
                    Toast.makeText(getApplicationContext(), "请先开启蓝牙", Toast.LENGTH_SHORT).show();
                } else {
                    bluetoothAdapter.cancelDiscovery();//停止搜索
                    String str = listDevices.get(position);
                    String macAdress = str.split("\\|")[1];
    
                    BluetoothDevice device = bluetoothAdapter.getRemoteDevice(macAdress);
                    try {
                        Method clientMethod = device.getClass()
                                .getMethod("createRfcommSocket", new Class[]{int.class});
                        btSocket = (BluetoothSocket) clientMethod.invoke(device, 1);
                        connect(btSocket);//连接设备
    
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }
        }


    6.连接蓝牙设备,并开辟子线程通信

    在这里值得注意while里面的2行代码。这2行代码花了不少功夫才弄到的

    (1)if(inputStream.available() >0==false)

    (2)Thread.sleep(400);//等待0.4秒,作用:让数据接收完整
    这2行用于处理inputStream读取数据不完整或混乱的问题,但感觉还是不够好。若谁有更好的方法,欢迎提出。
    另外inputStream在这里是关不掉的,因为这是蓝牙通信,单片机每产生的数据都要传输到手机端。试过多次:一旦断开inputstream,while循环结束,单片机再次产生的数据无法传送。不知道我有没有弄错,欢迎指出。

    
    

     /**
         * 连接蓝牙及获取数据
         */
        public void connect(final BluetoothSocket btSocket) {
            try {
                btSocket.connect();//连接
                if (btSocket.isConnected()) {
                    Log.e("----connect--- :", "连接成功");
                    Toast.makeText(getApplicationContext(), "蓝牙连接成功", Toast.LENGTH_SHORT).show();
                    listView.setVisibility(View.GONE);
                    btContent.setVisibility(View.VISIBLE);
                    new ConnetThread().start();//通信
    
                } else {
                    Toast.makeText(getApplicationContext(), "蓝牙连接失败", Toast.LENGTH_SHORT).show();
                    btSocket.close();
                    listView.setVisibility(View.VISIBLE);
                    btContent.setVisibility(View.GONE);
                    Log.e("--------- :", "连接关闭");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 蓝牙通信管理
         */
        private class ConnetThread extends Thread {
            public void run() {
                try {
                    InputStream inputStream = btSocket.getInputStream();
                    byte[] data = new byte[1024];
                    int len = 0;
                    String result = "";
    
                    while (len != -1) {
                        if (inputStream.available() > 0 == false) {//inputStream接收的数据是一段段的,如果不先
                            continue;
                        } else {
                            try {
                                Thread.sleep(500);//等待0.5秒,让数据接收完整
                                len = inputStream.read(data);
                                result = URLDecoder.decode(new String(data, "utf-8"));
    //                          Log.e("----result:----- :", ">>>" + result);
                                Message msg = new Message();
                                msg.what = MESSAGE_READ;
                                msg.obj = result;
                                handler.sendMessage(msg);
    
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    inputStream.close();//关不了,也好像不能关
                    Log.e("--------- :", "关闭inputStream");
                    if (btSocket != null) {
                        btSocket.close();
                    }
                } catch (IOException e) {
                    Log.e("TAG", e.toString());
                }
            }
    
        }


    7.用Handler处理Message

    private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MESSAGE_READ:
                        String result = (String) msg.obj;
                        String data = result.split("\\r\\n")[0];
                        Log.e("----data:----- :", ">>>" + data);
                        if (i < 6) {
                            Editable text = (Editable) btAllData.getText();
                            text.append(data);
                            btAllData.setText(text + "\r\n");
                            i++;
                        } else {
                            btAllData.setText(data + "\r\n");
                            i = 0;
                        }
                        break;
                }
            }
        };
    
        @Override
        protected void onDestroy() {
            unregisterReceiver(receiver);
            super.onDestroy();
        }




    8.1布局文件(尚未优化)

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000000"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:background="#000000"
            android:gravity="center"
            android:paddingLeft="20dp"
            android:text="@string/pipeline"
            android:textColor="#ffffff"
            android:textSize="20sp" />
    
        <LinearLayout
            android:visibility="gone"
            android:id="@+id/bt_content_llt"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_weight="1"
            android:background="#ffffff"
            android:orientation="vertical">
    
            <LinearLayout style="@style/bt_llt_style"
                android:layout_weight="3">
    
                <TextView
                    style="@style/btTV_style"
                    android:gravity="left"
                    android:layout_weight="1"
                    android:paddingTop="20dp"
                    android:text="@string/all_data" />
    
                <TextView
                    android:id="@+id/all_data"
                    style="@style/btTV_style"
                    android:gravity="left"
                    android:paddingLeft="2dp"
                    android:paddingTop="20dp"
                    android:textSize="16sp"
                    android:layout_weight="2" />
    
            </LinearLayout>
    
        </LinearLayout>
    
        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_weight="1"
            android:background="#f0f0f0"
            android:divider="#c0c0c0"
            android:dividerHeight="1dp" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/open_btn"
                style="@style/bt_button_style"
                android:text="@string/open_bluetooth" />
    
            <Button
                android:id="@+id/search_btn"
                style="@style/bt_button_style"
                android:text="@string/search_bluetooth" />
        </LinearLayout>
    
    </LinearLayout>
    


    8.2 item布局

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/device_name_tv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:paddingLeft="15dp"
        android:gravity="center|left"
        android:textColor="#000000"
        android:background="@drawable/list_item_selector"
        android:textSize="18sp">
    
    </TextView>
    

    8.3 资源文件strings.xml

    <resources>
        <string name="app_name">bluetooth</string>
    
        <string name="hello_world">Hello world!</string>
        <string name="action_settings">Settings</string>
      
        <string name="pipeline">管道检测仪</string>
        <string name="open_bluetooth">开启蓝牙</string>
        <string name="close_bluetooth">关闭蓝牙</string>
        <string name="search_bluetooth">搜索蓝牙</string>
        <string name="all_data">全部数据:</string>
        <color name="item_default">#F0F0F0</color>
        <color name="item_press">#A5D8F5</color>
    </resources>
    

    8.4 style

    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
        </style>
    
        <style name="btTV_style">
            <item name="android:background">#ffffff</item>
            <item name="android:gravity">left|center</item>
            <item name="android:paddingLeft">10dp</item>
            <item name="android:paddingRight">10dp</item>
            <item name="android:textSize">20sp</item>
            <item name="android:layout_width">1dp</item>
            <item name="android:layout_height">match_parent</item>
        </style>
    
        <style name="bt_llt_style">
            <item name="android:layout_width">match_parent</item>
            <item name="android:layout_height">1dp</item>
            <item name="android:layout_weight">1</item>
            <item name="android:orientation">horizontal</item>
        </style>
    
        <style name="bt_button_style">
            <item name="android:layout_width">1dp</item>
            <item name="android:layout_height">match_parent</item>
            <item name="android:layout_marginLeft">20dp</item>
            <item name="android:layout_marginRight">20dp</item>
            <item name="android:layout_weight">1</item>
            <item name="android:background">#5CB85C</item>
        </style>
    
    </resources>
    


    8.5  listview的item选择器

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <!-- 选中 -->
        <item android:state_pressed="true" android:drawable="@color/item_press" />
        <!-- 默认 -->
        <item android:drawable="@color/item_default"/>
    
    </selector>








    展开全文
  • 我的项目适用于android单片机蓝牙通信,以完成功能。直接上代码,两个 activity,清单文件加布局文件需要修改。 ##Git地址: https://github.com/BSHead/BLTAndroid/tree/master ...

    我的项目适用于android和单片机蓝牙通信,以完成功能。直接上代码,两个 activity,清单文件加布局文件需要修改。本人学识短浅,只负责代码搬运,实测有效可完成通讯
    ##Git地址: https://github.com/BSHead/BLTAndroid/tree/master

    展开全文
  • (2)安卓手机蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) (4)安卓手机蓝牙模块联合调试(四)—— 单片机数据...
  • STC89C52单片机通过HC-06蓝牙模块与Android手机通信

    万次阅读 多人点赞 2018-12-11 21:51:32
    STC89C52通过HC-06蓝牙模块与Android手机通信   如需转载请标明出处:http://blog.csdn.net/itas109  QQ技术交流群:129518033  2017-11-04补充 注意问题: 1.确保上位机波特率为9600 2.确保下位机的波特...
  • 实现Android手机通过蓝牙控制51单片机小车 #一、材料: 1.stc51单片机最小系统板(最好带上拉电阻); 2.HC-02蓝牙芯片; 3.蓝牙小车,带驱动; 4.充电宝; 5.Android手机及app; #二、硬件连接 1.把小车...
  • (2)安卓手机蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) 本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机...
  • Android通过蓝牙接收单片机发来的数据。
  • 1、Android蓝牙编程  蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码(Universally Unique Identifier),这是一个软件构建的标准,也是被开源基金会组织应用在分布式计算环境领域的一部分。在蓝牙3.0...
  • 该App功能为通过蓝牙接收单片机采集的温度传感器数据,同时可以通过蓝牙发送预设温度数据给单片机 蓝牙通信代码仿照参考代码进行编写,不再提供github代码 关键代码 主要是接收和发送数据,在参考的代码里面...
  • (2)安卓手机蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下) 本教程的项目地址:1989Jiangtao/BluetoothSCM: 安卓手机...
  • 这次期末的课程设计做了一个智能灯光控制系统,系统整体的功能不在此赘述,系统主要是要实现下位机同上位机的通信,上位机选用的是Android手机端,下位机是52单片机,通过蓝牙模块实现通信。虽然系统很简单,但还是...
  • 51单片机是市面上比较普及的单片机种类,同时也深受广大电子爱好者的青睐。在51单片机的众多功能中串口通信占据了重要的地位,通过串口通信,我们可以实现51单片机与其他设备的... 要完成单片机与Android手机的无...
  • 安卓手机通过蓝牙与单片机通信

    千次阅读 热门讨论 2014-04-10 16:01:24
     手机端打开编写的蓝牙通信软件,与单片机蓝牙串口模块连接,而后,手机通过蓝牙发送读数据命令到单片机单片机开始读取传感器信息,将采集到得传感器信息通过蓝牙发送到手机端,手机端软件接收到后,显示。...
  • 3、单片机TxD RxD+蓝牙模块RxD TxD手机蓝牙 只能收不能发 电路查了又查,单片机和app的程序改了又改,在第三点里连最简单的一个字符都收不到,前面两点进行长字符串传输毫无问题。现在求大神给个思路。 补充一下...
1 2 3 4 5 ... 20
收藏数 1,153
精华内容 461
关键字:

单片机蓝牙与android