由于项目的需要的Android与蓝牙模块通信,发了时间学习了下,实现了Android的与蓝牙模块的通信

1.蓝牙串口模块使用SPP-CA模块

蓝牙串口模块就是使用单片机的TX,RX与蓝牙模块通信,单片机通过TX发送数据给蓝牙模块,然后蓝牙模块在通过蓝牙协议把数据发送出去,蓝牙模块与Android的通信方式使用spp协议。

2.蓝牙通信

蓝牙的通信需要服务端和客户端,客户端搜索蓝牙设备,链接服务端。主要是通过插座通信,相关的知识可以学习了解下插座通信。链接建立起来,通信时数据的读写是通过输入输出流的方式读写。

3.Android蓝牙架构和API的说明

查看“机器人系统原理及开发要点详解”和“深入理解的Android网络编程”里的蓝牙相关章节,2本书里相关的章节有详细的介绍。

4.uuid

提示:如果要连接到蓝牙串行板,请尝试使用着名的SPP UUID 00001101-0000-1000-8000-00805F9B34FB。但是如果您连接到Android对等体,那么请生成您自己的唯一UUID。

这是Android官方文档的说明,如果是连接蓝牙串口模块使用通用的uuid 00001101-0000-1000-8000-00805F9B34FB,如果是Android手机间的通信链接,可以使用生成的uuid,客服端和服务端的uuid必须相同,下面通过蓝牙串口助手读取回来的UUID,下面是我的蓝牙串口模块的UUID。

下面是读取手机的蓝牙的UUID,可以看到比较多的UUID,有比较多的服务。

另外下面是其他蓝牙设备的UUID,应该是蓝牙4.0的。

代码部分还是比较简单的,下面是Android的蓝牙链接的主要部分代码,也是参考网上的。

包gjz.bluetooth;

导入gjz.bluetooth.R;
导入gjz.bluetooth.Bluetooth.ServerOrCilent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.UUID;
导入android.app.Activity;
导入android.bluetooth.BluetoothAdapter;
导入android.bluetooth.BluetoothDevice;
导入android.bluetooth.BluetoothServerSocket;
导入android.bluetooth.BluetoothSocket;
导入android.content.Context;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入android.util.Log;
导入android.view.View;
导入android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
导入android.widget.AdapterView;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.Toast;
导入android.widget.AdapterView.OnItemClickListener;

public class chatActivity extends Activity implements OnItemClickListener,OnClickListener {
    / **当活动首次创建时调用。* /
 
 private ListView mListView;
 private ArrayList <deviceListItem>列表;
 私人按钮sendButton;
 私人按钮disconnectButton;
 私人EditText editMsgView;
 deviceListAdapter mAdapter;
 上下文mContext;
 
 / *一些常量,代表服务器的名称* /
 public static final String PROTOCOL_SCHEME_L2CAP =“btl2cap”;
 public static final String PROTOCOL_SCHEME_RFCOMM =“btspp”;
 public static final String PROTOCOL_SCHEME_BT_OBEX =“btgoep”;
 public static final String PROTOCOL_SCHEME_TCP_OBEX =“tcpobex”;
 
 private BluetoothServerSocket mserverSocket = null;
 private ServerThread startServerThread = null;
 private clientThread clientConnectThread = null;
 private BluetoothSocket socket = null;
 private BluetoothDevice device = null;
 private readThread mreadThread = null ;; 
 private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
 
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.chat);
        mContext = this
        在里面();
    }
   
 private void init(){    
  list = new ArrayList <deviceListItem>();
  mAdapter = new deviceListAdapter(this,list);
  mListView =(ListView)findViewById(R.id.list);
  mListView.setAdapter(mAdapter);
  mListView.setOnItemClickListener(本);
  mListView.setFastScrollEnabled(真);
  editMsgView =(EditText)findViewById(R.id.MessageText); 
  editMsgView.clearFocus();
  
  sendButton =(Button)findViewById(R.id.btn_msg_send);
  sendButton.setOnClickListener(new OnClickListener(){
   @ Override
   public void onClick(View arg0){
    // TODO自动生成的方法存根
    String msgText = editMsgView.getText()。toString();
    if(msgText.length()> 0) {
     sendMessageHandle(msgText); 
     editMsgView.setText(“”);
     editMsgView.clearFocus();
     //关闭InputMethodManager
     InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
     imm.hideSoftInputFromWindow(editMsgView.getWindowToken(),0);
    } else
    Toast.makeText(mContext,“发送内容不能为空!”,Toast.LENGTH_SHORT).show();
   }
  });
  
  disconnectButton =(Button)findViewById(R.id.btn_disconnect);
  disconnectButton.setOnClickListener(new OnClickListener(){
   @ Override
   public void onClick(View arg0){
    // TODO自动生成的方法存根
          if(Bluetooth.serviceOrCilent == ServerOrCilent.CILENT)
    {
           shutdownClient();
    }
    else if(Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE)
    {
     shutdownServer();
    }
    Bluetooth.isOpen = false;
    Bluetooth.serviceOrCilent = ServerOrCilent.NONE;
    Toast.makeText(mContext,“已断开连接!”,Toast.LENGTH_SHORT).show();
   }
  });  
 }

