美文网首页
蓝牙发送数据和接收数据

蓝牙发送数据和接收数据

作者: 金卡戴珊ugly | 来源:发表于2019-04-17 10:29 被阅读0次

    蓝牙通信代码片段记录

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
    public class MassageFragment extends BaseBleFragment {
        private int selectPosition=5;//选中档位默认5
        private String addressDev;
        boolean openOrClose = false;
        private boolean isOpenClicked;//用作设备无响应提示
        private OpenBleHelper mOpenBleHelper;
    
        private static MyUIHandler mUIHandler;
    
        private static class MyUIHandler extends UIHandler<MassageFragment> {
            MyUIHandler(MassageFragment cls) {
                super(cls);
            }
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                MassageFragment activity = ref.get();
                if (activity != null) {
                    if (activity.getActivity()!=null&&activity.getActivity().isFinishing()) return;
                    switch (msg.what) {
                        case 0:
                            //8秒后,未搜索到设备,重试
                            if(!LinkState.getInstance().getState()){
                                BluetoothLeService.ME.close();
                                activity.bleModel.connectDevice(activity.addressDev);
                            }
                            break;
                        case 1:
                            activity.initBleComponent(activity.addressDev);//用于写数据
                            break;
                    }
                }
            }
        }
    
        @Override
        protected void initView(View view) {
            listenBroadcastBle();//监听蓝牙状态切换,重新连接蓝牙设备
            if(getArguments()!=null){//获取蓝牙data
                String bleData = getArguments().getString("bleData");
                addressDev = getArguments().getString("addressDev");
                if(bleData !=null && addressDev!=null){
                    showData(bleData);
                    mUIHandler.sendEmptyMessageDelayed(1,500);//延迟500毫秒
                } else {//此时是,有缓存的情况。在此我们判断蓝牙状态,开启服务,根据缓存的address,连接设备
                    addressDev = SharePerferenceHelper.createSharePerference("private").getString("address","");
                    initBleComponent(addressDev);//用于写数据
                    if (mOpenBleHelper.isBleEnable()) {
                        bleModel.connectDevice(addressDev);
                        mUIHandler.sendEmptyMessageDelayed(0,8*1000);//8秒后重试
                    }
                }
            }
            WaveView_top_left.setDrawProcessText(false);
            WaveView_top_right.setDrawProcessText(false);
            WaveView_bottom_left.setDrawProcessText(false);
            WaveView_bottom_right.setDrawProcessText(false);
    
            //取缓存的档位设置到控件中
            int degreeProgress = SharePerferenceHelper.createSharePerference("private").getInt("massageDegree",5);
            seekBar.setProgress(degreeProgress);
            seekBar.setEnabled(false);
        }
    
        private void listenBroadcastBle() {
            mOpenBleHelper = new OpenBleHelper(getActivity());
            if (!mOpenBleHelper.isBleEnable()) {
                mOpenBleHelper.setListener(bleStatusChangedListener);
            }
        }
    
        OpenBleHelper.OnBleStatusChangedListener bleStatusChangedListener = new OpenBleHelper.OnBleStatusChangedListener() {
            @Override
            public void onBleOpened() {
                mOpenBleHelper.setListener(null);
                bleModel.connectDevice(addressDev);//连接蓝牙设备
                mUIHandler.sendEmptyMessageDelayed(0,8*1000);//8秒后重试
            }
            @Override
            public void onBleClosed() {
                toast(getStringByResource(R.string.not_check_ble_open));
            }
            @Override
            public void onUnSupportBle() {
                mOpenBleHelper.setListener(null);
                toast(getStringByResource(R.string.unsupport_ble));
            }
        };
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = super.onCreateView(inflater, container, savedInstanceState);
            unbinder = ButterKnife.bind(this, rootView);
            seekBar.setOnSeekChangeListener(new OnSeekChangeListener() {
                @Override
                public void onSeeking(SeekParams seekParams) {
                    selectPosition = seekParams.thumbPosition+1;
                }
                @Override
                public void onStartTrackingTouch(IndicatorSeekBar seekBar) {
                }
                @Override
                public void onStopTrackingTouch(IndicatorSeekBar seekBar) {
                    //在此处做一个判断,提交数据,设置档位值
                    changeGearPosition(selectPosition);
                }
            });
            return rootView;
        }
    
        //写数据得到回调
        @Override
        public void showData(String data, String address) {
            super.showData(data, address);
    
            showData(data);//得到通知
    
            //有数据返回说明连接成功
            LinkState.getInstance().setState(true);
            //通知mainActivity更新状态图片
            EventBus.getDefault().post(new StateImgEvent(true));
        }
    
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onEvent(MassageEvent event) {
            if(seekBar!=null) {
                seekBar.showIndicator(event.getSelected());
            }
            if (event.getSelected()) {
                initBleComponent(addressDev);//重复监听
            }
        }
    
        //实现与腰部支撑的互斥
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onEvent(MassageOrLumbarMassageEvent event) {
            if(!event.isMassage() && openOrClose){
                openOrClose = false;
                TextView_enter.setSelected(false);
                TextView_enter.setText("开始");
                stopAnimation();
                seekBar.setEnabled(openOrClose);
            }
        }
    
        //删除设备,断开连接的通知
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onEvent(BleDisconnectEvent event) {
            bleModel.disconnectDevice(addressDev);
            bleModel.releaseActivity();
            bleModel.finish();
        }
    
        @OnClick({R.id.TextView_enter})
        public void onViewClicked(View view) {
            switch (view.getId()) {
                case R.id.TextView_enter:
                    //设置开关状态
                    massageOpenClose();
                    break;
            }
        }
    
        //解析蓝牙数据,并赋值给view
        public void showData(String data) {
            byte[] dataByte = ConvertUtils.hexStringToBytes(data);
            if (dataByte[0] == 0x55 && dataByte[1] == 0x01) {
                //设置按摩开关状态
                if (dataByte[2] == 0x01) {
                    openOrClose = true;
                    TextView_enter.setSelected(true);
                    TextView_enter.setText("关闭");
                    startAnimation();
                } else {
                    openOrClose = false;
                    TextView_enter.setSelected(false);
                    TextView_enter.setText("开始");
                    stopAnimation();
                }
                //通知service当前状态改变了
                EventBus.getDefault().post(new MassageOpenEvent(dataByte[2] == 0x01));
                //设置档位值
                int pro;
                if(dataByte[3]==10){
                    pro = 100;
                }else{
                    pro = dataByte[3]*10-10;
                }
                //缓存档位值在sp中
                SharePerferenceHelper.createSharePerference("private").putInt("massageDegree",pro);
                selectPosition = dataByte[3];
                seekBar.setProgress(pro);
                //开关未打开时,换挡控件是禁用的。
                seekBar.setEnabled(openOrClose);
            }
            //收到多次蓝牙数据,第二次的数据传递给腰部支撑fragment
            if(dataByte[0] == 0x55 && dataByte[1] == 0x03){
                EventBus.getDefault().post(new BleDataEvent(data));
            }
            //收到多次蓝牙数据,第三次的数据传递给加热fragment
            if(dataByte[0] == 0x55 && dataByte[1] == 0x05){
                EventBus.getDefault().post(new BleHeatingDataEvent(data));
            }
            //收到多次蓝牙数据,第四次的数据传递给通风fragment
            if(dataByte[0] == 0x55 && dataByte[1] == 0x06){
                EventBus.getDefault().post(new BleVentilationDataEvent(data));
            }
            isOpenClicked=false;
        }
    
        public void massageOpenClose() {
            openOrClose=!openOrClose;
            byte[] warmParams = new byte[5];
            warmParams[0] = 0x55;
            warmParams[1] = 0x01;
            if (openOrClose) {//开始
                warmParams[2] = 0x01;
                EventBus.getDefault().post(new MassageOrLumbarLumbarEvent(true));//通知腰部支撑页
            } else {//停止
                warmParams[2] = 0x00;
            }
            warmParams[3] = (byte) selectPosition;
            String str = HexDump.getBCC(warmParams);
            Integer in = Integer.valueOf(str,16);
            warmParams[4] = (byte) (int) in;
    //        byte[] sendData = ConvertUtils.getXORData(warmParams);
    //        if (sendData == null) return;
            blePresenter.writeData(warmParams, addressDev,true);
            isOpenClicked = true;
            //添加设备无响应的提示
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    if(isOpenClicked){
                        ToastUtils.makeText("设备无响应。");
                        openOrClose=!openOrClose;
                    }
                }
            },2000);
        }
    
        public void changeGearPosition(int position) {
            byte[] warmParams = new byte[5];
            warmParams[0] = 0x55;
            warmParams[1] = 0x02;
            warmParams[2] = 0x01;
            warmParams[3] = (byte) (position);
            String str = HexDump.getBCC(warmParams);
            Integer in = Integer.valueOf(str,16);
            warmParams[4] = (byte) (int) in;
            byte[] sendData = ConvertUtils.getXORData(warmParams);
            if (sendData == null) return;
            blePresenter.writeData(sendData, addressDev,true);
        }
    
        private void startAnimation() {
            WaveView_top_left.setProgressWithAnim(1, 12000);
            WaveView_top_right.setProgressWithAnim(1, 12000);
            WaveView_bottom_left.setProgressWithAnim(1, 12000);
            WaveView_bottom_right.setProgressWithAnim(1, 12000);
        }
    
        private void stopAnimation() {
            WaveView_top_left.setAnimationStop();
            WaveView_top_right.setAnimationStop();
            WaveView_bottom_left.setAnimationStop();
            WaveView_bottom_right.setAnimationStop();
        }
    }
    

    OpenBleHelper.java

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public class OpenBleHelper {
    
        private static final String TAG = "OpenBleHelper";
        private static final boolean DEBUG = true;
    
        private static final int REQUEST_CODE_ENABLE_BLE = 0X330;
        private static final int ON_REQUEST_OPEN_BLE_DELAY_CHECK = 6 * 1000;
    
        private FragmentActivity mActivity;
        private BleHelperFragment mBleHelperFragment;
        private BluetoothAdapter bluetoothAdapter;
        private BleStatusBroadCastReciver mReciver;
        private OnBleStatusChangedListener mListener;
        private Handler mMainHandler;
    
        public OpenBleHelper(FragmentActivity activity) {
            mActivity = activity;
            init();
        }
    
        private void init() {
            mBleHelperFragment = getBleFragment(mActivity);
            mBleHelperFragment.setBleHelper(this);
            BluetoothManager bluetoothManager = (BluetoothManager) mActivity.getApplicationContext()
                    .getSystemService(Context.BLUETOOTH_SERVICE);
            bluetoothAdapter = bluetoothManager.getAdapter();
            mReciver = new BleStatusBroadCastReciver(mActivity, this);
            mReciver.regiseter();
            mMainHandler = new Handler();
        }
    
        private BleHelperFragment getBleFragment(FragmentActivity activity) {
            FragmentManager fragmentManager = activity.getSupportFragmentManager();
            BleHelperFragment fragment = (BleHelperFragment) fragmentManager.findFragmentByTag(BleHelperFragment.TAG);
            if (fragment == null) {
                fragment = new BleHelperFragment();
                fragmentManager.beginTransaction().add(fragment, BleHelperFragment.TAG).commit();
            }
            return fragment;
        }
    
        public void setListener(OnBleStatusChangedListener listener) {
            mListener = listener;
        }
    
        /**
         * 开启蓝牙
         */
        public void openBle() {
            if (isSupportBle()) {
                if (isBleEnable()) {
                    dispatchOnBleOpened();
                } else {
                    requestOpenBle();
                }
            } else {
                dispatchUnSupportBle();
            }
        }
    
        /**
         * 判断当前是否支持蓝牙
         */
        public boolean isSupportBle() {
            return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2
                    && mActivity.getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
        }
    
        /**
         * 判断蓝牙是否已开启
         */
        public boolean isBleEnable() {
            if (bluetoothAdapter != null) {
                return bluetoothAdapter.isEnabled();
            }
            return false;
        }
    
        //通过intent的方式去请求开启蓝牙
        private void requestOpenBle() {
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (isIntentAvailable(mActivity, intent)) {
                mBleHelperFragment.startActivityForResult(intent, REQUEST_CODE_ENABLE_BLE);
            } else {
                dispatchOnBleClosed();
            }
        }
    
        //检测Intent 是否有效
        private boolean isIntentAvailable(Context context, Intent intent) {
            if (context == null) {
                return false;
            }
            PackageManager pm = context.getPackageManager();
            List<ResolveInfo> resolves = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            return resolves != null && !resolves.isEmpty();
        }
    
        //主线程中传递蓝牙已开启回调
        private void dispatchOnBleOpened() {
            if (mListener != null && mMainHandler != null) {
                mMainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mListener.onBleOpened();
                    }
                });
            }
        }
    
        //主线程中传递蓝牙已关闭回调
        private void dispatchOnBleClosed() {
            if (mListener != null && mMainHandler != null) {
                mMainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mListener.onBleClosed();
                    }
                });
            }
        }
    
        //主线程中传递不支持蓝牙
        private void dispatchUnSupportBle() {
            if (mListener != null && mMainHandler != null) {
                mMainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mListener.onUnSupportBle();
                    }
                });
            }
        }
    
        /**
         * 系统弹窗申请开启蓝牙之后,延时一段时间检查蓝牙的开启状态,避免用户点击拒绝而无响应
         */
        private void onRequestResultDelayCheckBleStatus() {
            if (mMainHandler != null) {
                mMainHandler.removeCallbacksAndMessages(null);
                mMainHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (isBleEnable()) {
                            dispatchOnBleOpened();
                        } else {
                            dispatchOnBleClosed();
                        }
                    }
                }, ON_REQUEST_OPEN_BLE_DELAY_CHECK);
            }
        }
    
        /**
         * 移除延迟检测
         */
        private void removeOnRequestResultDelayCheckBleStatus() {
            if (mMainHandler != null) {
                mMainHandler.removeCallbacksAndMessages(null);
            }
        }
    
        /**
         * 会自动释放
         */
        protected void release() {
            if (mBleHelperFragment != null) {
                mBleHelperFragment.release();
                mBleHelperFragment = null;
            }
            if (mReciver != null) {
                mReciver.release();
                mReciver = null;
            }
            if (mMainHandler != null) {
                mMainHandler.removeCallbacksAndMessages(null);
                mMainHandler = null;
            }
            mListener = null;
            bluetoothAdapter = null;
            mActivity = null;
        }
    
        @SuppressLint("ValidFragment")
        public static class BleHelperFragment extends Fragment {
    
            private static final String TAG = "com.lib.fast.helper.OpenBleHelper.BleHelperFragment";
    
            OpenBleHelper mBleHelper;
    
            private void setBleHelper(OpenBleHelper helper) {
                mBleHelper = helper;
            }
    
            @Override
            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (requestCode == REQUEST_CODE_ENABLE_BLE) {
                    d("use request open ble, activity result");
                    mBleHelper.onRequestResultDelayCheckBleStatus();
                }
            }
    
            private void release() {
                mBleHelper = null;
            }
    
            @Override
            public void onDestroy() {
                super.onDestroy();
                mBleHelper.release();
            }
        }
    
        //监听蓝牙开启状态广播
        private class BleStatusBroadCastReciver extends BroadcastReceiver {
    
            private Context mContext;
            private OpenBleHelper mOpenBleHelper;
            private boolean isRegisted;
            private String[] boradcasts = new String[]{BluetoothAdapter.ACTION_STATE_CHANGED};
    
            private BleStatusBroadCastReciver(Context context, OpenBleHelper openBleHelper) {
                mContext = context.getApplicationContext();
                mOpenBleHelper = openBleHelper;
            }
    
            public void regiseter() {
                if (!isRegisted) {
                    IntentFilter intentFilter = new IntentFilter();
                    for (String action : boradcasts) {
                        intentFilter.addAction(action);
                    }
                    mContext.registerReceiver(this, intentFilter);
                    isRegisted = true;
                }
            }
    
            public void unRegister() {
                if (isRegisted) {
                    mContext.unregisterReceiver(this);
                    isRegisted = false;
                }
            }
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
                    mOpenBleHelper.removeOnRequestResultDelayCheckBleStatus();
                    int bleStatus = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
                    if (bleStatus == BluetoothAdapter.STATE_ON) {
                        mOpenBleHelper.dispatchOnBleOpened();
                    } else if (bleStatus == BluetoothAdapter.STATE_OFF) {
                        mOpenBleHelper.dispatchOnBleClosed();
                    }
                }
            }
    
            public void release() {
                unRegister();
                mOpenBleHelper = null;
                mContext = null;
            }
        }
    
        private static void d(String msg, Object... args) {
            if (DEBUG) {
                Log.d(TAG, String.format(msg, args));
            }
        }
    
        public interface OnBleStatusChangedListener {
    
            /**
             * 蓝牙已开启
             */
            void onBleOpened();
    
            /**
             * 蓝牙已关闭或者开启失败
             */
            void onBleClosed();
    
            void onUnSupportBle();
        }
    
    }
    

    HexDump.java

    /**
     * Clone of Android's HexDump class, for use in debugging. Cosmetic changes
     * only.十六进制数据操作
     */
    public class HexDump {
        private final static char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
                '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    
        /**
         * 转换为字符串
         */
        public static String dumpHexString(byte[] array) {
            return dumpHexString(array, 0, array.length);
        }
    
        /**
         * 转换为字符串
         */
        public static String dumpHexString(byte[] array, int offset, int length) {
            return bytesToHexFun1(array, offset, length);
        }
    
        /**
         * 格式化数组输出
         */
        public static String toHexString(byte b) {
            return toHexString(toByteArray(b));
        }
    
        /**
         * 格式化数组输出
         */
        public static String toHexString(byte[] array) {
            return toHexString(array, 0, array.length);
        }
    
        /**格式化数组输出*/
        public static String toHexString(byte[] array, int offset, int length) {
            return bytesToHexFun2(array, offset, length);
        }
    
        private static String byteToHexFun3(byte[] array, int offset, int length) {
            StringBuilder result = new StringBuilder();
    
            byte[] line = new byte[16];
            int lineIndex = 0;
    
            result.append("0x");
            result.append(toHexString(offset));
    
            for (int i = offset; i < offset + length; i++) {
                if (lineIndex == 16) {
                    result.append(" ");
    
                    for (int j = 0; j < 16; j++) {
                        if (line[j] > ' ' && line[j] < '~') {
                            result.append(new String(line, j, 1));
                        } else {
                            result.append(".");
                        }
                    }
    
                    result.append("\n0x");
                    result.append(toHexString(i));
                    lineIndex = 0;
                }
    
                byte b = array[i];
                result.append(" ");
                result.append(HEX_DIGITS[(b >>> 4) & 0x0F]);
                result.append(HEX_DIGITS[b & 0x0F]);
    
                line[lineIndex++] = b;
            }
    
            if (lineIndex != 16) {
                int count = (16 - lineIndex) * 3;
                count++;
                for (int i = 0; i < count; i++) {
                    result.append(" ");
                }
    
                for (int i = 0; i < lineIndex; i++) {
                    if (line[i] > ' ' && line[i] < '~') {
                        result.append(new String(line, i, 1));
                    } else {
                        result.append(".");
                    }
                }
            }
    
            return result.toString();
        }
    
        private static String bytesToHexFun1(byte[] array, int offset, int length) {
            char[] buf = new char[length * 2];
    
            int bufIndex = 0;
            for (int i = offset; i < offset + length; i++) {
                byte b = array[i];
                buf[bufIndex++] = HEX_DIGITS[(b >>> 4) & 0x0F];
                buf[bufIndex++] = HEX_DIGITS[b & 0x0F];
            }
    
            return new String(buf);
        }
    
        /**
         * byte[] to hex string
         *
         * @param bytes
         * @return
         */
        private static String bytesToHexFun2(byte[] bytes, int offset, int length) {
            StringBuffer buf = new StringBuffer();
            buf.append("[ ");
            for (int i = offset; i < offset + length; i++) {
                byte b = bytes[i];
                buf.append(String.format("%02x ", new Integer(b & 0xff)).toUpperCase());
                if ((i - offset + 1) % 4 == 0) {
                    buf.append(" ");
                }
            }
            buf.append("]");
            return buf.toString();
        }
    
        public static String toHexString(int i) {
            return toHexString(toByteArray(i));
        }
    
        public static String toHexString(short i) {
            return toHexString(toByteArray(i));
        }
    
        public static byte[] toByteArray(byte b) {
            byte[] array = new byte[1];
            array[0] = b;
            return array;
        }
    
        public static byte[] toByteArray(int i) {
            byte[] array = new byte[4];
    
            array[3] = (byte) (i & 0xFF);
            array[2] = (byte) ((i >> 8) & 0xFF);
            array[1] = (byte) ((i >> 16) & 0xFF);
            array[0] = (byte) ((i >> 24) & 0xFF);
    
            return array;
        }
    
        public static byte[] shortToByteArray(short s) {
            byte[] array = new byte[]{(byte) s};
            return array;
        }
    
        public static byte intToByte(int i) {
            byte b = (byte) i;
            return b;
        }
    
        public static byte[] toByteArray(short i) {
            byte[] array = new byte[2];
    
            array[1] = (byte) (i & 0xFF);
            array[0] = (byte) ((i >> 8) & 0xFF);
    
            return array;
        }
    
        private static int toByte(char c) {
            if (c >= '0' && c <= '9')
                return (c - '0');
            if (c >= 'A' && c <= 'F')
                return (c - 'A' + 10);
            if (c >= 'a' && c <= 'f')
                return (c - 'a' + 10);
    
            throw new RuntimeException("Invalid hex char '" + c + "'");
        }
    
        public static byte[] hexStringToByteArray(String hexString) {
            int length = hexString.length();
            byte[] buffer = new byte[length / 2];
    
            for (int i = 0; i < length; i += 2) {
                buffer[i / 2] = (byte) ((toByte(hexString.charAt(i)) << 4) | toByte(hexString
                        .charAt(i + 1)));
            }
            return buffer;
        }
    
        /**
         * 手机号码验证
         *
         * @param mobiles
         * @return
         */
        public static boolean isMobileNO(String mobiles) {
    //      Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
            Pattern p = Pattern.compile("^1[3|4|5|8][0-9]\\d{8}$");
    
            Matcher m = p.matcher(mobiles);
            return m.matches();
        }
    
        /**
         * md5加密方法
         *
         * @param info 密码源
         * @return
         */
        public static String getMD5(String info) {
            try {
                MessageDigest md5 = MessageDigest.getInstance("MD5");
                md5.update(info.getBytes("UTF-8"));
                byte[] encryption = md5.digest();
    
                StringBuffer strBuf = new StringBuffer();
                for (int i = 0; i < encryption.length; i++) {
                    if (Integer.toHexString(0xff & encryption[i]).length() == 1) {
                        strBuf.append("0").append(Integer.toHexString(0xff & encryption[i]));
                    } else {
                        strBuf.append(Integer.toHexString(0xff & encryption[i]));
                    }
                }
    
                return strBuf.toString();
            } catch (NoSuchAlgorithmException e) {
                return "";
            } catch (UnsupportedEncodingException e) {
                return "";
            }
        }
    
        /**
         * 异或和
         */
    
        private static final char[] bcdLookup = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        private static final int REQUEST_CONNECT_DEVICE = 1;
        private static final int REQUEST_ENABLE_BT = 2;
        public static final int MESSAGE_DEVICE_NAME = 4;
    
    
        public static String XORAnd(byte[] bytes) {
            int str = 0;
            for (int i = 0; i < bytes.length; i++) {
                str ^= Integer.valueOf((bcdLookup[(bytes[i] >>> MESSAGE_DEVICE_NAME) & 15] + "" + bcdLookup[bytes[i] & 15] + ""), 16);
            }
            return Integer.toHexString(str);
        }
    
        /**
         * 比较两个byte[]时候一致
         */
        public static boolean bytesEquals(byte[] bs1, byte[] bs2) {
            if (bs1 == null || bs2 == null || bs1.length != bs2.length) return false;
            if (bs1.length == 0 && bs1.length == bs2.length) return true;
            for (int i = 0; i < bs1.length; i++) {
                if (bs1[i] != bs2[i]) return false;
            }
            return true;
        }
    
        public static boolean bytesStartWith(byte[] fromBytes, byte[] toBytes) {
            if (fromBytes == null || toBytes == null || fromBytes.length < toBytes.length) return false;
            for (int i = 0; i < toBytes.length; i++) {
                if (fromBytes[i] != toBytes[i]) return false;
            }
            return true;
        }
    
        public static boolean bytesEndWith(byte[] fromBytes, byte[] toBytes) {
            if (fromBytes == null || toBytes == null || fromBytes.length < toBytes.length) return false;
            for (int i = 1; i <= toBytes.length; i++) {
                if (fromBytes[fromBytes.length - i] != toBytes[toBytes.length - i]) return false;
            }
            return true;
        }
    
        /**
         * 获取高四位
         */
        public static int getHeight4(byte data) {
            int height;
            height = ((data & 0xf0) >> 4);
            return height;
        }
    
        /**
         * 获取低四位
         */
        public static int getLow4(byte data) {
            int low;
            low = (data & 0x0f);
            return low;
        }
    
        public static String getBCC(byte[] data) {
            try{
                String ret = "";
                byte BCC[]= new byte[1];
                for(int i=0;i<data.length;i++)
                {
                    BCC[0]=(byte) (BCC[0] ^ data[i]);
                }
                String hex = Integer.toHexString(BCC[0] & 0xFF);
                if (hex.length() == 1) {
                    hex = '0' + hex;
                }
                ret += hex.toUpperCase();
                return ret;
            } catch(Exception e){
                e.printStackTrace();
                return "";
            }
        }
    
        /**
         * bytes字符串转换为Byte值
         * @param src Byte字符串,每个Byte之间没有分隔符
         * @return byte[]
         */
        public static byte[] hexStr2Bytes(String src)
        {
            int m=0,n=0;
            int l=src.length()/2;
            System.out.println(l);
            byte[] ret = new byte[l];
            for (int i = 0; i < l; i++)
            {
                m=i*2+1;
                n=m+1;
                ret[i] = Byte.decode("0x" + src.substring(i*2, m) + src.substring(m,n));
            }
            return ret;
        }
    
    }
    

    相关文章

      网友评论

          本文标题:蓝牙发送数据和接收数据

          本文链接:https://www.haomeiwen.com/subject/bzrgwqtx.html