目录

今日科技快讯

介绍

实战


今日科技快讯

2月21日凌晨,三星美国旧金山举行Galaxy Unpacked 2019新品发布会。正式发布年度旗舰Galaxy S10系列手机以及折叠手机Galaxy Fold,还推出了首款5G手机。

Galaxy Fold此前曾在2018年11月开发者大会上亮相,但当时并没宣布具体参数,今天这是它终于定妆出场。它的形态是两折的,仿佛一个钱包,外表是一块4.6英寸的狭长屏幕,打开后,内部是一块7.3英寸的屏幕。三星Galaxy S10系列一共包含三款机型,分别是S10、S10+、S10e。相比去年的S9系列,S10系列外观最大的变化在于采用Dynamic AMOLED屏幕设计,网友俗称“挖孔屏”,其中S10为6.1英寸2K分辨率双曲全视屏、S10+为6.4英寸2K分辨率双曲全视屏,S10e由于定位相比前两者更低,所以仍然使用1080P非双曲全视屏。(转郭霖大神的快讯)

介绍

蓝牙介绍:

BLE蓝牙的兴起主要因为近年来可穿戴设备的流行。由于传统蓝牙功耗高不能满足可穿戴设备对于续航的要求。所以大部分可穿戴设备采用蓝牙4.0,即BLE蓝牙技术。BLE(Bluetooth Low Energy)低功耗蓝牙,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输。
缺点:BLE蓝牙数据传输速率低,特别是在安卓开发过程,BLE蓝牙一包数据最多为20字节,因此安卓系统下最好不要使用BLE蓝牙传输大量数据。

之前我在创业公司工作的时候做过一款蓝牙开锁APP,当时刚拿到需求的时候各种懵逼,在网上百度了好几天都没有一点头目,因为都讲的牛头不对马嘴,换句话来说不是我想要的,根本满足不了我现在的需求,不知道从何入手,然后问身边各种蓝牙大牛以及技术大牛才稍微有一点头目,在这里给大家分享一下技术难点和各种坑,我直接上图:

流程大概是这样:我懒得画图了,用简单一句话来讲就是,房东分配钥匙-租客拿到权限-临时权限(各种权限....)-查看房子-下单

实战

在开始之前推荐几个蓝牙框架给大家学习:https://github.com/dingjikerbo/BluetoothKit,https://github.com/litesuits/android-lite-bluetoothLE

上面已经简单得介绍了一下项目的流程,现在直接上重点以第一个指令开始演示:

由于怕影响到公司业务,打上马赛克,你们可以根据自己的业务需求来实现功能

权限代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.nokelock.nokelockble"><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><applicationandroid:name=".App"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name="com.nokelock.service.BluetoothLeService"android:enabled="true" /><activity android:name=".LockManageActivity" android:screenOrientation="portrait"/></application></manifest>

扫描部分:

private void startScanDevice() {if (isRefreshing) return;isRefreshing = true;BluetoothLeService bluetoothLeService = App.getInstance().getBluetoothLeService();if (bluetoothLeService != null) {final BluetoothAdapter bluetoothAdapter = bluetoothLeService.getmBluetoothAdapter();if (bluetoothAdapter == null) {isRefreshing = false;return;}tvRefresh.setText("正在扫描...");bluetoothDeviceList.clear();adapterList.clear();bleDeviceList.clear();bluetoothAdapter.startLeScan(new UUID[]{SampleGattAttributes.bltServerUUID}, leScanCallback);handler.postDelayed(new Runnable() {@Overridepublic void run() {tvRefresh.setText("扫描结束");isRefreshing = false;bluetoothAdapter.stopLeScan(leScanCallback);}}, 5000);} else {isRefreshing = false;}}

扫描回调:

这一块可以做处理比如我匹配到mac地址直接跳转到主页,你们可以做成那种扫描完以后放到adapter里面进行展示,这样更加直观明了。

