Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于isBlockingReadData是否阻塞式接收数据,和统一监听数据接口出现丢包情况 #24

Open
LuXiaoQiang opened this issue Aug 16, 2024 · 2 comments

Comments

@LuXiaoQiang
Copy link

LuXiaoQiang commented Aug 16, 2024

大佬,我看文档说:统一监听数据接口与发送 Task 任务收到的回调数据是互斥关系(剔除了 Task 回调的数据),优先级低于 Task 任务回调。但在实际使用情况好像数据又会互串,下面是关于遇到问题的描述:
因为下位机每隔一秒会发送一条心跳包消息给上位机,所以app这边通过使用统一监听数据接口的方式对下位机心跳包数据的接收,这件监听是在activity基类去添加的,
image
当isBlockingReadData设置为true时,发现会出现心跳包数据不能正常接收到,可能是收据接收阻塞了(应用程序频繁做其它操作,比如频繁网络请求,然后进行文件读写),导致部分心跳包数据出现丢包情况,尝试将isBlockingReadData设置为false,这个时候心跳包数据是可以正常接收(一秒一条数据),但是上位机主动发送指令数据给下位机后,心跳包数据也可能会在主动发送的这条指令任务的OnDataReceiverListener这个数据回调里,由于心跳包指令码和主动发送的指令码不是同一指令码,这一条指令会出现数据解析异常的情况,麻烦帮忙解答一下是否是我这这边使用的方式不对。

@zhouhuandev
Copy link
Owner

大佬,我看文档说:统一监听数据接口与发送任务任务收到的​​回调数据是互斥关系(剔除任务回调的数据),优先级低于任务 任务回调。但在实际使用情况下希望数据又会串互,下面是关于遇到问题的描述: 因为下位机每隔一秒发送一条心跳包消息给上位机,所以app金字塔通过使用统一监听数据接口的方式对下位机心率包数据的接收,这件监听是在activity基类去添加的, 当isBlockingReadData设置为true时,发现会出现心率包数据不能正常接收到,可能是接收接收阻塞了(应用程序关闭做其他操作,比如关闭网络请求,然后进行文件读写),导致部分心率包数据出现丢包情况,尝试将isBlockingReadData设置为false,这个时候心率包数据是正常接收(一秒一条数据) ,但是上位机主动发送指令数据给下位机后,心跳包数据也可能会在主动发送的这条指令任务的OnDataReceiverListener这个数据里,由于心跳包指令码和主动发送的指令码不是相同的指令码,这一条指令会出现数据解析异常的情况,麻烦帮忙解答一下是我这个布拉格使用的方式不对。 图像

其实对于你这种情况来看,大致是上位机向下位机主动发送的指令协议不是同一类型的协议,然后出现无法对应匹配到 Task,然后就使用了全局的默认数据回调。

这里使用 task 的情况下,需要满足上位机与下位机的回复的协议指令是同类型的协议,具体还需要根据私有协议来定制的标准看。

isBlockingReadData 使用的情况是在某些下位机中再向上位机发送数据的时候容易丢失数据或者是大批量的数据,那么就建议使用阻塞方式进行读取,这样子不会丢失数据。

不论是什么样子的数据,都需要对头指针与尾指针做好对应的校验就可以了。如果在通讯的过程中哪里不合适,你也可以将源码拉取下来,自行进行修改再使用。

@LuXiaoQiang
Copy link
Author

大佬,我看文档说:统一监听数据接口与发送任务任务收到的​​回调数据是互斥关系(剔除任务回调的数据),优先级低于任务 任务回调。但在实际使用情况下希望数据又会串互,下面是关于遇到问题的描述: 因为下位机每隔一秒发送一条心跳包消息给上位机,所以app金字塔通过使用统一监听数据接口的方式对下位机心率包数据的接收,这件监听是在activity基类去添加的, 当isBlockingReadData设置为true时,发现会出现心率包数据不能正常接收到,可能是接收接收阻塞了(应用程序关闭做其他操作,比如关闭网络请求,然后进行文件读写),导致部分心率包数据出现丢包情况,尝试将isBlockingReadData设置为false,这个时候心率包数据是正常接收(一秒一条数据) ,但是上位机主动发送指令数据给下位机后,心跳包数据也可能会在主动发送的这条指令任务的OnDataReceiverListener这个数据里,由于心跳包指令码和主动发送的指令码不是相同的指令码,这一条指令会出现数据解析异常的情况,麻烦帮忙解答一下是我这个布拉格使用的方式不对。 图像

其实对于你这种情况来看,大致是上位机向下位机主动发送的指令协议不是同一类型的协议,然后出现无法对应匹配到 Task,然后就使用了全局的默认数据回调。

这里使用 task 的情况下,需要满足上位机与下位机的回复的协议指令是同类型的协议,具体还需要根据私有协议来定制的标准看。

isBlockingReadData 使用的情况是在某些下位机中再向上位机发送数据的时候容易丢失数据或者是大批量的数据,那么就建议使用阻塞方式进行读取,这样子不会丢失数据。

不论是什么样子的数据,都需要对头指针与尾指针做好对应的校验就可以了。如果在通讯的过程中哪里不合适,你也可以将源码拉取下来,自行进行修改再使用。

大佬,我这边只是在OnDataReceiverListener回调的onSuccess里面去校验回复的数据,只校验针头,也就是看数据的帧开始数据是不是跟协议的是对应的,然后再取下一个字节,这个字节对应的是数据长度,然后根据这个数据长度对下位机返回的数据进行数据截取解析。不知道我这个校验方式是不是不对,请大佬指点一下。
下面这张截图就是检验帧开始的数据
image
下面这张截图是对返回的数据进行解析
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants