蓝牙MCU开发之旅:不后悔踏进这个深坑

        去年年初的时候,由于公司的大神离开了,小公司没有冗余的人员,一下子没有能做固件的人了。恰逢我司的app逐渐转移到米家的插件上去了,在美女领导一番蛊惑下,无知的我踏入了固件开发这个深坑。

        前些日子因为一些原因险些不得不离职,因为公司目前只有我一个人熟悉蓝牙芯片的固件开发,会导致很多项目delay。后来想了想,决定将自己这一年来从android转mcu开发的经验写一写,方便新来的同事快速上手或者review各种问题,也帮助自己梳理一下。

        有关BLE基础的中文文档并不是很多,我这里推荐一个技术网站,叫做蜗牛科技,他们的文章里边,有一部分会讲解一些蓝牙的基本知识,对于快速了解BLE的一些原理很有好处,然后他们的网站上边还介绍了很多其他的知识,都是干货,没事儿也可以逛逛:http://www.wowotech.net/  

        然后,北高智的一位技术支持工程师,也总结了很多Nordic体系相关的一些知识,主要是应用层,对于新手入门有特别大的帮助(可惜我是入门之后他才写的,没人带好悲惨啊),但是他的东西对于已经入门的也有很大的帮助,某些疑难问题或者需要做性能上的提升,不妨经常看一看这个,网站是:http://www.cnblogs.com/iini/

        只是做固件的话,不需要对硬件有过度的了解,但是如果完全不懂,就会特别容易被各种坑,所以有时间需要适度了解一下硬件的一些基本知识。

        我司以前的蓝牙芯片主要使用的是Ti 的2640,后来从我接手MCU的开发后,就没有再使用Ti的芯片了,转为引入了两款新的芯片,一个是Dialog公司的14585,一个是Nordic的52832,两者各有优劣。我本人的话也是主要在这两款芯片上有所积累,接下来的文章也是记录使用这两款芯片在软件上面遇到的问题。

        从性能上讲,14585芯片基于Cortext M0架构,功耗极低,性能也比较低,价格便宜(只考虑价格的话,国产的比这个还便宜特别多),应付普通的BLE应用基本上没有啥问题。52832基于Cortext M4架构,性能强大,可以进行多线程操作。

        然后从软件开发的角度来看,Dialog公司提供的SDK质量较差,架构层次不是特别的清晰,有时候经常需要修改SDK源码。版本管理也比较混乱,我从最开始接触14585到现在一年的时间,已经迭代了6个版本。固件的SDK版本迭代这么快并非好事,但是有些Bug又必须得修复...

        但是Dialog有一个优点就是,对新手特别友好,提供各种example都是基本操作,他们的官方网站上边,有很多新手教程,手把手教怎么入门,怎么编写自己的BLE服务,怎么实现OTA......然后,SDK中,特意提供了专门针对普通应用的框架,方便大家定义自己的服务。这些服务包括custs1和custs2,一般使用其中一个即可,SDK中提供了专门的文件方便往custs1和custs2中添加自己的服务。

        在SDK6.0.6.427版本中,custs1和custs2遗留了一个bug,就是client对一个服务的某个attribute发起的的read操作(前提是可以read),固件这边不会有任何的授权或者回调,这意味着固件无法知道client什么时候读了,无法在client读取之前修改value。我们的解决办法是,连接成功后,就立即更新所有可以read的attribute value,但是这种方法无法满足某些需求。经过我的测试,标准的服务比如diss是有接口告知被读取的,也可以在回传数据之前修改内容。如果在这个版本上边有这个需求,可以照着SDK中定义标准服务的方式写自己的服务,而不是使用custs1或者custs2。

        Nordic的SDK做的很出色,稳定性非常好,对于老手而言,使用nordic的SDK会更得心应手,但是对于新手则不那么友好。他们的各种文档很多,所有版本的API都可以在官方网站上边直接访问到,但是没有向新手提供更易懂的教程之类的。另一个问题是,不像Dialog专门提供了一个易用的custs框架,实际上他们的SDK也不需要提供,熟悉之后添加服务之类的也很简单。但是但是...SDK附带的example中,各种类型和函数等都过度包装了,一个很简单的东西,定义了一层又一层,很容易让人看的头皮发麻。为了降低添加Service和处理各种handler的难度,我自己搞了一套更简单易懂的东西,会在后续贴出来。

        

你可能感兴趣的:(#,BLE,物联网)