private Handler LinkDetectedHandler = new Handler(){
        @
        Override public void handleMessage(Message msg){
         //Toast.makeText(mContext,(String)msg.obj,Toast.LENGTH_SHORT).show();
         if(msg.what == 1)
         {
          list.add(new deviceListItem((String)msg.obj,true));
         }
         else
         {
          list.add(new deviceListItem((String)msg.obj,false));
         }
   mAdapter.notifyDataSetChanged();
   mListView.setSelection(list.size() - 1);
        }
       
    };   
   
    @Override
    public synchronized void onPause(){
        super.onPause();
    }
    @Override
    public synchronized void onResume(){
        super.onResume();
        if(Bluetooth.isOpen)
        {
         Toast.makeText(mContext,“连接已经打开,可以通信,如果要再建立连接,请先断开!”,Toast.LENGTH_SHORT).show();
         返回;
        }
        if(Bluetooth.serviceOrCilent == ServerOrCilent.CILENT)
        {
   String address = Bluetooth.BlueToothAddress;
   if(!address.equals(“null”))
   {
    device = mBluetoothAdapter.getRemoteDevice(address); 
    clientConnectThread = new clientThread();
    clientConnectThread.start();
    Bluetooth.isOpen = true;
   }
   else
   {
    Toast.makeText(mContext,“address is null!”,Toast.LENGTH_SHORT).show();
   }
        }
        else if(Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE)
        {                
         startServerThread = new ServerThread();
         startServerThread.start();
         Bluetooth.isOpen = true;
        }
    }
 //开启客户端
 私有类clientThread extends Thread {   
  public void run(){
   try {
    //创建一个Socket连接:只需要服务器在注册时的UUID号
    // socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
    socket = device.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));
    //连接
    消息msg2 = new Message();
    msg2.obj =“请稍候,正在连接服务器:”+ Bluetooth.BlueToothAddress;
    msg2.what = 0;
    LinkDetectedHandler.sendMessage(MSG2);
    
    socket.connect();
    
    消息msg = new Message();
    msg.obj =“已经连接上服务端!可以发送信息”。
    msg.what = 0;
    LinkDetectedHandler.sendMessage(MSG);
    //启动接受数据
    mreadThread = new readThread();
    mreadThread.start();
   }
   catch(IOException e)
   {
    Log.e(“connect”,“”,e);
    消息msg = new Message();
    msg.obj =“连接服务端异常!断开连接重新试一试”。
    msg.what = 0;
    LinkDetectedHandler.sendMessage(MSG);
   }
  }
 };

