Jump to content
Click here if you are having website access problems ×

Purplemeanie

Area Representative
  • Posts

    658
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by Purplemeanie

  1. Hi Charles,

    thanks for that info.

    I think that then makes a lot more sense if the rev-counter uses the default broadcast OBD data - what I called MBE-Broadcast in my blog posts. It was bugging me that it must be there for a reason and I had thought that perhaps the shift-lights shipped with many cars were the reason for the broadcasts to be there. But it makes sense that the rev-counter might use it. I had also thought that it might be a hang over from the days of stacked-dashes.

    I've updated the CAN bus post on my blog along with the MBE-Broadcast post too.

    If I get some time I might see if I can make sure it's the MBE-broadcast protocol that's definitely being used by the rev-counter. CAN bus is certainly not a PCM signal but should be simple enough to check what the rev-counter is doing from the wiring and maybe even do some tests with a CAN bus gateway to inject some dummy data into the rev-counter if it does indeed use CAN bus.

    John

    [ Edit: having done some more research with the build manual wiring diagram I'm not so sure now that the rev-counter is on the CAN bus. I'll need to do some more digging around and will post back here when I find out, or someone else can chime in]

  2. If anyone's interested then I've got the bulk of the posts finished on all of this on my website here:

    https://www.purplemeanie.co.uk/index.php/2019/08/31/ecu-diagnostics-part-1-introduction/

    If anyone finds any errors or omissions then I'll be more than happy to correct and/update. I'm still learning lots about the car's ECU and will keep posting to my blog when I find things.

    And as always, I'm sure you'll find my site a great cure for insomnia if you ever need one - there's over 26,000 words or write up on this ECU topic already! :-)

    John

  3. Jonathan,

      the idea behind my wheel computer is to have the electronics on the wheel doing the display and the main processing in a Raspberry Pi sat under the dash and connected to the OBD port of the car.

      I toyed with the idea of having this wheel computer as a dash mounted display... but I got to thinking that the wheel would often be in the way and then it struck me that putting it on the wheel would make more sense. Once I'd built a 3D model of the wheel (and the electronics I thought I could get away with) then I thought it would probably work (I was going to say fly... but I hope it doesn't do that).

      I've also mocked up a few solutions using larger screens and different LED strip layouts. But I think a bigger screen would drain a battery too much and other LED options would be too bright and lower "resolution".

      I've built a number of these sorts of things over the years and I think it will work... battery life might be a problem but I've left room for more battery capacity in case its a problem. If it can last 6 to 8 hours then that'll be fine for what I'm thinking.

      A dash mounted unit would be possible though. And I might knock one up to see how that works too.

      I've also toyed with the idea of creating a head-up-display. The angle of a Caterham wind screen doesn't seem too conducive to a HUD but I might give that a go too at some point. I really like the one I have on my Beemer, and so that might be the ideal display.

      Something I prototyped a few years ago using similar technology (it's an alerting device for people who are deaf - yes people who are deaf do use phones... they use videophones! :-) ). So the idea is that the top LED array would be able to show a shift-light configuration but would also be able to scroll text/data if I wanted. The brightness of these things will need to adjust with ambient light levels and I've found that any LED array also needs a difuser in front of it... all things that'll go into the wheel-computer... along with indicator buttons and indictor self-cancelling gyro setup (yeh... I know Beemer drivers don't usually use indicators... but there are exceptions!).

    LEDAlerterCropped.png.03b4462d919be221efaf3dc523206152.png

     

    John

  4. I suspect they're surprised nobody got this far already. And in fact I bet that the engine tuners out there know this stuff already but are keeping quiet.

    Like I said before, they weren't exactly hiding anything. If they'd have encrypted the .ec2 files or put some simple obfuscation on the connection protocol then I think we'd have struggled a bit more.

    John

  5. As a teaser of things to come... here's a render of my next project to create a Steeting Wheel Computer for my car. It will connect to the CAN bus Raspberry Pi using Bluetooth and show stats and shift-lights on the steering wheel...

    SteeringWheelv12low-res.png.9dcaa7e3910adff4529f060654eeb01c.png

    The render shows the wheel and electronics... I'll "wrap" the electronics in a plastic case that I'll 3D print.

    John

  6. Hi Jonathan,

      In theory, yes.

      If we can see all the inputs to the ECU (and I think we can) and we can see all the outputs (again, I think we can) then as we drive the car around (or perhaps more scientifically on a rolling road) we should be able to deduce the map - especially as we know how many maps there are (from the unlocked ECU maps that are around) and what format they take.

      ... in theory.

      It shouldn't be too difficult to write some software to do exactly that and test your suggestion.

      While Mark is working on his dashboard, I'm working on a steering-wheel-computer (more on that later). Once I'm done with that, and my blog updates, then I'll have time to do some testing. Now we have the basic code, it should also be possible for another softie to take what we've done and test your theory.

      BTW... if anyone needs more help with their insomnia, or found my previous posts on this thread too light weight, then I've started to write all the gorey detail out on my blog: https://www.purplemeanie.co.uk/index.php/2019/08/31/ecu-diagnostics-part-1-introduction/

    John

  7. Hi John,

      I haven't tried to extract a map yet. I suspect it needs a different approach than the one we've been using to get the ECU variables. I'm also not that hopeful that we'll succeed, they are supposed to be locked after all and what we've done so far isn't anything that MBE have specifically protected against. They haven't used any encryption or subterfuge that we've had to break through, they've just used already existing protocols with a couple of twists. It wasn't as though they were hiding the info, it just took some persistence to figure out what they were doing. However, these ECUs are supposed to be locked and so I suspect won't give up a map that easily.

      Attempting to read a map is on the list of things to have a look at though.

    John

  8. Progress report...

    Up until now, a lot of what we posted about the MBE ECU protocols has been a little theoretical. We've sniffed away at the packets on the canbus and we've poked and prodded at Easimap. We also wrote some simple test applications to test out our theories.

    But now we have a software tool to ask a standard locked MBE 9A4 to send us whatever data we want to ask it for. We've now been able to select which data parameters we want to know about and for the car to respond. We can then repeatedly ask the car for updates as often as we dare and to produce things like dashboards, data-loggers and change lights etc.

    I run these tools run on a Raspberry Pi at the moment but should work on any Linux system. It uses a PiCAN2 to access the canbus, but could use any SocketCAN compatible device.

    The code is available on GitHub for anyone to download, look at, and throw stones at, if that's what you're into. The code can be found here:

    https://github.com/Purplemeanie

    For the softies amongst you: The can-isotp repository is a modified kernel module that can knoble flow-control in the ISOTP protocol layer. The Caterham-OBD repo has the main access class (mbe.py) and a test app. There are also other support tools and files in there too.

    The code is still quite rough and ready, so don't be too critical of it.... it's a work in progress.

    So... by way of an example: I asked the car for the following EC2 data variables:

    RT_AIRTEMP1(LIM)
    RT_COOLANTTEMP1(LIM)
    RT_ENGINESPEED
    RT_BATTERYVOLTAGE(LIM)
    RT_SOFTCUTTIME
    RT_HARDCUTTIME

    And got the following back. As you can see, the battery needs charging and the engine wasn't running!...        

    Air Temp RT_AIRTEMP1(LIM) 16.189669642175936 C
    Battery Voltage RT_BATTERYVOLTAGE(LIM) 11.815976195925842 V
    Coolant Temp RT_COOLANTTEMP1(LIM) 21.95635919737545 C
    Engine Speed RT_ENGINESPEED 0.0 RPM
    Hard Cut RT_HARDCUTTIME 7900.0 RPM
    Soft Cut RT_SOFTCUTTIME 7800.0 RPM

    If needed I can ask for that data repeatedly and get a continuous readout showing "real time" values for all the data points I ask for.

    I think we can say we have the basics now for a set of tools to be able to write whatever applications we want.

    Not bad progress for a few weeks tinkering. I'm just waiting for some old-hand to pop up and say they did this years ago. But what the heck, its been great fun solving the puzzle.

    John

  9. Hi Toughie... I hope that's a vote of confidence in what we're doing :-)

    All these shenanigans are (I'm afraid) bread and butter for some of us doing this work. In the words of the slogan that was behind the Wireshark network sniffer a few years ago... we spend our working lives "Sniffing the glue that holds the internet together"! Packet analysis on an OBD canbus should be relatively simple, and certainly isn't rocket science ;-)

    New post coming later tonight...

  10. First off, thanks to all those that have shown some interest in this thread, it can get a bit technical at times, so shout if you'd like me (us) to go into more detail. Or shout if you want me to stop :-)

    Ok, so another update. 

    Summary

    We now understand the communications protocol used by Easimap and can use it to ask the ECU for whatever data the car has to offer. We can then manipulate the responses we get back from the car and format it to make sense to us.

    If you don't want the technical jargon, then skip to the bottom of the post for the Results :-)

    TL;DR

    I've got to a point now where I think we understand how Easimap is talking to the car and how it formats the data fields it gets from the car. And therefore we can just do the same to get whatever data the car has to offer.

    What I haven't looked at yet is how Easimap can set parameters in the car's ECU. I will take a look at that at some point but for the moment my interest is in creating some sort of Linux tool that can extract data from the car and display it. I may also have a look at whether the mappings on the ECU can be changed, though the general consensus is that the ECU's are locked, and I have no reason to change that theory at the moment. I'm not sure how that locking occurs or whether it can be circumvented. At the moment I'm not interested in that side of things and have no intention of looking at it - at least at the moment.

    So, to that end... here's what I understand now about what I called in the previous post the "MBE ISOTP-like" protocol used by MBE in their Easimap software and the ECU's.

    Firstly, this protocol is a multi-layered protocol. It's a bit like Russian Dolls, the actual data packets used by MBE are a couple of layers deep inside the doll. In order to look at the data the way that the ECU does we have to capture the data from the OBD port and then unpack it a couple of times to get at the real data.

    The unpacking layers in this case are CAN, ISOTP (ISO-15765) and a proprietary MBE layer.

    Lets dig into the various layers and explain what's going on, hopefully this will help future developers. I also intend to do a full writeup on my blog and I'm sure Mark will do the same for what he's been looking at. I'll have diagrams and code snippets there to help. Unfortunately, this L7 website is a little limited in the sorts of diagrams and files I can show you here, so my website will be a better place for a full write-up. I'll post a link when it goes live.

    CAN Layer

    The OBD-II port (on my car (2017 420R) and most modern-ish Caterhams) connects to the ECU by way of a two wire differential voltage protocol. It uses CAN-H and CAN-L to signal 1s and 0s on the CAN bus.

    There are two critical things here in each CAN packet... firstly there's the CAN ID (identifier) and then there's the Data. The CAN ID can be either 11bits long or 29bits long. On my car with the MBE 9A4 ECU, it uses 29bit IDs. But other Caterhams also seem to use 11bit, probably with unlocked ECUs.

    Secondly, the CAN packet contains up to 8 bytes of data. The CAN standard does allow for more than 8 bytes but it doesn't seem as though our cars use that version of the protocol.

    Other than the ID and data the CAN packet also contains lots of start bits, CRC (cyclic redundancy check) error checking, data length parameters and an ACK section. The ACK section is perhaps worth a few words: a sending device on the network only knows if "something" has received it's CAN packet if a receiver sets the ACK bit when it received the data.

    Anyway, on to the more interesting stuff.

    The 29bit CAN IDs are used a payload type identifier - When a device sending on the bus sets a particular ID, it is telling any receiver what sort of protocol to expect in the packet.  I'll talk more about the specifics of the IDs used in our cars when I get onto the ISOTP layer below.

    So, at a high level view of each CAN packet, there are the two things we're interested in, the CAN ID and the Data. For our cars the IDs are 29bit and the data can be up to 8 bytes. And a packet looks like this when we've captured it from the CAN bus:
      #   Time        Prot Len Info CAN ID       Data
      168 1.612770860 CAN  32  XTD: 0x0cbe1101   10 08 01 00 00 00 00 f8
      169 1.613462515 CAN  32  XTD: 0x0cbe1101   21 7c 7d 00 00 00 00 00
      170 1.614548554 CAN  32  XTD: 0x0cbe0111   03 81 34 12 00 00 00 00
      
    This data is laid out in columns by the packet sniffing tool I'm using (Wireshark/tshark). 
    - # = Packet Number
    - Time = number of seconds since the packet capture started
    - Prot = Protocol (CAN)
    - Len  = Length of the capture packet. This is not the CAN data length, that's always 8 for us
    - CAN ID = 29bits (shown as hexadecimal in this example)
    - Data = Data in the CAN packet, shown as hexadecimal bytes

    You'll see why I picked those particular packets a bit later.

    So, to recap... when we put a packet sniffer (Raspberry Pi with PICAN2 interface in my case) and watch (sniff) the CAN bus, we see a succession of lines of output from our packet sniffer like above... 

    ISOTP

    Ok. So lets look at one level of Russian Dolls down (smaller doll).

    As you can see from the example above, our particular implementation of the CAN protocol allows the car and any other device on the CAN bus to talk in chunks of 8 bytes at a time.

    Now, this is quite restrictive for a modern car. The communication between Easimap and the car ECU might need to send all sorts of data that is longer than 8 bytes. For instance a 2 dimensional engine fueling map that might be hundreds of bytes long.

    The MBE ECU and Easimap get over this problem by adding another protocol on top of the CAN interface (another Russian Doll). This protocol is called ISO-15765 or ISO-TP. By formatting the data in the CAN packets we can send one ISO-TP "frame" across multiple CAN packets - allowing us to send more than 8 bytes in a frame.

    Here's the same 3 CAN packets from above, but this time we looking at it through an ISO-TP dissector (its dissecting the packet stream and viewing it as though it is formatted in accordance with the ISO-TP protocol).

      #   Time        Proto    Len Info                       Data
      168 1.612770860 ISO15765 32 First Frame(Frame Len: 8)   01 00 00 00 00 f8
      169 1.613462515 ISO15765 32 Consecutive Frame(Seq: 1)   7c 7d
      170 1.614548554 ISO15765 32 Single Frame(Len: 3)        81 34 12

    Packets 168 and 169 are actually a single ISO-TP frame. The "First Frame" and the "Consecutive Frame" are "fragments" of a whole frame and can be joined together to form an ISO-TP frame with the following data:

      01 00 00 00 00 f8 7c 7d
      
    The "Frame Len: 8" in the First Frame tells us there are 8 bytes of data at the ISO-TP protocol layer.

    Now, you might say... but hang on, we could send 8 bytes of data with just CAN frames. Well, that's true in this particular example but for more complex examples we can send over 4000 bytes of data in a single ISO-TP frame (using many CAN packets).

    One significant departure that MBE seem to make from the ISO-TP standard is that they do not implement flow-control in the protocol. We don't need to go into that here, but if anyone is trying to talk to an MBE ECU using their own software, then they'll need to remove any notion of flow control from the ISO-TP layer they use. At least that's my current theory - and it seems to be stacking up.

    Right, so now we've used up two layers of the Russian Doll. The CAN layer and the ISO-TP layer. In the third layer (I'll call it the MBE layer) we see exactly what the ECU and Easimap are really saying to each other.

    MBE Layer

    The data we extracted using the ISO-TP dissector has given us the following (same as above):

      01 00 00 00 00 f8 7c 7d
      
    What does that mean to the ECU?

    Well, this took a bit of figuring out. We don't have MBE's complete rule-book for decoding this layer of the communications. But what we do have is their Easimap software. That helps us in two ways. Firstly, we can watch Easimap and the ECU talking to each other. That's how we got these sample packets. But that just looks like random data at the moment. Secondly, we have the EC2 data files that Easimap loads when it discovers what ECU its talking to. MBE supports a whole raft of ECU's and each seems to communicate with Easimap in a different way. MBE could have coded each of those protocols into Easimap but that would mean that they needed to update the Easimap software whenever they make a new ECU for a customer (Caterham or whoever).

    So, MBE wrote Easimap to discover what ECU its talking to and then load the correct EC2 file for that ECU. Fortunately for us the EC2 files are easily found in the Easimap installation.

    A Digression into EC2 files

    The EC2 files are worth a whole post in themselves. And we had to write scripts to decode them and give us the keys to unlock the MBE layer.

    In simple terms though, the EC2 files set up a lot of "variables". Each variable is a type of data that Easimap can extract from the ECU. The 9A4 EC2 file that Easimap uses for our cars has over 2000 variables defined. It turns out that over half of them are "disabled" but that still leaves over 900 to work with. I suspect that many of these 900 don't actually do anything with our cars but I'm planning to got and check which are "active" and which are not.

    For each variable in the EC2 file there a definitions for things like, the number of bytes of data each variable takes up in the MBE communications layer, the short and long description of the variable that Easimap uses when showing the data on the screen and crucially it also has entries for what it calls a "page" and an "address".

    This information for each variable is spread all over the EC2 file and the scripts we wrote had to find each variable and pull the respective information together to build a picture of how each variable works.

    {'address': '0x237c',
     'bytes': '2',
     'display_interval': '1000.000000',
     'display_maximum': '12000.000000',
     'display_minimum': '0.000000',
     'long_desc': ' Engine Speed in rpm as measured by the crankshaft sensor. This '
                  'is the primary input for the fuel and ignition maps',
     'name': 'RT_ENGINESPEED',
     'page': '0xf8',
     'scale_maximum': '65535.000000',
     'scale_minimum': '0.000000',
     'short_desc': ' Engine Speed',
     'units': 'RPM'}
     
    [ You can read the info as address=237c etc. ]

    Once we'd decoded the EC2 file we could start to try and guess on the protocol used in this MBE layer.

    Back to the MBE Layer

    I picked all this example data and info for a reason. I had suspected ever since looking at the EC2 files for the first time a few weeks ago that the page and address info was important. And I had one of thos Eureka moments when I looked at the output of the ISO-TP layer and realized from:

      01 00 00 00 00 f8 7c 7d

    The f8 looked like a page from the EC2 file (see 'page' : '0xf8' above) and the 7c looked like part of the address. So, I went away and hand decoded a bunch of messages from the ECU and low and behold it seemed to match up. So page=f8 and address Low-Byte (the 7c bit of the address) meant RT_ENGINESPEED - the engine RPMs.

    The next thing was to figure out what the rest of the packet means.

    And so I wrote a bunch more code and started to test out my theories.

    After the [01 00 00 00 00 f8 7c 7d] message is sent by Easimap, the ECU responds with:

      81 34 12

    One of the ways that we saw both CAN and ISO-TP communicate was to send a "command" in the first byte of the packet/frame. And for the response to have a similar format but with one or more other bits in the response byte being set.

    So, it seemed to make sense that the initial 01 byte in the frame from Easimap was responded to by the ECU with a response byte of 81 (81 in hexadecimal is 01 with the top bit set). This was starting to add up and so the request [01 .... 7d] was a data request for RT_ENGINESPEED and the ECU responded with 3412 (after the 81).

    Now I've connived to make the data here readable. When I was first testing I didn't have the car running and so the ECU was responding with 81 00 00... meaning 0 RPM. But when I started up the car the responses turned into real engine rev data.

    Turns out that the [34 12] is sent in reverse order and the bytes need to be swapped, making the engine revs 0x1234, which in decimal are 4660. That's revving the car a little highly in a test, but you can see how the data works.

    Addresses are Weird

    One of the complications around access to the ECU seems to be some weird mapping going on between the EC2 file and the address requests going to the ECU. For instance, if we take our RT_ENGINESPEED variable then the EC2 address is 0x237c.

    But what Easimap sends to the ECU is a request for two bytes, a Lowest Significant Byte (LSB) and a Most Significant Byte (MSB) or 0x7c and 0x7d i our RT_ENGINESPEED example.

    Having tried this out with a few dozen different variables it seems that Easimap takes the LSB of the Easimap address (0x7c in this example) and increments (adds one) for each extra byte it wants from the ECU. 

    Easimap sometimes asks for 4-byte data and so this incrementing can be seen here, for example, with RT_ENGINERUNTIME...

    This is the variable info for RT_ENGINERUNTIME
    {'address': '0xcfcecdcc',
     'bytes': '4',
     'display_interval': '10000.000000',
     'display_maximum': '1193046.500000',
     'display_minimum': '0.000000',
     'long_desc': ' Engine Run Time',
     'name': 'RT_ENGINERUNTIME',
     'page': '0xe2',
     'scale_maximum': '1250999.875000',
     'scale_minimum': '0.000000',
     'short_desc': ' ERT',
     'units': 'Hours'}
    RT_ENGINERUNTIME=3.9094e+04 Hours ( ERT ) [0x07ffffff=134217727, Scale:1250999.875, Div:4294967295, Offset:0.0]

    But that's a bit weird too, because the EC2 address ('0xcfcecdcc') is the actual series of requests sent to the ECU. I'm a little baffled at the moment about when Easimap uses the EC2 address and when it makes one up. I suspect there are rules depending on how many bytes are being asked for.

    Compound Data Requests

    Lets talk about another twist to the tale. In order that Easimap can talk to the ECU in an as-efficient way as possible. It batches up requests to pages inside the ECU and asks for a bunch of data results in one go. A request and response will therefore look like this at the CAN layer:

       46 0.353164720                             CAN 32 XTD: 0x0cbe1101   10 23 01 00 00 00 00 f8
       47 0.353978868                             CAN 32 XTD: 0x0cbe1101   21 30 31 36 37 44 45 4c
       48 0.354710862                             CAN 32 XTD: 0x0cbe1101   22 4d 4e 4f 50 51 5a 5b
       49 0.355482989                             CAN 32 XTD: 0x0cbe1101   23 5c 5d 64 6a 6b 7c 7d
       50 0.356219206                             CAN 32 XTD: 0x0cbe1101   24 9e 9f a0 a1 d8 d9 da
       51 0.356950718                             CAN 32 XTD: 0x0cbe1101   25 db 9f a0 a1 d8 d9 da
       52 0.358137040                             CAN 32 XTD: 0x0cbe0111   10 1e 81 4e 39 c7 47 e0
       53 0.358462988                             CAN 32 XTD: 0x0cbe0111   21 54 d4 83 3a 85 4e 39
       54 0.358805252                             CAN 32 XTD: 0x0cbe0111   22 a8 0d a2 a0 00 b0 4f
       55 0.359140831                             CAN 32 XTD: 0x0cbe0111   23 00 00 7a 9c 68 08 00
       56 0.359467705                             CAN 32 XTD: 0x0cbe0111   24 80 00 80 a1 d8 d9 da


    Which then looks like this at the ISO-15765 layer:

       46 0.353164720                             ISO15765 32 First Frame(Frame Len: 35)   01 00 00 00 00 f8
       47 0.353978868                             ISO15765 32 Consecutive Frame(Seq: 1)   30 31 36 37 44 45 4c
       48 0.354710862                             ISO15765 32 Consecutive Frame(Seq: 2)   4d 4e 4f 50 51 5a 5b
       49 0.355482989                             ISO15765 32 Consecutive Frame(Seq: 3)   5c 5d 64 6a 6b 7c 7d
       50 0.356219206                             ISO15765 32 Consecutive Frame(Seq: 4)   9e 9f a0 a1 d8 d9 da
       51 0.356950718                             ISO15765 32 Consecutive Frame(Seq: 5)   db 9f a0 a1 d8 d9 da
       52 0.358137040                             ISO15765 32 First Frame(Frame Len: 30)   81 4e 39 c7 47 e0
       53 0.358462988                             ISO15765 32 Consecutive Frame(Seq: 1)   54 d4 83 3a 85 4e 39
       54 0.358805252                             ISO15765 32 Consecutive Frame(Seq: 2)   a8 0d a2 a0 00 b0 4f
       55 0.359140831                             ISO15765 32 Consecutive Frame(Seq: 3)   00 00 7a 9c 68 08 00
       56 0.359467705                             ISO15765 32 Consecutive Frame(Seq: 4)   80 00 80 a1 d8 d9 da

    Which is a request like this at the MBE layer:
      01 00 00 00 00 f8 30 31 36 37 44 45 4c 4d 4e 4f 50 51 5a 5b 5c 5d 64 6a 6b 7c 7d 9e 9f a0 a1 d8 d9 da db

    Followed by a response of this:
      81 4e 39 c7 47 e0 54 d4 83 3a 85 4e 39 a8 0d a2 a0 00 b0 4f 00 00 7a 9c 68 08 00 80 00 80
      
    Or once the MBE layer is decoded it's a request for:

    This is a command request for data in page: f8 ...
    [{'bytes': '2', 'name': 'RT_THROTTLEANGLE1(RAW)'},
     {'bytes': '2', 'name': 'RT_AIRTEMP1(LIM)'},
     {'bytes': '2', 'name': 'RT_COOLANTTEMP1(LIM)'},
     {'bytes': '2', 'name': 'RT_COOLANTFUELFACTOR'},
     {'bytes': '2', 'name': 'RT_AIRTEMPFUELFACTOR'},
     {'bytes': '2', 'name': 'RT_THROTTLEANGLEINCREASING'},
     {'bytes': '2', 'name': 'RT_TPSFUEL+TRIMBANK1'},
     {'bytes': '2', 'name': 'RT_TPSVSSPEEDIGN+TRIM1'},
     {'bytes': '1', 'name': 'RT_THROTTLESITE1'},
     {'bytes': '2', 'name': 'RT_BAROSCALEDLIM'},
     {'bytes': '2', 'name': 'RT_ENGINESPEED'},
     {'bytes': '2', 'name': 'RT_BATTERYVOLTAGE(LIM)'},
     {'bytes': '2', 'name': 'RT_BATTERYVOLTAGECOMP'},
     {'bytes': '2', 'name': 'RT_MAPPINGPOT1LIM'},
     {'bytes': '2', 'name': 'RT_MAPPINGPOT2LIM'}]
     
    and a response with these values:

    RT_THROTTLEANGLE1(RAW)=1.1192 V ( Throttle Angle 1 (Raw) ) [0x394e=14670, Scale:5.0, Div:65535, Offset:0.0]
    RT_AIRTEMP1(LIM)=14.862  ( Air Temp ) [0x47c7=18375, Scale:160.0, Div:65535, Offset:-30.0]
    RT_COOLANTTEMP1(LIM)=23.048  ( Coolant Temp ) [0x54e0=21728, Scale:160.0, Div:65535, Offset:-30.0]
    RT_COOLANTFUELFACTOR=105.98  ( Coolant Fuel Factor ) [0x83d4=33748, Scale:400.0, Div:65535, Offset:-1e+02]
    RT_AIRTEMPFUELFACTOR=4.0848  ( Air Temp Fuel Factor ) [0x853a=34106, Scale:200.0, Div:65535, Offset:-1e+02]
    RT_THROTTLEANGLEINCREASING=1.1192 V ( Throttle Angle Increasing ) [0x394e=14670, Scale:5.0, Div:65535, Offset:0.0]
    RT_TPSFUEL+TRIMBANK1=5.6013 ms ( TPS Fuel + Trim ) [0x0da8=3496, Scale:105.0, Div:65535, Offset:0.0]
    RT_TPSVSSPEEDIGN+TRIM1=4.7022  ( TPS vs Speed Ign + Trim ) [0xa0a2=41122, Scale:-120.0, Div:65535, Offset:80.0]
    RT_THROTTLESITE1=0.0 Site ( Throttle Site 1 ) [0x00=0, Scale:16.0, Div:255, Offset:0.0]
    RT_BAROSCALEDLIM=1.04 Bar ( Baro Pressure ) [0x4fb0=20400, Scale:6.5535, Div:65535, Offset:-1.0]
    RT_ENGINESPEED=0.0 RPM ( Engine Speed ) [0x0000=0, Scale:65535.0, Div:65535, Offset:0.0]
    RT_BATTERYVOLTAGE(LIM)=12.225 V ( Battery Voltage ) [0x9c7a=40058, Scale:20.0, Div:65535, Offset:0.0]
    RT_BATTERYVOLTAGECOMP=0.43116 ms ( Battery Voltage Comp ) [0x0868=2152, Scale:13.13, Div:65535, Offset:0.0]
    RT_MAPPINGPOT1LIM=0.0015259  ( Mapping Pot 1 ) [0x8000=32768, Scale:200.0, Div:65535, Offset:-1e+02]
    RT_MAPPINGPOT2LIM=0.0015259  ( Mapping Pot 2 ) [0x8000=32768, Scale:200.0, Div:65535, Offset:-1e+02]

    All that done in one ISO-TP request frame and one response frame.

    Results

    Most of the variables have scale and offset factors that have to be applied, but initial results give the following for the default Easimap screen...

    RT_CURRENTFAULTSB=3.2769e+04 - ( Current Faults B ) [0x8001=32769, Scale:65535.0, Div:65535, Offset:0.0]
    RT_ENGINE_CONFIG=176.0 - ( Eng Cnfg ) [0xb0=176, Scale:255.0, Div:255, Offset:0.0]
    RT_MEMORYCONFIG=64.0 - ( Memory Configuration ) [0x40=64, Scale:255.0, Div:255, Offset:0.0]
    RT_IGNITIONADVANCEBANK1=23.691  ( Ignition Advance ) [0x7820=30752, Scale:-120.0, Div:65535, Offset:80.0]
    RT_BAROFUELCOMP=3.5294  ( Barometric Pressure Fuel Compensation ) [0x84=132, Scale:200.0, Div:255, Offset:-1e+02]
    RT_CRANKCOUNT=463.0 - ( Crank Count ) [0x01cf=463, Scale:65535.0, Div:65535, Offset:0.0]
    RT_ENGINERUNTIME=3.9094e+04 Hours ( ERT ) [0x07ffffff=134217727, Scale:1250999.875, Div:4294967295, Offset:0.0]
    RT_THROTTLEANGLE1(RAW)=1.5767 V ( Throttle Angle 1 (Raw) ) [0x50ba=20666, Scale:5.0, Div:65535, Offset:0.0]
    RT_AIRTEMP1(LIM)=14.615  ( Air Temp ) [0x4762=18274, Scale:160.0, Div:65535, Offset:-30.0]
    RT_COOLANTTEMP1(LIM)=23.121  ( Coolant Temp ) [0x54fe=21758, Scale:160.0, Div:65535, Offset:-30.0]
    RT_COOLANTFUELFACTOR=22.719  ( Coolant Fuel Factor ) [0x4e8a=20106, Scale:400.0, Div:65535, Offset:-1e+02]
    RT_AIRTEMPFUELFACTOR=4.0848  ( Air Temp Fuel Factor ) [0x853a=34106, Scale:200.0, Div:65535, Offset:-1e+02]
    RT_THROTTLEANGLEINCREASING=1.5767 V ( Throttle Angle Increasing ) [0x50ba=20666, Scale:5.0, Div:65535, Offset:0.0]
    RT_TPSFUEL+TRIMBANK1=4.5887 ms ( TPS Fuel + Trim ) [0x0b30=2864, Scale:105.0, Div:65535, Offset:0.0]
    RT_TPSVSSPEEDIGN+TRIM1=24.32  ( TPS vs Speed Ign + Trim ) [0x76c8=30408, Scale:-120.0, Div:65535, Offset:80.0]
    RT_THROTTLESITE1=8.2824 Site ( Throttle Site 1 ) [0x84=132, Scale:16.0, Div:255, Offset:0.0]
    RT_BAROSCALEDLIM=1.04 Bar ( Baro Pressure ) [0x4fb0=20400, Scale:6.5535, Div:65535, Offset:-1.0]
    RT_ENGINESPEED=2400.0 RPM ( Engine Speed ) [0x0960=2400, Scale:65535.0, Div:65535, Offset:0.0]
    RT_BATTERYVOLTAGE(LIM)=13.087 V ( Battery Voltage ) [0xa782=42882, Scale:20.0, Div:65535, Offset:0.0]
    RT_BATTERYVOLTAGECOMP=0.33138 ms ( Battery Voltage Comp ) [0x0676=1654, Scale:13.13, Div:65535, Offset:0.0]
    RT_MAPPINGPOT1LIM=0.0015259  ( Mapping Pot 1 ) [0x8000=32768, Scale:200.0, Div:65535, Offset:-1e+02]
    RT_MAPPINGPOT2LIM=0.0015259  ( Mapping Pot 2 ) [0x8000=32768, Scale:200.0, Div:65535, Offset:-1e+02]
    RT_SOFTCUTTIME=7800.0 RPM ( Soft Cut ) [0x1e78=7800, Scale:65535.0, Div:65535, Offset:0.0]
    RT_HARDCUTTIME=7900.0 RPM ( Hard Cut ) [0x1edc=7900, Scale:65535.0, Div:65535, Offset:0.0]
    RT_INJECTIONTIMEA=7.2051 ms ( Final Injection Time ) [0x1191=4497, Scale:105.0, Div:65535, Offset:0.0]
    RT_DUTYCYCLEA=14.51  ( Duty Cycle ) [0x25=37, Scale:100.0, Div:255, Offset:0.0]
    RT_HAVESPEEDS=169.0 - ( RT_HAVESPEEDS ) [0x00a9=169, Scale:65535.0, Div:65535, Offset:0.0]

    Some of this still isn't making sense but most of it seems to.

    I hope that's been at least somewhat informative for people. Feels like I should do a lecture course on the subject [ and really put you all to sleep ] :-)

    John

  11. Another Progress Report:

    We (CTRMint, Aerobod and myself) have made some good progress since the last update.

    Our work is with the 9A4 MBE ECU and the car's OBD connector with the following working assumptions:

    • There are three protocols used by the ECUs
      • A Broadcast Protocol with limited information that outputs about every 100ms. 
      • OBD-II standard protocol that is a request/repsonse protocol based around 29bit CANbus IDs
      • Easimap ISOTP-like protocol that is a request/response protocol using 29bit CANBus IDs and a modified ISOTP (ISO-15765) protocol

    Broadcast Protocol

    There are a few CANbus messages broadcast by the ECU's using a CAN ID of 0x0cbb0001. These messages are sent as soon as the car is put into ignition position 2. There are probably some useful data entries in these messages but there's not a lot there so we haven't concentrated on that yet.

    OBD-II Protocol

    The MBE ECU's support the standard OBD-II protocol. You can send the ECU OBD-II data requests and the ECU will respond. We've seen this protocol being used by OBD scanners and it mostly makes sense.

    We've been using the Wireshark packet sniffer to decode the OBD-II protocol and have submitted a code patch to Wireshark.org to allow Wireshark to decode the 29bit CAN IDs, modes and PIDs that the MBE ECUs use. This patch has now been accepted and should hopefully appear in the next release of Wireshark.

    EasiMap ISOTP-like Protocol

    The third protocol is probably the most interesting and where we have spent the most of our time. This protocol is used by Easimap 6 to communicate with the ECUs and has a lot more data variables than either of the other two protocols.

    This protocol is also a request/response protocol where a querying device (Easimap with MBE 985, or some other CANbus tool like a Raspberry Pi with a PICAN2 HAT) sends a command to the ECU and the ECU responds with the data.

    We've found that on top of the CANbus protocol, the ECU's add ISOTP packetisation. This allows the ECUs to communicate in larger than 8 byte frames. At the lowest level 8 byte packets are sent but with ISOTP on top it can bunch up multiple 8 byte packets into ISOTP frames - allowing larger transmission chuncks to/from the application layer to the car.

    I've called this a "ISOTP-like" protocol because it uses the packet structure of ISOTP but critically seems to omit the use of FlowControl. So, we've had to modify some standard Python libraries to be able to talk to the car.

    We haven't made a whole lot of communications to our cars yet, but we have sent commands to the cars and got responses for things like Serial Number, Engine RPM and Coolant Temp.

    On top of the ISOTP protocol the ECUs are adding another control layer. We don't completely understand this layer at the moment but we are able to "hard code" some commands and then get responses. We have seen a couple of these commands so far, one that asks the car for its serial number and another that asks for data back from the car.

    The second of these commands is also interesting in that it can ask for multiple data items back from the car at once. It can ask for single items but it can also ask for multiple items and so make the communication on the bus much more efficient.

    In parallel with this work around the commands, we've also spent a lot of time trying to figure out what each data request means and what the respective results are - how the data is placed in the response, how it is scaled and what its ranges are. To that end we've decoded the Easimap EC2 file used for our ECUs (9A4be52a.ec2). As a result we have a Python tool now that can take an EC2 file and extract the communication protocol used by Easimap and store it in a form that we can now write software against (we have it in csv, json and python formats).

    Here's an example of the configuration for engine rpm...

        {
            "name" = "RT_ENGINESPEED".
            "page" = "0xF8".
            "address" = "0x237C".
            "bytes" = "2".
            "scale_minimum" = "0.000000".
            "scale_maximum" = "65535.000000".
            "display_minimum" = "0.000000".
            "display_maximum" = "12000.000000".
            "display_interval" = "1000.000000".
            "units" = "RPM".
            "short_desc" = " Engine Speed".
            "long_desc" = " Engine Speed in rpm as measured by the crankshaft sensor. This is the primary input for the fuel and ignition maps"
        }

    The page and address fields above are used to create the "request for data" commands and then the remainder of the configuration tells us how to interpret the results. The "bytes" field tells us how many bytes of data will come back from the car.

    If anyone is interested to know more then please contact CtrMint to join our Slack workspace or DM me and I can send more info. The Slack channel has all the source code and output files that we've been working on.

    I must stress that this is all a work-in-progress. Any of this information may change... though we think (hope) we are on the right track.

    I hope that's vaguely interesting to a few of you. More to come over the next few days/weeks... and there will be a full write-up, source code and sample files available on the subject at some point.

    John, Mark and James.

  12. Progress Report:

    Mark and I haven't given up on this project (yet)!

    We've been setting up test systems and figuring out what's what on the OBD port.

    It's clear that the MBE 9A4 ECU's use a couple of different protocols on that port. There's an MBE specific protocol that's used by Easimap to talk to the car, and there's OBD-II.

    In order to decode the OBD traffic I had been using the Wireshark packet sniffer. Wireshark has recently updated its support for OBD and it can now decode 11bit CAN OBD IDs. However, it struggled (that's software speak for: it didn't) when we tried to get it to decode the 29bit codes used on our MBE ECUs.

    So, to get that fixed I've worked this week on getting Wireshark patched for our OBD 29bit protocols and have now submitted a patch to allow Wireshark to correctly dissect our OBD port.

    Here's a screen shot of what the OBD protocol now looks like with my patch in Wireshark:

    Wiresharkdecoding29bitOBD.jpg.955f35ff38e4a61571416eebe1e1d495.jpg

    The patch is here:

    https://code.wireshark.org/review/#/c/34297/

    This is my first Wireshark commit so I'm not quite sure how the process runs for getting it into the regular Wireshark releases, but hopefully it won't take too long.

    If anyone's interested, Wireshark can be downloaded from here (obviously doesn't contain my patch yet):

    http://wireshark.org

    The next step is to try and decode the MBE Easimap protocol. Mark and I have made some good progress on this but we're still a long way from having it cracked.

    More to follow over the coming days/weeks...

    John

     

  13. So a bit of a diversion today... I was looking at the Easimap protocol again as Mark and I were chatting on Slack and I remembered I had an OBD scanner that I bought when I was building the car. So I decided to connect that back up to the car again and see what it did on the CANBus with my newly set up Raspberry Pi CANBus sniffer.

    By the way, some of you old hands will probably know all this already. But hopefully its helpful to some of you.

    The scanner is an Autolink AL319. It goes through a setup phase where it tries to decide what protocol the car is talking - Which turned out to be "CAN EXD FAST". Makes sense seeing as the Wireshark captures we've been looking at report exactly that (CAN EXD).

    It then goes through a phase of deciding what data the car can report using the OBD protocol.

    It's perhaps worth noting here that these ECU's talk at least two protocols. The one Easimap uses and OBD-II. The OBD protocol is quite easy to decode but the Easimap one is proving to be a little more troublesome.

    Anyway, that lead me to what OBD is, and to this page:

    https://www.csselectronics.com/screen/page/simple-intro-obd2-explained/language/en

    and then to the Wikipedia page here:

    https://en.wikipedia.org/wiki/OBD-II_PIDs

    If you want to dig into OBD then those two pages explain it all. But suffice to say the protocol is a Request/Response protocol. The Scanner sends a request for a response about a PID (see the two links for more info on PIDs).

    The upshot of my research was that I could see the car responding to three PID discovery requests as follows:

    9A4 ECU Response the OBD PID 0
    0xd8368019 -> 0b11011000001101101000000000011001

    9A4 ECU Response the OBD PID 20
    0x20002001 -> 0b00100000000000000010000000000001

    9A4 ECU Response the OBD PID 40
    0x40100000 -> 0b01000000000100000000000000000000

    And that leads to the following PIDs being supported by the car. Just thought some of you might appreciate this research. It seems that some websites refer to Services (the new term) and some to PID, they are the same thing as far as I can see.

    (I've checked my working out and I think I've got it right, but someone might like to check it)

    To be clear: This data is not present on the OBD/CAN port by default. You have to have a device connected that can "ask" for the data. i.e. the device has to send a "request" and the car sends the "response".

    Service (PID) Supported (Snn)
    S01 1 -> Monitor status since DTCs cleared. (Includes malfunction indicator lamp (MIL) status and number of DTCs.)
    S02 1 -> Freeze DTC
    S03 0 -> 
    S04 1 -> Calculated engine load
    S05 1 -> Engine coolant temperature
    S06 0 -> 
    S07 0 -> 
    S08 0 -> 
    S09 0 -> 
    S0A 0 -> 
    S0B 1 -> Intake manifold absolute pressure
    S0C 1 -> Engine RPM
    S0D 0 -> 
    S0E 1 -> Timing advance
    S0F 1 -> Intake air temperature
    S10 0 -> 
    S11 1 -> Throttle position
    S12 0 -> 
    S13 0 -> 
    S14 0 -> 
    S15 0 -> 
    S16 0 -> 
    S17 0 -> 
    S18 0 -> 
    S19 0 -> 
    S1A 0 -> 
    S1B 0 -> 
    S1C 1 -> OBD standards this vehicle conforms to
    S1D 1 -> Oxygen sensors present (in 4 banks)
    S1E 0 -> 
    S1F 0 -> 
    S20 1 -> PIDs supported [21 - 40]

    S21 0 -> 
    S22 0 -> 
    S23 1 -> Fuel Rail Gauge Pressure (diesel, or gasoline direct injection)
    S24 0 -> 
    S25 0 -> 
    S26 0 -> 
    S27 0 -> 
    S28 0 -> 
    S29 0 -> 
    S2A 0 -> 
    S2B 0 -> 
    S2C 0 -> 
    S2D 0 -> 
    S2E 0 -> 
    S2F 0 -> 
    S30 0 -> 
    S31 0 -> 
    S32 0 -> 
    S33 1 -> Absolute Barometric Pressure
    S34 0 -> 
    S35 0 -> 
    S36 0 -> 
    S37 0 -> 
    S38 0 -> 
    S39 0 -> 
    S3A 0 -> 
    S3B 0 -> 
    S3C 0 -> 
    S3D 0 -> 
    S3E 0 -> 
    S3F 0 -> 
    S40 1 -> PIDs supported [41 - 60]

    S41 0 ->
    S42 1 -> Control module voltage
    S43 0 ->
    S44 0 ->
    S45 0 ->
    S46 0 ->
    S47 0 ->
    S48 0 ->
    S49 0 ->
    S4A 0 ->
    S4B 0 ->
    S4C 1 -> Commanded throttle actuator
    S4D 0 ->
    S4E 0 ->
    S4F 0 ->
    S50 0 ->
    S51 0 ->
    S52 0 ->
    S53 0 ->
    S54 0 ->
    S55 0 ->
    S56 0 ->
    S57 0 ->
    S58 0 ->
    S59 0 ->
    S5A 0 ->
    S5B 0 ->
    S5C 0 ->
    S5D 0 ->
    S5E 0 ->
    S5F 0 ->
    S60 0 ->

    John

  14. Looks like our messages crossed Mark, I was responding to your previous one.

    Now for your last message...

    Yes, PiCan2 is SocketCan compatible... seems to work well, once I'd found the one I'd squirrelled away from 2017!. They also do variants with GPS and accelerometer built in, and one that has two CAN interfaces that can be used as a bridge. Let me know if you get to try one as there were a couple of twists to the driver setup for the latest 4.x kernels.

    i should probably do a blog post on its setup, but I was hoping we'd crack the code before I did that :-)

  15. That would certainly be worth a try Mark.

    Can you put up the converted candump formatted file somewhere?

    How did you convert it? Have you got some custom code in Wireshark or have you written a libpcap based converter? I was thinking of just parsing an exported CSV file from Wireshark, but that's not very elegant :-)

    John

  16. For anyone interested, here are two .pcap files...

    The first is the pcap that generated the packet listing in post #64 above:

    https://www.dropbox.com/s/29vkmdltab3ytm3/cano-003-ig2_0s-easimap_1000p.pcap?dl=0

    The second pcap is a simple capture of what was on the CAN bus with just Easimap looking for an ECU to monitor:

    https://www.dropbox.com/s/07i02ojv9lsum2z/cano-004-only-easimap.pcap?dl=0

    Knock yourself out! :-)

    (I'm currently trying to figure out if there's a mapping between what's in the can bus data and what's in the Easimap EC2 file. I'm sure there must be a correlation between the can bus data and the page/address config from the EC2. There are some correlations but I haven't got the confidence yet that I've figured it out.)

    And Mark, I also think there's a good chance that replaying the 0x(03,04...) packet into the canbus may just wake up the gateway that's hiding the second CAN ID. But Easimap is a little chatty around that time so it might take a few of those codes around pkt 528 in that pcap. 

    One of my next experiments is to see what Easimap does if it's running but the car is off, then I turn the car on. I'm wondering if Easimap turns the 0x(03,04,00,0d,cf,00,00,e2) into  0x(03,04,00,0d,ef,fb,ff,f7) or is the first data set enough to wake things up.

    I'm definitely still poking around in the dark, but at least we now have a torch!

    John

  17. Hi James, that should be possible. I may need to wait for the weather to clear and be able to get the car out of the garage :-)

    Do you want the CAN data in any particular format? I've only used tshark (Wireshark) to capture packets so far, and the associated .pcap can be a little difficult to work with - though libpcap programming isn't too bad its not easy to dump pcap's into something like Excel.

    Can you tell me what you're going to do with the data and then hopefully I can make sure it works as best as I can make it for you.

  18. Ok, so hopefully I can move this on a small amount...

    I've now got both Easimap running and a CANBus sniffer. The setup is:

    • MacBookPro running Easimap through Parallels,Windows 10 VM 
    • SBD USB to CANBus interface connected to Mac and the USB routed through to the Windows VM
    • Raspberry Pi 4 with a PiCAN2 HAT
    • OBD-II Y-cable plugged into Caterham, MacBookPro (Easimap) and Pi (PiCAN2 running tshark)
    • Ignition set to postion 2 but engine not running (I'll try some running tests when I've (we've) firgured out some more of what's going on

    Here's a picture of the setup:

    IMG_1895.jpeg.f0323e845955f89d02cded2a24aa5bd0.jpeg

    I've tried a few captures of what's going on when Easimap is running with the following findings:

    • Until easimap is running the car outputs CAN packets as per Marks output on page 3 of this thread (all the packets are coming from a device with an ID of 0x0cbb001)
    • Once Easimap is started there are two new devices that start talking on the bus
      • 0xcbe1101 - seems to be the SBD USB to CANBus interface
      • 0xcbe0111 - seems to be another device in the car, probably where Easimap is getting its data from

    It seems that Easimap is sending a packet with 0x(03,04,00,0d,ef,fb,ff,f7) which starts the 0xcbe0111 device sending.

    I also tried turning the car off to see what Easimap would do then. It then starts sending packets out at about 1s intervals with the values 0x(03,04,00,0d,cf,00,00,e2). That's what makes me think that 0xcbe1101 is the SBD interface and that it sends a 03,04... packet to get the car to output more info.

    My suspicion is that the 03,04 packet is opening a CAN gateway in the car. 

    I now have a lot more data, but still no idea what it means.

    Here's a chunk of data from Wireshark at around the time that Easimap starts to talk to the car, the initial Easimap packet seems to be at packet 528 (left column):

    No.    Time                 Protocol    Length    Info
    522    5.217999920    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    523    5.227903970    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    524    5.237803910    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 cf d6 00 00
    525    5.248304747    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    526    5.257841952    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    527    5.267871945    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    528    5.269606548    CAN    32    XTD: 0x0cbe1101   03 04 00 0d ef fb ff f7
    529    5.270596810    CAN    32    XTD: 0x0cbe0111   10 0d e4 00 0d 23 39 41
    530    5.270927046    CAN    32    XTD: 0x0cbe0111   21 34 62 65 35 33 30 00
    531    5.277878771    CAN    32    XTD: 0x0cbb0001   ff 49 00 00 00 00 00 00
    532    5.288061077    CAN    32    XTD: 0x0cbb0001   ff 95 00 00 00 00 00 00
    533    5.297965424    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    534    5.308121693    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    535    5.318314165    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 cf d6 00 00
    536    5.328443119    CAN    32    XTD: 0x0cbe1101   03 04 00 5e ef fb ff f7
    537    5.328729670    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    538    5.329432159    CAN    32    XTD: 0x0cbe0111   07 e4 00 5e 2b 07 01 00
    539    5.337934713    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    540    5.347971169    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    541    5.357984570    CAN    32    XTD: 0x0cbb0001   ff 49 00 00 00 00 00 00
    542    5.368106561    CAN    32    XTD: 0x0cbb0001   ff 95 00 00 00 00 00 00
    543    5.378248386    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    544    5.388638336    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    545    5.398827049    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 9f d6 00 00
    546    5.408066758    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    547    5.418108103    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    548    5.428370518    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    549    5.438262384    CAN    32    XTD: 0x0cbb0001   ff 49 00 00 00 00 00 00
    550    5.448232693    CAN    32    XTD: 0x0cbb0001   ff 95 00 00 00 00 00 00
    551    5.459009322    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    552    5.468146959    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    553    5.478194340    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 ef d6 00 00
    554    5.488435460    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    555    5.498216679    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    556    5.508246450    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    557    5.518649382    CAN    32    XTD: 0x0cbb0001   ff 49 00 00 00 00 00 00
    558    5.528866409    CAN    32    XTD: 0x0cbb0001   ff 95 00 00 00 00 00 00
    559    5.538409909    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    560    5.548303645    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    561    5.558352749    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 bf d6 00 00
    562    5.568327299    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    563    5.578379125    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    564    5.588759816    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    565    5.599091804    CAN    32    XTD: 0x0cbb0001   ff 49 00 00 00 00 00 00
    566    5.608444419    CAN    32    XTD: 0x0cbb0001   ff 95 00 00 00 00 00 00
    567    5.618418746    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    568    5.628551367    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    569    5.638437603    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 8f d6 00 00
    570    5.648491596    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    571    5.658657346    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    572    5.669189776    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    573    5.678610186    CAN    32    XTD: 0x0cbb0001   ff 49 00 00 00 00 00 00
    574    5.688548625    CAN    32    XTD: 0x0cbb0001   ff 95 00 00 00 00 00 00
    575    5.698673153    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    576    5.708593426    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    577    5.718837841    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 ef d6 00 00
    578    5.729158163    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    579    5.738714219    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    580    5.748656584    CAN    32    XTD: 0x0cbb0001   ff 00 00 00 00 00 00 00
    581    5.758626393    CAN    32    XTD: 0x0cbb0001   ff 49 00 00 00 00 00 00
    582    5.768961752    CAN    32    XTD: 0x0cbb0001   ff 95 00 00 00 00 00 00
    583    5.776471191    CAN    32    XTD: 0x0cbe1101   10 0a 01 00 00 00 00 12
    584    5.777320493    CAN    32    XTD: 0x0cbe1101   21 66 67 a8 a9 00 00 12
    585    5.778524474    CAN    32    XTD: 0x0cbe0111   05 81 aa aa 16 00 12 66
    586    5.778809858    CAN    32    XTD: 0x0cbb0001   04 95 ff 28 00 00 00 00
    587    5.787125934    CAN    32    XTD: 0x0cbe1101   10 09 01 00 00 00 00 1a
    588    5.787834886    CAN    32    XTD: 0x0cbe1101   21 52 5c 5d 00 00 00 1a
    589    5.788834463    CAN    32    XTD: 0x0cbe0111   04 81 84 00 00 00 1a 52
    590    5.789118458    CAN    32    XTD: 0x0cbb0001   03 27 00 1d 00 1d 00 00
    591    5.799340004    CAN    32    XTD: 0x0cbb0001   02 aa aa 00 bf d6 00 00
    592    5.800358840    CAN    32    XTD: 0x0cbe1101   10 0a 01 00 00 00 00 e2
    593    5.801094588    CAN    32    XTD: 0x0cbe1101   21 cc cd ce cf 00 00 e2
    594    5.802136776    CAN    32    XTD: 0x0cbe0111   05 81 ff ff ff 07 e2 cc
    595    5.808806413    CAN    32    XTD: 0x0cbb0001   01 52 00 00 39 00 95 49
    596    5.814872560    CAN    32    XTD: 0x0cbe1101   10 23 01 00 00 00 00 f8
    597    5.815639382    CAN    32    XTD: 0x0cbe1101   21 30 31 36 37 44 45 4c
    598    5.816393407    CAN    32    XTD: 0x0cbe1101   22 4d 4e 4f 50 51 5a 5b
    599    5.817143414    CAN    32    XTD: 0x0cbe1101   23 5c 5d 64 6a 6b 7c 7d
    600    5.817903458    CAN    32    XTD: 0x0cbe1101   24 9e 9f a0 a1 d8 d9 da

     

  19. All your screen shots have shown up for me. I've been pondering them so haven't commented.

    The last one you show makes some sense now. You've got the same 29 bit ID that Mark was reporting but you've got additional devices on the bus. Makes a lot more sense now. Not sure why Mark wasn't seeing the same but maybe he didn't have the car running or something.

  20. Thanks Mark. FWIW, I would have thought a Y-cable would be fine... it's not a particularly fast bus and I would have thought the resistive pull-up and active pull-down mechanism should play fine with the Korlan sniffing while the SBD/Easimap is doing its thing. Would be cool to find out what magic Easimap does to turn on all the goodies it can record. I haven't seen anyone else post the exact mechanism yet, but I may have missed it.

    Where did you get the Korlan from... the US link you provided? or was there a UK/EU site?

    John

×
×
  • Create New...