private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {@Overridepublic void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {if (!bluetoothDeviceList.contains(device)) {bluetoothDeviceList.add(device);bleDevice = new BleDevice(device, scanRecord, rssi);Log.e("TAG", "名字" + device.getName());Log.e("TAG", "MAC" + device.getAddress());//自动连接if ("F0:0F:26:5D:95:E3".equals(device.getAddress())) {Log.e("TAG", "ok");App.getInstance().getBluetoothLeService().connect("F0:0F:26:5D:95:E3");Intent intent = new Intent(MainActivity.this, LockManageActivity.class);intent.putExtra("name", device.getName());intent.putExtra("address", device.getAddress());startActivity(intent);}bleDeviceList.add(bleDevice);}}};
 private void initWidget() {comp = new SortComparator();ListView listView = (ListView) findViewById(R.id.recycler_view);tvRefresh = (TextView) findViewById(R.id.tv_refresh);Button btRefresh = (Button) findViewById(R.id.bt_refresh);adapter = new DeviceAdapter(this, adapterList);listView.setAdapter(adapter);new Thread(new DeviceThread()).start();listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {App.getInstance().getBluetoothLeService().getmBluetoothAdapter().stopLeScan(leScanCallback);isRefreshing = false;tvRefresh.setText("扫描结束");BleDevice bluetoothDevice = adapterList.get(position);String name = bluetoothDevice.getDevice().getName();if (TextUtils.isEmpty(name)) {name = "null";}String address = bluetoothDevice.getDevice().getAddress();Intent intent = new Intent(MainActivity.this, LockManageActivity.class);intent.putExtra("name", name);intent.putExtra("address", address);startActivity(intent);}});btRefresh.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {refreshDevice();}});}private void refreshDevice() {requestPermission(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 101);}

连接到蓝牙以后呢,就比较简单了,现在要做的是蓝牙锁的读和写:

