蓝牙、wifi连接相关资料

wifi连接部分:

6.0之后,wifi连接和蓝牙连接都需要获取位置权限

权限注册:

<!--wifi-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

监听wifi状态广播,连接成功后,再获取数据

参考:

public static final String TAG = "WifiActivity";
    private Button check_wifi, open_wifi, close_wifi, scan_wifi;
    private ListView mlistView;
    protected WifiUtil mWifiAdmin;
    private List<ScanResult> mWifiList;
    public int level;
    protected String ssid;

@Override
protected void beforeLayout() {
    super.beforeLayout();
    mWifiAdmin = new WifiUtil(WifiActivity.this);
    PermissionGen.with(WifiActivity.this)
            .addRequestCode(100)
            .permissions(
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_WIFI_STATE
            )
            .request();
    IntentFilter filter = new IntentFilter(
            WifiManager.NETWORK_STATE_CHANGED_ACTION);
    //="android.net.wifi.STATE_CHANGE"  监听wifi状态的变化
    registerReceiver(mReceiver, filter);
}

@Override
protected void initView() {

    initViews();

    mlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            AlertDialog.Builder alert = new AlertDialog.Builder(WifiActivity.this);
            ssid = mWifiList.get(position).SSID;
            alert.setTitle(ssid);
            alert.setMessage("输入密码");
            final EditText et_password = new EditText(WifiActivity.this);
            final SharedPreferences preferences = getSharedPreferences("wifi_password", Context.MODE_PRIVATE);
            et_password.setText(preferences.getString(ssid, ""));
            alert.setView(et_password);
            //alert.setView(view1);
            alert.setPositiveButton("连接", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String pw = et_password.getText().toString();
                    if (null == pw || pw.length() < 8) {
                        Toast.makeText(WifiActivity.this, "密码至少8位", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    SharedPreferences.Editor editor = preferences.edit();
                    editor.putString(ssid, pw);   //保存密码
                    editor.commit();
                    mWifiAdmin.addNetwork(mWifiAdmin.CreateWifiInfo(ssid, et_password.getText().toString(), 3));
                }
            });
            alert.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //
                    //mWifiAdmin.removeWifi(mWifiAdmin.getNetworkId());
                }
            });
            alert.create();
            alert.show();

        }
    });
}


/*
 * 控件初始化
 * */
private void initViews() {
    check_wifi = (Button) findViewById(R.id.check_wifi);
    open_wifi = (Button) findViewById(R.id.open_wifi);
    close_wifi = (Button) findViewById(R.id.close_wifi);
    scan_wifi = (Button) findViewById(R.id.scan_wifi);
    mlistView = (ListView) findViewById(R.id.wifi_list);
    check_wifi.setOnClickListener(WifiActivity.this);
    open_wifi.setOnClickListener(WifiActivity.this);
    close_wifi.setOnClickListener(WifiActivity.this);
    scan_wifi.setOnClickListener(WifiActivity.this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.check_wifi:
//                mWifiAdmin.checkState(WifiActivity.this);

            Log.d("TAG", "===>" + mWifiAdmin.getConfiguration().size());
            for (int i = 0; i < mWifiAdmin.getConfiguration().size(); i++) {
                Log.d("TAG", "===>" + mWifiAdmin.getConfiguration().get(i).SSID);
            }
            break;
        case R.id.open_wifi:
            mWifiAdmin.openWifi(WifiActivity.this);
            break;
        case R.id.close_wifi:
            mWifiAdmin.closeWifi(WifiActivity.this);
            break;
        case R.id.scan_wifi:
            mWifiAdmin.startScan(WifiActivity.this);
            mWifiList = mWifiAdmin.getWifiList();
            if (mWifiList != null) {
                mlistView.setAdapter(new MyAdapter(this, mWifiList));
                new Utility().setListViewHeightBasedOnChildren(mlistView);
            }
            break;
        default:
            break;
    }
}

public class MyAdapter extends BaseAdapter {
    LayoutInflater inflater;
    List<ScanResult> list;

