前言: 最近接触蓝牙开发,主要是通过蓝牙连接获取传感器硬件设备的数据,并进行处理。 网上学习一番,现整理出一套比较标准的 操作流程代码。 如果大家看得懂,将来只需要改下 硬件设备的MAC码 和 改下对接收数据的处理 即可。 一切都是套路~~~ 现在以一个小型项目需 ...
前言:
最近接触蓝牙开发,主要是通过蓝牙连接获取传感器硬件设备的数据,并进行处理。
网上学习一番,现整理出一套比较标准的 操作流程代码。
如果大家看得懂,将来只需要改下 硬件设备的MAC码 和 改下对接收数据的处理 即可。 一切都是套路~~~
现在以一个小型项目需求来学习Android蓝牙编程
需求: 通过蓝牙获取硬件数据,并显示在一个随数据即时变化的动态折线图中。
实现思路:
(1) 配对蓝牙设备
(2) 连接蓝牙设备 ,根据MAC地址,代码中修改
(3) 接收数据
(4) 处理数据 ,根据硬件厂商提供给你的数据转换公式,在BluetoothService类中 修改
(5) 传数据给折线图,展现实时变化
-----------------------------------------------------------------------
蓝牙知识了解:
(1)、MAC地址:每个设备都有全球唯一的,根据此MAC地址判断蓝牙设备
(2)、蓝牙传输数据,通常一秒钟会传输很多个包,每个包的数据情况如下:
此时,这个包有11个字节,0x55 是首码,通常通过他来判断一个包的开始
SUM是验证码,会有一套公式来计算,判断当前包是不是一个有效的完整的包
中间的即是数据,然后硬件方面会给我们一套计算公式,可以以此获取我们要的数据。
当然每个硬件的包的数据大小都是不同的,有的可能有21个字节,每个硬件的数据的计算方式也不想同
代码实现:
一共就三部分,因为代码篇幅可能较大,不适合一段段代码讲解,直接贴出整个代码。所有的解释都在注释当中。
其中:
(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
(#换成@)。