所有关于电路
项目

如何使用Android应用程序与一个定制的祝福

2015年9月18日,通过特拉维斯Fagerness

学习如何与一个定制的BLE外围使用Android设备。

本文演示了如何与一个定制的BLE外围使用Android设备。这个应用程序可以适应BLE功能添加到其他设备通过连接联盟能力的设备。

概述

这是一个系列文章的一部分nRF51。nRF51是soc皮层M0和祝福所有在一个无线电芯片。本文演示了如何从安卓定制外围通信。

前面的文章:
使用nRF51祝福:ARM-GCC构建环境

如何使用Android应用程序与一个定制的祝福

需求

安装

Java JDK 7

适用于您的操作系统下载JDK安装和按照屏幕上的指令。

Android工作室

下载您的操作系统的安装程序,按照屏幕上的指示来安装。

创建一个新项目

开放的安卓工作室,你应该看到下面的屏幕。

选择导入一个Android代码示例。在下一个屏幕上选择样本蓝牙Le关贸总协定连接。该项目将使我们与我们的应用程序的框架来构建的。样例应用程序可以扫描设备,连接,和显示信息服务和特色。

项目名称你想什么。我把它作为默认相同的名称。

单击Finish。现在该项目将负载。

处理一个项目

IDE似乎势不可挡,它有许多功能。

让我们通过一些关键的特性,我们需要创建一个自定义应用程序基于这个例子。

文件浏览器

文件浏览器有许多类别和显示每个文件的项目。的体现xml文件,设置项目,告诉操作系统应用程序将需要哪些行为和特性。的java文件夹包含应用程序的实际代码。的res文件夹包含的资源,如图形布局,菜单,和价值观在整个应用程序中使用。值可以是字符串、数组、颜色等等。在整个应用程序中使用它们的代码,而不是硬编码的值。

布局视图

布局视图将自动打开,如果打开布局文件。布局可以modifed直接通过改变文本视图通过点击左下角的底部。记住这一点,因为它会更容易复制下一节的代码创建一个布局。

Java视图

如果你打开一个java文件,一个标准的文本编辑器就会打开。

与按钮创建一个布局

我们要向应用程序添加两个按钮将使我们能够读和写所创建的自定义特性。要做到这一点,我们必须创建一个新的布局文件,右键单击文件夹> new >布局资源布局。将打开一个新窗口,设置一些选项,让他们作为默认值。将名称设置为“button_control”。您现在应该看到一个新文件称为“button_control。xml”文件夹下的布局。

在左下角点击“文本”按钮来查看XML文件本身。将下面的代码粘贴到文件button_control.xml。

< ?xml version = " 1.0 " encoding = " utf - 8 " ?> < LinearLayout xmlns: android = " http://schemas.android.com/apk/res/android " android:取向=“垂直”android: layout_width =“match_parent”android: layout_height = " match_parent " > <按钮android: layout_width =“match_parent”android: layout_height =“wrap_content”android:文本=“写字符”android: id =“@ + id / button2”android: onClick = " onClickWrite " / > <按钮android: layout_width =“match_parent”android: layout_height =“wrap_content”android:文本=“读字符“android: id =“@ + id /按钮”android: onClick = " onClickRead " / > < TextView android: layout_width =“wrap_content”android: layout_height =“wrap_content”android:文本=“@string / no_data”android: id = " @ + id / data_value " / > < / LinearLayout >

您应该会看到两个按钮在电话的例子和一些文本说“没有数据”。这个文本字段用于显示特征数据。

增加BluetoothLeService读写函数

为了使按钮做任何事情,我们必须修改BluetoothLeService文件能够读和写自定义特性。函数名为后添加以下两个函数getSupportedServices ()在第314行。这些功能已经硬编码的UUID的BLE外围项目中创建的。

公共空间readCustomCharacteristic(){如果(mBluetoothAdapter = = null | | mBluetoothGatt = = null){日志。w(标签,“BluetoothAdapter不初始化”);返回;}/ *检查设备上的服务是可用* / BluetoothGattService mCustomService = mBluetoothGatt.getService (UUID.fromString (“00001110 - 0000 - 1000 - 8000 - 00805 - f9b34fb "));如果(mCustomService = = null){日志。w(标签,“自定义BLE服务未找到”);返回;}/ *得到阅读的特点从服务* / BluetoothGattCharacteristic mReadCharacteristic = mCustomService.getCharacteristic (UUID.fromString (“00000002 - 0000 - 1000 - 8000 - 00805 - f9b34fb "));如果(mBluetoothGatt.readCharacteristic (mReadCharacteristic) = = false){日志。w(标签,“未能读特征”);}}公共空writeCustomCharacteristic (int值){如果(mBluetoothAdapter = = null | | mBluetoothGatt = = null){日志。w(标签,“BluetoothAdapter不初始化”);返回; } /*check if the service is available on the device*/ BluetoothGattService mCustomService = mBluetoothGatt.getService(UUID.fromString("00001110-0000-1000-8000-00805f9b34fb")); if(mCustomService == null){ Log.w(TAG, "Custom BLE Service not found"); return; } /*get the read characteristic from the service*/ BluetoothGattCharacteristic mWriteCharacteristic = mCustomService.getCharacteristic(UUID.fromString("00000001-0000-1000-8000-00805f9b34fb")); mWriteCharacteristic.setValue(value,android.bluetooth.BluetoothGattCharacteristic.FORMAT_UINT8,0); if(mBluetoothGatt.writeCharacteristic(mWriteCharacteristic) == false){ Log.w(TAG, "Failed to write characteristic"); } }

增加DeviceControlActivity读写函数

BluetoothLeService只是底层类abtracts一些祝福安卓功能。为了从UI做任何事,必须做一些修改该文件DeviceControlActivity。添加以下两个函数结束后的类makeGattUpdateIntentFilter ()。这些函数只调用这两个函数添加到类。的onClickWrite ()函数写值0 xaa的特点,但这可以修改成你希望的任何值。读函数触发一个读请求的操作系统。当阅读完成后通过一个数据转移意图这是读mGattUpdateReceiver行动ACTION_DATA_AVAILABLE意图和行为是Android的一个特性,而超出了本文的范围。

公共空间onClickWrite(查看v){如果(mBluetoothLeService ! = null) {mBluetoothLeService.writeCustomCharacteristic (0 xaa);}}公共空onClickRead(查看v){如果(mBluetoothLeService ! = null) {mBluetoothLeService.readCustomCharacteristic ();}}

修改DeviceControlActivity

编写的类将尝试访问一些UI特性,不存在于我们创建的布局。确保应用程序不会崩溃,几行注释掉了。我们也不得不开始布局,我们创建了。


函数mGattUpdateReceiver

注释掉109行:
/ / displayGattServices (mBluetoothLeService.getSupportedGattServices ());

函数clearUI

注释掉151行:
/ / mGattServicesList.setAdapter ((SimpleExpandableListAdapter)零);


onCreate函数

注释掉UI引用。保持mDataField引用。改变setContentView函数加载button_control布局。

@Override公共空onCreate(包savedInstanceState) {super.onCreate (savedInstanceState);setContentView (R.layout.button_control);最终目的意图= getIntent ();mDeviceName = intent.getStringExtra (EXTRAS_DEVICE_NAME);mDeviceAddress = intent.getStringExtra (EXTRAS_DEVICE_ADDRESS);/ /设置UI引用。/ * ((TextView) findViewById (R.id.device_address)) . settext (mDeviceAddress);mGattServicesList = (ExpandableListView) findViewById (R.id.gatt_services_list);mGattServicesList.setOnChildClickListener (servicesListClickListner);mConnectionState = (TextView) findViewById (R.id.connection_state); */ mDataField = (TextView) findViewById(R.id.data_value); getActionBar().setTitle(mDeviceName); getActionBar().setDisplayHomeAsUpEnabled(true); Intent gattServiceIntent = new Intent(this, BluetoothLeService.class); bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE); }
函数updateConnectionState

删除235行:
/ / mConnectionState.setText (resourceId);

测试应用程序

首先,确保周边打开和广告。下载的应用程序将你的手机连接到电脑,点击绿色箭头。将弹出一个窗口,选择设备上运行。如果你没有看到你的设备,你可能需要安装亚行USB debuggable驱动程序和设置你的设备。这是不同的对于每一个设备。

应用程序将打开你的手机。它会自动开始扫描。选择“自定义BLE”外围。现在你可以读和写数据按按钮。当你写的时候,你可以看到数据UART控制台。当你阅读时,你可以看到手机上的数据增加了每秒钟值为1。数据显示为ASCII文本和原始字节值。

我按下了按钮读字符,可以看到数据值0 x6a ASCII“j”。

结论

本文演示了如何在Android BLE的例子工作室可以修改无论UUID。这个应用程序可以适应BLE功能添加到其他设备通过连接联盟能力的设备。这可能是通过GPIO、SPI、UART、I2C实现。以后的文章将显示一些这样的例子。玩得开心!

自己尝试这个项目!BOM。

BluetoothLeGatt.zip

60的评论
  • 很棒的小教程正是我一直在寻找的。我仍在努力理解UUID协议。

    喜欢的。 回复
    • Leytronix 2019年6月14日
      确实伟大的教程,但是代码的链接是无效的。谁有代码?
      喜欢的。 回复
      • K
        凯特·史密斯 2019年6月18日
        感谢你的阅读!我们可以下载该文件在我们最后你告诉我们如果你登录吗?如果是这样,我们必须进一步调查来找出问题。
        喜欢的。 回复