/*** BLE通讯广播*/private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();switch (action) {case SampleGattAttributes.ACTION_GATT_CONNECTED://链接deviceStatus.setText("连接状态:已连接");progressDialog.dismiss();break;case SampleGattAttributes.ACTION_GATT_DISCONNECTED://断开progressDialog.dismiss();deviceStatus.setText("连接状态:已断开");count = 0;openCount.setText("开锁次数:" + count);break;case SampleGattAttributes.ACTION_GATT_SERVICES_DISCOVERED://发现服务handler.sendEmptyMessageDelayed(0, 2000);break;case SampleGattAttributes.ACTION_BLE_REAL_DATA:parseData(intent.getStringExtra("data"));break;case BluetoothAdapter.ACTION_STATE_CHANGED:Log.e(LockManageActivity.class.getSimpleName(), "state_changed");break;}}};
private void parseData(String value) {byte[] values = HexUtils.hexStringToBytes(value);byte[] x = new byte[16];System.arraycopy(values, 0, x, 0, 16);byte[] decrypt = BluetoothLeService.Decrypt(x, SampleGattAttributes.key);String decryptString = HexUtils.bytesToHexString(decrypt).toUpperCase();Log.e("TAG", "value:" + decryptString);if (decryptString.startsWith("0102")) {//tokenif (decrypt != null && decrypt.length == 16) {if (decrypt[0] == 0x01 && decrypt[1] == 0x02) {token[0] = decrypt[3];token[1] = decrypt[4];token[2] = decrypt[5];token[3] = decrypt[6];CHIP_TYPE = decrypt[7];DEV_TYPE = decrypt[10];deviceVersion.setText("当前版本:" + Integer.parseInt(decryptString.substring(16, 18), 16) + "." + Integer.parseInt(decryptString.substring(18, 20), 16));handler.sendEmptyMessageDelayed(1, 1000);}}handler.sendEmptyMessage(1);} else if (decryptString.startsWith("0402")) {//电量progressDialog.dismiss();
//            if (decryptString.startsWith("020201ff")) {
//                deviceCz.setText("获取电量失败");
//                Log.e("TAG", "获取电量失败");
//            } else {String battery = decryptString.substring(10, 12);deviceBattery.setText("当前电量:" + battery);Log.e("TAG", "电量字符串" + battery);Log.e("TAG", "当前电量" + Integer.parseInt(battery, 16));
//            }} else if (decryptString.startsWith("0202")) {//开锁if (decryptString.startsWith("02020101")) {deviceCz.setText("开锁失败");} else {count++;deviceCz.setText("开锁成功");openCount.setText("开锁次数:" + count);}}

基本一系列操作已经做完了,主要难点就是指令的读和写,然后在转成文档对应的编码就可以了,后面只需要按照文档里面的读和写操作就可以了,上面代码完全可以用设计模式优化一下,在这里只做演示,所以就没有那么优雅。

之前有过一篇蓝牙打印文章感兴趣请移步:https://blog.csdn.net/a214024475/article/details/52996047

练习

对照现有的蓝牙框架进行练习:https://github.com/dingjikerbo/BluetoothKit,https://github.com/litesuits/android-lite-bluetoothLE

Android蓝牙开锁讲解相关推荐

  1. android 蓝牙开锁功能,uni-app蓝牙开锁篇

    uni-app的api和微信的api其实很相似,用法一样,在这里奉上我之前在项目中实现蓝牙开锁的代码,我会说明每一步的步骤,哪个步骤用哪个api,每个api的详细用法可以去uni-app官网参考文档 ...

  2. 基于Arduino的无接触式智能门锁(RFID和蓝牙开锁)

    一.简单介绍 本项目基于Arduino开发,支持刷卡(复旦卡)和蓝牙串口密码发送两种方式,支持舵机和继电器(可接电磁锁等)两种开锁方式.详情见代码,代码注释很全的. 文章末尾附源程序.库文件.3D打印 ...

  3. Android 蓝牙开发 uuid,Android蓝牙开发之 UUID

    UUID:全球唯一标识符 在蓝牙中,每个Service和Characteristic都唯一地由"全球唯一标识符" (UUID)来校验,主要是保证他们的唯一性. UUID可分为:16 ...

  4. iphone开蓝牙wifi上网慢_为啥我开锁总是比别人慢?

    说起手机的蓝牙功能,大家都不陌生,在还没有wifi,网速超级慢,流量也贵得害怕的年代. 蓝牙传送是两台手机之间传输文件最快也最方便的方式,堪称当年手机界的"黑科技"功能.多年过去后 ...

  5. Android蓝牙开发 — 经典蓝牙BLE蓝牙

    一,前期基础知识储备 1)蓝牙是一种支持设备之间短距离通信的无线电技术(其他还包括红外,WIFI): 支持移动电话.笔记本电脑.无线耳机等设备之间进行信息的交换: Android支持的蓝牙协议栈:Bl ...

  6. android 智能家居 物联网 声纹开锁

    智能家居 物联网  声纹开锁 啥话不说,先上效果图:   前几天给客户做一个物联网的项目,完事后,自己觉得挺好玩,也花100多块钱买了一个8路的继电器模块,买了一个小锁头,我的初衷是要通过手机蓝牙信号 ...

  7. android 蓝牙锁应用开发实例(三)蓝牙相关功能实现【第一部分】

    本人水平有限,文章中如果出现什么不正确或者模糊的地方,还请各位小伙伴留下评论,多多指教 : ) 正式开始前的话 蓝牙开发梳理 整体思路 核心API BlueToothAdapter 简介 getDef ...

  8. JavaScript|拖拽|仿Android手机九点连线开锁

    最简单的JavaScript拖动代码 <script> var xx=0,yy=0; function a(v) { xx=event.x-v.offsetLeft; yy=event.y ...

  9. 实训9——蓝牙修改开锁密码

    实训九 : 蓝牙修改开锁密码 一.实验目的 通过ESP32,按键模块和SG90舵机,实现蓝牙发送相应的命令修改按键密码 二.实验内容 1.连接ESP32和按键模块的引脚,以及ESP32和SG90舵机的 ...

  10. Android定制化自己的开锁界面

    android 在4.0以前,解锁界面是采用横滑的方式,在4.0之后,就采用了中心圆环的解锁方式,4.0和4.1都是有三个图标的,分别是:向上的google搜索应用,向左的拍照应用以及向右的正常解锁功 ...

最新文章

  1. oracle sql now函数,postgresql的now()与Oracle的sysdate区别说明
  2. 人人都能成为安全防范的高手 ——《黑客新型攻击防范:深入剖析犯罪软件》
  3. 我是一个SDN控制器
  4. 企业建立规范化IT运维管理制度的重要性
  5. 十种MySQL报错注入
  6. 四位先行进位电路逻辑表达式_如何用基本的逻辑门设计32bit的超前进位加法器?...
  7. hybris测试数据的存放位置
  8. Web API 速率限制(一)
  9. 在C语言中巧用正则表达式
  10. C语言的预编译,程序员必须懂的知识!【预编译指令】【预编译过程】
  11. springboot 全局捕获异常
  12. endnote 参考文献加序号_EndNote同一文章的插入不同编号参考文献的方法 | 科研动力...
  13. ajax 七牛云上传图片,学习笔记:利用七牛云上传图片小结
  14. 【ubuntu20】虚拟机下ubuntu联网
  15. 计算机词汇怎么背,如何背诵英语词汇更有效?
  16. html 手机语音聊天,好用的手机语音聊天软件推荐
  17. 计算机基础知识八股文(网络篇)
  18. 区块链学习笔记一 BTC密码学原理
  19. Panabit专业流量监控开源软件
  20. 做自媒体没素材怎么办?

热门文章

  1. Linux 基础入门---常用命令
  2. 课程管理系统 java
  3. html怎么打开成word,html怎么打开Word文档
  4. awvs 中文手册详细版
  5. 超精华的unity2d同屏显示9千人,看完还怕学不会?
  6. bmi计算器公式_bmi计算器免费版客户端
  7. PHP+MYSQL图书管理系统(课设)
  8. WinRAR命令行参数整理
  9. 如何使用NFC读写器读卡器ACR122U-A9|ACR1251U-M1|ACR1252U读写NDEF格式的智能海报|网址|文本等数据的方法与步骤
  10. 年末十家手机银行数字化升级大盘点:谁家开发更全面?谁家建设更到位?