你的位置:首页 > 软件开发 > 操作系统 > Android项目实战(二十六):蓝牙连接硬件设备开发规范流程

Android项目实战(二十六):蓝牙连接硬件设备开发规范流程

发布时间:2016-09-26 17:00:25
前言:  最近接触蓝牙开发,主要是通过蓝牙连接获取传感器硬件设备的数据,并进行处理。  网上学习一番,现整理出一套比较标准的 操作流程代码。  如果大家看得懂,将来只需要改下 硬件设备的MAC码 和 改下对接收数据的处理 即可。 一切都是套路~~~ 现在以一个小型项目需 ...

Android项目实战(二十六):蓝牙连接硬件设备开发规范流程

前言:

  最近接触蓝牙开发,主要是通过蓝牙连接获取传感器硬件设备的数据,并进行处理。

  网上学习一番,现整理出一套比较标准的 操作流程代码。

  如果大家看得懂,将来只需要改下 硬件设备的MAC码 和 改下对接收数据的处理 即可。  一切都是套路~~~

 

现在以一个小型项目需求来学习Android蓝牙编程

需求: 通过蓝牙获取硬件数据,并显示在一个随数据即时变化的动态折线图中。

实现思路:

(1) 配对蓝牙设备  

(2) 连接蓝牙设备    ,根据MAC地址,代码中修改

(3) 接收数据

(4) 处理数据          ,根据硬件厂商提供给你的数据转换公式,在BluetoothService类中 修改

(5) 传数据给折线图,展现实时变化

-----------------------------------------------------------------------

 

蓝牙知识了解:

(1)、MAC地址:每个设备都有全球唯一的,根据此MAC地址判断蓝牙设备

(2)、蓝牙传输数据,通常一秒钟会传输很多个包,每个包的数据情况如下:

  此时,这个包有11个字节,0x55 是首码,通常通过他来判断一个包的开始

                                     SUM是验证码,会有一套公式来计算,判断当前包是不是一个有效的完整的包

              中间的即是数据,然后硬件方面会给我们一套计算公式,可以以此获取我们要的数据。

  当然每个硬件的包的数据大小都是不同的,有的可能有21个字节,每个硬件的数据的计算方式也不想同

Android项目实战(二十六):蓝牙连接硬件设备开发规范流程

 

 

代码实现:

一共就三部分,因为代码篇幅可能较大,不适合一段段代码讲解,直接贴出整个代码。所有的解释都在注释当中。

其中:

(1)、红色部分是需要大家根据个人硬件情况进行修改的

(2)、紫色部分是根据个人数据情况添加删除修改的。

一:MainActivity

public class MainActivity extends Activity {  private BluetoothService mBluetoothService; //自定义蓝牙服务类  private BluetoothAdapter mBluetoothAdapter;  private String mConnectedDeviceName = null; //连接设备的名称  //默认是1,因为程序启动时首先会连接一个蓝牙  private int current_pos = 1;  //hanlder消息标识 message.what  public static final int MESSAGE_STATE_CHANGE = 1; // 状态改变  public static final int MESSAGE_READ = 2;     // 读取数据  public static final int MESSAGE_WRITE = 3;     // 给硬件传数据,暂不需要,看具体需求  public static final int MESSAGE_DEVICE_NAME = 4; // 设备名字  public static final int MESSAGE_TOAST = 5;     // Toast  //传感器 ,这里默认同时需要和三个硬件连接,分别设置id 1,2,3进行区分,demo中实际只用到 MAGIKARE_SENSOR_DOWN = 1  //可以根据情况自行添加删除  public static final int MAGIKARE_SENSOR_UP = 2;  public static final int MAGIKARE_SENSOR_DOWN = 1;  public static final int MAGIKARE_SENSOR_CENTER = 3;  public static float[] m_receive_data_up;          //传感器的数据  public static float[] m_receive_data_down;         //传感器的数据 ,demo中我们只需要这一个,因为只有一个硬件设备,  public static float[] m_receive_data_center;        //传感器的数据  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    //获取蓝牙适配器    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();    // 1、判断设备是否支持蓝牙功能    if (mBluetoothAdapter == null) {      //设备不支持蓝牙功能      Toast.makeText(this, "当前设备不支持蓝牙功能!", Toast.LENGTH_SHORT).show();      return;    }    // 2、打开设备的蓝牙功能    if (!mBluetoothAdapter.isEnabled()) {      boolean enable = mBluetoothAdapter.enable(); //返回值表示 是否成功打开了蓝牙设备      if (enable) {        Toast.makeText(this, "打开蓝牙功能成功!", Toast.LENGTH_SHORT).show();      } else {        Toast.makeText(this, "打开蓝牙功能失败,请到'系统设置'中手动开启蓝牙功能!", Toast.LENGTH_SHORT).show();        return;      }    }    // 3、创建自定义蓝牙服务对象    if (mBluetoothService == null) {      mBluetoothService = new BluetoothService(MainActivity.this, mHandler);    }    if (mBluetoothService != null) {      //根据MAC地址远程获取一个蓝牙设备,这里固定了,实际开发中,需要动态设置参数(MAC地址)      BluetoothDevice sensor_down = mBluetoothAdapter.getRemoteDevice("20:16:06:15:78:76");      if (sensor_down != null) {        //成功获取到远程蓝牙设备(传感器),这里默认只连接MAGIKARE_SENSOR_DOWN = 1这个设备        mBluetoothService.connect(sensor_down, MAGIKARE_SENSOR_DOWN);      }    }  }  private Handler mHandler = new Handler(new Handler.Callback() {    @Override    public boolean handleMessage(Message msg) {      switch (msg.what){        case MESSAGE_READ:          try {            String str=msg.getData().getString("index");            int index=Integer.valueOf(str);            switch (index)            {              //获取到蓝牙传输过来的数据              case MAGIKARE_SENSOR_UP:                m_receive_data_up=msg.getData().getFloatArray("Data");                break;              //实际只用到这个case ,因为demo只连接了一个硬件设备              case MAGIKARE_SENSOR_DOWN:                m_receive_data_down=msg.getData().getFloatArray("Data");                break;              case MAGIKARE_SENSOR_CENTER:                m_receive_data_center=msg.getData().getFloatArray("Data");                break;            }          } catch (Exception e) {            // TODO: handle exception          }          break;        case MESSAGE_STATE_CHANGE://          连接状态          switch (msg.arg1) {            case BluetoothService.STATE_CONNECTED:              break;            case BluetoothService.STATE_CONNECTING:              break;            case BluetoothService.STATE_LISTEN:              break;            case BluetoothService.STATE_NONE:              break;          }          break;        case MESSAGE_DEVICE_NAME:          mConnectedDeviceName = msg.getData().getString("device_name");          Log.i("bluetooth","成功连接到:"+mConnectedDeviceName);          Toast.makeText(getApplicationContext(),"成功连接到设备" + mConnectedDeviceName,Toast.LENGTH_SHORT).show();          break;        case MESSAGE_TOAST:          int index=msg.getData().getInt("device_id");          Toast.makeText(getApplicationContext(),msg.getData().getString("toast"), Toast.LENGTH_SHORT).show();          //当失去设备或者不能连接设备时,重新连接          Log.d("Magikare","当失去设备或者不能连接设备时,重新连接");            

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Android项目实战(二十六):蓝牙连接硬件设备开发规范流程

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录