android蓝牙控制PC端代码分享

引言

在安卓端通过蓝牙发送指令到PC端,java程序接收指令,并执行相应的动作。其中指令格式有所规范,PC端的java程序通过robot库进行操作

代码

控制类remotePC.java

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.IOException;

public class remotePC {
  //保存当前鼠标指针的坐标(px,py)
  private static int px;
  private static int py;
  //最大延迟时间:1秒
  public static final int MAX_DELAY = 1000;
  //最小间隔时间:1毫秒
  public static final int SAMPLE_TIME_DIV = 1;
  //魔法数字,用于设置默认的事件delay时间间隔
  private final double magicX = 1.0;
  //视觉延迟:默认100ms
  private final int VISIBAL_MOVEMENT = 100;
  //PC屏幕尺寸
  private int screenWidth;
  private int screenHeight;
  //手机屏幕尺寸
  private int mobileWidth;
  private int mobileHeight;
  //手机电脑尺寸转换的比例
  private double widScale;
  private double heiScale;
  //用于控制的robot类
  private Robot robot;

  //默认构造函数
  public remotePC() throws AWTException{
    this(1366, 768);
  }
  //构造函数,指定手机屏幕尺寸
  public remotePC(int mobileWidth, int mobileHeight) throws AWTException{
    robot = new Robot();
    robot.setAutoDelay((int)magicX);
    setScreenSize();
    this.mobileHeight = mobileHeight;
    this.mobileWidth = mobileWidth;
    setScale();
  }
  public void moveToCenter(){
    this.move(screenWidth/2, screenHeight/2, 1);
  }
  //[鼠标光标移动]
  //dt:间隔时间,时间长短对应速度
  //dx,dy:手机上移动的相对横纵位移,自动转换为pc上应该移动的尺寸
  public void move(int dx, int dy, int dt){
    double deltaX = (1.0*dx/widScale);
    double deltaY = (1.0*dy/heiScale);
    int dxpms = (int)deltaX/dt;
    int dypms = (int)deltaY/dt;
    for(int i=0; i<dt; i++){
      px += dxpms;
      py += dypms;
      if(px <= 0){
        px = 0;
      }else if(px >= screenWidth){
        px = screenWidth;
      }
      if(py <= 0){
        py = 0;
      }else if(py >= screenHeight){
        py = screenHeight;
      }
      robot.mouseMove((int)px, (int)py);
    }
  }
  //[按下鼠标左键]
  public void pressMouseL(){
    robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
  }
  //[释放鼠标左键]
  public void releaseMouseL(){
    robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
  }
  //[点击一下鼠标左键]
  public void clickMouseL(){
    this.pressMouseL();
    this.releaseMouseL();
  }
  //[按下鼠标右键]
  public void pressMouseR(){
    robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
  }
  //[释放鼠标右键]
  public void releaseMouseR(){
    robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
  }
  //[点击鼠标右键]
  public void clickMouseR(){
    this.pressMouseR();
    this.releaseMouseR();
  }
  //[按下滚轮]
  public void pressWheel(){
    robot.mousePress(InputEvent.BUTTON2_DOWN_MASK);
  }
  //[释放滚轮]
  public void releaseWheel(){
    robot.mouseRelease(InputEvent.BUTTON2_DOWN_MASK);
  }
  //[滚轮往下移动]:step是移动步数,相对于滚轮的一格
  public void wheelDown(int step){
    for(int i=0; i<step; i++){
      robot.mouseWheel(1);
    }
  }
  //[滚轮往上移动]:step是移动步数,相对于滚轮的一格
  public void wheelUp(int step){
    for(int i=0; i<step; i++){
      robot.mouseWheel(-1);
    }
  }
  //[敲一格字符:A-Z]:c为字母的char类型字符,必须是大写的
  public void printChar(char c){
    if(c <= 'Z' && c >= 'A'){
      robot.keyPress((int)c);
      robot.keyRelease((int)c);
    }
  }
  //[敲一个空格]
  public void printSpace(){
    robot.keyPress(KeyEvent.VK_SPACE);
    robot.keyRelease(KeyEvent.VK_SPACE);
  }
  //[放大]相当于ctrl+滚轮上移
  public void zoomIn(int step){
    robot.keyPress(KeyEvent.VK_CONTROL);
    for(int i=0; i<step; i++)
      robot.mouseWheel(-1);
    robot.keyRelease(KeyEvent.VK_CONTROL);
  }
  //[缩小]相当于ctrl+滚轮下移
  public void zoomOut(int step){
    robot.keyPress(KeyEvent.VK_CONTROL);
    for(int i=0; i<step; i++)
      robot.mouseWheel(1);
    robot.keyRelease(KeyEvent.VK_CONTROL);
  }
  //[显示app切换栏]相当于alt+tab,并且alt不放开,一旦调用该函数后,需要手动调用closeSwitchApps()来释放alt按键
  public void showSwitchApps(){
    robot.keyPress(KeyEvent.VK_ALT);
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
    //robot.keyRelease(KeyEvent.VK_ALT);
  }
  //[app向右切换]相当于在按了alt+tab的情况下再按一次tab
  public void tabRight(){
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
  }
  //[app向左切换]相当于在按了alt+tab的情况下再按一次shift+tab
  public void tabLeft(){
    robot.keyPress(KeyEvent.VK_SHIFT);
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_SHIFT);
  }
  //[关闭app切换栏]在使用showSwitchApps()后必须调用该函数来释放alt
  public void closeSwitchApps(){
    robot.keyRelease(KeyEvent.VK_ALT);
  }
  //[app回切/左切一次]:按下shift+alt+tab,并释放
  public void simpleLeftSwitchApp(){
    this.showSwitchApps();
    this.delay(VISIBAL_MOVEMENT);
    this.tabLeft();
    this.tabLeft();
    this.delay(VISIBAL_MOVEMENT);
    this.closeSwitchApps();
  }
  //[app切换/右切一次]:按下alt+tab,并释放
  public void simpleRightSwitchApp(){
    this.showSwitchApps();
    this.delay(VISIBAL_MOVEMENT);
    this.closeSwitchApps();
  }
  //[显示当前window下所有app]:相当于window+tab
  public void listAppsWindow(){
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[显示桌面/隐藏app]:相当于window+M
  public void showDesktop(){
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_M);
    robot.keyRelease(KeyEvent.VK_M);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[当前窗口最大化]:相当于window+UP
  public void windowUp(){
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_UP);
    robot.keyRelease(KeyEvent.VK_UP);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[取消当前窗口最大化]:相当于window+DOWN
  public void windowDown(){
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_DOWN);
    robot.keyRelease(KeyEvent.VK_DOWN);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[窗口置于左侧/多窗口并排]:相当于window+LEFT
  public void windowLeft(){
    //TODO: window + Left
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_LEFT);
    robot.keyRelease(KeyEvent.VK_LEFT);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[窗口置于右侧/多窗口并排]:相当于window+RIGHT
  public void windowRight(){
    //TODO: window + Right
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_RIGHT);
    robot.keyRelease(KeyEvent.VK_RIGHT);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[切换桌面:左切]:window+control+left
  public void leftSwitchWindow(){
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_LEFT);
    robot.keyRelease(KeyEvent.VK_LEFT);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[切换桌面:右切]:window+control+right
  public void rightSwitchWindow(){
    robot.keyPress(KeyEvent.VK_WINDOWS);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_RIGHT);
    robot.keyRelease(KeyEvent.VK_RIGHT);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_WINDOWS);
  }
  //[快速打开记事本]
  public void openNotepad(){
    try {
      Runtime.getRuntime().exec("notepad");
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  //[快速打开画图板]
  public void openPaint(){
    try {
      Runtime.getRuntime().exec("mspaint");
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  //[ppt笔]
  public void setDraw(){
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_P);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_P);
  }
  //[ppt激光笔]
  public void setLaser(){
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_L);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_L);
  }
  //[ppt荧光笔]
  public void setMark(){
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_I);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_I);
  }
  //[ppt隐藏鼠标]
  public void hideMouse(){
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_H);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyRelease(KeyEvent.VK_H);
  }
  //[ppt 上一张]
  public void prevSlide(){
    robot.keyPress(KeyEvent.VK_LEFT);
    robot.keyRelease(KeyEvent.VK_LEFT);
  }
  //[ppt 下一张]
  public void nextSlide(){
    robot.keyPress(KeyEvent.VK_RIGHT);
    robot.keyRelease(KeyEvent.VK_RIGHT);
  }
  //延迟函数,延迟ms个毫秒
  public void delay(int ms){
    robot.delay(ms);
  }
  //获得当前PC屏幕的尺寸
  public void setScreenSize(){
    Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();

    screenWidth = (int)screensize.getWidth();
    screenHeight = (int)screensize.getHeight();
  }
  //打印当前PC屏幕的尺寸
  public String getScreenInfo(){
    return "screenSize:"+screenWidth+"*"+screenHeight;
  }
  //设置手机和PC屏幕尺寸的转换比
  private void setScale(){
    heiScale = -1.0 / 1.5;
    widScale = 1.0 / 3.0;
  }

}

