 +            offset,
 +            isLong);
 +
++  const callback = function(result, data) {
++    log.debug('_onReadAttribute.callback',
++              result,
++              '<Buffer ' + data.length + '>',
++              address);
++
++    let hexdata = '';
++    if (result === RESULT_SUCCESS) {
++      if (!Buffer.isBuffer(data)) {
++        data = new Buffer(data);
++      }
++      hexdata = data.toString('hex');
++    }
++    this._bledroid.command('attributeResponse ' +
++                           connectionId + ' ' +
++                           transactionId + ' ' +
++                           handle + ' ' +
++                           result + ' ' +
++                           offset + ' ' +
++                           hexdata);
++  }.bind(this);
++
 +  if (this._centralMap.has(address)) {
 +    assert.strictEqual(this._centralMap.get(address),
 +                       this._centralMap.get(connectionId));

+    log.warn('Unknown central \'%s\', ignoring read request', address);
+    assert(!this._centralMap.has(connectionId),
+           'Have another entry for connectionId ' + connectionId);
+    return;
+  }
+
+  const attribute = this._attributeMap.get(handle);
+  if (!attribute) {
+    log.warn('Unknown attribute handle %d, ignoring read request', handle);
+    return;
+  }
+
+  const callback = function(result, data) {
+    log.debug('_onReadAttribute.callback',
+              result,
+              '<Buffer ' + data.length + '>',
+              address);
+
+    let hexdata = '';
+    if (result === RESULT_SUCCESS) {
+      if (!Buffer.isBuffer(data)) {
+        data = new Buffer(data);
+      }
+      hexdata = data.toString('hex');
+    }
+    this._bledroid.command('attributeResponse ' +
+                          connectionId + ' ' +
+                          transactionId + ' ' +
+                          handle + ' ' +
+                          result + ' ' +
+                          offset + ' ' +
+                          hexdata);
+  }.bind(this);
+
+  attribute.emit('readRequest', offset, callback, address);
+};

+include $(BUILD_NODE_MODULE)
diff --git a/lib/android/bindings.js b/lib/android/bindings.js
new file mode 100644
index 0000000..a598689
--- /dev/null
+++ b/lib/android/bindings.js
@@ -0,0 +1,866 @@
+'use strict';
+
+const assert = require('assert');