//开启服务器
 私有类ServerThread extends Thread {
  public void run(){
     
   try {
    / *创建一个蓝牙服务器
     *参数分别:服务器名称,UUID * / 
    mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
      UUID.fromString(“00001101-0000 -1000-8000-00805F9B34FB“));  
    
    Log.d(“server”,“wait cilent connect ...”);
    
    消息msg = new Message();
    msg.obj =“请稍候,正在等待客户端的连接...”;
    msg.what = 0;
    LinkDetectedHandler.sendMessage(MSG);
    
    / *接受客户端的连接请求* /
    socket = mserverSocket.accept();
    Log.d(“server”,“accept success!”);
    
    消息msg2 = new Message();
    String info =“客户端已经连接上!可以发送信息”。
    msg2.obj = info;
    msg.what = 0;
    LinkDetectedHandler.sendMessage(MSG2);
    //启动接受数据
    mreadThread = new readThread();
    mreadThread.start();
   } catch(IOException e){
    // TODO自动生成的catch块
    e.printStackTrace();
   }
  }
 };
 / *停止服务器* /
 private void shutdownServer(){
  new Thread(){
   public void run(){
    if(startServerThread!= null)
    {
     startServerThread.interrupt();
     startServerThread = null;
    }
    if(mreadThread!= null)
    {
     mreadThread.interrupt();
     mreadThread = null;
    }    
    try {     
     if(socket!= null)
     {
      socket.close();
      socket = null;
     }
     if(mserverSocket!= null)
     {
      mserverSocket.close(); / *关闭服务器* /
      mserverSocket = null;
     }
    } catch(IOException e){
     Log.e(“server”,“mserverSocket.close()”,e);
    }
   };
  }。开始();
 }
 / *停止客户端连接* /
 private void shutdownClient(){
  new Thread(){
   public void run(){
    if(clientConnectThread!= null)
    {
     clientConnectThread.interrupt();
     clientConnectThread = null;
    }
    if(mreadThread!= null)
    {
     mreadThread.interrupt();
     mreadThread = null;
    }
    if(socket!= null){
     try {
      socket.close();
     } catch(IOException e){
      // TODO自动生成的catch块
      e.printStackTrace();
     }
     socket = null;
    }
   };
  }。开始();
 }
 //发送数据
 private void sendMessageHandle(String msg)
 {  
  if(socket == null)
  {
   Toast.makeText(mContext,“没有连接”,Toast.LENGTH_SHORT).show();
   返回;
  }
  try {    
   OutputStream os = socket.getOutputStream();
   os.write(msg.getBytes());
  } catch(IOException e){
   // TODO自动生成的catch块
   e.printStackTrace();
  }   
  list.add(new deviceListItem(msg,false));
  mAdapter.notifyDataSetChanged();
  mListView.setSelection(list.size() - 1);
 }
 //读取数据
    private class readThread extends Thread {
        public void run(){
         
            byte [] buffer = new byte [1024];
            int字节;
            InputStream mmInStream = null;
           
   尝试{
    mmInStream = socket.getInputStream();
   } catch(IOException e1){
    // TODO自动生成的catch块
    e1.printStackTrace();
   } 
            while(true){
                try {
                    //从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 =新字符串(buf_data);
      消息msg = new Message();
      msg.obj = s;
      msg.what = 1;
      LinkDetectedHandler.sendMessage(MSG);
                    }
                } catch(IOException e){
                 try {
      mmInStream.close();
     } catch(IOException e1){
      // TODO自动生成的catch块
      e1.printStackTrace();
     }
                    休息
                }
            }
        }
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();

if(Bluetooth.serviceOrCilent == ServerOrCilent.CILENT)
  {
         shutdownClient();
  }
  else if(Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE)
  {
   shutdownServer();
  }
        Bluetooth.isOpen = false;
  Bluetooth.serviceOrCilent = ServerOrCilent.NONE;
    }
 public class SiriListItem {
  String message;
  boolean isSiri;

public SiriListItem(String msg,boolean siri){
   message = msg;
   isSiri = siri
  }
 }
 @覆盖
 公共无效onItemClick(适配器视图<?>为arg0,查看ARG1,INT ARG2,长ARG3){
  // TODO自动生成方法存根
 }
 @覆盖
 公共无效的onClick(查看为arg0){
  // TODO自动生成方法stub
 } 
 public class deviceListItem {
  String message;
  boolean isSiri;

public deviceListItem(String msg,boolean siri){
   message = msg;
   isSiri = siri
  }
 }
}

下面是实现的效果。

1.Android手机通信

一台手机作为服务端,等待客服端链接。

另一台手机作为客户端,链接服务端,链接成功,发送数据

2.Android和蓝牙模块的通信

蓝牙模块作为服务器端,安卓手机作为客户端,链接蓝牙模块。

蓝牙模块通过串口线链接PC,通过串口工具接收Android手机端发送数据,Android手机端链接成功信息连接<< A0:E4:53:18:BB:42 CONNETED,链接成功发送信息hellokitty mina123456789,Android链接断开信息DISC:SUCCESS + READY + PAIRABLE

看到不少朋友需要源码:找了电脑上源码

下面是源码下载地址:

http://download.csdn.net/detail/cwcwj3069/9876795



