刚接触蓝牙开发是在第一份工作的时候(在2014年的时候),当时还不知道什么是报文,校验和等等一堆新手需要领包裹的新知识,哈哈哈,想起来就是一个小白出城了
智能蓝牙秤
生物雷达睡眠监测
蓝牙枕头
蓝牙灯
智能水床
福尼亚无线阵痛
宝莱特按摩
宝莱特体温计
宝莱特胎压计
宝莱特血压计
智能文胸按摩器
蓝牙对讲机
蓝牙咖啡称
… ..未完
刚踏入社会的小白 看到这硬件类的东西真的兴趣异常的大,对着设备连接,以及硬件的零件呀,都翻了个遍,但是问题却一个一个迎面扑来,接受暴风的洗礼
问题 1 设备和APP的交互
怎么接受数据解析到我们想要的,怎么发送报文 ,emm 伤脑筋
怎么解决? 当然是烦百度
下面是第一种
简单的报文 设置命令(APP发送给MCU)说明
Byte1 Byte2 Byte3 Byte4 B yte5 Byte6 Byte7
产品类型 命令类型 命令/数据 命令/数据 命令/数据 命令/数据 XOR
XOR可能有些小伙伴会不知道,这个其实是这个设备定义的一种协议
XOR为Byte1 XOR Byte2 XOR Byte3 XOR Byte4 XOR Byte5 XOR Byte6 的值
问题 2 时间的格式化和数值的高低位
这个问题就跟数据的准确性一样,如果传的位数跟字节不对,那么是写不进去的, 要处理这个问题,首先,也是必要的需要去学一样东西,那就是进制转换,时间以及部分数据是需要从10进制转16进制发送到设备,当时我把进制转换以及位运算全新复习了个遍,最后如愿以偿,成功进入新手专区。
问题 3 设备的重连
这个其实是一个异常简单的问题,怎么这么说呢,因为我们只要拿到设备的断开状态,严谨一点判断下蓝牙在打开状态下 那么这个是可以重连的。这是理想状态下 那么我为什么会遇到问题呢,那就是因为设备的频繁的开机关机,那么我们这边跟设备的一个连接机制的问题,首先设备是没有那么快真的关机的,他会在关机后,还会待机10来秒,并不是真正关机,我们这边系统呀,他其实还会搜索到设备,所以呢,也是没有关机,这块最后怎么解决的呢,当然是找硬件工程师,找他商量连接的机制以及做一个联调,当时我就坐在人家旁边待了一整天,最后问题解决了
自我提升和及时沟通是一个非常好的良药
Tinker 官网 http://tinkerpatch.com/
花几分钟注册个账号 新建一个APP APP名称建议和工程名称一样,方便管理
1)、配置Tinker版本信息
我们使用配置文件去配置版本信息,易于统一版本和后面更换版本 编辑根目录的gradle.properties,加入
- TINKER_VERSION=1.9.2
- TINKERPATCH_VERSION=1.2.2
2).配置app目录下的build.gradle文件
apply plugin: 'com.android.application'
apply from: 'tinkerpatch.gradle'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.feijin.sleep"
minSdkVersion 19
targetSdkVersion 26
versionCode 8
versionName "0.0.8"
multiDexEnabled true
multiDexKeepProguard file("tinkerMultidexKeep.pro")
//keep specific classes using proguard syntax
}
signingConfigs {
release {//发布版本的签名配置
storeFile file('../keystore/gary.jks')
keyAlias 'gary'
storePassword '12345678'
keyPassword '12345678'
}
debug {//调试版本的签名配置
storeFile file('../keystore/gary.jks')
keyAlias 'gary'
storePassword '12345678'
keyPassword '12345678'
}
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
signingConfig signingConfigs.debug
proguardFiles 'proguardRules.pro', getDefaultProguardFile('proguard-android.txt')
}
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.debug
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
implementation "com.android.support:multidex:1.0.2"
//若使用annotation需要单独引用,对于tinker的其他库都无需再引用
annotationProcessor("com.tinkerpatch.tinker:tinker-android-anno:${TINKER_VERSION}") {
changing = true
}
compileOnly("com.tinkerpatch.tinker:tinker-android-anno:${TINKER_VERSION}") { changing = true }
implementation("com.tinkerpatch.sdk:tinkerpatch-android-sdk:${TINKERPATCH_VERSION}") {
changing = true
}
}
3) 配置 根目录下的build.gradle 文件
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
//mavenLocal()
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
//无需再单独引用tinker的其他库
classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:${TINKERPATCH_VERSION}"
}
}
allprojects {
repositories {
//mavenLocal()
google()
jcenter()
}
}
// See http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html.
if (JavaVersion.current().isJava8Compatible()) {
allprojects {
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
}
}
}
subprojects {
tasks.withType(JavaCompile) {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
4) 在项目根目录新建tinkerpatch.gradle文件 代码如下
```css apply plugin: ‘tinkerpatch-support’
/**
/**
autoBackupApkPath = “${bakPath}”
appKey = “0d36f0530a76e76c”
/** 注意: 若发布新的全量包, appVersion一定要更新 **/ appVersion = “0.0.8”
def pathPrefix = “${bakPath}/${baseInfo}/${variantName}/” def name = “${project.name}-${variantName}”
baseApkFile = “${pathPrefix}/${name}.apk” baseProguardMappingFile = “${pathPrefix}/${name}-mapping.txt” baseResourceRFile = “${pathPrefix}/${name}-R.txt”
/**
/**
/**
https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97 / tinkerPatch { ignoreWarning = false useSign = true dex { dexMode = “jar” pattern = [“classes.dex”] loader = [] } lib { pattern = [“lib//.so”] }
res { pattern = [“res/”, “r/”, “assets/*”, “resources.arsc”, “AndroidManifest.xml”] ignoreChange = [] largeModSize = 100 }
packageConfig { } sevenZip { zipArtifact = “com.tencent.mm:SevenZip:1.1.10” // path = “/usr/local/bin/7za” } buildConfig { keepDexApply = false } }