Fardriver BLE Communication

not.py

100 mW
Joined
Feb 9, 2025
Messages
42
Location
United Kingdom, England
Welcome, I'm currently in the works of reversing Fardriver's BLE communication to make my own custom dashboard app.
Thought I should document it in case anyone in the future decides to try.

I'm a total newbie to all kinds of serial & bluetooth communication but I've been doing python for multiple years now.
Feel free to correct me on anything I say.

Also check out: Fardriver controller serial protocol reverse engineering if your interested in the serial communication.
Lots of helpful info in there regarding how data is sent as well.



Current findings:
Address 0xEE:
First nibble: Direction switch. 0 for forwards / 8 for reverse.
Second nibble: Mode switch. B for 1 / 3 for 2 / 7 for 3.
Fourth nibble: Breaking. F for break / D for normal.
Next 4 nibbles seem to count up as the wheel spins, maybe for the speedo?
Example: 09 1D 29 32 00 00 00 00 00 00 00 00


Address 0xE2:
Nibbles 12-15: RPM

These are all my findings from tonight, will be back with more soon.
 
Last edited:

Someone managed to connect all the important parameters to the ESP. I checked it and it works :) However, there are often problems with connecting the controller to the ESP32. It doesn't connect immediately, only after a while.
 
i try this, and my reading are all 0, the uuid are the same as in the github, using nrf connect. i'm sure its correct. i wonder whyy :(
I will send you my code that works in serial monitor and on ILI9341 and ESP32 wroom.
I'm still making a new layout using squareline studio but I'm waiting for my esp32 S3 N16R8 to arrive to test it.

 
Last edited:
Heyy goood news.. it workss.. ahahahah oh my.. THANK YOU SO MUCH! woohooo.. time to upgrade to lvgl..

And i wonder if you can sniff the jikong bms too.. i tried and it works. But in other valur its in correct.. i attach some picture my attempt to connect to jk bms.
 

Attachments

  • 20250926_203506.jpg
    20250926_203506.jpg
    1.4 MB · Views: 5
  • 20250926_201059.jpg
    20250926_201059.jpg
    1.7 MB · Views: 5
Are you referring to the handbrake signal? If so, could you share the code for this function? Thanks to gtp chat, I also decoded the reading for DNR gears:

In fardriver data :
C:
int dnrMode = 0; // 0=Neutral, 1=Drive, 2=Reverse

In proces packet :
C:
// ---- DNR detection ----
  uint8_t dnrByte = pData[0];
  uint8_t newDnr = dnrByte & 0x03;  // 0=N,1=D,2=R (bitowo z testów)
  static uint8_t lastDnr = 255;

  if (newDnr != lastDnr) {
    lastDnr = newDnr;
    controllerData.dnrMode = newDnr;

    Serial.print("🕹️ Tryb DNR zmieniony: ");
    switch (newDnr) {
      case 0:
        Serial.println("NEUTRAL");
        break;
      case 1:
        Serial.println("DRIVE");
        break;
      case 2:
        Serial.println("REVERSE");
        break;
      default:
        Serial.println("Nieznany");
        break;
    }
  }
  break;
}
 
Last edited:
Are you referring to the handbrake signal? If so, could you share the code for this function? Thanks to gtp chat, I also decoded the reading for DNR gears:

In fardriver data :
C:
int dnrMode = 0; // 0=Neutral, 1=Drive, 2=Reverse

In proces packet :
C:
// ---- DNR detection ----
  uint8_t dnrByte = pData[0];
  uint8_t newDnr = dnrByte & 0x03;  // 0=N,1=D,2=R (bitowo z testów)
  static uint8_t lastDnr = 255;

  if (newDnr != lastDnr) {
    lastDnr = newDnr;
    controllerData.dnrMode = newDnr;

    Serial.print("🕹️ Tryb DNR zmieniony: ");
    switch (newDnr) {
      case 0:
        Serial.println("NEUTRAL");
        break;
      case 1:
        Serial.println("DRIVE");
        break;
      case 2:
        Serial.println("REVERSE");
        break;
      default:
        Serial.println("Nieznany");
        break;
    }
  }
  break;
}
Wow, thats a new found great. Let me try that. Oh thr motor temp is zero from your code, maybe a wrong byte.

What i mean by brake signal when you pressed the brake the motor wont run.

BRAKE SIGNAL:
Packet: 0xE2 (Address 0)
Byte: 3
Bit: 7

I found this byte for the brake.

Now, for the soc reading i think i beed to connect to bms and read it from there. Already done but some false reading, need to find the right byte.
 
Everything works fine for me :) I wonder if there are any other parameters that would be useful to decode, e.g. throttle voltage, phase current.
 
Back
Top