Android与蓝牙串口模块通信相关推荐

  1. java 蓝牙读取数据格式,单片机与安卓手机通过蓝牙串口模块利用JSON数据格式通信实例...

    原标题:单片机与安卓手机通过蓝牙串口模块利用JSON数据格式通信实例 JSON 指的是 Java 对象表示法(Java Object Notation),JSON 是轻量级的文本数据交换格式,JSON ...

  2. android车机蓝牙,安卓APP通过蓝牙串口模块控制DSP车机收音机

    从零开始,嘀咕很久 终于可以使用了... 安卓APP是电脑版xdr-gtk 的手机版控制,频谱扫描和RDS还没嘀咕好... 手机APP是在 ace919 eggplant886两位控制DSP车机的基础 ...

  3. android 车载蓝牙模块,安卓APP通过蓝牙串口模块控制DSP车机收音机

    从零开始,嘀咕很久 终于可以使用了... 安卓APP是电脑版xdr-gtk 的手机版控制,频谱扫描和RDS还没嘀咕好... 手机APP是在 ace919 eggplant886两位控制DSP车机的基础 ...

  4. android蓝牙模块有哪些类型,蓝牙串口模块是什么?怎么用?有哪些种类?

    燚智能点评:蓝牙串口模块,分为经典蓝牙串口(4.0以前的)和BLE串口(4.0以后).经典蓝牙的速度快,和普通串口速度相当,功耗高.BLE的速度慢,也就1K每秒上下,但是功耗低. 如果做物联网产品的控 ...

  5. 串口发数据到android数据错误,51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法...

    原标题:51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法 JSON(Java Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMA (欧洲计 ...

  6. HC-02蓝牙串口模块的配置和使用

    HC-02蓝牙串口模块是基于蓝牙2.0并兼容BLE的双模蓝牙数传模块,带底板的蓝牙模块如下图: 模块可以作为从机与HC-05或HC-06的主机设备通信,也可以和手机通信. 模块在上电未连接蓝牙的时候L ...

  7. arduino蓝牙通讯代码_通过手机控制蓝牙串口模块与Arduino通讯

    功能 通过手机APP向蓝牙模块发送指令,蓝牙模块通过串口将指令传递给Arduino开发板,并由Arduino做出反馈,传递给手机. 工具材料Arduino 开发板 ×1 蓝牙串口模块×1 Androi ...

  8. uniapp app蓝牙打印_编程器加装蓝牙串口模块与手机APP操作演示

    编程器加装蓝牙模块后,可以方便的使用手机查看打印信息,进入控制台执行各种串口命令.本款蓝牙串口APP具有保存打印信息.分享打印信息.设置字体大小.清除屏幕信息.进入控制台.发送串口命令.执行串口命令- ...

  9. 关于蓝牙串口模块开发

    我想做一个蓝牙串口APP,跟我的蓝牙串口模块进行通讯,但网上找的例子都是查找蓝牙,蓝牙配对什么步骤,这些步骤每个手机都可以手动做,没必要弄了吧,怎么还弄这些步骤呢?只要手动配对后再监听就可以了吧?有开 ...

最新文章

  1. Redis 存储字符串和对象
  2. WebX.0:Web1.0
  3. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析
  4. c#子线程线程中操作窗体更新的报错
  5. VTK:可视化之BackgroundTexture
  6. 目标群体是什么意思_抖音代运营日常主要是做什么的?
  7. python3.6与3.7的区别_选择 Python3.6 还是 Python 3.7
  8. 为啥我从后台查到的值在页面显示的是undefined_【java笔记】046天,作购物车页面,学习JavaScript...
  9. html移动端即时翻译插件,React框架实现移动页面翻译是一种什么体验?
  10. 如何使用QXDM 的1477项 转化utc时间
  11. java 调用net remoting_获取 org.springframework.remoting.RemoteAccessException: 在进行调用时无法访问远程服务?...
  12. java电子小词典课程设计,java课程设计---英汉电子词典
  13. ROS——RPLIDAR A1 SDK详解
  14. 万元怎样保留小数点_excel中数值转换成万元后如何只保留两位小数?,excle 万元 元...
  15. Ubuntu 声卡解决办法合集
  16. U-Net网络模型学习总结
  17. 【英语写作】以亚太杯为例
  18. 解决第三方dll出现:找不到指定模块(非路径错误)
  19. 奇异值分解实验:图像压缩与推荐系统
  20. JDK 8的新特性-Lambda表达式 精品文章总结

热门文章

  1. Z-Wave Networking Basics ZWAVE网络基础
  2. 《TIME》2008年50个最佳网站
  3. 被骗去柬埔寨的程序员...
  4. 高端大气述职报告PPT模板
  5. 券商资产管理部业务详述
  6. 直流无刷电机驱动器资料 功能支持模式:有霍尔和无霍尔两种
  7. 基于NRF905的无线温度采集系统
  8. DS18B20简单介绍温度测量操作
  9. 利尔达蓝牙空调接收器方案助力打造更舒适的公路生活
  10. 哪些操作符具有副作用?它们具有什么副作用?