pycarplay icon indicating copy to clipboard operation
pycarplay copied to clipboard

iOS 14

Open bnazari opened this issue 4 years ago • 14 comments

Amazing program! Have you had a chance to update the code to make it work with iOS14. The phone recognizes the device and adds it to the list of cars, but the protocol.py kicks out a "struct.error: unpack requires a buffer of 24 bytes" error. Not sure if this is a IOS14 issue or an issue with what I'm doing.

bnazari avatar Oct 15 '20 03:10 bnazari

So after messing around with the some more, it turns out the apk only works with the Carlinkit dongle and not one of the clones.

bnazari avatar Oct 25 '20 19:10 bnazari

Ahh, that's a shame (also sorry for the late reply). I'm surprised it doesn't work on the clones though, I'd expect things to be pretty similar - is there a specific point where it fails, or are they totally different?

electric-monk avatar Oct 26 '20 01:10 electric-monk

No need to apologize for the late reply...what you have made is incredible. I changed the dongle on a whim after seeing this:

https://www.reddit.com/r/CarPlay/comments/iwch1s/autokit_android_carlinkit_worked_for_a_while_then/

Not sure at what point it fails, but definitely before the phone connection is made.

I was thinking of doing something slightly different (though my python skills are horrid.) It might be possible to display the H264 data on X and then VNC into it. Might end up having less overhead. Currently trying to understand your code a bit more. Attempted to play the audio packets through sounddevice, but I'm fairly far from being able to manage the speaker and microphone connection for now.

Like you, I am annoyed with the shenanigans of Tesla's refusal to allow CarPlay.

bnazari avatar Oct 26 '20 02:10 bnazari

I seem to have similar issues, even with the Carlinkit dongle mentioned on the readme on iOS 14:

Found USB device...
Connected!
Connection started!
Exception in thread Thread-103:
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "/home/pi/dev/pycarplay/link.py", line 77, in _read_thread
    msg = header.upgrade(self._ep_in.read(needlen))
  File "/home/pi/dev/pycarplay/protocol.py", line 36, in upgrade
    upd._setdata(bodydata)
  File "/home/pi/dev/pycarplay/protocol.py", line 164, in _setdata
    (v,) = struct.unpack("<L", data)
struct.error: unpack requires a buffer of 4 bytes

The device appears to register its name, and even the carkit logo appears, but then dies and nothing seems to get piped through afterwards. Running the .apk on an old android device w/USB OTG seems to work, which would suggest the dongle isn't faulty, but is perhaps running a new software version?

harrylepotter avatar Nov 21 '20 21:11 harrylepotter

@harrylepotter Quick suggestion... If you have an RPi lying around, try throwing Android on it and see if the Carlinkit app works on it. I discovered that the knock-off version of the dongle I bought on Amazon didn't even work with the app on Android.

bnazari avatar Nov 22 '20 01:11 bnazari

@bnazari - i tried this on an old Nexus 5 i had sitting in a drawer and the carplay works perfectly. I'm suspecting there may have been some changes to the box fw - according to the app it's running 2020.08.07.1519

harrylepotter avatar Nov 22 '20 01:11 harrylepotter

update: I found an older (jadx-able) 2019 version of the APK. Have observed that the files uploaded seem to differ in the older release.

harrylepotter avatar Nov 23 '20 20:11 harrylepotter

...From what i can see it initialized the car audio, but then i get this message back (protocol.py:164): array('B', [4, 0, 0, 0, 57, 48, 58, 65, 50, 58, 53, 66, 58, 67, 66, 58, 68, 65, 58, 57, 48, 234, 95, 115]) Seems like this is maybe a frame we should be dropping/ignoring, perhaps?

harrylepotter avatar Nov 23 '20 21:11 harrylepotter

Most of that is clearly ASCII, and it decodes to "90:A2:5B:CB:DA:90" which looks like a MAC address. I assume it's something to do with the wifi/Bluetooth support (which my dongle never had, so I was unable to debug it).

electric-monk avatar Nov 23 '20 21:11 electric-monk

update: ignoring that message (the mac address seems to be the Bluetooth mac address of my iphone) results in a working implementation of teslabox.py:

index d2e1dfd..50a798b 100644
--- a/protocol.py
+++ b/protocol.py
@@ -38,6 +38,9 @@ class Message:
         except KeyError:
             upd=Unknown(self.type)
             upd._setdata(bodydata)
+        except struct.error:
+            upd=Unknown(self.type)
+            upd._setdata(bodydata)
         return upd

@electric-monk i dont suppose whist on your jadx adventures you found anything referencing sending keypresses? I'm trying to retrofit an old audi headunit with carplay. Noticed in the android app there's config to map keycodes to things like left/right/select/etc. I have a feeling like this is possibly a msgtype=8 with Value=4, and then some additional metadata on the keycode?

harrylepotter avatar Nov 23 '20 23:11 harrylepotter

I'm sure I saw some mention of it (as you've also noticed). If I did I likely updated the "function name map" file I was using with jadx to show something more human readable, I thought I'd recently uploaded that into the repo but it looks like I didn't, I'll see if I can find it again as that might have some extra clues for anyone who wants to continue poking around in there.

electric-monk avatar Nov 24 '20 20:11 electric-monk

Amazing! thankyou so much!

harrylepotter avatar Nov 24 '20 20:11 harrylepotter

added support for buttons on another thread. Gist of protocol from Jad here: https://gist.github.com/harrylepotter/f4bfb37f11faf9efcfd6cd4b189cfa33

harrylepotter avatar Nov 25 '20 06:11 harrylepotter

I uploaded the JADX function file to https://github.com/electric-monk/pycarplay/blob/master/Autokit.jobf, hopefully it has some useful extra function names in it (some that are just guesses).

electric-monk avatar Nov 25 '20 07:11 electric-monk