Traffic Card

公交卡蓝牙稳定性完善

背景

公交卡开卡过程中药频繁和后台交互拉取数据,由于手表没有联网能力,所以我们自己封装一套HttpManager 供第三方合作的App使用,以便访问自己的服务器,但是在与雪球合作的时候,合作业务不稳定,反馈给我们说,是调用我们的接口返回蓝牙异常造成的, 所以我们这边也复现这个问题,在实际的调试过程中也有发现,蓝牙不稳定,尤其是泰山2代上非常不稳定,之前HttpManager都是假设蓝牙稳定情况下,但是在蓝牙不稳定的情况下就有可能造成消息请求发送出去回不来,或者请求根本就没从手表发送出去,缺少相应的回包机制。

优化思路

Http请求的时候都会指定超时,如果没指定就使用默认超时,根据该信息设计蓝牙端断开容忍超时,只要在这超时之间请求能回来,就认为请求成功,中间无论蓝牙断开几次,只要从新连接上,传回之前请求的接口,并且在超时时间之内,就把请求的结果返回给第三方应用。

情况分类

根据蓝牙断开时请求是否发送DM端可以分为两类,一类是发送的时候刚好蓝牙断开,这是请求在DMA缓存,并且根据超时时间设定超时,以确保调用端有结果返回,不会一直卡在某个阶段一直等待,没有结果返回。

发送的时候蓝牙断开

这种状态,涉及和第二种状态的转换,大致分为两种

  • 断开时超时之内消息发送到DM端。
  • 断开超时之内,蓝牙从新连接上,请求发送到DM端。这种状态就流转到下个状态。

    请求发送到DM端蓝牙断开

    这种涉及两种,
  • 超时之内,蓝牙从新连接上, 消息回到dma
  • 超时后消息回到DMA,但是因为DMA把超时结果已经返回给客户端,所以本次结果会被过滤掉。这里有个细节优化,DMA会根据蓝牙状态,如果此时蓝牙连接,但是消息没回来,那就是返回给客户端超时,蓝牙没连接就返回蓝牙异常,降低返回蓝牙异常的可能性, 让客户端重试,提高成功率。

优化结果

之前在开卡充值过程中,只要开关一次蓝牙,就会造成开卡充值失败,优化后开关蓝牙只要在超时之内连接成功基本都能开卡充值成功,中间可以随意任意断开蓝牙,只要在超时时间之内连接上请求成功即可。

待优化

发送过程中丢包,或者发送数据受损坏,这是一种极端情况,暂时没有优化,需要加入校验和回包机制验证。