SPP is now working in Android 4.2 as well!

This commit is contained in:
Kristian Sloth Lauszus 2013-04-01 03:09:23 +02:00
parent 02f98dd950
commit 712ed057e5
2 changed files with 13 additions and 9 deletions

View file

@ -70,7 +70,6 @@ The BTD library will also make it possible to use multiple services at once, the
SPP stands for "Serial Port Profile" and is a Bluetooth protocol that implements a virtual comport which allows you to send data back and forth from your computer/phone to your Arduino via Bluetooth. SPP stands for "Serial Port Profile" and is a Bluetooth protocol that implements a virtual comport which allows you to send data back and forth from your computer/phone to your Arduino via Bluetooth.
It has been tested successfully on Windows, Mac OS X, Linux, and Android. It has been tested successfully on Windows, Mac OS X, Linux, and Android.
Unfortunately Google broke something in Android 4.2, so it's currently not working in this version of Android.
More information can be found at these blog posts: More information can be found at these blog posts:

21
SPP.cpp
View file

@ -191,13 +191,7 @@ void SPP::ACLData(uint8_t* l2capinbuf) {
#endif #endif
} else if (l2capinbuf[6] == sdp_dcid[0] && l2capinbuf[7] == sdp_dcid[1]) { // SDP } else if (l2capinbuf[6] == sdp_dcid[0] && l2capinbuf[7] == sdp_dcid[1]) { // SDP
if (l2capinbuf[8] == SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU) { if (l2capinbuf[8] == SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST_PDU) {
/* if (((l2capinbuf[16] << 8 | l2capinbuf[17]) == SERIALPORT_UUID) || ((l2capinbuf[16] << 8 | l2capinbuf[17]) == 0x0000 && (l2capinbuf[18] << 8 | l2capinbuf[19]) == SERIALPORT_UUID)) { // Check if it's sending the full UUID, see: https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm, we will just check the first four bytes
Serial.print("\r\nUUID: 0x");
Serial.print(l2capinbuf[16],HEX);
Serial.print(" ");
Serial.print(l2capinbuf[17],HEX);
*/
if ((l2capinbuf[16] << 8 | l2capinbuf[17]) == SERIALPORT_UUID) {
if (firstMessage) { if (firstMessage) {
serialPortResponse1(l2capinbuf[9], l2capinbuf[10]); serialPortResponse1(l2capinbuf[9], l2capinbuf[10]);
firstMessage = false; firstMessage = false;
@ -213,9 +207,20 @@ void SPP::ACLData(uint8_t* l2capinbuf) {
l2capResponse2(l2capinbuf[9], l2capinbuf[10]); // L2CAP continuation state l2capResponse2(l2capinbuf[9], l2capinbuf[10]); // L2CAP continuation state
firstMessage = true; firstMessage = true;
} }
} else } else {
#ifdef EXTRADEBUG
Notify(PSTR("\r\nLength: "), 0x80);
uint16_t length = l2capinbuf[11] << 8 | l2capinbuf[12];
PrintHex<uint16_t> (length, 0x80);
Notify(PSTR("\r\nData: "), 0x80);
for (uint8_t i = 0; i < length; i++) {
PrintHex<uint8_t> (l2capinbuf[13+i], 0x80);
Notify(PSTR(" "), 0x80);
}
#endif
serviceNotSupported(l2capinbuf[9], l2capinbuf[10]); // The service is not supported serviceNotSupported(l2capinbuf[9], l2capinbuf[10]); // The service is not supported
} }
}
} else if (l2capinbuf[6] == rfcomm_dcid[0] && l2capinbuf[7] == rfcomm_dcid[1]) { // RFCOMM } else if (l2capinbuf[6] == rfcomm_dcid[0] && l2capinbuf[7] == rfcomm_dcid[1]) { // RFCOMM
rfcommChannel = l2capinbuf[8] & 0xF8; rfcommChannel = l2capinbuf[8] & 0xF8;
rfcommDirection = l2capinbuf[8] & 0x04; rfcommDirection = l2capinbuf[8] & 0x04;