    public MyAdapter(Context context, List<ScanResult> list) {
        this.inflater = LayoutInflater.from(context);
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @SuppressLint({"ViewHolder", "InflateParams"})
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        view = inflater.inflate(R.layout.wifi_listitem, null);
        ScanResult scanResult = list.get(position);
        TextView wifi_ssid = (TextView) view.findViewById(R.id.ssid);
        ImageView wifi_level = (ImageView) view.findViewById(R.id.wifi_level);
        wifi_ssid.setText(scanResult.SSID);
        Log.i(TAG, "scanResult.SSID=" + scanResult);
        level = WifiManager.calculateSignalLevel(scanResult.level, 5);

        if (scanResult.capabilities.contains("WEP") || scanResult.capabilities.contains("PSK") ||
                scanResult.capabilities.contains("EAP")) {
            wifi_level.setImageResource(R.drawable.wifi_signal_lock);
        } else {
            wifi_level.setImageResource(R.drawable.wifi_signal_open);
        }
        wifi_level.setImageLevel(level);
        //判断信号强度,显示对应的指示图标
        return view;
    }
}

/*设置listview的高度*/
public class Utility {
    public void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return;
        }
        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }
}

//监听wifi状态
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (wifiInfo.isConnected()) {
            WifiManager wifiManager = (WifiManager) context
                    .getSystemService(Context.WIFI_SERVICE);
            String wifiSSID = wifiManager.getConnectionInfo()
                    .getSSID();
            Toast.makeText(context, wifiSSID + "连接成功", Toast.LENGTH_SHORT).show();

            WifiInfo mWifiInfo = wifiManager.getConnectionInfo();
            if (null != mWifiInfo && null != mWifiInfo.getSSID()) {
                String info = "getSSID()=" + mWifiInfo.getSSID() + "\n"
                        + "getBSSID()=" + mWifiInfo.getBSSID() + "\n"
                        + "getHiddenSSID()=" + mWifiInfo.getHiddenSSID() + "\n"
                        + "getLinkSpeed()=" + mWifiInfo.getLinkSpeed() + "\n"
                        + "getMacAddress()=" + mWifiInfo.getMacAddress() + "\n"
                        + "getNetworkId()=" + mWifiInfo.getNetworkId() + "\n"
                        + "getRssi()=" + mWifiInfo.getRssi() + "\n"
                        + "getSupplicantState()=" + mWifiInfo.getSupplicantState() + "\n"
                        + "getDetailedStateOf()=" + mWifiInfo.getDetailedStateOf(mWifiInfo.getSupplicantState());
                //mTVWifiInfo.setText(info);
            } else {
                //mTVWifiInfo.setText("没有连接到wifi");
            }
        }


//            filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
//            final String action = intent.getAction();
//            // wifi已成功扫描到可用wifi。
//            if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
////                Log.d(TAG, "接收到" + DateUtils.getCurrentDateString());
////                mScanResults = mWifiManager.getScanResults();
////                Log.d(TAG, "mScanResults.size()===" + mScanResults.size());
//
//                Log.d("TAG", "wifi已成功扫描到可用wifi");
//            }
//            //系统wifi的状态
//            else if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
//                int wifiState = intent.getIntExtra(
//                        WifiManager.EXTRA_WIFI_STATE, 0);
//                switch (wifiState) {
//                    case WifiManager.WIFI_STATE_ENABLED:
////                        Log.d(TAG, "WiFi已启用" + DateUtils.getCurrentTime());
////                        mWifiManager.startScan(); <<<这里
//                        Log.d("TAG", "WiFi已启用");
//                        break;
//                    case WifiManager.WIFI_STATE_DISABLED:
////                        Log.d(TAG, "Wifi已关闭" + DateUtils.getCurrentTime());
//                        Log.d("TAG", "Wifi已关闭");
//                        break;
//                }
//            }
    }

};
Android wifi连接,怎么监控密码错误,正在连接,连接成功
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); //信号强度变化
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); //网络状态变化
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); //wifi状态,是否连上,密码
mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);  //是不是正在获得IP地址
mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);//连上与否
用这些广播,你再看看广播的内容就搞得定了。


if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
LogLazy.e("wifi密码错误广播");
int linkWifiResult = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 123);
if (linkWifiResult == WifiManager.ERROR_AUTHENTICATING) {
toast("密码错误");
}
}

连接成功获取的ssid带"",搜索的ssid不带""

 

蓝牙部分:

