@Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); Log.d(TAG, "receive BLE Action :" + action); if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { // 发现蓝牙服务,这时可以发送数据 // tv_log.append("发现蓝牙服务完成,发送同步时间命令\n"); // mBluetoothLeService.setSynTime(); tv_log.append("发现蓝牙服务完成,发送获取设备WatchID命令\n"); mBluetoothLeService.getWatchId(); } else if (BluetoothLeService.ACTION_GATT_SERVICES_TIMEOUT.equals(action)) { // 蓝牙通讯超时,这里可以重发未响应的命令 tv_log.append("蓝牙命令超时.......\n"); } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) { // 蓝牙断开 tv_log.append("蓝牙连接断开.......\n"); } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) { // 接收到蓝牙数据 byte[] bytes = intent.getByteArrayExtra(BluetoothLeService.EXTRA_DATA); tv_log.append("接收到数据:" + ProtocolParser.bytes2HexString(bytes) + "\n"); pasrseData(bytes); } }
@Override public void onServiceConnected(ComponentName componentName, IBinder service) { mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService(); mBluetoothLeService.setPedometerType(Pedometer_TypeInfo.Pedometer_Type.L11); Log.i(TAG, "BLEService onServiceConnected()"); }
/** 绑定蓝牙服务和广播,Activity初始化需绑定蓝牙服务。 */ public void bindLeService() { Intent bleService = new Intent(this, BluetoothLeService.class); bindService(bleService, mServiceConnection, BIND_AUTO_CREATE); localBroadcastManager.registerReceiver( mGattUpdateReceiver, BluetoothLeService.makeGattUpdateIntentFilter()); }
protected void test_proc() { // TODO Auto-generated method stub tv_log.setText(""); if (mBluetoothLeService == null) { Toast.makeText(this, "蓝牙服务未绑定!", Toast.LENGTH_SHORT).show(); return; } if (mDeviceAddress.length() < 12) { Toast.makeText(this, "没有指定设备,请先扫描!", Toast.LENGTH_SHORT).show(); return; } // 指定MAC地址连接 tv_log.append("重新连接设备:" + mDeviceAddress + "\n"); mBluetoothLeService.connect(mDeviceAddress, ""); }
protected void pasrseData(byte[] bytes) { if (null == bytes) return; if (bytes.length == 5 && bytes[0] == 0x6e && bytes[1] == 0x01 && bytes[2] == 0x00 && bytes[4] == (byte) 0x8f) { // 电量返回的结果 } else if ((bytes.length == 6) && bytes[0] == 0x6e && bytes[1] == 0x01 && bytes[2] == 0x01 && bytes[5] == (byte) 0x8f) { // 响应消息应答,具体看通讯协议 tv_log.append( "解析数据 收到应答 ,命令码: 0x" + String.format("%02x", bytes[3]) + " 结果: " + showResult(bytes[4]) + "\n"); switch (bytes[3]) { case 0x15: // 时间时间返回 tv_log.append("设置12小时制,Km显示\n"); mBluetoothLeService.setTimeType(false, true, false, false, 0); // 设置12小时制,Km显示 break; case 0x34: // 时间格式和距离单位设置返回 tv_log.append("删除7:10分的一个提醒\n"); mBluetoothLeService.deleteAReminder(7, 10); // 删除7:10分的一个提醒 break; case 0x09: // 删除提醒返回 tv_log.append("添加一个 7:10清醒的提醒(星期一和星期三)\n"); mBluetoothLeService.addAReminder(4, 7, 10, "00000011"); // 添加一个 7:10清醒的提醒(星期一和星期三) break; case 0x40: // 添加提醒返回 tv_log.append("设置 个人信息 男 19880214, 身高170 体重60\n"); mBluetoothLeService.SynPersonData(0, 1988, 2, 14, 170, 60); // 设置 个人信息 男 19880214, 身高170 体重60 break; case 0x0c: // 设置个人信息返回 tv_log.append("设置目标10000步\n"); mBluetoothLeService.setGoalSteps(10000); // 设置目标10000步 break; case 0x32: tv_log.append("获取当日运动汇总\n"); mBluetoothLeService.getSportDataTotal(); break; case 0x0d: // 目标设置完成 tv_log.append("设置自动删除数据模式\n"); mBluetoothLeService.setManualMode(3); break; case 0x06: // 运动详细数据传输完成返回 tv_log.append("获取运动详细数据完成\n"); break; default: break; } } else if (bytes.length == 24 && bytes[0] == 0x6e && bytes[2] == 0x04 && bytes[23] == (byte) 0x8f) { tv_log.append("获取的DN号为:" + ProtocolParser.parseDeviceDN(bytes) + "\n"); tv_log.append("发送同步时间命令\n"); mBluetoothLeService.setSynTime(); } else if (bytes.length == 20 && bytes[0] == 0x6e && bytes[1] == 0x01 && bytes[2] == 0x0F && bytes[19] == (byte) 0x8f) { // 运动汇总数据返回 SportsData sData = ProtocolParser.parseSportTotalData(bytes); if (null == sData) { tv_log.append("获取运动汇总数据为空\n"); } else { tv_log.append("获取运动汇总数据: 步数:" + sData.steps + " ,卡路里: " + sData.cal + " \n"); } tv_log.append("获取运动明细数据..\n"); mBluetoothLeService.getSportDataDetail(); // 获取运动明细数据 } else if ((bytes.length == 21 && bytes[0] == 0x6e && bytes[2] == 0x05 && bytes[20] == (byte) 0x8f) // L28S/C返回 || (bytes.length == 19 && bytes[0] == 0x6e && bytes[2] == 0x05 // L11/L28T/W/H 返回 && bytes[18] == (byte) 0x8f)) { // 运动详细数据返回 SportsData sData = ProtocolParser.parseSportDetailData(bytes); if (null == sData) { tv_log.append("获取运动详细数据为空\n"); } else { tv_log.append("获取运动详细数据: 步数:" + sData.steps + " ,卡路里: " + sData.cal + " \n"); } } }