Android 蓝牙上

前几天虽然讲述下团结当起定义表单中之跳过程被URL参数传递的拍卖。

Android 蓝牙上


  通常之开中,我们开展URL传参时,肯定还会面定义一个起含义之参数名叫,让接受页面去Request获取,这从没问题,但一旦是以由定义表单中,参数的名称上相似还碰面比的永恒,系统识其它名目无非就是那么约定好的部分,所以不能重新通过还多的&符号来间隔的传递参数,这该怎么着处理为?大家可约定一定的格式,将参数举行数组化,通过固定的参数称呼传递,样子如下:PPI_ID|PPI20100304001,PSF_ID|PSF20101210002。

攻由

上单礼拜集团如付出个简易的五子棋游戏!其中一个要求便是永葆蓝牙对阵!所以苦逼的本身学蓝牙方面的学识了!

  这样的参数名即简练而容易书写,而且系统可以很好之识别,很扎眼的观参数是通过”,”将逐一参数举行分隔,再经”|”将参数名和参数值分隔,至于以URL中之名即便吓自名叫了,就深受其Param了。

简介

  • Bluetooth是眼下动最广泛的无线通讯协议,远距离无线通讯的正规化。传说瑞典暴发个上特别好吃蓝莓导致自己之齿每日都是紫色之,在他执政期间及时号太岁相当擅长交际,能说会合暨,和邻国的打得干分外好,这些Bluetooth的发明者觉得蓝牙它的意向就是是在将远距离互换周围的设施,跟这多少个上很相近,于是从名叫蓝牙。

  • 要对短距离设备通讯(10米)

  • 无线动圈耳机,无线鼠标,无线键盘

  以收到页的处理者,在此间是通过单独的参数近似来处理的,因为系统遭到之表单参数仍然经就类格局传送,所以用到之地点得不行多,将参数功用独立化,也是大便宜之,统一之法子去分析表单参数,更好的保障其。直接贴下代码吧:

Android 中之运

/// <summary>
      /// 参数分隔辅助类,样式如:PPI_ID|PPI,PSF_ID|PSF,
      /// 提供对参数的分解及返回键值列表信息
      /// </summary>
      [Serializable]
      public class SplitParam
      {
          /// <summary>
          /// 参数字符串
         /// </summary>
         /// <param name="param"></param>
         public SplitParam(string param)
         {
             this.Param = param;
         }

         public override string ToString()
         {
             return Param;
         }

         private string _param = string.Empty;
         /// <summary>
         /// 参数字符串
         /// </summary>
         public string Param
         {
             get { return _param; }
             private set
             {
                 if (!string.IsNullOrEmpty(value))
                 {
                     _param = value;
                 }
             }
         }

         /// <summary>
         /// 保存解析过的参数列表
         /// </summary>
         private Dictionary<string, string> _paramList = null;

         /// <summary>
         /// 获取解析后的参数列表信息,可用于参数替换等
         /// </summary>
         /// <returns></returns>
         public Dictionary<string, string> GetParamList()
         {
             if (_paramList == null)
             {
                 _paramList = new Dictionary<string, string>();
                 string[] listA = _param.Split('|');
                 if (listA == null || listA.Length == 0)
                 {
                     return _paramList;
                 }

                 string[] listB;
                 foreach (string item in listA)
                 {
                     if (!string.IsNullOrEmpty(item))
                     {
                         listB = item.Split(',');
                         if (listB != null & listB.Length > 1)
                         {
                             _paramList.Add(listB[0], listB[1]);
                         }
                     }
                 }
             }
             return _paramList;
         }

         /// <summary>
         /// 根据键值获取获取值
         /// </summary>
         /// <param name="key"></param>
         /// <returns></returns>
         public string GetValueByKey(string key)
         {
             GetParamList();
             if (_paramList != null && _paramList.ContainsKey(key))
             {
                 return _paramList[key];
             }
             return "";
         }

蓝牙 API 简单简介

  • BluetoothAdapter (蓝牙本土适配器)
  1. cancelDiscovery() 结束当前找蓝牙的 Task
  2. disable() 关闭蓝牙
  3. enable() 打开蓝牙
  4. getAddress() 拿到当地蓝牙适配器的地点
  5. getBondedDevices() 获得已经绑定的碧蓝牙的设施
  6. getDefaultAdapter() 拿到当地蓝牙适配器
  7. getName() 得到当地蓝牙的名号
  8. getRemoteDevice(byte[] address) 得到远程蓝牙设备
  9. getRemoteDevice(String address) 得到远程蓝牙设备
  10. isEnabled() 判断蓝牙是否打开
  11. setName(String name) 设置蓝牙名
  12. startDiscovery() 先导搜多附近蓝牙
  13. listenUsingInsecureRfcommWithServiceRecord(String name, UUID uuid)
    创建 BluetoothServerSocket
  • BluetoothDevice
  1. createBond() 蓝牙配对 (低版本不帮忙,>=api19)
  2. createRfcommSocketToServiceRecord(UUID uuid) 创建 BluetoothSocket
  3. getBondState() 拿到配对之状态
  4. getAddress() 得到远程蓝牙适配器的地点
  5. getName() 拿到远程蓝牙的名
  • BluetoothSocket 与 BluetoothServerSocket

立有限只 API 和Socket 和ServerSocket 差不多 这里不予介绍

*** 当然矣,Android
中蓝牙相关的API还广大!这里自己仅说了几乎个常因而底!!!! ***

  

Android 中之实战

** 现在大家便比如常规的逻辑来移动! **

string str = “PPI_ID|PPI20100304001,PSF_ID|PSF20101210002”;
Response.Write(new
SplitParam(str).GetValueByKey(“PPI_ID”));//结果:PPI20100304001

第一步

咱俩只要优先抱 蓝牙本地适配器,来判断设备是否襄助蓝牙!

    mAdapter=BluetoothAdapter.getDefaultAdapter();
    //判断设备是否支持蓝牙
    if (mAdapter==null){
        Toast.makeText(this, "不支持蓝牙", Toast.LENGTH_SHORT).show();
    }

简介
在C#着,Dictionary提供高效的因全职的元素查找。当你出过多素的时光可采取它们。它包含在System.Collections.Generic名空间受到。

第二步

好了!现在下要做的虽是判定蓝牙是否打开了!没有打开则打开!

    if (!mAdapter.isEnabled()){//蓝牙没有打开
      //  mAdapter.enable();//不支持这样写,影响用户体验

        //建议使用这种方式
        Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(intent, 200);
    }

代码写得死去活来知!我便不讲啊!!!

在利用前,你要注脚其的键类型和值类型。

第三步

马到成功打开蓝牙之后,要记挂旁人的适配上会察觉,大家得装蓝牙的可见性,现在己即便来安装蓝牙的可见性!看代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode==200){
        Intent dis=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        dis.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
        startActivity(dis);
    }
}

