MainActivity.java 5.59 KB
package com.metroapp;

import android.annotation.TargetApi;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

import com.facebook.react.ReactActivity;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.metroapp.bean.ScanResultBean;
import com.metroapp.nativemodules.BluetoothModule;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends ReactActivity {

    /**
     * Returns the name of the main component registered from JavaScript.
     * This is used to schedule rendering of the component.
     */
    @Override
    protected String getMainComponentName() {
        return "metroApp";
    }


    // 本地蓝牙适配器
    private BluetoothAdapter mBluetoothAdapter;
    private static ScanResultBean scanResultBean = null;
    private static  MainActivity _this;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        _this = this;
        initBluetooth();
        startTimer(10*1000);
    }

    @TargetApi(22)
    public void initBluetooth(){

        BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);//这里与标准蓝牙略有不同
        mBluetoothAdapter = bluetoothManager.getAdapter();

        if (mBluetoothAdapter == null){
            Toast.makeText(MainActivity.this,"该手机暂无蓝牙设备",Toast.LENGTH_SHORT).show();
            return;
        }
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {//小于18
            Toast.makeText(MainActivity.this,"该手机暂不支持蓝牙4.0",Toast.LENGTH_SHORT).show();
            return;
        }

        if (!mBluetoothAdapter.isEnabled()) {
            mBluetoothAdapter.enable();
        }
        mBluetoothAdapter.startLeScan(mLeScanCallback);
    }


    private static  int lastRSS =-9999;//上一个rss值
    private static String UUID ="E2C56DB5-DFFB-48D2-B060-D0F5A71096E0";

    private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {

        @Override
        public void onLeScan(final BluetoothDevice device, final int rssi,
                             final byte[] scanRecord) {
            int startByte = 4;

            String  scanRecordhex=bytesToHex(scanRecord);
            String hexString = scanRecordhex.substring(18,50);
            // ibeacon的UUID值
            String uuid = hexString.substring(0, 8) + "-"
                    + hexString.substring(8, 12) + "-"
                    + hexString.substring(12, 16) + "-"
                    + hexString.substring(16, 20) + "-"
                    + hexString.substring(20, 32);
            int major = Integer.valueOf(scanRecordhex.substring(50,54),16);
            int minor = Integer.valueOf(scanRecordhex.substring(54,58),16);
            String ibeaconName = device.getName()==null?"null":device.getName();
            String mac = device.getAddress();
            int txPower = (scanRecord[startByte + 24]);
            if (uuid.equalsIgnoreCase(UUID)){//扫描到了
                if (rssi >=lastRSS){
                    if (scanResultBean == null){
                        scanResultBean = new ScanResultBean();
                    }
                    scanResultBean.setDeviceCode(uuid+"|"+major+"|"+minor);
                    scanResultBean.setRss(rssi+"");

                    lastRSS = rssi;
                }

            }
        }
    };

    static final char[] hexArray = "0123456789ABCDEF".toCharArray();

    private static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for (int j = 0; j < bytes.length; j++) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }





    private static Timer timer = new Timer();
    private static Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // 要做的事情
            super.handleMessage(msg);
            if (msg.what == 1){

                if (scanResultBean ==null){
                    scanResultBean = new ScanResultBean();
                    scanResultBean.setRss("");
                    scanResultBean.setDeviceCode("");
                }
                WritableMap et= Arguments.createMap();
                System.out.println("===>deviceCode"+scanResultBean.getDeviceCode());
                et.putString("deviceCode",scanResultBean.getDeviceCode());
                et.putString("rss",scanResultBean.getRss());
                BluetoothModule.sendEvent("BlueToolData",et);
                resetData();

            }

        }
    };


    public static void resetData(){
        lastRSS =-9999;
        scanResultBean = null;
    }

    /**
     * 开启定时器
     * @param period
     */
    public static void startTimer(long period){
        if (timer ==null){
            timer = new Timer();
        }
        timer.schedule(task, 0, period);
    }

    /**
     * 关闭定时器
     */
    public static void stopTimer(){
        if (timer !=null){
            timer.cancel();
        }

    }

    private static TimerTask task = new TimerTask() {
        @Override
        public void run() {
            Message message = new Message();
            message.what = 1;
            handler.sendMessage(message);
        }
    };


}