`
在下个路口
  • 浏览: 111277 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Android 蓝牙编程控制机器人

阅读更多
        暑假的缘故,博客很久没更新了。开学这一个星期以来,接触了一些新的东西,就是通过蓝牙连接控制机器人,确实很多东西都比较陌生,在网上花费了大量的时间来找资料,好在到今天已经实现了初步的功能。
           

        所需的知识:
            蓝牙是一种支持设备短距离传输数据的无线技术。android在2.0以后提供了这方面的支持。在蓝牙编程里面主要用到的有以下几个类:
          (1) BluetoothAdapter类:代表了一个本地的蓝牙适配器。它是所有蓝牙交互的的入口点。利用它你可以发现其他蓝牙设备,查询绑定了的设备,使用已知的MAC地址实例化一个蓝牙设备和建立一个BluetoothServerSocket(作为服务器端)来监听来自其他设备的连接。
           (2)BluetoothDevice类:代表了一个远端的蓝牙设备,使用它请求远端蓝牙设备连接或者获取远端蓝牙设备的名称、地址、种类和绑定状态。(其信息是封装在bluetoothsocket中)。
          (3) Bluetoothsocket类:代表了一个蓝牙套接字的接口(类似于tcp中的套接字),它是应用程序通过输入、输出流与其他蓝牙设备通信的连接点。
           (4)Blueboothserversocket类:代表打开服务连接来监听可能到来的连接请求(属于server端),为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。当远端设备发起连接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket类将会返回一个bluetoothsocket。
          (5) Bluetoothclass类: 描述了一个蓝牙设备的一般特点和能力。它的只读属性集定义了设备的主、次设备类和一些相关服务。然而,它并没有准确地描述所有该设备所支持的蓝牙文件和服务,而是作为对设备种类来说的一个小小暗示。


        一:Android的Activity的创建。
                这个相信接触Android的人都懂的怎么创建一个自己喜欢的Activity,怎么使自己的界面美观。代码方面主要是XML文件的编写,创建一些组件,并且给每个组件添加相应的ID号,以便添加监听。

        二:添加权限,蓝牙编程需添加两个权限。
               在manifest中配置
       Xml代码 
<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

   
       三:启动蓝牙\关闭蓝牙。
           //创建蓝牙适配器对象   在这里为了在另外的Activity中使用,我设为了静态
static BluetoothAdapter adapter =BluetoothAdapter.getDefaultAdapter();
       //等于10表示蓝牙处于关闭状态  
       if (adapter.getState()=10)
               adapter.enable(); //开启蓝牙
          }
      if (adapter.getState()==12){//等于12表示蓝牙处于开启状态
             adapter.disable();   //关闭蓝牙
           }
   
      启动蓝牙与关闭蓝牙各自在开启\关闭按钮里的OnclickListener监听中操作。

      
         四:搜索蓝牙设备。
                这里可以分为几个小方面:
    (1)使本机蓝牙处于可见(即处于易被搜索到状态),便于其他设备发现本机蓝牙            
    //使本机蓝牙在300秒内可被搜索           发现蓝牙设备
   //使本机蓝牙在300秒内可被搜索           发现蓝牙设备
         
//使本机蓝牙在300秒内可被搜索           发现蓝牙设备
         private void ensureDiscoverable() { 
            if (MainActivity.adapter.getScanMode() != 
             BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
  //使自己设备能被发现
     [align=center]
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
             discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
             startActivity(discoverableIntent); 
         } 
}  }  [/align]                     

            在点击搜索按钮时调用此方法,此时系统会弹出询问框。
      
        (2)查找设备
            //搜索设备
     private  BroadcastReceiver mReceiver = new BroadcastReceiver(){
private ListView bluetooth_list;
   @Override 
          public void onReceive(Context context, Intent intent) {
       //搜索新设备
System.out.println("onReceive..........") mNewDevicesArrayAdapter=new ArrayAdapter<String>(context, 0);
          String action = intent.getAction(); 
if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
   device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
System.out.println("name="+device.getName()+"  address="+device.getAddress());
//将设备名添加到list中,以便之后显示在列表上
                  list.add(device.getName());
        // 已经配对的则跳过 
        if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
          //保存设备地址与名字 
mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); 
      } 
        }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
           //搜索结束 
        if (mNewDevicesArrayAdapter.getCount()== 0) {  
    mNewDevicesArrayAdapter.add("没有搜索到设备"); 
                }                 
             }      

通过Adapter.startDiscovery();搜索设备,要获得此搜索的结果需要注册 一个BroadcastReceiver来获取。先注册再获取信息,然后在OnReceive方法中处理
       注册广播
      //注册,当一个设备被发现时调用onReceive 
  IntentFilter filter = new IntentFilt(BluetoothDevice.ACTION_FOUND);
     this.registerReceiver(mReceiver, filter);
          
         //当搜索结束后调用onReceive 
      filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
        this.registerReceiver(mReceiver, filter);


       用完之后得注销广播,一般在OnCreat()中创建,在OnDestroy()中销毁
                this.unregisterReceiver(mReceiver);//销毁广播

           五:蓝牙配对
               利用反射机制调用系统隐藏方法creatBond()配对
 
BluetoothDevice d = MainActivity.adapter.getRemoteDevice(device.getAddress());
        try {

//反射机制调用隐藏方法createBond
Method method_bond = BluetoothDevice.class.getMethod("createBond");
boolean bool= (Boolean)method_bond.invoke(d);     //返回bool值
Toast.makeText(BluetoothActivity.this, "bool="+bool, 3).show();

} catch (Exception e) {
e.printStackTrace();
}
      
 

           
             六:连接蓝牙

             在广播OnReceive()中对蓝牙配对状态进行监听
        
if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){
            //创建 BluetoothDevice对象
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        //获取配对状态
          int state = device.getBondState();
       switch(state){
      case BluetoothDevice.BOND_NONE
          break;
      case BluetoothDevice.BOND_BONDING:
           
           break;
      case BluetoothDevice.BOND_BONDED:
        }
  

        当检测到配对状态为BOND_BONDED,即配对成功时,开始连接,连接代码
               
try {
UUID uuid = UUID.fromString(SPP_UUID);
//createRfcommSocketToServiceRecord创建一个socket对象
BluetoothSocket bs = device.createRfcommSocketToServiceRecord(uuid); Toast.makeText(BluetoothActivity.this, "正在连接..", 3).show();
                   bs.connect();
            }catch (IOException e) {   e.printStackTrace();
}
   
        其中uuid我是在代码中直接给定的,uuid有很多种不同类型,可以查表得。 [static final String SPP_UUID = "00001101-0000-1000-800000805F9B34FB";  给定全局静态      此为文件传输型uuid

          七:传输数据
       private class ConnectedThread extends Thread {
      private final BluetoothSocket mmSocket;
      private final InputStream mmInStream;
      private final OutputStream mmOutStream;
      public ConnectedThread(BluetoothSocket socket) {
         mmSocket = socket;
         InputStream tmpIn = null;
          OutputStream tmpOut = null;
       // Get the input and output streams, using temp objects because
       // member streams are final
         try {
             tmpIn = socket.getInputStream();
             tmpOut = socket.getOutputStream();
         } catch (IOException e) { }
         mmInStream = tmpIn;
         mmOutStream = tmpOut;
     }

    public void run() {
       byte[] buffer = new byte[1024];  // buffer store for the stream
         int bytes; // bytes returned from read()
       // Keep listening to the InputStream until an exception occurs
         while (true) {
             try {
                 // Read from the InputStream
                 bytes = mmInStream.read(buffer);
                 // Send the obtained bytes to the UI Activity
              mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
             } catch (IOException e) {
                 break;
             }
         }
     }

/* Call this from the main Activity to send data to the remote device */
     public void write(byte[] bytes) {
         try {
             mmOutStream.write(bytes);
         } catch (IOException e) { }     }

/* Call this from the main Activity to shutdown the connection */
     public void cancel() {
         try {
             mmSocket.close();
         } catch (IOException e) { }
     }
}

     
        传输数据主要涉及文件的读写,
              tmpIn = socket.getInputStream();
             tmpOut = socket.getOutputStream();

         主要为这两行代码

  
         到这里蓝牙的基本功能就完成了。
         现在还有控制机器人的具体指令没有实现,需再接再厉,早日完成这个项目。


分享到:
评论

相关推荐

    基于Android和云技术的语音控制机器人

    "基于Android和云技术的语音控制机器人"项目就是一个很好的例子,它将Android平台的便利性和云服务的强大功能整合在一起,实现了通过语音指令对机器人进行远程控制。下面将详细介绍这个项目的相关知识点。 首先,...

    成功实现手机蓝牙控制智能小车机器人!视频+程序源代码(Android).doc

    Android 手机蓝牙控制智能小车机器人的实现对大家来说是一个很有挑战性的任务,但是通过这篇文章,我们可以看到作者经过努力和研究,最终成功实现了这个项目。下面我们将对这个项目的关键技术点进行详细的分析和总结...

    Android蓝牙控制Lego NXT的例子

    在本文中,我们将深入探讨如何使用Android设备通过蓝牙来控制乐高NXT(Lego NXT)机器人。Android蓝牙控制Lego ...通过这个例子,开发者不仅可以学习到Android蓝牙通信的知识,还可以探索机器人控制和交互设计的领域。

    Android手机控制球形机器人实验设计与实现.pdf

    在本实验中,Android手机作为控制终端,通过蓝牙与球形机器人进行通信,发送指令以控制机器人的运动。开发者需要具备Java编程技能,因为Android应用主要是用Java语言编写的。理解Android的生命周期管理和UI设计原则...

    Android系统协同LEGO机器人工作关键技术研究.pdf

    这项技术研究的关键部分主要包括蓝牙通信技术、传感器扩展技术以及语音识别控制技术,这些技术的深入研究和应用,有望使Android系统与LEGO机器人产品在功能上实现互补和统一。 首先,蓝牙通信技术使Android设备能够...

    电信设备-基于Android的小型移动机器人控制系统.zip

    《基于Android的小型移动机器人控制系统》 在当前的科技领域,智能机器人技术正在快速发展,而Android系统的广泛应用为其提供了广阔的发展空间。本资料主要探讨的是如何利用Android系统构建一个小型移动机器人的...

    基于Android的小型移动机器人远程控制系统设计.pdf

    本设计主要解决传统机器人控制终端灵活性不足的问题,利用Android移动平台,构建了一个高效、便捷的远程控制系统。 该系统由三部分组成:小型移动机器人、无线通信模块和Android平台。小型移动机器人是执行任务的...

    基于Android的移动机器人开发.pdf

    1. UI设计:Android Studio提供了丰富的界面元素和布局工具,用于创建用户友好的机器人控制界面。用户可以通过触摸屏控制机器人的移动方向、速度,或者设置预设的行动模式。 2. 传感器集成:Android设备内置多种...

    适用于Android设备的Arduino蓝牙机器人-项目开发

    1. `the_code.ino` - 这是一个Arduino编程的源代码文件,很可能包含了实现蓝牙通信、机器人控制逻辑和可能的传感器交互的代码。Arduino IDE使用INO格式的文件进行编程,因此,通过分析这个文件,我们可以深入了解...

    基于安卓平台的机器人控制

    总结,基于安卓平台的机器人控制项目涉及到多个技术领域,包括安卓应用开发、蓝牙通信、机器人控制以及微控制器编程。通过将这些技术融合,我们可以实现远程操控iRobot Create机器人进行移动,并通过机械臂完成物体...

    STM32+Android实现的智能家政机器人电路代码论文.zip

    标题中的“STM32+Android实现的智能家政机器人电路代码论文”表明这是一个结合了微控制器STM32和Android系统的智能家居应用项目,涉及到硬件电路设计、嵌入式编程以及移动应用开发。STM32是基于ARM Cortex-M内核的微...

    基于Android控制的乒乓球捡拾机器人设计.pdf

    该机器人采用蓝牙技术实现近程无线通信,通过Android设备发送控制信号,而嵌入式设备端接收这些信号后执行相应的动作,使得机器人能够实现无线控制、球体导流、快速批量回收以及全向快速移动等功能。在实际的测试中...

    机器人手机编程系统设计.pdf

    Android系统在移动设备中的广泛应用,使其成为控制和编程机器人的一种便捷工具。由于Android设备的普及和用户友好界面,可以开发出能够通过Android平台实现机器人控制的应用程序。 2. ARM核心控制板: 文档中提到的...

    【毕业设计】基于arduino的蓝牙扫地机器人.zip

    【毕业设计】基于arduino的蓝牙扫地机器人的项目是一次将硬件编程与物联网技术结合的实践,主要利用arduino开发板来实现对扫地机器人的控制。这个设计涉及到多个IT领域的知识点,包括微控制器编程、无线通信、传感器...

    Android 串口编程

    在实际应用中,Android串口编程常用于物联网设备的控制,比如通过蓝牙串口连接智能硬件,或者在Android平板电脑上控制机器人等。此外,它还可以用于调试目的,如查看设备底层的日志输出。 需要注意的是,不是所有的...

    android机器人技术讲稿.rar

    2. **Android硬件接口**:Android设备通常拥有多种传感器,如加速度计、陀螺仪、磁力计等,这些硬件接口在机器人控制中至关重要。理解如何获取和处理这些传感器的数据是构建智能行为的关键。 3. **蓝牙与WiFi通信**...

    phone_android:用于控制机器人的 Android 应用程序开发

    对于机器人控制应用,可能需要声明特殊的硬件访问权限,如蓝牙或网络通信,以便与机器人进行数据交换。 2. **Activity**:Activity是Android应用中的一个关键组件,代表用户界面的一个屏幕。在机器人控制应用中,...

Global site tag (gtag.js) - Google Analytics