1.BLE是蓝牙4.0里面的低功耗规范,Android 4.3以上的系统开始搭载BLE模块

2.不排除某些特殊设备的定制系统去除了BLE模块的情况,使用之前可以先判断当前设备是否支持BLE,再进行后续操作。蓝牙设备相关程序必须使用真机才能运行。

3.蓝牙操作与硬件关联很大,开发过程中要保持和硬件协议的沟通,某些问题的解决需要硬件方面做一些适配。

4.BLE的MTU(最大传输单元)是20字节,即一次最多能发送20个字节,若超过20个字节,建议采用分包传输的方式。

5.两次操作之间最好间隔一小段时间,如100ms(具体时间可以根据自己实际蓝牙外设自行尝试延长或缩短)。举例,连接成功之后,延迟100ms进行notify,成功之后延迟100ms进行write,write成功之后,notify的数据回调接口将返回外设传输过来的数据。

6.连接过程中,假如外设突然中断(或关闭)了蓝牙,Android设备维持的BLE连接并不会马上回调onDisConnected方法,而是会延迟一段时间才会通知连接断开,开发时需注意,假如对实时性要求较高的程序,可能需要借助其他辅助方法来判断设备是否中断,比如心跳包等。

7.蓝牙应用开发中,存在两种角色,分别是central和peripheral ,中文就是中心和外设。比如手机去连接智能设备,那手机就是central,智能设备就是peripheral。

8.连接之后的操作有:write,read,notify,indicate,response or not等。indicate和notify的区别就在于,indicate是一定会收到数据,notify有可能会丢失数据(不会有central收到数据的回应),write也分为response和no response,如果是response,那么write成功回收到peripheral的确认消息,但是会降低写入的速率,换一个角度说就是 write no response写的速率更快。

9.连接断开之后可以根据实际情况进行重连,但如果是连接失败的情况,建议不要立即重连,而是调用void closeBluetoothGatt()清空一下状态,并延迟一段时间等待复位,否则会把gatt阻塞,导致手机不重启蓝牙就再也无法连接任何设备的严重情况。

10.调用bleManager.closeBluetoothGatt()之后,最好不要紧接着调用bleManager = null,因为Android原生蓝牙API中的gatt.close()方法需要一段时间保证完成,我们建议延迟一段时间。延时操作在Android蓝牙开发中是一个重要的技巧。

11.很多Android设备是可以强制打开用户手机蓝牙的,打开蓝牙需要一段时间(部分手机上需要向用户请求)。虽然时间比较短,但也不能调用完打开蓝牙方法后直接去调用扫描方法,此时蓝牙多半是还未开启完毕状态。建议的做法是维持一个蓝牙状态的广播,调用打开蓝牙方法后,在一段时间内阻塞线程,如果在这段时间内收到蓝牙打开广播后,再进行后续操作。而后续操作过程中,如果收到蓝牙正在关闭或关闭的广播,也可以及时对当前的情况做一个妥善处理。

 

蓝牙地址是00:00:00:00:00:00什么意思:mac = 12:C6:3D:C7:70:C9

那是MAC,也就是物理地址的意思。

也叫硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。IP地址与MAC地址在计算机里都是以二进制表示的,IP地址是32位的,而MAC地址则是48位的。MAC地址的长度为48位(6个字节),通常表示为12个16进制数,每2个16进制数之间用冒号隔开,如:08:00:20:0A:8C:6D就是一个MAC地址,其中前6位16进制数08:00:20代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后3位16进制数0A:8C:6D代表该制造商所制造的某个网络产品(如网卡)的系列号。只要你不去更改自己的MAC地址,那么你的MAC地址在世界是惟一的。

 

rssi:接收信号强度指示

 

注意:

1、android4.3-5.0之间,蓝牙搜索api与5.0之后蓝牙搜索api不同

2、6.0之后需要gps位置服务,估计是与蓝牙的信号范围有关系

 

止鼾枕:

MCU:硬件设备简称

CMD:命令字 如0x02

 

蓝牙只能传输字节数组。。。

 

一个蓝牙设备只能被一台手机连接(连接后就被占用了),而一台手机可以同时连接多个蓝牙设备

发布了104 篇原创文章 · 获赞 5 · 访问量 3万+
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览