查看: 5089|回复: 1

通过蓝牙BLE连接Curie和Android手机

[复制链接]
  • TA的每日心情
    无聊
    2017-6-24 14:20
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2017-7-9 16:27 | 显示全部楼层 |阅读模式
    本帖最后由 190808149 于 2017-7-13 02:40 编辑


    两年前的中美创客大赛成都赛区分赛上,我第一次接触到Intel Edison,了解到这块计算能力强大的SoC内含了BLE蓝牙功能,是实现物联网无线通讯的利器,因此开始入手学习。当时,Intel 官网上刊载了A Stevens和Intel公司Haishen的一篇文章《通过蓝牙* LE (BLE)从安卓*连接到英特尔® Edison》,谈到使用Google公司新问世的Android Studio软件,为同样具备蓝牙能力的手机编写相关JAVA代码,使其能够与Edison进行蓝牙通讯。这意味着,创客活动中常用的SoC单片机可以和人人必备的手机链接起来了。这给我们做硬件创新带来了极大的便利。

    然而不幸的是,复杂的Edison带来了高昂的制造成本,限制了其销量。低迷的需求导致Edison最终走到停产的尽头。

    还好,同样拥有蓝牙能力,成本更加低廉的Curie系列产品生存下来了。Arduino 101小巧灵活的封装设计,低廉的成本,让创客把它应用到项目设计中,而不需要插接HC06这样的蓝牙扩展模块。特别是像我这样对硬件和电子实验动手能力不强的程序猿,每一次硬件问题的调试和诊断,都是一场痛苦的灾难。

    如果,能把Arduino 101的蓝牙能力调动起来,和Android手机实现连接,就可以用Android手机查看Arduino101采集到的传感器数据
    。论坛里有文章谈到使用Curie的BLE Gatt协议为Android手机提供心率数据。但文章却没有谈及,Android App的编写。只是使用已内置Gatt协议的现有App查看Curie发出的固定格式的传感器信息。

    IMG_20170709_144822.jpg

    如果能够使用Android Studio自己编写手机App,让Android和Arduino101交互使用,用Android手机遥控Arduino101,无线指挥Arduino单片机执行电机动作。这对硬件项目设计更有意义。

    无标题.png

    因此,我以
    A Stevens和Intel公司Haishen的文章为模板,改写一篇:《通过蓝牙BLE连接Curie和Android手机》,以Curie替换掉停产的Edison,让Curie继续与Android互动,探索Arduino的手机遥控扩展能力。希望大家批评。

    蓝牙截图1:设置数值.png




    简介
    蓝牙* LE (BLE) 通信因其低成本和低能耗等优势,被越来越多的用于商用产品和娱乐性应用。 如果希望实现 Android* 手机或平板电脑与英特尔l®Curie之间的无线通信,蓝牙* LE (BLE) 只能是唯一选择。

    下面,我们将使用免费的Android手机开发工具Android Studio和Arduino101编程工具Arduino Sketch,和低成本、构建英特尔 Curie与配备蓝牙 4.0 的 Android 设备之间的 BLE 通信。

    什么是 BLE?
    蓝牙低能耗 (BLE),蓝牙 LE,或 BLE (也称智能蓝牙)是一种无线个域网技术,由蓝牙特别兴趣小组设计和市场推广。 它主要针对健康医疗、健身、安全、自动化和家庭娱乐等行业的应用。
    蓝牙 LE 最初由诺基亚于 2006 年推出,当时称为 Wibree。 2010 年,通过蓝牙版本 4.0 ,蓝牙 LE 加入了蓝牙标准的行业。
    相比于标准蓝牙连接,BLE 可显著降低设备的能耗,同时提供常规蓝牙的大部分连接性以及约一半的连接范围(大约 15 米)。 安装电池的设备如果使用蓝牙 LE,可在不充电或更换电池的情况下运行数年。

    硬件  
    由于英特尔 Edison和 Galileo停产。 就目前的物联网项目而言,我们只能使用Curie:

    • Arduino 101 / Genuino 101  购买地址:http://clz.me/buy101
    • 运行 Android 4.3 或更高版本的 Android 设备(我使用 360n5手机)
    • 面向开发且运行 Windows* 7 以上 的 PC(我使用SAMSUNG NoteBook9 Win10)
    软件
    我使用下列几款免费的软件工具。 如欲查看本示例,您应根据需要下载并安装下列软件工具:



    调试 Android 设备
    BLE 支持已添加至Android 4.3(API 级别:18)。 您需要运行 4.3 或更高版本的设备来通过 BLE 进行通信。
    如欲了解更多有关 Android BLE 的信息,请访问: https://developer.android.com/guide/topics/connectivity/bluetooth-le.html
    如果之前没有 Android 开发经验,您需要在手机或平板电脑上启用开发人员选项,然后将其用于运行和调试软件。 打开设置应用,滚动至底部,选择 “About device”,然后点击构建编号七 (7) 次,以解锁开发人员选项。
    现在,设置下方应显示 Developer Options,请务必确认 “USB debugging”。
    如欲了解更多有关 Android 开发人员选项的信息,请访问: http://developer.android.com/tools/device.html
    安装软件并开始编写代码!面向英特尔® Galileo 的 Arduino IDE

    您需要下载专门准备的 Arduino IDE 版本,以将 Sketch 部署至英特尔 Curie。

    英特尔® Curie驱动程序  本文撰写之时,其版本为 2.0.2。

    Android Studio
    Android Studio 是一款面向 Android 开发的全新 Java* IDE,基于 IntelliJ IDEA* (https://www.jetbrains.com/idea/)。 尽管目前还只是测试版,但它性能稳定,功能齐全。 如果您习惯使用面向 Android 开发的 Eclipse* 或 IntellliJ IDEA,那您应该可以轻松理解下列关于两者用法的演示。
    Android Studio 包含 Android SDK,可大幅简化安装流程。 只需下载、从压缩文件中提取内容,然后在 bin 文件夹中运行 studio.exe 即可。
    如欲了解更多有关 Android Studio 的信息,请访问: https://developer.android.com/sdk/installing/studio.html

    Android SDK
    你可能需要下载其他 SDK 软件包。 为此,请在 Android Studio 的工具栏中点击 "SDK Manager"。 关于配置 Android SDK,我们在此不做介绍,请访问下列链接,了解更多详情:
    https://developer.android.com/sdk/installing/adding-packages.html
    如果之前安装过 Android SDK,您可以配置 Android Studio,并将其指向正确的路径,如图 4 所示
    在 Android Studio 中,点击 Configure -> Project Defaults -> Project Structure,并设置路径。
    图 4. 在 Android* Studio 中设置 SDK 路径
    测试Arduino Sketch IDE和英特尔® Curie/Arduino101

    在开始演示之前,请确保您能够运行 Blink 示例 sketch。 它位于 examples -> 01.Basics -> Blink 文件夹中打开示例文件。

    测试Android Studio和手机
    安装 Android Studio 后,请确保您能够创建新项目,并在 Android 设备上运行该项目。
    • 连接 Android 设备和 PC
    • 打开 Android Studio
    • 选择 "New Project…"
    • 选择名称和位置,并点击 "Next" 3 次 (API 15/Blank Activity)
    • 点击 Finish,并等待项目创建完成(可能耗时 20 多秒)
    • 移动工具栏中的绿色 Play 图标
    • 选择您的设备,并按下 "OK"
    如果所有步骤都正确,您的 Android 屏幕应显示 “Hello world!”(图 5)
    图:Android* Studio Hello World 应用

    BLE 工作原理
    BLE 根据需要提供短数据包,然后关闭链路。 这是蓝牙 LE 实现低能耗的原因之一。 相比于常规蓝牙的传统配对方法,BLE 设备仅在需要收发信息时进行链接。
    BLE 的通信方式极其严密。 设备显示收发数据的服务,后者包含称之为特征的内容,以定义可共享的数据。 如需获取更多详情,特征可包含描述符,帮助定义数据。 例如,您可以拥有一项标记为 "Heart Rate Monitor" 的服务,该服务包含 "heart rate measurement" 等特征。
    大多数蓝牙 LE API 都支持搜索本地设备和发现有关这些设备的服务、特征和描述符。

    将数据从 Android 发送至英特尔® Curie的前提条件
    本文余下内容将假设您有一个面向英特尔 Curie和 Android 开发而设置和配置的开发系统。 请确保您已完成下列步骤,并根据需要检查之前的内容。
    • 安装英特尔 Arduino* IDE
    • 安装英特尔 Curie驱动程序
    • 安装 Android Studio
    • 安装 Android SDK
    • 在英特尔 Curie上部署和运行 Blink 演示
    • 部署和运行空白 Hello world Android 项目

    一、编写Android 中的 BLE通讯程序。

    您可以访问下列链接,从 GitHub 下载完整的项目:

    https://github.com/qq95538/Ediso ... /Android/BLEConnect(原文作者针对Edison所写的蓝牙链接程序在此https://github.com/adrianstevens/Edison_to_Android_BLE/tree/master/Android/BLEConnect,针对Curie LEDSketch示例项目,我对原文程序做了少许调整)


    或者直接创建新项目,并把以下代码复制到空App模板的MainActivity.java文件中

    [mw_shl_code=java,true]package com.beetroot.bleconnect;

    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothGatt;
    import android.bluetooth.BluetoothGattCallback;
    import android.bluetooth.BluetoothGattCharacteristic;
    import android.bluetooth.BluetoothGattService;
    import android.bluetooth.BluetoothManager;
    import android.bluetooth.BluetoothProfile;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.util.Log;

    import android.bluetooth.BluetoothDevice;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.Button;
    import android.view.View;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Timer;
    import java.util.TimerTask;
    import java.util.UUID;


    public class MainActivity extends Activity {
        //these values are specific to the Grove BLE V1 - update if you're using a different module
        private static String GROVE_SERVICE = "19B10000-E8F2-537E-4F6C-D104768A1214";
        private static String CHARACTERISTIC_TX = "19B10001-E8F2-537E-4F6C-D104768A1214";
        private static String CHARACTERISTIC_RX = "0000ffe1-0000-1000-8000-00805f9b34fb";

        private static final int REQUEST_ENABLE_BT = 1;
        private static final long SCAN_PERIOD = 5000; //5 seconds
        private static final String DEVICE_NAME = "LED"; //display name for Grove BLE

        private BluetoothAdapter mBluetoothAdapter;//our local adapter
        private BluetoothGatt mBluetoothGatt; //provides the GATT functionality for communication
        private BluetoothGattService mBluetoothGattService; //service on mBlueoothGatt
        private static List<BluetoothDevice> mDevices = new ArrayList<BluetoothDevice>();//discovered devices in range
        private BluetoothDevice mDevice; //external BLE device (Grove BLE module)

        private TextView mainText;

        private Timer mTimer;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            final Button button = (Button)findViewById(R.id.btnConnect);
            button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // Code here executes on main thread after user presses button
                    statusUpdate("Button Action.");
                }
            });


            mainText = (TextView) findViewById(R.id.mainText);
            mainText.setText("Hello Bluetooth LE!");

            initiateBLE();
            //try to find the Grove BLE V1 module
            searchForDevices();

        }

        private void initiateBLE(){
            //mTimer = new Timer(); //qq95538: a redundant action.

            //check to see if Bluetooth Low Energy is supported on this device
            if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
                Toast.makeText(this, "BLE not supported on this device", Toast.LENGTH_SHORT).show();
                finish();
            }

            statusUpdate("BLE supported on this device");

            //get a reference to the Bluetooth Manager
            final BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
            mBluetoothAdapter = mBluetoothManager.getAdapter();
            if (mBluetoothAdapter == null) {
                Toast.makeText(this, "BLE not supported on this device", Toast.LENGTH_SHORT).show();
                finish();
                return;
            }

            //Open settings if Bluetooth isn't enabled
            if (!mBluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }

            if (mBluetoothAdapter == null) {
                Toast.makeText(this, "Bluetooth disabled", Toast.LENGTH_SHORT).show();
                finish();
                return;
            }


        }


        private void searchForDevices ()
        {
            statusUpdate("Searching for devices ...");

            if(mTimer != null) {
                mTimer.cancel();
            }

            scanLeDevice();
            mTimer = new Timer();
            mTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    statusUpdate("Search complete");
                    if(findGroveBLE() == true){
                        connectDevice();
                    };
                }
            }, SCAN_PERIOD);
        }

        private boolean findGroveBLE ()
        {
            if(mDevices == null || mDevices.size() == 0)
            {
                statusUpdate("No BLE devices found");
                return false;
            }
            else if(mDevice == null)
            {
                statusUpdate("Unable to find Grove BLE");
                return false;
            }
            else
            {
                statusUpdate("Found Grove BLE V1");
                statusUpdate("Address: " + mDevice.getAddress());
                //connectDevice(); //qq95538:take out of this local function and follow it
                return true;
            }
        }

        private boolean connectDevice ()
        {
            BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(mDevice.getAddress());
            if (device == null) {
                statusUpdate("LED was found, but unable to connect");
                return false;
            }
            // directly connect to the device
            statusUpdate("Device Connecting with Gatt ...");
            mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
            return true;
        }



        private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
                if (newState == BluetoothProfile.STATE_CONNECTED) {
                    statusUpdate("Connected");
                    statusUpdate("Searching for services");
                    mBluetoothGatt.discoverServices();
                } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                    statusUpdate("Device disconnected");
                }
            }

            @Override
            public void onCharacteristicRead(BluetoothGatt gatt,
                                             BluetoothGattCharacteristic characteristic,
                                             int status){
                String value = UtilOnStr.parseBytesToHexString(characteristic.getValue());
                statusUpdate( "value" + value);

            }
            @Override
            public void onServicesDiscovered(BluetoothGatt gatt, int status) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    List<BluetoothGattService> gattServices = mBluetoothGatt.getServices();

                    for(BluetoothGattService gattService : gattServices) {
                        statusUpdate("Service discovered: " + gattService.getUuid());
                        if(GROVE_SERVICE.equals(gattService.getUuid().toString().toUpperCase()))
                        {
                            mBluetoothGattService = gattService;
                            statusUpdate("Found communication Service");
                            sendMessage();
                        }
                    }
                } else {
                    statusUpdate("onServicesDiscovered received: " + status);
                }
            }
        };

        private void sendMessage ()
        {
            if (mBluetoothGattService == null)
                return;

            statusUpdate("Finding Characteristic...");
            BluetoothGattCharacteristic gattCharacteristic =
                    mBluetoothGattService.getCharacteristic(UUID.fromString(CHARACTERISTIC_TX));

            if(gattCharacteristic == null) {
                statusUpdate("Couldn't find TX characteristic: " + CHARACTERISTIC_TX);
                return;
            }

                statusUpdate("Found TX characteristic: " + gattCharacteristic.getUuid() );
                mBluetoothGatt.readCharacteristic(gattCharacteristic);

    /*        statusUpdate("Sending message 'Hello Grove BLE'");

            String msg = "Hello Grove BLE";

            byte b = 0x00;
            byte[] temp = msg.getBytes();
            byte[] tx = new byte[temp.length + 1];
            tx[0] = b;

            for(int i = 0; i < temp.length; i++)
                tx[i+1] = temp;

            gattCharacteristic.setValue(tx);
            mBluetoothGatt.writeCharacteristic(gattCharacteristic);*/

        }

        private void scanLeDevice() {
            new Thread() {

                @Override
                public void run() {
                    mBluetoothAdapter.startLeScan(mLeScanCallback);

                    try {
                        Thread.sleep(SCAN_PERIOD);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }.start();
        }

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

            @Override
            public void onLeScan(final BluetoothDevice device, final int rssi,
                                 byte[] scanRecord) {
                if (device != null) {
                    if (mDevices.indexOf(device) == -1)//to avoid duplicate entries
                    {
                        if (DEVICE_NAME.equals(device.getName())) {
                            mDevice = device;//we found our device!
                        }
                        mDevices.add(device);
                        statusUpdate("Found device " + device.getName());
                    }
                }
            }
        };

        //output helper method
        private void statusUpdate (final String msg) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.w("BLE", msg);
                    mainText.setText(mainText.getText() + "\r\n" + msg);
                }
            });
        }
    }

    [/mw_shl_code]

    打开 Android Studio(或选择的 IDE),创建新的空白 Android 应用,并将其命名为 BLEConnect。 请务必将最低 SDK 设置为至少 API 18。 否则,您将无法使用 BLE API。
    图 : 创建一个新的 Android 应用:
    接下来打开 AndroidManifest.xml,并在 <application> 标签上方添加下列内容,以添加所需的权限:
    <uses-permission android:name="android.permission.BLUETOOTH"/>
            <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    设置 UI为了简单起见,我们只使用默认布局,但我们需要为 TextView 设置一个 ID。 打开 layout -> activity_main.xml,选择 TextView,并将 ID 设置为 mainText,以便我们在代码中引用该 ID。
    图 : 设置 TextView 的资源 id
    MainActivity就该项目而言,代码其余部分将进入 MainActivity。 如果您逐行添加代码,那么请注意,Android Studio 将自动检测丢失的输入,并提示您添加。
    示例代码将:
    • 检查 Android 设备中的 BLE 支持
    • 搜索附近的 BLE 设备
    • 识别和连接BLE 模块
    • 为已知通信服务搜索可用的服务
    • 查找通信服务的传输特征
    • 通过将数值写入特征来发送消息
    我在此不一一介绍每行代码,仅介绍一些核心概念。
    类别层变量和静态值我们在连接 BLE 模块、搜索服务和发送消息的过程中保存了一些数值。 我们还将为 Curie添加部分已知静态值。 如果您使用其他模块,可能需要进行调整。 具体而言,我建议定义收发特征,例如:
    CHARACTERISTIC_TX = "19B10001-E8F2-537E-4F6C-D104768A1214"

    状态辅助方法为了简单起见,我们在之前标记的 TextView 上显示我们的进度。 代码包含一种简单的辅助方法,名为 statusUpdate,帮助我们将状态消息写入屏幕和控制台。 它还可返回至 UI 线程,以便我们安全从任一线程调用该方法。
    连接 BLE 设备为引用 Bluetooth Manager,我们首先应查看设备是否提供 BLE,调用 getSystemService 以引用 Bluetooth Manager (BluetoothManager),然后调用 getAdapter() 方法,以引用 BluetoothAdapter 项目。 或者,您还可以直接从 Bluetooth Manager 类使用静态帮助方法 getDefaultAdapter
    搜索附近的 BLE 设备搜索设备时,我们使用计时器搜索特定时间段。 我们调用 Bluetooth manager 项目中的 startLeScan,并传入至回调项目,以知晓是否搜索到设备。
    API 持续扫描设备,因此,我们可能会在每台设备的 LeScanCallback 中接收到多个通知,所以在保存之前,我们应确认该设备入口的唯一性。 我们还要检查模块的设备名称,并保存引用。 就本示例而言,我们实际上不需要将设备保存在列表中。
    @Overridepublic void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {        …}
    查找通信服务
    大多数 BLE 设备都会显示一个或多个服务以供通信/互动。 BLE 中的 TI CC2540 包含一个 ID 为 “19B10000-E8F2-537E-4F6C-D104768A1214” 的关键服务。 接下来,我们将查找引用,并将其保存至该服务。
    首先,我们需要连接设备。 为了知晓连接时间或查找到服务的时间,我们需要 BluetoothGattCallback 项目,并覆盖 onConnectionStateChangedonServicesDiscovered
    请注意,使用 onConnectionStateChanged 方法时,如果获悉连接成功,我们可调用 mBluetoothGatt.discoverServices() 搜索服务。 识别到所需的服务后,我们可以继续发送消息。
    @Overridepublic void onConnectionStateChange (BluetoothGatt gatt, int status, int newState){        …}@Overridepublic void onServicesDiscovered (BluetoothGatt gatt, int status) {        …}许多其他方法可以被覆盖。 请访问此处参阅其中的文档:
    https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback.html
    发送消息
    示例代码提供了一种 sendMessage 方法。 我们通过 UDID 识别到所需的特征后,调用该特征的 setValue。 最后,我们调用 BluetoothGatt 引用中的 writeCharacteristic,从而输入特征值,以发送数据。

    把Java代码段输入Android Studio的App模板,调试完成后,编译上传的Android手机。接下来我们设置英特尔 Curie。

    二、Arduino Sketch IDE编程
    我们现在要在 Android 设备和英特尔 Curie/Arduino101 之间进行简单的蓝牙链接。
    打开【主菜单】-【文件】-【示例】-【CurieBLE】-【Peripheral】-【LED】例程,并烧录

    无标题.png

    或者新建一个ino项目文件。或者拷贝代码段到Sketch IDE.

    [mw_shl_code=cpp,true]/*
    * Copyright (c) 2016 Intel Corporation.  All rights reserved.
    * See the bottom of this file for the license terms.
    */

    /*
    * Sketch: led.ino
    *
    * Description:
    *   This is a Peripheral sketch that works with a connected Central.
    *   It allows the Central to write a value and set/reset the led
    *   accordingly.
    */

    #include <CurieBLE.h>

    BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service

    // BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
    BLEUnsignedCharCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

    const int ledPin = 13; // pin to use for the LED

    void setup() {
      Serial.begin(9600);

      // set LED pin to output mode
      pinMode(ledPin, OUTPUT);

      // begin initialization
      BLE.begin();

      // set advertised local name and service UUID:
      BLE.setLocalName("LED");
      BLE.setAdvertisedService(ledService);

      // add the characteristic to the service
      ledService.addCharacteristic(switchCharacteristic);

      // add service
      BLE.addService(ledService);

      // set the initial value for the characeristic:
      switchCharacteristic.setValue(0);

      // start advertising
      BLE.advertise();

      Serial.println("BLE LED Peripheral");
    }

    void loop() {
      // listen for BLE peripherals to connect:
      BLEDevice central = BLE.central();

      // if a central is connected to peripheral:
      if (central) {
        Serial.print("Connected to central: ");
        // print the central's MAC address:
        Serial.println(central.address());

        // while the central is still connected to peripheral:
        while (central.connected()) {
          // if the remote device wrote to the characteristic,
          // use the value to control the LED:
          if (switchCharacteristic.written()) {
            if (switchCharacteristic.value()) {   // any value other than 0
              Serial.println("LED on");
              digitalWrite(ledPin, HIGH);         // will turn the LED on
            } else {                              // a 0 value
              Serial.println(F("LED off"));
              digitalWrite(ledPin, LOW);          // will turn the LED off
            }
          }
        }

        // when the central disconnects, print it out:
        Serial.print(F("Disconnected from central: "));
        Serial.println(central.address());
      }
    }

    /*
       Copyright (c) 2016 Intel Corporation.  All rights reserved.

       This library is free software; you can redistribute it and/or
       modify it under the terms of the GNU Lesser General Public
       License as published by the Free Software Foundation; either
       version 2.1 of the License, or (at your option) any later version.

       This library is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       Lesser General Public License for more details.

       You should have received a copy of the GNU Lesser General Public
       License along with this library; if not, write to the Free Software
       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
    */[/mw_shl_code]

    在英特尔 Curie上部署后,我们的 sketch 可自动运行。 它首先运行 setup() 函数,然后无限地连续调用 loop() 函数。 这有助于我们读取和响应串行连接的输入。

    部署 Sketch现在请点击 Arduino IDE 的确认按钮(选框),设置好所有 typo。 确认后,请确保英特尔 Edison 已连接至 PC,并上传 sketch(右箭头)。 传输完成后,sketch 启动循环,然后我们可连接 Android 应用。 现在请打开 Arduino IDE 的 Serial Monitor(右上角的放大镜图标),然后可以开始收发数据了。
    Sketch 基于英特尔 Curie 运行后,运行Sketch程序。 您应该可以看到 serial monitor 中显示消息 “Connected”。
    点击鼠标,Android程序即可运行,当点击Light按钮后,Arduino101上的LED灯闪烁切换。





    图 : 运行于 Android* 手机的 BLEConnect

    展望未来
    将更多的程序逻辑放到Android手机,让Arduino101保留简单可靠的硬件控制功能。是硬件创新制作的未来。

    Screenshot_2017-07-07-00-32-45.png
  • TA的每日心情
    无聊
    2017-6-24 14:20
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2017-7-13 02:46 | 显示全部楼层
    更新了Android端BLE程序,直接配合遥控CurieBLE官方蓝牙例程LED.ino,并上传了蓝牙通讯演示视频,点击Android手机端按钮直接遥控Arduino101的pin13 LED闪灭。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    求解用arduino 让WS2812全灯带无特效常亮并做呼吸灯效果
    求解用arduino 让WS2812全
    本人小白,初学arduino,一边逛论坛一边看网上视频教程,看得比较杂 找了很久也没找
    想通过blinker按钮按住常亮灯松手熄灭功能
    想通过blinker按钮按住常
    1.测试了APP里面的开关按键,可以实现按下灯亮再按一下灯灭。2.做第2步测试的时候,想
    新手求助!blinker同步到米家,但手机里的小爱控制不了ESP8266
    新手求助!blinker同步到
    搞了两个晚上还是没解决,请大神帮忙看看 我的手机是苹果手机,下了点灯,米家,小爱
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表