PC端通过蓝牙和安卓app交互:BluetoothServer.java

/**
 * Created by luyudi on 2016/11/9.
 * Modified by Lannooo on 2016/12/4.
 */
// server
import java.awt.*;
import java.io.InputStream;
import java.io.IOException;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;

public class BlueToothServer implements Runnable {
  private remotePC Controller;
  // 下面的UUID必须和手机客户端的UUID相一致
  private static UUID ECHO_SERVER_UUID= new UUID("aeb9f938a1a34947ace29ebd0c67adf1", false);
  // 流连接通知 用于创建流连接
  private StreamConnectionNotifier myPCConnNotifier = null;
  // 流连接
  private StreamConnection streamConn = null;
  // 接受数据字节流
  // 接收x y 坐标
  private byte[] acceptedByteArray = new byte[1024];
  // 读取(输入)流
  private InputStream inputStream = null;

  // 主线程
  public static void main(String[] args) {
    new BlueToothServer();
  }

  public BlueToothServer() {
    try {
      String url = "btspp://localhost:" + ECHO_SERVER_UUID.toString();
      // 得到流连接通知
      myPCConnNotifier = (StreamConnectionNotifier) Connector.open(url);
      Controller = new remotePC();
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    // 打开连接通道并读取流线程
    new Thread(this).start();
  }
  public static int getInt(byte[] bytes){
    return (0xff & bytes[3])       |
        (0xff00 & (bytes[2] << 8))  |
        (0xff0000 & (bytes[1] << 16)) |
        (0xff000000 & (bytes[0] << 24));
  }
  public static float getFloat(byte[] b){
    return Float.intBitsToFloat(getInt(b));
  }
  @Override
  public void run() {
    try {
      boolean isMouseLPressed = false;
      boolean isWheelPressed = false;
      boolean end = false;

      while (true) {
        // 持续保持着监听客户端的连接请求
        // 获取流连接
        streamConn = myPCConnNotifier.acceptAndOpen();
        // 获取流通道
        inputStream = streamConn.openInputStream();
        // 循环读取字节流,判断code类型和x,y坐标
        while (inputStream.read(acceptedByteArray) != -1) {
          String acceptString = new String(acceptedByteArray);
          int index;
          if((index = acceptString.indexOf("RemoteTouch")) != -1) {
            byte[] codeBytes = new byte[4];
            byte[] dxBytes = new byte[6];
            byte[] dyBytes = new byte[6];
            System.arraycopy(acceptedByteArray, index + 11, codeBytes, 0, 4);
            System.arraycopy(acceptedByteArray, index + 15, dyBytes, 0, 6);
            System.arraycopy(acceptedByteArray, index + 21, dxBytes, 0, 6);
            int dy = Integer.parseInt(new String(dyBytes));
            int dx = Integer.parseInt(new String(dxBytes));
            int code = getInt(codeBytes);
            if (end) {
              inputStream.close();
              if (streamConn != null) {
                streamConn.close();
                System.out.println("Disconnected...");
              }
              break;
            }
            switch (code) {
              case 1://按下鼠标左键
                isMouseLPressed = true;
                Controller.pressMouseL();
                System.out.println("Pressing mouse L");
                break;
              case 2://释放鼠标左键
                if (isMouseLPressed) {
                  Controller.releaseMouseL();
                  System.out.println("Released mouse L");
                  isMouseLPressed=false;
                }
                break;
              case 3://点击鼠标左键
                Controller.clickMouseL();
                System.out.println("Clicked mouse L");
                break;
              case 4://点击鼠标右键
                Controller.clickMouseR();
                System.out.println("Clicked mouse R");
                break;
              case 5://按下滚轮
//           isWheelPressed = true;
//           Controller.pressWheel();
//           System.out.println("Pressing wheel");
                break;
              case 6://释放滚轮
//           if(isWheelPressed){
//             Controller.releaseWheel();
//             System.out.println("Released wheel");
//           }
                break;
              case 7://滚轮滚动
                int step = Math.abs(dy) / 40;
                System.out.println("wheel");
                if (dy > 0) {
                  Controller.wheelDown(step);
                  System.out.printf("Wheel Down:%d steps. dy=%d\n", step, dy);
                } else {
                  Controller.wheelUp(step);
                  System.out.printf("Wheel Up:%d steps. dy=%d\n", step, dy);
                }
                break;
              case 8://放大、缩小
                double s = Math.sqrt((double) (dx * dx + dy * dy));
                if (dx < 0) {
                  Controller.zoomOut((int) s / 20);
                  System.out.printf("Zoom out %d steps. dx=%d,dy=%d\n", (int) s / 20, dx, dy);
                } else {
                  Controller.zoomIn((int) s / 20);
                  System.out.printf("Zoom in %d steps. dx=%d,dy=%d\n", (int) s / 20, dx, dy);
                }
                break;
              case 9://显示可切换apps
                Controller.listAppsWindow();
                System.out.println("show Switch apps");
                break;
              case 10://显示桌面
                Controller.showDesktop();
                System.out.println("show desktop");
                break;
              case 11://app 右切
                Controller.simpleRightSwitchApp();
                System.out.println("switch app: right");
                break;
              case 12://app 左切
                Controller.simpleLeftSwitchApp();
                System.out.println("switch app: left");
                break;
              case 13://window 右切
                Controller.rightSwitchWindow();
                System.out.println("switch window right");
                break;
              case 14://window 左切
                Controller.leftSwitchWindow();
                System.out.println("switch window left");
                break;
              case 15://鼠标左键双击
                Controller.clickMouseL();
                Controller.delay(1);
                Controller.clickMouseL();
                System.out.println("clicked double mouse L");
                break;
              case 16://鼠标移动
                Controller.move(dx, dy, 1);
                //System.out.printf("Move mouse:dx=%d,dy=%d\n", dx, dy);
                break;
              case 17://左分屏
                Controller.windowLeft();
                System.out.println("Window divide: left");
                break;
              case 18://右分屏
                Controller.windowRight();
                System.out.println("Window divide: right");
                break;
              case 19: //上一张ppt
                Controller.prevSlide();
                System.out.println("previous slide");
                break;
              case 20:
                Controller.nextSlide();
                System.out.println("Next Slide");
                break;
              case 32: // PPT设置为隐藏鼠标
                Controller.hideMouse();
                System.out.println("Hide");
                break;
              case 33: // ppt激光笔
                Controller.setLaser();
                System.out.println("Laser");
                break;
              case 34: // ppt笔
                Controller.setDraw();
                System.out.println("Draw");
                break;
              case 35: // ppt 荧光笔
                Controller.setMark();
                System.out.println("Mark");
                break;
              case 100://退出
                end = true;
                System.out.println("Quit.");
                break;

              default://未识别
                System.out.println("Unknown code");
                break;
            }
          }
          // clear data
          acceptedByteArray = new byte[1024];
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android Bluetooth蓝牙技术使用流程详解

    在上篇文章给大家介绍了Android Bluetooth蓝牙技术初体验相关内容,感兴趣的朋友可以点击了解详情. 一:蓝牙设备之间的通信主要包括了四个步骤 设置蓝牙设备 寻找局域网内可能或者匹配的设备 连接设备 设备之间的数据传输 二:具体编程实现 1. 启动蓝牙功能 首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,如果返回为空,则无法继续执行了.例如: BluetoothAdapter mBluetoothAdapter = Blueto

  • Android系统中的蓝牙连接程序编写实例教程

    Bluetooth结构 1.JAVA层 frameworks/base/core/java/android/bluetooth/ 包含了bluetooth的JAVA类. 2.JNI层 frameworks/base/core/jni/android_bluetooth_开头的文件 定义了bluez通过JNI到上层的接口. frameworks/base/core/jni/android_server_bluetoothservice.cpp 调用硬件适配层的接口system/bluetooth/

  • android实现蓝牙文件发送的实例代码,支持多种机型

    最近项目上需要实现蓝牙传输apk的一个功能,能够搜索周围的蓝牙手机并分享文件.从需求上讲android手机自带的蓝牙传输模块就可以满足需要了,实现也很简单.不过让人头疼的是,虽然说一般的主流机型都配置有蓝牙模块,但是android机型碎片化太严重,不同android版本手机蓝牙功能也不一样.4.0.3以下版本和以上版本使用的蓝牙包是不同的,分别是"com.android.bluetooth"和"com.mediatek.bluetooth".还有一些厂商对蓝牙模块进

  • Android蓝牙通信聊天实现发送和接受功能

    很不错的蓝牙通信demo实现发送和接受功能,就用了两个类就实现了,具体内容如下 说下思路把 主要有两个类 主界面类 和 蓝牙聊天服务类 . 首先创建线程 实际上就是创建BluetoothChatService() (蓝牙聊天服务类) 这个时候把handler 传过去 这样就可以操作UI 界面了,在线程中不断轮询读取蓝牙消息,当主界面点击发送按钮时 调用BluetoothChatService 的发送方法write 方法,这里的write 方法 使用了handler 发送消息,在主界面显示,另一个

  • Android蓝牙开发深入解析

    1. 使用蓝牙的响应权限 复制代码 代码如下: <uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 2. 配置本机蓝牙模块 在这里首先要了解对蓝牙操作一个核心类BluetoothAdapter 复制代码 代码如下: Bluetoot

  • 详解Android——蓝牙技术 带你实现终端间数据传输

    蓝牙技术在智能硬件方面有很多用武之地,今天我就为大家分享一下蓝牙在Android系统下的使用方法技巧,并实现一下两个终端间数据的传输. 蓝牙(Bluetooth)是一种短距离的无线通信技术标准,蓝牙协议分为4层,即核心协议层.电缆替代协议层.电话控制协议层和采纳的其它协议层. 这4种协议中最重要的是核心协议.蓝牙的核心协议包括基带.链路管理.逻辑链路控制和适应协议四部分.其中链路管理(LMP)负责蓝牙组件间连接的建立.逻辑链路控制与适应协议(L2CAP)位于基带协议层上,属于数据链路层,是一个为

  • Android单片机与蓝牙模块通信实例代码

    啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通过参考网上资料,问题顺利搞定,下面小编把具体实现思路分享给大家,供大家参考. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码(Universally Unique Identifier),这是一个软件构建的标准,也是被开源基金会组织应用在分布式计算环境领域的一部分.在蓝牙3.0及下一版本中,UUID被用于唯一标识一个服务,比如文件传输服务,串口服务.打印机服务等,如下: #蓝牙串

  • Android手机通过蓝牙连接佳博打印机的实例代码

    所使用的打印机为佳博打印机,支持蓝牙.wifi.usb我所使用的是通过蓝牙来连接. 在网上找到一个佳博官方针对安卓开发的App源码,但是各种的跳转,没有看太懂,所以又去问度娘,找到了一个不错的文章 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发. 1. 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 // 管理蓝牙设备的权限 <uses-permissionandroid:name="

  • Android适配安卓6.0蓝牙通讯实现过程

    事先说明: 安卓蓝牙需要定位权限申请,在安卓6.0需要用户手动确认权限后才能使用,各位可以自行查询资料实现,如果嫌麻烦,可以用第三方Bmob集成好的工具类进行实现,详细可以看http://blog.csdn.net/qq_30379689/article/details/52223244 蓝牙连接过程: 1.查询用户是否开启蓝牙. 2.搜索附近的可用的蓝牙. 3.进行蓝牙配对. 4.进行蓝牙连接. 5.获取输入流和输出流. 6.发送消息. 晒上我自己画的美图: 实验效果图: 实现需要的权限:由于

  • 分享Android 蓝牙4.0(ble)开发的解决方案

    最近,随着智能穿戴式设备.智能医疗以及智能家居的普及,蓝牙开发在移动开中显得非常的重要.由于公司需要,研究了一下,蓝牙4.0在Android中的应用. 以下是我的一些总结. 1.先介绍一下关于蓝牙4.0中的一些名词吧:    (1).GATT(Gneric Attibute  Profile) 通过ble连接,读写属性类小数据Profile通用的规范.现在所有的ble应用Profile  都是基于GATT (2).ATT(Attribute Protocal) GATT是基于ATT Potoca

随机推荐