[原创] Android应用使用蓝牙通信控制车联网设备(Kotlin实现)

前言

现在物联网设备和车联网设备中使用蓝牙通信的场景越来越多,前几年只有高端车才具备使用手机控制车辆的功能,现在已经越来越普及,包括自动解锁、一键寻车、车辆控制、电量检测,OTA无线升级等,还有现在很普及的共享单车,也是通过手机的蓝牙无线控制实现的解锁功能。
这几天韧带做手术比较有时间,又不能到处跑,不然有空肯定是出去嗨呀… 见下图:
没钱嗨个屁
这个实例的 Android Studio 版本4.1.2 , TargetSdkVersion版本是 28,Gradle 版本: 6.5

本文主要包含下面几个内容:
1. 首先展示了我做的一个使用Android控制蓝牙设备的一个实例,模拟的是用户使用手机打开车辆前门和打开后备箱。
2. Android 蓝牙通信的基本介绍和实现步骤

Enjoy !

在这里插入图片描述

开发环境

Android Studio 版本4.1.2
TargetSdkVersion: 28
CompileSdkVersion 28
Gradle 版本: 6.5

1. 步骤展示

手机注册蓝牙通信Server端

首先,车主手机端进入Android 车控APP,在车控蓝牙通信过程中,注册为Server端,这样车控APP就可以主动建立蓝牙连接。

Android 蓝牙通信中会会涉及SPP通用数据传输协议,这个协议是Android 2.0中引入的API,通过Socket的形式实现数据传输及交互,需要区分Server端和 Client 端。

在这里插入图片描述

蓝牙设备注册Client端

蓝牙从设备就是通信中的Client端,我这里用一个有蓝牙功能的Pad 模拟了车载蓝牙模块,这样双机通信的方法比较方(省)便(钱) , 现在市面上用得比较多的是HC-06 蓝牙通信模块,可以和单片机配合使用,有钱有时间的自己试一下。

在这里插入图片描述

Android手机端通过蓝牙发送打开前门指令

在这里插入图片描述

Android手机端通过蓝牙发送打开后备箱指令

在这里插入图片描述

从上面的画面大家可以看到,用户的手机和蓝牙设备是没有通过数据线直接连接的,手机通过蓝牙向Client设备发送了指令,Client设备接收到指令后,执行了打开车门和打开后备箱的动作,将模型中的相应部位变成了红色。

2. Android 蓝牙通信的基本介绍和实现步骤

  1. #在Manifest 里申请蓝牙权限
    首先,要在新建项目中的AndroidManifest.xml中声明两个权限:BLUETOOTH权限用于请求连接和传送数据;BLUETOOTH_ADMIN权限用于启动设备、发现或进行蓝牙设置,如果要拥有该权限,必须先拥有BLUETOOTH权限。
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

