I am guessing the reason client cannot read the characteristic value is because the link is not encrypted. What you should do is modify the code to send security request every time connection comes up. Currently in the connection_up callback it sends the security request only if device is not bonded. Remove this check and send the request always. Please note that the check for bonded was done to work around the problem in iOS6/iOS7. Apple fixed the problem in iOS8, so processing of security request should work just fine. Let me know if you really need support for iOS6/iOS7.
Sending the security request every time the connection
comes up fixed the issue.