学习路线+知识梳理
花了很长时间,就为了整理这张详细的知识路线脑图。当然由于时间有限、能力也都有限,毕竟嵌入式全体系实在太庞大了,包括我那做嵌入式的同学,也不可能什么都懂,有些东西可能没覆盖到,不足之处,还希望小伙伴们一起交流补充,一起完善进步。
这次就分享到这里吧,下篇见。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3… 不同的机型的discoverService到onServiceDiscovered之间的耗时长短不一,这会导致一个问题:如果蓝牙硬件设备支持离线传输,即有记忆功能,连接上之后多久发送之前的数据的问题。如果连接之上立即发送,那么手机端的onServiceDiscovered尚未触发,这样Characteristic的值就获取不了(因为你的service,Characteristic都尚未初始化好),从而导致失败。
解决的办法有3个:
1)建立一套ACK机制,蓝牙硬件设备不断的广播,直到所有的数据都收到返回的ACK确认才不再广播即可。
2)更好的办法是,当手机端onServiceDiscovered触发后,并且service,Characteristic都初始化好后,发送指令给蓝牙硬件设备(即writeCharacteristic)表示手机端已经准备好,可以发送数据给我了,蓝牙硬件设备收到后再发送数据,这样能很好的保证数据不丢失。
- 最好的办法是1)和 2)的结合,即发送准备好的指令,然后让智能硬件发送数据,然后在接收数据的过程中,使用ACK机制确保数据没有任何丢失。
4… Read/Write Characteristic/Descriptor 等都是异步的,即立即返回,等待回调。因此如果Android手机底层自身如果没有做请求的同步顺序执行的话,那么当有很多请求几乎同时进行时,回调顺序是无法保证的。此时就造成错误,这也会导致很多蓝牙4.0不能兼容某些Android的原因,因此需要自己提供一套同步机制,如RequestQueue,来保证request&response 一个接一个高效有序的进行,即下一个request必须等到上一个request的response返回之后再执行。
5… Read/Write Characteristic/Descriptor/RemoteRssi(),一般在不同的线程中回调。(除了onDescriptorWrite返回的线程与写入线程为同一个线程???)
BluetoothDevice.conncectGatt(),
BluetoothGatt.connect(),
BluetoothGatt.disconnect(),
BluetoothGatt.discoverServices()
最好都在主线程,否则会遇到很多意想不到的麻烦。
6… BLE的特征一次读写最大长度20字节。
7… Android手机会对连接过的BLE设备的Services进行缓存,若设备升级后Services等有改动,则程序会出现通讯失败。此时就得刷新缓存,反射调用BluetoothGatt类总的refresh()方法。
8… startLeScan(UUID[], LeScanCallback)在Android 4.4及以下手机中似乎只支持16位的短UUID,不支持128位。
9… connectGatt() 在某些三星手机上只能在UI线程调用。
10… Android L 新API扫描设备换为 startScan(List, ScanSettings, ScanCallback)。
11… Android M 必须拥有定位权限才能扫描BLE设备。
12… 一个主设备(例如Android手机)可以同时连接多个从设备(一般为6个,例如智能硬件。超过就连接不上了),一个从设备只能被一个主设备连接,一旦从设备连接上主设备,就停止广播,断开连接则继续广播。在任何时刻都只能最多一个设备在尝试建立连接。如果同时对多个蓝牙设备发起建立Gatt连接请求。如果前面的设备连接失败了,则后面的设备请求会被永远阻塞住,不会有任何连接回调。所以建议:如果要对多个设备发起连接请求,最好是一个接一个的顺序同步请求管理。
13… 任何出错,超时,用完就马上调用Gatt.disconnect(), Gatt.close()。
14… 从bindService 到 onServiceConnected 这个回调花费时间较长, onServiceConnected 这个回调很可能在 MainActivity onResume之后才执行, 所以不要指望onResume里去执行扫描,因为此时serviceConnected 回调都尚未执行
15… getBtAdapter().enable()是异步,立即返回,但从 off 到 on 的过程需要一个时间所以只能监听系统broadcast发出的intent里的state
最后
分享一份NDK基础开发资料
分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!