不知我们发没发出在意到,我是以
onActivityResult(int requestCode, int resultCode, Intent data)
那么些回调函数中装置蓝牙可见性的!因为大家当开拓蓝牙的下用了
startActivityForResult(Intent intent,int requestCode)
这多少个艺术!还有一些豪门为要小心
就是蓝牙在安可见性的早晚,有个时常。就是其一字段
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION
对应之值!那多少个极大值是300秒!

详细表明
务必包含名为空间System.Collection.Generic 
Dictionary里面的各种一个因素仍旧一个键值对(由二只要素构成:键和值) 
键必须是绝无仅有的,而值不需要唯一的 
键和值都可以是另外项目(比如:string, int, 自定义类型,等等) 
经过一个键读取一个价的年华是接近O(1) 
键值对中的偏序可以无定义 
创制与起初化一个Dictionary对象
Dictionary myDictionary = new Dictionary();
引用:http://www.cnblogs.com/henw/archive/2011/05/15/2046758.html

第四步

由来,大家便可以寻找附近的碧蓝牙啊!那么有同学会问了,我们怎么知道暴发配备为搜寻到啊?这个坏简短哦!但我们探寻到装备的时光,系统就是会面吃大家发送广播啦!大家唯有注册个广播接收器就执行啊!

  mAdapter.startDiscovery();//开始搜索

 //注册蓝牙广播接收器。
 IntentFilter filter = new IntentFilter();
 filter.addAction(BluetoothDevice.ACTION_FOUND);//发现蓝牙动作
 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索结束动作
 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);//搜素开始动作
 registerReceiver(blueReceiver, filter);

 /**
 * 蓝牙接收器
 **/
public class BlueReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)) {
            BluetoothDevice device =                        intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            deviceList.add(device);
            adapter.notifyDataSetChanged();
        }
        if (intent.getAction().equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {

        }
        if (intent.getAction().equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {

        }
    }
}

BlueReceiver
中我只是简短的将搜索到得设备放置集合中。被没开了多之操作!

第五步

前些天至了较重大之手续了!当我们寻找到了蓝牙的下,我假若配对,因为只有以交配以后才可以连续哦!

  BluetoothDevice device = (BluetoothDevice) adapter.getItem(i);
  if (device.getBondState() == BluetoothDevice.BOND_BONDED) {//是否已配对
         connect(device);
   } else {

              try {
                Method boned=device.getClass().getMethod("createBond");
                boolean isok= (boolean) boned.invoke(device);
                if(isok)
                {
                     connect(device);
                }
              } catch (Exception e) {
                     e.printStackTrace();

              }

  }

此,我思注脚的凡就是是以此配对,在 API19 之后 createBond()
Android对外提供了是法子!但是当 API19
先并从未供者办法,所以呢我只得用反射了!这一个兼容性相比好奥!!

第六步

近年来,就怪简答啦!只要连就尽呐!在此我放在了一个线程中了!

private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device) {
        mmDevice = device;
        BluetoothSocket tmp = null;

        try {
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) {
            Log.e(TAG, "create() failed", e);
        }
        mmSocket = tmp;
    }

    @Override
    public void run() {
        Log.i(TAG, "BEGIN mConnectThread");
        setName("ConnectThread");

        mAdapter.cancelDiscovery();
        try {

            mmSocket.connect();

        } catch (IOException e) {
            connectionFailed();
            try {
                mmSocket.close();
            } catch (IOException e2) {
                Log.e(TAG, "unable to close() socket during connection failure", e2);
            }
            BlueToothService.this.start();
            return;
        }

        synchronized (BlueToothService.this) {
            mConnectThread = null;
        }

        connected(mmSocket, mmDevice);//这里是另外一个读取数据的线程,这里就和socket操作一样了
        write("start".getBytes());
    }

    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) {
            Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}

** 好啊!如若你念到此 就吧就算学会了蓝牙的简操作了! **

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图