Notify 与 Indicate的区别
根据TI BLE1.4.0的介绍,Indicate是有ACK的。
Q1:那么如果我用Notify,是否可能会丢数据呢?
比如我用一个charisticrist 连续notify100个数据,中间是否有可能丢数据?
我实验了很多次,也没有发现有丢数据。
Q2:Indicate怎么使用呢?我看了thermometer的例子,但是感觉他仅仅是在定义
static gattAttribute_t thermometerAttrTbl[] = 时,用了GATT_PROP_INDICATE属性。
但在实际发送时,仍然用的是GATT_Notification啊
看来你已在E2E得到回复了,请注意查看
Feng Xu3,
Q1:BLE是可以基于link layer层保证空中数据不丢失的,notification和indication都是基于GATT的,取决于你在应用层如何对这些数据处理,如果你对notification的数据处理不及时,是会被后续数据冲击丢失的。
Q2:indication 用的是GATT_Indication().
Hi Y,
非常感谢你的回答。
就是说,使用notify,BLE的link layer本身会保证数据不会丢失,但是在central节点,数据如果不被及时读走,会被冲掉?
我不知道如果我用Notify方式的话,APP那端能不能够及时读走数据,这要如何确定呢?
还是说只有使用indication才能够保证不丢数据?
另外,如果使用read的方式,数据传输速度能够比notify高吗?
谢谢!
Frank
Feng Xu3,
这个完全取决于你发Notification的速度和APP那端的处理方法,两边都是你自己控制的,问题应该不大。
read的方式应该速度比Notification要低。
Hi Y,
那么Indicate与Notify相比,如果APP那端能及时处理,是否Indicate能达到与Notify同样的速率?
谢谢!
Frank
Feng Xu3,
这是个好问题。
这么说吧,如果在连接参数相同的情况下(主要指connection interval),并且APP处理得当,那肯定是Notification快,因为indication要等回复才能发下一个包。
Hi Yan,
请问您说的indication等回复才能发下一个包,是指link layer前一个packet已经发送成功了的前提下,也不会再发下一个packet,而是要等主机端对数据进行应用层的逻辑处理完成,并得到主机端的反馈后才发下一个packet,我理解的意思对吗?
如果对的话,那么write with response是不是也可以同理的反向理解。
我个性签名档的博客地址,《CC2541之notify》、《CC2541之indicate》。
hi 甜甜的大香瓜
感谢回复,我看过您的教程了,我理解的意思是indicate比notify多了一个应用层的GATT_MSG_EVENT通知。我还有两个疑问:1、indicate是否会阻塞链路层的数据包发送?也就是说前一个indicate确认链路层发送成功之前,是否会发送下一个数据包?2、indicate通知在手机端接收到之后,是接收到通知就反馈从机,还是处理完响应的业务逻辑再反馈从机(这样可能会有一些耗时操作),如果是后者是否会影响数据传输速率?
hi,yi zhang23
1、我认为不会阻塞,“在确认发送成功之前发送下一包”这是不允许的。
2、这个问题太底层了,我也回答不上来,你得去看看蓝牙协议看看有没有写清楚。这个问题在应用意义上不大,你实测是多少时间就多少时间拿来用即可。indicate本来就是耗时的,担心耗时就用notify。
hi 甜甜的大香瓜
抱歉问题1我表达错了,我知道链路层数据发送在前一个编号包没有确认并且没有收到对端序号+1的响应的情况下是不会允许传下一个包的。我其实想问的是,indicate之所以效率低,是不是因为notify只确认链路层成功就反馈序号+1的包来让从机发下一个包;而indicate需要将数据向上传递给Host的应用层做完对应的逻辑处理以后才反馈序号+1的确认包,这样的话数据在被应用层处理完成之前这段时间,链路层相当于是被阻塞的,从而降低了数据传输速率。
那么如果以上逻辑成立,在连接事件中的多个M->S,S->M交互之间,是一直在发空包维持连接吗?sorry,我是做iOS软件开发的,刚接触蓝牙还没实践过编程,以上的猜测如果要验证的话,是否可以用packet sniffer通过抓包的方式来分析理解其中的原理?
你好,
简单的说就是:
notification无需client端确认,就好像小明妈妈跟小明发了一条信息说该吃饭了,小明收到了可以有动作也可以忽略。
indication是需要client端确认,举个例子小明妈妈跟小明打电话,小明务必点击接听,听妈妈跟他说该吃饭了,整个过程才完结。
如果没有响应indication 那server这边会做什么动作?GATT会自动retry吗?还是需要在应用层自己加retry机制?
数据重要的话,可以采用应答模式。
类似于WiFi、网络的UDP和TCP的意思,大数据量快速传输UDP(Notify),小数据可靠传输 TCP(Indicate)