1. 项目概述与准备工作
在这个万物互联的时代,手机与硬件设备的无缝连接已经成为现实。想象一下,你躺在沙发上用手机App就能控制家里的智能灯开关,或者在工作时远程监控工厂设备的运行状态——这些看似科幻的场景,现在通过Android Studio和STM32的蓝牙协作就能轻松实现。作为一个有10年经验的开发者,我亲自实践过这个项目,今天就来分享如何用手机App驱动STM32硬件创新。
首先来看看需要准备哪些工具和环境。Android Studio是开发手机App的核心工具,建议使用最新稳定版,我目前用的是Android Studio Giraffe版本,兼容性很好。STM32开发环境我推荐STM32CubeIDE,它集成了代码生成和调试功能,特别适合嵌入式开发新手。蓝牙模块选择上,HC-05或HC-06都是不错的选择,价格便宜且容易上手,我在淘宝上买的HC-05模块只要15块钱一个。
编程语言方面,Android端建议使用Kotlin,相比Java更简洁现代;STM32端当然是C语言了。如果你对蓝牙协议不太熟悉也不用担心,我会用最通俗的方式讲解关键概念。实际开发中,我建议先准备好以下硬件:一块STM32F103C8T6开发板(也就是常说的Blue Pill板子),价格在20元左右;一个HC-05蓝牙模块;还有若干LED和电阻用于测试。
注意:购买蓝牙模块时一定要选择已配对好的版本,否则还需要额外的USB转TTL工具进行AT指令配置,会增加入门难度。
开发环境配置有个小技巧:先在STM32CubeIDE中安装对应的芯片支持包,然后在Android Studio中配置好最低API级别为19(Android 4.4),这样可以覆盖绝大多数现代安卓设备。我第一次做这个项目时,就因为API级别设置太高导致老手机无法运行,折腾了好久才找到原因。
2. Android端蓝牙控制App开发
2.1 用户界面设计与实现
设计App界面时要考虑实用性和美观性的平衡。我的做法是创建一个简洁的控制器界面,包含设备列表、连接状态显示和控制按钮。在Android Studio中新建项目时,选择Empty Activity模板,命名为BluetoothController。
布局文件主要包含几个关键组件:一个ListView用于显示发现的蓝牙设备,一个TextView显示连接状态,还有一组控制按钮。我这里用LinearLayout垂直布局,代码是这样的:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btnScan"
android:text="扫描设备"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ListView
android:id="@+id/listDevices"
android:layout_width="match_parent"
android:layout_height="200dp"/>
<TextView
android:id="@+id/tvStatus"
android:text="未连接"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnLedOn"
android:text="打开LED"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnLedOff"
android:text="关闭LED"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
在实际项目中,我建议添加进度条来显示扫描状态,因为蓝牙扫描可能需要几秒钟时间,给用户视觉反馈很重要。颜色搭配上,用绿色表示已连接,红色表示断开,这样直观明了。
2.2 蓝牙权限处理与设备扫描
蓝牙功能需要申请权限,这是一个容易踩坑的地方。在AndroidManifest.xml中需要添加以下权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
注意:从Android 6.0开始,还需要运行时申请位置权限,因为蓝牙扫描需要用到位置服务。我第一次开发时就忘了这个,导致在最新Android版本上无法扫描设备。
设备扫描的核心代码是这样的:
private fun scanDevices() {
if (!checkPermissions()) {
requestPermissions()
return
}
val bluetoothAdapter: BluetoothAdapter? = Bluetoo


2764

被折叠的 条评论
为什么被折叠?



