Android蓝牙开发入坑指南

BLE简述

蓝牙是一套非常庞大复杂的协议栈,通俗的说就是一组应用于无线系统通信的约定,各个厂家根据这个约定生产出了各种蓝牙设备。由于蓝牙协议栈非常的庞大,很多厂商并不会完全实现蓝牙协议栈的所有功能。Android 4.3以后蓝牙开发一般都是基于低功耗蓝牙BLE4.0,BLE协议是蓝牙协议的子集。
BLE协议结构

被误会是表达者的宿命?

今天不知道怎的和老婆讨论起说话方式的问题,我一听忽然就想起老婆曾经说和她们公司的程序员交流特别费劲,总是一句话说不明白,开会啰哩啰嗦半天也不知道他们说的啥。我作为一个正常的程序员,我忽然发现我也有这个问题,于是我就从自身出发,思考这个问题的原因,想了好久,今天提到这个问题嘛,我就想解释一下我作为一个程序员,为啥会有上述问题:

程序员作为一个职业,当然也有其职业习惯,程序员们互相交流,往往并不会用大量语言去从头到尾详细描述一个事物,他们描述自己的工作,喜欢逐个介绍其中的特点,往往很难一句话简明扼要的说出一个事物。

何时可以转型?——Flutter开发实践

Flutter前段时间终于出了1.0,是时候亲手实践一把了。
实践之前先了解一下前人的智慧,发现一篇文章:

我花了 8 小时,”掌握”了一下 Flutter | Flutter 中文站上线
https://www.jianshu.com/p/9aaabc60d8af

这文章比较有意思,可能就是Flutter 中文站的人写的,非常有用,当然文章里的写的8小时我感觉快了点儿,捣鼓一遍肯定不够的,搞不好install都要好久。下载完flutter sdk和plugin之后要flutter doctor -v检查开发环境,结论一般都是:Doctor found issues in X categories,会给出相应的tip,一个一个照做就行了,实践发现这些issues不需要全部处理,例只做android的话,ios的 toolchain可以忽略,“Android license status unknown”的提示特别愁人,不过stackoverflow都有解决方法,我一开始兢兢业业地照做了,第二天手残更新了一下android studio,结果“Android license status unknown”的提示又出来了,不过我发现编译打包都没问题,就不管了。

烂代码是怎样炼成的

这两天接手一个离职员工的项目,改bug,个中不爽,难以启齿,有些代码写得实在是让人哭笑不得,不一一列举,摘一段集烂代码之大成的典型案例:

从老蒋越级指挥说起

蒋介石喜欢越级指挥是出了名的,常常在战斗中绕过各战区司令,直接打电话到前线,给前线的师长、团长下命令,常常搞得前线指挥官一脸蒙蔽,屡战屡败,后来他被赶出了大陆。

有人说蒋介石越级指挥是他玩谋弄权的体现:各个司令都是我老蒋重金养起来的,你要听我的,你手下的兵也都是我的,我让你当司令你才当司令的,你不能拥兵自重。有人说蒋介石越级指挥是因为他过于自负,总认为自己是当世张良,能定胜负于千里之外,他认为前线将领能力太差,于是忍不住上线微操一把,过个当指挥官的瘾。当然要我说嘛,蒋介石也许就是为了防止各个统兵大员尾大不掉,毕竟就算他再怎么瞎指挥、再怎么失败,他至少牢牢把握着党国的中央大权呀,还是有本事的。

不说老蒋了,就说我们自己的事,我们一线程序员,分明就是老蒋手下的兵,那些市场、销售、客服部老蒋们天天把电话往我们前线打,小兵们眼花缭乱,不知所措。如果不做好需求管理,项目能一两个版本保持健康就不错了,往后就直奔着失控去了。

用RxJava优雅的执行并发网络请求

Android或者ios原生开发,并发网络请求是个难排解的痛。现在来看,这个问题已经不是问题了,写个文章记录一下,毕竟当年曾经为了这个问题操碎了心。说这个事首先要明白下面这个问题:

痛在哪?——主线程之殇

Android的消息机制恨死人,众所周知,android UI操作只能在主线程进行,而且主线程里不推荐执行作UI操作以外的一切操作,当年Android早期在主线程里请求网络是不会报错的,顶多把界面卡黑屏。现在这么搞会乍样大家都知道的,编译时会有警告,运行时会crash。如何优雅地请求网络数据,然后切换到主线程去更新UI,无数志士仁人为了解决这个问题操碎了心,早期官方推荐用AsnycTask,后来出现了经典的httpAsync,后来又有volley,现在又有Retrofit。现在的小程序员们不用在乎这些问题,只要拿来用用就行,大公司也都有自己成熟的网络库。而且现在hybird、react native很流行,不会涉及到主线程的问题。但是如果把14年以前的项目源码翻出来,运气好还能看到handler满天飞的情况,真是恶心死人。

好久不写博客了

真的是好久好久不写博客了,主要是懒。。之前一直使用wordpress,可是国内好难找到好用的wordpress空间。之前一度以为daocloud.io是我的福音,我曾好长一段时间把博客放在daocloud上,可好用了,我也是那时候体会到了docker的强大。后来daocloud果然被监管了,我的博客被停了,于是这一年多来我的域名就被打入冷宫了。。当时数据都没来得及备份,真是遗憾。

Java字节序列化框架

工作中需要在Android平台与嵌入式设备通信,互联网环境中数据交互一般采用json格式,解析比较容易。嵌入式设备间通信常常采用字节流传输,通信过程中需要逐个字节、甚至逐个位去读取,非常麻烦。
Java语言与字节编码互相转换的框架实际上是有的,比如说Javolution,可以把C语言的结构体转换为Java类,但是国内用户很少,文档稀少,转换某些结构有bug,难以解决,于是打算自己写一个字节序列化框架。

自掘坟墓的苹果

最近被appstore搞的焦头烂额,虽然早有心里准备,但还是让我捉襟见肘,苦不堪言。

我是最近刚刚接手ios开发的,从实验室小伙伴那儿“过继”过来的项目。这之前一直做android开发,ios接触得少,iphone毕竟还是价格相对高一些嘛,印象很好。可是经过这么几个月的深刻接触,我对苹果产品的好感就荡然无存了。苹果产品也许还能继续保持高价一段时间,但苹果的研发体系实在是混乱。

如何精准沟通

很多程序员不善于沟通,尤其当他全身心投入工作后,这会带来很多问题,因为除了自己给自己做软件,很少有项目是一个人能完成的,软件研发不仅仅是程序员的事,需求、设计、进度、风险,还有用户,各方面都需要沟通。

软件研发过程中的沟通和我们日常的语言交流有所区别,日常交流可以通过表情、手势、动作来辅助沟,传达特殊含义,表达语言所难以描述的信息。软件研发过程中,程序员常常是面对着屏幕,一边看着代码一边与别人沟通,这时候的沟通尤其需要精准,所以很多程序员之间互相沟通时喜欢直接讲代码,否则脱离了代码,就说不清楚他在干嘛,也难听懂别人要他干嘛,行外人觉得这就是程序员的特点,这是个悲剧,程序员不应该这样的。