Android BLE 通信处理过程---串行通信

来源:互联网 发布:dota2看视频软件 编辑:程序博客网 时间:2024/05/21 01:46

这文章主要是对工作的笔记。总结提高。
首先,手机和BLE设备的通信过程,可以有串行通信和并行通信。
串行通信:就是手机每次发送一条命令到BLE设备,直到BLE设备处理完毕,并回复手机处理结果后,手机才能发送下一条命令。
并行通信:手机可以同时发送多条命令给BLE设备,然后,BLE设备可以串行处理,也可以并行处理,每处理完一条命令就回复手机一次。
因为手机和BLE设备通信并不是非常的频繁,一次发送多条命令的情况也不是很常见,一般都是
手机发送单条命令—》BLE设备回复ack—》BLE设备执行命令—》BLE设备返回结果—》手机端回复一个ack,并根据结果进行相应的操作,所以还是使用串行通信更为靠谱,代码实现也比较容易,清晰。

1、整体框架分析

手机发送单条命令—》BLE设备回复ack—》BLE设备执行命令—》BLE设备返回结果—》手机端回复一个ack,并根据结果进行相应的操作,根据这个过程,
(1)我们需要一个专门用来发送各种命令的管理类SendMsgManager,
(2)需要一个接收BLE设备回复或者主动发过来命令的管理类ReceiveMsgManager,
(3)我们还需要一个核心类BleService服务类,它包含了BluetoothGattCharacteristic对象,我们需要使用它来发送,或者接受消息。以及包含了一条通信的通道。
(4)解析BLE设备返回的消息或者接收到BLE设备主动发过来的命令的过程,可能是一个很耗时的过程,所以我们需要一个处理线程类ParseThread。
(5)为了将结果返回到UI或者用户,我们可以借助一个监听接口类IRspListener接口,如下。

public interface IRspListener {    /**     * 处理成功     * @param object 返回对象     */    void onSuccess(Object object);    /**     * 处理失败     * @param errorCode 错误码     */    void onFailed(int errorCode);}

(6)另外,由于BLE通信的长度有限制最初为20字节,我们可以通过gatt.requestMtu(MTU_SIZE)方法来再次请求设置connection的MTU,可以设置为100……这个可以和硬件的商量着来。但是,即便是设置了100,仍然有可能我们发送的命令超过了MTU,这个时候就需要将我们的命令分为多包发送。关于多包,这个涉及到公司的制定的相关通信协议,这里不便多说。可以根据每个公司的制定的协议分别处理。这里我们需要一个将我们的消息封装、分包、CRC等操作的类PackMessage类。
(7)上面我们说了BleService服务类,它包含了通信的通道,发起连接、发送、接收消息等方法,所以,我们需要一个类来开启并访问它里面的方法,这里我们使用ConnectManager类,通过这个类,我们可以连接BLE设备、获取连接状态,断开连接、释放资源等。它就是一个连接管理类。

2、发送过程

连接过程这里略过,连接完成,我们就可以在手机端向BLE设备发送命令。发送命令的地方一般是在一个Activity中,而且需要获得最终的BLE设备执行的结果,并将结果反馈给你用户,或者根据执行结果接着执行之后的操作,很显然,这是一个异步操作,我们使用上面提到的IRspListener监听接口来实现。即BLE设备执行成功,就会回调onSuccess方法,否则,回调onFailed方法。下面的代码显示了一个简单的发送命令的代码:

SendMsgManager.getInstance().reqBattery(true, new IRspListener() {     @Override     public void onSuccess(Object object) {             mWatchBattery = (int) object;             Log.i(TAG,"get watch battery success : "+mWatchBattery);        }     @Override     public void onFailed(int errorCode) {            Log.e(TAG,"get watch battery failed: "+errorCode);        }      });}

在SendMsgManager类中我们需要把监听接口IRspListener对象保存起来,等待执行结果返回时再回调,
在发送之前,我们需要判断待发送的命令的长度能否一次发送完成,不然就需要分包发送。发送过程,最终经过BleService类发送完成,如下:

mTxCharacteristic.setValue(data);mBluetoothGatt.writeCharacteristic(mTxCharacteristic);

3、接收BLE设备的回复

上面已经说到,这个项目的协议:BLE设备收到手机发过去的消息,会首先回复一个ack字符串,然后BLE继续进行相应的处理,最后,再将处理结果发送给手机端。这个过程,总共向手机端发送两条消息。
(1)收到ack回复帧:在这个项目中,是没做任何处理,不需要解析。这不太完善,其实这也有没收到ack的情况,只不过出现的几率很低。如果想更完善,可以在手机端设置一个超时任务,一段时间后没收到ack,就会继续发上一条命令,只不过这样就更麻烦,而且,必要性也不是很大。
(2)收到BLE设备回复的结果帧:这时候,就需要进行解析工作。解析过程中,手机端也需要给BLE设备回复一个ack,上面也提到,解析工作可能是耗时的,因为我们不确定对方发过来的数据长度,有可能是多个包。需要在ParseThread线程中解析。在解析中我们就可以回调IRspListener接口中的方法。然后,我们的Activity就可以接收到执行结果,给用户反馈。

4、继续发送下一条指令

上述,我们已经完成了一条命令的整个过程。然后就可以接着发送下一条。这里既然是串行通信,所以,我们需要在发送类SendMsgManager中设置一个是否可以发送下一条的标志位,这个标志位在上一条的整个过程未完毕时,一直是false,即不能发送下一条。这样就强制实现了串行通信。

上面所述的都是一些自己根据项目代码总结出来的大体概况,不是那么详细,只是一个实现的思路。关于并行通信,这个实现起来貌似很复杂。如果有大神指点那就太好了。

1 0
原创粉丝点击