Previously we had an issue: if there is a change of characteristics in
the new build of our firmware, then the app will get the wrong data.
By saying changed characteristics, it can be an added or removed
characteristic, or adding notification to an existing characteristic.
In order to keep the pairing information, the "/var/lib/bluetooth"
folder is copied over to the new build's partition. We realized that
there is no "service changed indication". The app can't handle the
changed services. So we disabled the bluetooth cache by set this in
"/etc/bluetooth/main.conf":
[GATT]
Cache = no
But recently, we saw the problem again even if the bluetooth cache is
disabled: in the build number 101, a characteristic is removed. But
when we upgrade the build from 100 to 101, the app gets the wrong
data. We looked at the log. When the app tries to read temperature by
using the temperature UUID, somehow the bluetooth service we created
received the request to read the "device name"(device name UUID). So
the "device name" is returned to the app as the temperature. This
looks like the same behavior as the bluetooth cache is not disabled. I
looked at the "/var/lib/bluetooth/[BT_MAC]/cache" folder. There is no
"[Attributes]" section in the files in the folder. That means the
disabled cache seems working.
The only way to fix this issue is to force exit the mobile app on the
phone and "Forget This Device" in iOS or "Unpair" in Android.
I looked at the btmon(see attached). For the working btmon log, there
is "Attribute group list: XX entries" under "ACL Data TX". But there
is no "Attribute group list: XX entries" under "ACL Data TX" in the
attached problematic btmon log.
Questions:
1. How is it possible that this still happens even if the bluetooth
cache is disabled?
2. Is this the problem on the Linux side which runs the GATT server or
on the mobile side?
3. Is there anything else we should look into?
We're going to release our product soon. This is a critical issue for
us. Please help if you have any suggestions.
Thanks!