注意:这里有一个坑,如果你的TargetVersion大于22,就意味着你需要让用户动态申请权限,这个时候需要增加下面的ACCESS_FINE_LOCATION和 ACCESS_COARSE_LOCATION权限。 否则车主的手机会无法搜索到蓝牙设备,我就遇到了这个问题。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  1. SSP通用数据传输协议中,Android 蓝牙通信用到的四个类:
  • BluetoothAdapter:代表本地蓝牙适配器,是所有蓝牙交互的入口。使用这个你可以发现其他蓝牙设备,查询已配对的设备列表,使用一个已知的 MAC 地址来实例化一个 BluetoothDevice,以及 创建一个BluetoothServerSocket 来为监听与其他设备的通信

  • BluetoothDevice:代表一个远程蓝牙设备,使用这个来请求一个与远程设备的 BluetoothSocket连接,或者查询关于设备名称、地址、类和连接状态等设备信息 。

  • BluetoothSocket:代表一个蓝牙 socket 的接口(和 TCP Socket 类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过 InputStream 和 OutputStream 交换数据。

  • BluetoothServerSocket:代表一个开 放的服务 器 socket,它 监听接受 的请求( 与 TCP ServerSocket 类似)。为了连接两台 Android 设备,一个设备必须使用这个类开启一个服务器 socket。当一个远程蓝牙设备开始一个和该设备的连接请求,BluetoothServerSocket 将会返回一 个已连接的BluetoothSocket,接受该连接。

  1. 在蓝牙通信中,无论在Server端,还是在Client端,都需要使用BluetoothAdapter适配器启动蓝牙功能
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter() 
            iv_server_original!!.setImageResource(R.drawable.server_background_original)
            if (mBluetoothAdapter == null) {
   
                Toast.makeText(applicationContext, "bluetooth is no available", Toast.LENGTH_LONG).show() 
                return@OnClickListener
            }
            mBluetoothAdapter!!.enable() 
            if (!mBluetoothAdapter!!.isEnabled) {
   
                Toast.makeText(applicationContext, "bluetooth function is no available", Toast.LENGTH_LONG).show()
                finish()
                return@OnClickListener
            }
            try {
   
                serverSocket = mBluetoothAdapter!!.listenUsingRfcommWithServiceRecord("aaa", uuid)
                btListen_Thread = btListenThread(serverSocket, bluetoothServerMessageHandle)
                btListen_Thread!!.start()
                Toast.makeText(applicationContext, "服务器端已经开始运行", Toast.LENGTH_SHORT).show()
            } catch (e: IOException) {
   
                e.printStackTrace()
            }
        })

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter() : 用于获取蓝牙适配器
mBluetoothAdapter!!.enable() : 允许蓝牙适配器,如果enable 失败,表示当前蓝牙设备不可用
if (mBluetoothAdapter == null) //表示当前手机不支持蓝牙

  1. 使用SSP协议中的uuid作为参数,使用 mBluetoothAdapter!!.listenUsingRfcommWithServiceRecord("aaa", uuid) 方法新建ServerSocket对象。并且通过 btListenThread(serverSocket, bluetoothServerMessageHandle) 构造函数创建 蓝牙监听线程。
    下面的bluetoothServerMessageHandle对象用户接受蓝牙指令后,在界面的展示。
            try 
  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在 Android Studio 中为应用设置密码,可以使用 Android Keystore System 来存储和保护密码。下面是使用 Kotlin 实现此功能的一些步骤: 1. 首先,您需要在您的项目中添加以下依赖项: ``` implementation "androidx.security:security-crypto:1.0.0" ``` 2. 在您的 Activity 或 Fragment 中创建一个函数,用于向 Keystore 存储密码。以下是一个示例函数: ``` private fun savePasswordToKeystore(password: String) { val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec) val sharedPreferences = getSharedPreferences("my_app_preferences", Context.MODE_PRIVATE) val encryptedPassword = EncryptedSharedPreferences.create( "my_app_passwords", masterKeyAlias, applicationContext, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) encryptedPassword.edit().putString("my_password_key", password).apply() } ``` 此函数将使用 Android Keystore System 将密码加密并存储在 EncryptedSharedPreferences 中。 3. 在您的 Activity 或 Fragment 中创建一个函数,用于检索从 Keystore 存储的密码。以下是一个示例函数: ``` private fun getPasswordFromKeystore(): String? { val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec) val encryptedPassword = EncryptedSharedPreferences.create( "my_app_passwords", masterKeyAlias, applicationContext, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) return encryptedPassword.getString("my_password_key", null) } ``` 此函数将从 EncryptedSharedPreferences 中检索加密的密码,并将其解密返回。 4. 最后,在您的 Activity 或 Fragment 中,您可以使用上面的函数创建一个设置密码的按钮和一个输入密码的 EditText。当用户点击设置密码按钮时,您可以调用 savePasswordToKeystore() 函数,将密码存储在 Keystore 中。当用户尝试登录时,您可以使用 getPasswordFromKeystore() 函数检索密码并验证它是否正确。 希望这可以帮助您使用 Kotlin 实现Android Studio 中为应用设置密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值