The video also show how to enable 3D Acceleration in VirtualBox. (Please note: In my experience of using Ubuntu on VirtualBox/Windows 10, sometimes will have problem when 3D Acceleration enabled.)
Think Java: How to Think Like a Computer Scientist Currently used at many colleges, universities, and high schools, this hands-on introduction to computer science is ideal for people with little or no programming experience. The goal of this concise book is not just to teach you Java, but to help you think like a computer scientist. You�ll learn how to program�a useful skill by itself�but you�ll also discover how to use programming as a means to an end.
Authors Allen Downey and Chris Mayfield start with the most basic concepts and gradually move into topics that are more complex, such as recursion and object-oriented programming. Each brief chapter covers the material for one week of a college course and includes exercises to help you practice what you�ve learned.
Learn one concept at a time: tackle complex topics in a series of small steps with examples
Understand how to formulate problems, think creatively about solutions, and write programs clearly and accurately
Determine which development techniques work best for you, and practice the important skill of debugging
Learn relationships among input and output, decisions and loops, classes and methods, strings and arrays
Work on exercises involving word games, graphics, puzzles, and playing cards
In lasp example of BottomSheet, I implement a OnClickListener of background to expand and collapse the bottom sheet. Without this, user cannot expand the bottom sheet if collapsed, because bottom sheet have height of 0 by default. If you want you can set the height of collapsed bottom sheet, by calling setPeekHeight() method.
/* Build.VERSION.SDK_INT: The user-visible SDK version of the framework; its possible values are defined in Build.VERSION_CODES. https://developer.android.com/reference/android/os/Build.VERSION_CODES.html */ int sdk_int = Build.VERSION.SDK_INT;
/* backgroundLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (bottomSheetBehavior.getState()){ case BottomSheetBehavior.STATE_COLLAPSED: bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); break; case BottomSheetBehavior.STATE_EXPANDED: bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); break; } } }); */ }
BottomSheetBehavior.BottomSheetCallback bottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback(){ @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { switch (newState){ case BottomSheetBehavior.STATE_COLLAPSED: textPrompt.setText("COLLAPSED"); break; case BottomSheetBehavior.STATE_DRAGGING: textPrompt.setText("DRAGGING"); break; case BottomSheetBehavior.STATE_EXPANDED: textPrompt.setText("EXPANDED"); break; case BottomSheetBehavior.STATE_HIDDEN: textPrompt.setText("HIDDEN"); break; case BottomSheetBehavior.STATE_SETTLING: textPrompt.setText("SETTLING"); break; default: textPrompt.setText("unknown..."); } }
@Override public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// Check if BLE is supported on the device. if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, "BLUETOOTH_LE not supported in this device!", Toast.LENGTH_SHORT).show(); finish(); }
getBluetoothAdapterAndLeScanner();
// Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { Toast.makeText(this, "bluetoothManager.getAdapter()==null", Toast.LENGTH_SHORT).show(); finish(); return; }
listBluetoothDevice = new ArrayList<>(); adapterLeScanResult = new ArrayAdapter<BluetoothDevice>( this, android.R.layout.simple_list_item_1, listBluetoothDevice); listViewLE.setAdapter(adapterLeScanResult); listViewLE.setOnItemClickListener(scanResultOnItemClickListener);
mHandler = new Handler();
}
AdapterView.OnItemClickListener scanResultOnItemClickListener = new AdapterView.OnItemClickListener(){
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final BluetoothDevice device = (BluetoothDevice) parent.getItemAtPosition(position);
new AlertDialog.Builder(MainActivity.this) .setTitle(device.getName()) .setMessage(msg) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {
} }) .show();
} };
private String getBTDevieType(BluetoothDevice d){ String type = "";
switch (d.getType()){ case BluetoothDevice.DEVICE_TYPE_CLASSIC: type = "DEVICE_TYPE_CLASSIC"; break; case BluetoothDevice.DEVICE_TYPE_DUAL: type = "DEVICE_TYPE_DUAL"; break; case BluetoothDevice.DEVICE_TYPE_LE: type = "DEVICE_TYPE_LE"; break; case BluetoothDevice.DEVICE_TYPE_UNKNOWN: type = "DEVICE_TYPE_UNKNOWN"; break; default: type = "unknown..."; }
// Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { Toast.makeText(this, "bluetoothManager.getAdapter()==null", Toast.LENGTH_SHORT).show(); finish(); return; }
private void getBluetoothAdapterAndLeScanner(){ // Get BluetoothAdapter and BluetoothLeScanner. final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
mScanning = false; }
/* to call startScan (ScanCallback callback), Requires BLUETOOTH_ADMIN permission. Must hold ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get results. */ private void scanLeDevice(final boolean enable) { if (enable) { listBluetoothDevice.clear(); listViewLE.invalidateViews();
// Stops scanning after a pre-defined scan period. mHandler.postDelayed(new Runnable() { @Override public void run() { mBluetoothLeScanner.stopScan(scanCallback); listViewLE.invalidateViews();
//scan specified devices only with ScanFilter ScanFilter scanFilter = new ScanFilter.Builder() .setServiceUuid(BluetoothLeService.ParcelUuid_GENUINO101_ledService) .build(); List<ScanFilter> scanFilters = new ArrayList<ScanFilter>(); scanFilters.add(scanFilter);
ScanSettings scanSettings = new ScanSettings.Builder().build();
With the help from the Android Design Support Library, you can implement a number of important material design components to all developers and to all Android 2.1 or higher devices.
This example show how to implement Bottom Sheets with help of Android Design Support Library.
/* Build.VERSION.SDK_INT: The user-visible SDK version of the framework; its possible values are defined in Build.VERSION_CODES. https://developer.android.com/reference/android/os/Build.VERSION_CODES.html */ int sdk_int = Build.VERSION.SDK_INT;
backgroundLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (bottomSheetBehavior.getState()){ case BottomSheetBehavior.STATE_COLLAPSED: bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); break; case BottomSheetBehavior.STATE_EXPANDED: bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); break; } } });
}
BottomSheetBehavior.BottomSheetCallback bottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback(){ @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { switch (newState){ case BottomSheetBehavior.STATE_COLLAPSED: textPrompt.setText("COLLAPSED"); break; case BottomSheetBehavior.STATE_DRAGGING: textPrompt.setText("DRAGGING"); break; case BottomSheetBehavior.STATE_EXPANDED: textPrompt.setText("EXPANDED"); break; case BottomSheetBehavior.STATE_HIDDEN: textPrompt.setText("HIDDEN"); break; case BottomSheetBehavior.STATE_SETTLING: textPrompt.setText("SETTLING"); break; default: textPrompt.setText("unknown..."); } }
@Override public void onSlide(@NonNull View bottomSheet, float slideOffset) {
Last post show the first step to enable Bluetooth, this post show how to scan BLE devices in range.
We will re-use the BluetoothLeService.java in Android example code "Bluetooth Le Gatt example". Modify to suit our case.
BluetoothLeService.java
/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
/** * Service for managing connection and data communication with a GATT server hosted on a * given Bluetooth LE device. */ public class BluetoothLeService extends Service { private final static String TAG = BluetoothLeService.class.getSimpleName();
private static final int STATE_DISCONNECTED = 0; private static final int STATE_CONNECTING = 1; private static final int STATE_CONNECTED = 2;
public final static String ACTION_GATT_CONNECTED = "android-er.ACTION_GATT_CONNECTED"; public final static String ACTION_GATT_DISCONNECTED = "android-er.ACTION_GATT_DISCONNECTED"; public final static String ACTION_GATT_SERVICES_DISCOVERED = "android-er.ACTION_GATT_SERVICES_DISCOVERED"; public final static String ACTION_DATA_AVAILABLE = "android-er.ACTION_DATA_AVAILABLE"; public final static String EXTRA_DATA = "android-er.EXTRA_DATA";
public static String String_GENUINO101_ledService = "19B10000-E8F2-537E-4F6C-D104768A1214"; public final static ParcelUuid ParcelUuid_GENUINO101_ledService = ParcelUuid.fromString(String_GENUINO101_ledService); public final static UUID UUID_GENUINO101_ledService = UUID.fromString(String_GENUINO101_ledService);
public static String String_GENUINO101_switchChar = "19B10001-E8F2-537E-4F6C-D104768A1214"; public final static UUID UUID_GENUINO101_switchChare = UUID.fromString(String_GENUINO101_switchChar);
// Implements callback methods for GATT events that the app cares about. For example, // connection change and services discovered. private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { String intentAction; if (newState == BluetoothProfile.STATE_CONNECTED) { intentAction = ACTION_GATT_CONNECTED; mConnectionState = STATE_CONNECTED; broadcastUpdate(intentAction); Log.i(TAG, "Connected to GATT server."); // Attempts to discover services after successful connection. Log.i(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices());
private void broadcastUpdate(final String action) { final Intent intent = new Intent(action); sendBroadcast(intent); }
private void broadcastUpdate(final String action, final BluetoothGattCharacteristic characteristic) { final Intent intent = new Intent(action);
/* // This is special handling for the Heart Rate Measurement profile. Data parsing is // carried out as per profile specifications: // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx // ?u=org.bluetooth.characteristic.heart_rate_measurement.xml if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) { int flag = characteristic.getProperties(); int format = -1; if ((flag & 0x01) != 0) { format = BluetoothGattCharacteristic.FORMAT_UINT16; Log.d(TAG, "Heart rate format UINT16."); } else { format = BluetoothGattCharacteristic.FORMAT_UINT8; Log.d(TAG, "Heart rate format UINT8."); } final int heartRate = characteristic.getIntValue(format, 1); Log.d(TAG, String.format("Received heart rate: %d", heartRate)); intent.putExtra(EXTRA_DATA, String.valueOf(heartRate)); } else { // For all other profiles, writes the data formatted in HEX. final byte[] data = characteristic.getValue(); if (data != null && data.length > 0) { final StringBuilder stringBuilder = new StringBuilder(data.length); for(byte byteChar : data) stringBuilder.append(String.format("%02X ", byteChar)); intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString()); } } */
//remove special handling for time being Log.w(TAG, "broadcastUpdate()");
final byte[] data = characteristic.getValue();
Log.v(TAG, "data.length: " + data.length);
if (data != null && data.length > 0) { final StringBuilder stringBuilder = new StringBuilder(data.length); for(byte byteChar : data) { stringBuilder.append(String.format("%02X ", byteChar));
public class LocalBinder extends Binder { BluetoothLeService getService() { return BluetoothLeService.this; } }
@Override public IBinder onBind(Intent intent) { return mBinder; }
@Override public boolean onUnbind(Intent intent) { // After using a given device, you should make sure that BluetoothGatt.close() is called // such that resources are cleaned up properly. In this particular example, close() is // invoked when the UI is disconnected from the Service. close(); return super.onUnbind(intent); }
private final IBinder mBinder = new LocalBinder();
/** * Initializes a reference to the local Bluetooth adapter. * * @return Return true if the initialization is successful. */ public boolean initialize() { // For API level 18 and above, get a reference to BluetoothAdapter through // BluetoothManager. if (mBluetoothManager == null) { mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); if (mBluetoothManager == null) { Log.e(TAG, "Unable to initialize BluetoothManager."); return false; } }
mBluetoothAdapter = mBluetoothManager.getAdapter(); if (mBluetoothAdapter == null) { Log.e(TAG, "Unable to obtain a BluetoothAdapter."); return false; }
return true; }
/** * Connects to the GATT server hosted on the Bluetooth LE device. * * @param address The device address of the destination device. * * @return Return true if the connection is initiated successfully. The connection result * is reported asynchronously through the * {@code BluetoothGattCallback#onConnectionStateChange( * android.bluetooth.BluetoothGatt, int, int)} * callback. */ public boolean connect(final String address) { if (mBluetoothAdapter == null || address == null) { Log.w(TAG, "BluetoothAdapter not initialized or unspecified address."); return false; }
// Previously connected device. Try to reconnect. if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress) && mBluetoothGatt != null) { Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection."); if (mBluetoothGatt.connect()) { mConnectionState = STATE_CONNECTING; return true; } else { return false; } }
final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); if (device == null) { Log.w(TAG, "Device not found. Unable to connect."); return false; } // We want to directly connect to the device, so we are setting the autoConnect // parameter to false. mBluetoothGatt = device.connectGatt(this, false, mGattCallback); Log.d(TAG, "Trying to create a new connection."); mBluetoothDeviceAddress = address; mConnectionState = STATE_CONNECTING; return true; }
/** * Disconnects an existing connection or cancel a pending connection. The disconnection result * is reported asynchronously through the * {@code BluetoothGattCallback#onConnectionStateChange( * android.bluetooth.BluetoothGatt, int, int)} * callback. */ public void disconnect() { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.disconnect(); }
/** * After using a given BLE device, the app must call this method to ensure resources are * released properly. */ public void close() { if (mBluetoothGatt == null) { return; } mBluetoothGatt.close(); mBluetoothGatt = null; }
/** * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead( * android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)} * callback. * * @param characteristic The characteristic to read from. */ public void readCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.readCharacteristic(characteristic); }
/** * Enables or disables notification on a give characteristic. * * @param characteristic Characteristic to act on. * @param enabled If true, enable notification. False otherwise. */ public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
// This is specific to Genuino 101 ledService. if (UUID_GENUINO101_ledService.equals(characteristic.getUuid())) { BluetoothGattDescriptor descriptor = characteristic.getDescriptor( UUID_GENUINO101_switchChare); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); } }
/** * Retrieves a list of supported GATT services on the connected device. This should be * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully. * * @return A {@code List} of supported services. */ public List<BluetoothGattService> getSupportedGattServices() { if (mBluetoothGatt == null) return null;
return mBluetoothGatt.getServices(); } }
Edit AndroidManifest.xml to add service of ".BluetoothLeService".
// Check if BLE is supported on the device. if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, "BLUETOOTH_LE not supported in this device!", Toast.LENGTH_SHORT).show(); finish(); }
getBluetoothAdapterAndLeScanner();
// Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { Toast.makeText(this, "bluetoothManager.getAdapter()==null", Toast.LENGTH_SHORT).show(); finish(); return; }
listBluetoothDevice = new ArrayList<>(); adapterLeScanResult = new ArrayAdapter<BluetoothDevice>( this, android.R.layout.simple_list_item_1, listBluetoothDevice); listViewLE.setAdapter(adapterLeScanResult); listViewLE.setOnItemClickListener(scanResultOnItemClickListener);
mHandler = new Handler();
}
AdapterView.OnItemClickListener scanResultOnItemClickListener = new AdapterView.OnItemClickListener(){
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final BluetoothDevice device = (BluetoothDevice) parent.getItemAtPosition(position);
new AlertDialog.Builder(MainActivity.this) .setTitle(device.getName()) .setMessage(msg) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) {
} }) .show();
} };
private String getBTDevieType(BluetoothDevice d){ String type = "";
switch (d.getType()){ case BluetoothDevice.DEVICE_TYPE_CLASSIC: type = "DEVICE_TYPE_CLASSIC"; break; case BluetoothDevice.DEVICE_TYPE_DUAL: type = "DEVICE_TYPE_DUAL"; break; case BluetoothDevice.DEVICE_TYPE_LE: type = "DEVICE_TYPE_LE"; break; case BluetoothDevice.DEVICE_TYPE_UNKNOWN: type = "DEVICE_TYPE_UNKNOWN"; break; default: type = "unknown..."; }
// Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { Toast.makeText(this, "bluetoothManager.getAdapter()==null", Toast.LENGTH_SHORT).show(); finish(); return; }
private void getBluetoothAdapterAndLeScanner(){ // Get BluetoothAdapter and BluetoothLeScanner. final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
mScanning = false; }
/* to call startScan (ScanCallback callback), Requires BLUETOOTH_ADMIN permission. Must hold ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get results. */ private void scanLeDevice(final boolean enable) { if (enable) { listBluetoothDevice.clear(); listViewLE.invalidateViews();
// Stops scanning after a pre-defined scan period. mHandler.postDelayed(new Runnable() { @Override public void run() { mBluetoothLeScanner.stopScan(scanCallback); listViewLE.invalidateViews();
As shown in this video; there are three bluetooth devices running in range. This example recognize Genuino 101 and HM-10 (BLE module), but not HC-06 (classic Bluetooth module).
Last post demonstrate the Android Bluetooth Le Gatt example code with Arduino/Genuino 101. This post start to (TRY to) implement my own Bluetooth LE Gatt Example, step-by-step. The aim of the examples (in coming series) are scan BLE device, find and link with specified device Genuino 101 (programmed with "LEDCB", refer previous post), and read and write characteristic of the device to turn ON/OFF the Genuino 101 on-board LED.
In this first step, create a new project in Android Studio, named AndroidBleGatt.
In my example (in coming post) I will scan LE device using BluetoothLeScanner (Added in API level 21) instead of calling deprecated startLeScan() and stopLeScan() methods as in the BluetoothLeGatt example, so specify the Min Sdk Version of API 21.
Edit AndroidManifest.xml to add uses-feature of "android.hardware.bluetooth_le", uses-permission of "android.permission.BLUETOOTH", "android.permission.BLUETOOTH_ADMIN" and "android.permission.ACCESS_COARSE_LOCATION".
// Check if BLE is supported on the device. if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, "BLUETOOTH_LE not supported in this device!", Toast.LENGTH_SHORT).show(); finish(); }
getBluetoothAdapterAndLeScanner();
// Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { Toast.makeText(this, "bluetoothManager.getAdapter()==null", Toast.LENGTH_SHORT).show(); finish(); return; }
// Checks if Bluetooth is supported on the device. if (mBluetoothAdapter == null) { Toast.makeText(this, "bluetoothManager.getAdapter()==null", Toast.LENGTH_SHORT).show(); finish(); return; }
This post show how to run the Android Bluetooth Le Gatt example Code to link with Arduino/Genuino 101.
The Arduino/Genuino 101 board contains the Intel� Curie� Module. The 101 adds Bluetooth Low Energy capabilities and has an on-board 6-axis accelerometer/gyroscope, providing exciting opportunities for building creative projects in the connected world. More information about the technical specifications and documentation can be found on the Arduino/Genuino 101 main page.
In Arduino/Genuino 101 board, program with example: > File > Examples > CurieBLE > CallbackLED
This example setup Arduino/Genuino 101 as Bluetooth LE device (named "LEDCB") with service with UUID "19B10000-E8F2-537E-4F6C-D104768A1214" and create switch characteristic allowing remote device to read and write, with UUID "19B10001-E8F2-537E-4F6C-D104768A1214". We need the UUIDs in future examples.
So I copy here for future reference:
/* Copyright (c) 2015 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 */
#include <CurieBLE.h>
const int ledPin = 13; // set ledPin to use on-board LED BLEPeripheral blePeripheral; // create peripheral instance
BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); // create service
// create switch characteristic and allow remote device to read and write BLECharCharacteristic switchChar("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);
void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); // use the LED on pin 13 as an output
// set the local name peripheral advertises blePeripheral.setLocalName("LEDCB"); // set the UUID for the service this peripheral advertises blePeripheral.setAdvertisedServiceUuid(ledService.uuid());
// add service and characteristic blePeripheral.addAttribute(ledService); blePeripheral.addAttribute(switchChar);
// assign event handlers for connected, disconnected to peripheral blePeripheral.setEventHandler(BLEConnected, blePeripheralConnectHandler); blePeripheral.setEventHandler(BLEDisconnected, blePeripheralDisconnectHandler);
// assign event handlers for characteristic switchChar.setEventHandler(BLEWritten, switchCharacteristicWritten); // set an initial value for the characteristic switchChar.setValue(0);
// advertise the service blePeripheral.begin(); Serial.println(("Bluetooth device active, waiting for connections...")); }
void switchCharacteristicWritten(BLECentral& central, BLECharacteristic& characteristic) { // central wrote new value to characteristic, update LED Serial.print("Characteristic event, written: ");
In Android side, load with example code of Bluetooth Le Gatt:
How it run:
This demo haven't show any real function indeed. In coming posts, I will TRY to implement my own example app (with re-using part of the Bluetooth Le Gatt example) to control and read state from Genuino 101. Currently, I don't know how much I can.