Hey this is an old thread, but I have done exactly the thing you are asking... in fact I found this post while searching for the treadmill controller and wanted to leave some info for the next person:
The comms interface for the controller isn't straight PWM, it uses RS-485. Here is a link to my writeup: https://elliotmade.com/2020/06/26/treadmill-controller-reverse-engineering/
I didn't completely reverse the protocol, but I figured out enough to run it. I never found any official documentation (not surprising), but also did not expect to. I left an arduino sketch there as well that can start/stop and control the speed. Couple other notes:
- The controller gets mad without the encoder plugged in
- If you don't send it a packet within a few seconds of booting, it also gets mad
- It also requires continuous communication or it will stop (for safety). When stopped or at a steady state, you should continually send the same packet
- The speed commands have to be ramped up. You can't go from 0-4000 in one step, rather you have to send some intermediate speeds as it accelerates (safety?)
- Don't have to ramp down, just send a slower speed and it will coast until it reaches it
- I'm an amateur at such things, so what I did is probably super dangerous... so watch out! (mine is on a belt grinder now, dangerous by design)
Cheers
See https://elliotmade.com/2020/06/26/treadmill-controller-reverse-engineering/
Speed to Byte Message:
MPH | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Measured RPM |
---|---|---|---|---|---|---|---|---|
0.0 | 0 | 255 | 241 | 2 | 0 | 0 | 221 | 0 |
0.5 | 0 00 | 255 FF | 241 F1 | 2 02 | 0 00 | 161 A1 | 16 10 | |
0.6 | 0 | 255 | 241 | 2 | 0 | 195 | 201 | |
0.7 | 0 | 255 | 241 | 2 | 0 | 230 | 186 | |
0.8 | 0 | 255 | 241 | 2 | 1 | 8 | 144 | |
0.9 | 0 | 255 FF | 241 F1 | 2 02 | 1 01 | 42 2A | 116 74 | |
1.0 | 0 | 255 | 241 | 2 | 1 | 76 | 105 | 332 |
1.1 | 0 | 255 | 241 | 2 | 1 | 111 | 188 | |
1.2 | 0 | 255 | 241 | 2 | 1 | 145 | 33 | |
1.3 | 0 | 255 | 241 | 2 | 1 | 179 | 197 | |
1.4 | 0 | 255 | 241 | 2 | 1 | 213 | 216 | |
1.5 | 0 | 255 | 241 | 2 | 1 | 248 | 18 | |
1.6 | 0 | 255 | 241 | 2 | 2 | 26 | 156 | |
1.7 | 0 | 255 | 241 | 2 | 2 | 60 | 188 | |
1.8 | 0 | 255 | 241 | 2 | 2 | 94 | 101 | |
1.9 | 0 | 255 | 241 | 2 | 2 | 129 | 79 | |
2.0 | 0 | 255 | 241 | 2 | 2 | 163 | 171 | 670 |
2.1 | 0 | 255 | 241 | 2 | 2 | 197 | 182 | |
2.2 | 0 | 255 | 241 | 2 | 2 | 231 | 82 | |
2.3 | 0 | 255 | 241 | 2 | 3 | 10 | 43 | |
2.4 | 0 | 255 | 241 | 2 | 3 | 44 | 11 | |
2.5 | 0 | 255 | 241 | 2 | 3 | 78 | 210 | |
2.6 | 0 | 255 | 241 | 2 | 3 | 112 | 8 | |
2.7 | 0 | 255 | 241 | 2 | 3 | 147 | 154 | |
2.8 | 0 | 255 | 241 | 2 | 3 | 181 | 186 | |
2.9 | 0 | 255 | 241 | 2 | 3 | 215 | 99 | |
3.0 | 0 | 255 | 241 | 2 | 3 | 249 | 250 | 1016 |
3.1 | 0 | 255 | 241 | 2 | 4 | 28 | 96 | |
3.2 | 0 | 255 | 241 | 2 | 4 | 62 | 132 | |
3.3 | 0 | 255 | 241 | 2 | 4 | 96 | 229 | |
3.4 | 0 | 255 | 241 | 2 | 4 | 130 | 70 | |
3.5 | 0 | 255 | 241 | 2 | 4 | 165 | 87 | |
3.6 | 0 | 255 | 241 | 2 | 4 | 199 | 142 | |
3.7 | 0 | 255 | 241 | 2 | 4 | 233 | 23 | |
3.8 | 0 | 255 | 241 | 2 | 5 | 11 | 64 | |
3.9 | 0 | 255 | 241 | 2 | 5 | 46 | 51 | |
4.0 | 0 | 255 | 241 | 2 | 5 | 80 | 212 | 1358 |
4.1 | 0 | 255 | 241 | 2 | 5 | 114 | 48 | |
4.2 | 0 | 255 | 241 | 2 | 5 | 148 | 87 | |
4.3 | 0 | 255 | 241 | 2 | 5 | 183 | 130 | |
4.4 | 0 | 255 | 241 | 2 | 5 | 217 | 38 | |
4.5 | 0 | 255 | 241 | 2 | 5 | 251 | 194 | |
4.6 | 0 | 255 | 241 | 2 | 6 | 29 | 136 | |
4.7 | 0 | 255 | 241 | 2 | 6 | 64 | 186 | |
4.8 | 0 | 255 | 241 | 2 | 6 | 98 | 94 | |
4.9 | 0 | 255 | 241 | 2 | 6 | 132 | 57 | |
5.0 | 0 | 255 | 241 | 2 | 6 | 166 | 221 | 1700 |
5.1 | 0 | 255 | 241 | 2 | 6 | 200 | 121 | |
5.2 | 0 | 255 | 241 | 2 | 6 | 235 | 172 | |
5.3 | 0 | 255 | 241 | 2 | 7 | 13 | 63 | |
5.4 | 0 | 255 | 241 | 2 | 7 | 47 | 219 | |
5.5 | 0 | 255 | 241 | 2 | 7 | 81 | 60 | |
5.6 | 0 | 255 | 241 | 2 | 7 | 116 | 79 | |
5.7 | 0 | 255 | 241 | 2 | 7 | 150 | 236 | |
5.8 | 0 | 255 | 241 | 2 | 7 | 184 | 117 | |
5.9 | 0 | 255 | 241 | 2 | 7 | 218 | 172 | |
6.0 | 0 | 255 | 241 | 2 | 7 | 253 | 189 | 2042 |
6.1 | 0 | 255 | 241 | 2 | 8 | 31 | 135 | |
6.2 | 0 | 255 | 241 | 2 | 8 | 65 | 230 | |
6.3 | 0 | 255 | 241 | 2 | 8 | 99 | 2 | |
6.4 | 0 | 255 | 241 | 2 | 8 | 134 | 54 | |
6.5 | 0 | 255 | 241 | 2 | 8 | 164 | 175 | |
6.6 | 0 | 255 | 241 | 2 | 8 | 202 | 118 | |
6.7 | 0 | 255 | 241 | 2 | 8 | 236 | 86 | |
6.8 | 0 | 255 | 241 | 2 | 9 | 15 | 112 | |
6.9 | 0 | 255 | 241 | 2 | 9 | 49 | 234 | |
7.0 | 0 | 255 | 241 | 2 | 9 | 83 | 51 | 2385 |
7.1 | 0 | 255 | 241 | 2 | 9 | 117 | 19 | |
7.2 | 0 | 255 | 241 | 2 | 9 | 152 | 158 | |
7.3 | 0 | 255 | 241 | 2 | 9 | 186 | 122 | |
7.4 | 0 | 255 | 241 | 2 | 9 | 220 | 103 | |
7.5 | 0 | 255 | 241 | 2 | 9 | 254 | 131 | |
7.6 | 0 | 255 | 241 | 2 | 10 | 33 | 132 | |
7.7 | 0 | 255 | 241 | 2 | 10 | 67 | 93 | |
7.8 | 0 | 255 | 241 | 2 | 10 | 101 | 125 | |
7.9 | 0 | 255 | 241 | 2 | 10 | 135 | 222 | |
8.0 | 0 | 255 | 241 | 2 | 10 | 170 | 20 | 2725 |
8.1 | 0 | 255 | 241 | 2 | 10 | 204 | 9 | |
8.2 | 0 | 255 | 241 | 2 | 10 | 238 | 237 | |
8.3 | 0 | 255 | 241 | 2 | 11 | 16 | 132 | |
8.4 | 0 | 255 | 241 | 2 | 11 | 51 | 81 | |
8.5 | 0 | 255 | 241 | 2 | 11 | 85 | 76 | |
8.6 | 0 | 255 | 241 | 2 | 11 | 119 | 168 | |
8.7 | 0 | 255 | 241 | 2 | 11 | 153 | 118 | |
8.8 | 0 | 255 | 241 | 2 | 11 | 188 | 5 | |
8.9 | 0 | 255 | 241 | 2 | 11 | 222 | 220 | |
9.0 | 0 | 255 | 241 | 2 | 12 | 0 | 105 | 3070 |
9.1 | 0 | 255 | 241 | 2 | 12 | 34 | 141 | |
9.2 | 0 | 255 | 241 | 2 | 12 | 101 | 161 | |
9.3 | 0 | 255 | 241 | 2 | 12 | 103 | 69 | |
9.4 | 0 | 255 | 241 | 2 | 12 | 137 | 139 | |
9.5 | 0 | 255 | 241 | 2 | 12 | 171 | 127 | |
9.6 | 0 | 255 | 241 | 2 | 12 | 206 | 49 | |
9.7 | 0 | 255 | 241 | 2 | 12 | 240 | 235 | |
9.8 | 0 | 255 | 241 | 2 | 13 | 18 | 188 | |
9.9 | 0 | 255 | 241 | 2 | 13 | 52 | 156 | |
10.0 | 0 | 255 | 241 | 2 | 13 | 87 | 116 | 3414 |
10.1 | 0 | 255 | 241 | 2 | 13 | 121 | 237 | |
10.2 | 0 | 255 | 241 | 2 | 13 | 155 | 78 | |
10.3 | 0 | 255 | 241 | 2 | 13 | 173 | 110 | |
10.4 | 0 | 255 | 241 | 2 | 13 | 224 | 92 | |
10.5 | 0 | 255 | 241 | 2 | 14 | 2 | 210 | |
10.6 | 0 | 255 | 241 | 2 | 14 | 36 | 242 | |
10.7 | 0 | 255 | 241 | 2 | 14 | 70 | 43 | |
10.8 | 0 | 255 | 241 | 2 | 14 | 105 | 131 | |
10.9 | 0 | 255 | 241 | 2 | 14 | 139 | 32 | |
11.0 | 0 | 255 | 241 | 2 | 14 | 173 | 0 | 3752 |
11.1 | 0 | 255 | 241 | 2 | 14 | 207 | 217 | |
11.2 | 0 | 255 | 241 | 2 | 14 | 242 | 80 | |
11.3 | 0 | 255 | 241 | 2 | 15 | 20 | 195 | |
11.4 | 0 | 255 | 241 | 2 | 15 | 54 | 39 | |
11.5 | 0 | 255 | 241 | 2 | 15 | 88 | 131 | |
11.6 | 0 | 255 | 241 | 2 | 15 | 123 | 86 | |
11.7 | 0 | 255 | 241 | 2 | 15 | 157 | 49 | |
11.8 | 0 | 255 | 241 | 2 | 15 | 191 | 213 | |
11.9 | 0 | 255 | 241 | 2 | 15 | 225 | 180 | |
12.0 | 0 | 255 | 241 | 2 | 16 | 4 | 119 | 3996 |
Arduino Code
/* * Encoder on A2, A3 * Button on A1 * MAX 485: 5v to DE, D8 to DI. A and B to A and B of the treadmill controller * TM1637 display clock on 2, data on 3 * Short out the middle "safety key" pins * Take power from one of the treadmill controller pins (which one?) * Treadmill header has 8 pins (left to right, latch at the bottom): * 1 - 12v * 2 - 12v * 3 - A or B? * 4 - Safety switch * 5 - Safety switch * 6 - A or B? * 7 - Ground * 8 - Ground */ #include <AltSoftSerial.h> //https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html #include <SimpleTimer.h> //https://github.com/jfturcot/SimpleTimer #include <RotaryEncoder.h> //http://www.mathertel.de/Arduino/RotaryEncoderLibrary.aspx //https://github.com/mathertel/RotaryEncoder #include "OneButton.h" //https://github.com/mathertel/OneButton #include <TM1637Display.h> //https://github.com/avishorp/TM1637 #include <EEPROMex.h> //https://github.com/thijse/Arduino-EEPROMEx const int encoderButton = A1; const int encoderA = A2; const int encoderB = A3; const int dispClock = 2; //D2 const int dispData = 3; //D3 AltSoftSerial ss; SimpleTimer timer; OneButton encoderButt(encoderButton, true); RotaryEncoder encoder(A2, A3); TM1637Display display1(dispClock, dispData); bool halt = true; int setSpeed = 0; int curSpeed = 0; //ramp this up until it reaches the set speed int savedSpeed = 0; const int speedCount = 123; const byte b1[] = {0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16}; const byte b2[] = {0,161,195,230,8,42,76,111,145,179,213,248,26,60,94,129,163,197,231,10,44,78,112,147,181,215,249,28,62,96,130,165,199,233,11,46,80,114,148,183,217,251,29,64,98,132,166,200,235,13,47,81,116,150,184,218,253,31,65,99,134,164,202,236,15,49,83,117,152,186,220,254,33,67,101,135,170,204,238,16,51,85,119,153,188,222,0,34,101,103,137,171,206,240,18,52,87,121,155,173,224,2,36,70,105,139,173,207,242,20,54,88,123,157,191,225,4,20,54,88,123,157,191,225}; const byte b3[] = {221,16,201,186,144,116,105,188,33,197,216,18,156,188,101,79,171,182,82,43,11,210,8,154,186,99,250,96,132,229,70,87,142,23,64,51,212,48,87,130,38,194,136,186,94,57,221,121,172,63,219,60,79,236,117,172,189,135,230,2,54,175,118,86,112,234,51,19,158,122,103,131,132,93,125,222,20,9,237,132,81,76,168,118,5,220,105,141,161,69,139,127,49,235,188,156,116,237,78,110,92,210,242,43,131,32,0,217,80,195,39,131,86,49,213,180,119,195,39,131,86,49,213,180}; const int sfm[] = {0,262,314,366,418,471,523,575,628,680,732,785,837,889,941,994,1046,1098,1151,1203,1255,1308,1360,1412,1464,1517,1569,1621,1674,1726,1778,1831,1883,1935,1987,2040,2092,2144,2197,2249,2301,2355,2406,2458,2510,2563,2615,2667,2721,2772,2824,2878,2929,2981,3033,3087,3138,3190,3244,3295,3347,3401,3453,3504,3556,3610,3661,3713,3767,3818,3870,3924,3976,4027,4079,4133,4184,4236,4290,4342,4393,4447,4499,4550,4602,4656,4708,4759,4813,4865,4916,4970,5022,5074,5125,5179,5231,5282,5336,5388,5440,5493,5545,5597,5648,5702,5754,5805,5859,5911,5963,6016,6068,6120,6171,6225,6277,6329,6382,6434,6486,6539,6591,6643}; //eeprom memory locations const int memAddress = 20; const int memBase = 350; void setup() { //interrupts for encoder PCICR |= (1 << PCIE1); // This enables Pin Change Interrupt 1 that covers the Analog input pins or Port C. PCMSK1 |= (1 << PCINT10) | (1 << PCINT11); // This enables the interrupt for pin 2 and 3 of Port C. //Serial.begin(9600); ss.begin(9600); timer.setInterval(100, sendSpeedPacket); encoderButt.attachClick(startStop); // Set Up EEPROM EEPROM.setMemPool(memBase, EEPROMSizeNano); //Load the stored speed value setSpeed = EEPROM.readInt(memAddress); display1.setBrightness(2); updateDisplay(); } void loop() { // put your main code here, to run repeatedly: timer.run(); encoderButt.tick(); readEncoder(); updateDisplay(); } void sendSpeedPacket() { if(halt == true) { //send the stop packet ss.write((byte)0); ss.write((byte)255); ss.write((byte)241); ss.write((byte)2); ss.write((byte)0); ss.write((byte)0); ss.write((byte)221); } else { //send the current speed packet ss.write((byte)0); ss.write((byte)255); ss.write((byte)241); ss.write((byte)2); ss.write((byte)b1[curSpeed]); ss.write((byte)b2[curSpeed]); ss.write((byte)b3[curSpeed]); } if (halt == true){ curSpeed = 0; } if (curSpeed < setSpeed && halt == false) { //this ramps the sent speed up until it hits the set speed curSpeed++; } if (curSpeed > setSpeed && halt == false) { //this immediately reduces the sent speed to the set speed curSpeed = setSpeed; } //Serial.print(halt); //Serial.print(" "); //Serial.println(curSpeed); } void startStop () { halt = !halt; EEPROM.writeInt(memAddress, setSpeed); //save the speed every time the button is pushed... so that on next power up it is not zero } void readEncoder() { static int pos = 0; int newPos = encoder.getPosition(); if (pos > newPos) { setSpeed = setSpeed - 1; } else if (pos < newPos) { setSpeed = setSpeed + 1; } pos = newPos; //--keep setSpeed = constrain(setSpeed, 0, speedCount); } ISR(PCINT1_vect) { encoder.tick(); // just call tick() to check the state. } void updateDisplay() { display1.showNumberDecEx(sfm[setSpeed], 0, true); //Set time should always show on display 1 // Serial.print("Minutes: "); // Serial.print(seconds / 60); // Serial.print("Seconds: "); // Serial.println(seconds & 60); }
Example ESP8266 Code
https://www.mischianti.org/2020/05/11/interface-arduino-esp8266-esp32-rs-485/
Sample Code for ESP8266 Wemos:
#include "Arduino.h" #include <SoftwareSerial.h> #include <Ticker.h> #define SER_RX_PIN D2 // Serial Receive pin #define SER_TX_PIN D3 // Serial Transmit pin //RS485 control #define SER_CONTROL_PIN D0 // Transmission set pin #define SER_TX_VALUE HIGH #define SER_RX_VALUE LOW SoftwareSerial serialPort(SER_RX_PIN, SER_TX_PIN); Ticker ticker; int byteSend; String dataReceived; bool isDataReceived = false; bool halt = true; int setSpeed = 0; int curSpeed = 0; //ramp this up until it reaches the set speed //int savedSpeed = 0; //const int speedCount = 123; const byte b1[] = {0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16}; const byte b2[] = {0,161,195,230,8,42,76,111,145,179,213,248,26,60,94,129,163,197,231,10,44,78,112,147,181,215,249,28,62,96,130,165,199,233,11,46,80,114,148,183,217,251,29,64,98,132,166,200,235,13,47,81,116,150,184,218,253,31,65,99,134,164,202,236,15,49,83,117,152,186,220,254,33,67,101,135,170,204,238,16,51,85,119,153,188,222,0,34,101,103,137,171,206,240,18,52,87,121,155,173,224,2,36,70,105,139,173,207,242,20,54,88,123,157,191,225,4,20,54,88,123,157,191,225}; const byte b3[] = {221,16,201,186,144,116,105,188,33,197,216,18,156,188,101,79,171,182,82,43,11,210,8,154,186,99,250,96,132,229,70,87,142,23,64,51,212,48,87,130,38,194,136,186,94,57,221,121,172,63,219,60,79,236,117,172,189,135,230,2,54,175,118,86,112,234,51,19,158,122,103,131,132,93,125,222,20,9,237,132,81,76,168,118,5,220,105,141,161,69,139,127,49,235,188,156,116,237,78,110,92,210,242,43,131,32,0,217,80,195,39,131,86,49,213,180,119,195,39,131,86,49,213,180}; void setup() { Serial.begin(115200); //initialize RS485 pinMode(SER_CONTROL_PIN, OUTPUT); digitalWrite(SER_CONTROL_PIN, SER_RX_VALUE); serialPort.begin(9600); ticker.attach_ms(15,sendSpeedPacket); } void loop() { // setSpeed = 0; // delay(30000); // setSpeed = 1; // delay(30000); // setSpeed = 10; // delay(30000); // // setSpeed = 1; delay(30000); setSpeed = 5; // delay(30000); // setSpeed = 12; delay(30000); halt=true; } void processSerial(){ processReceived(); sendSpeedPacket(); } void processReceived(){ digitalWrite(SER_CONTROL_PIN, SER_RX_VALUE);// Init receive if (serialPort.available()){ dataReceived = serialPort.readString(); Serial.print("Data received "); Serial.println(dataReceived); } } void sendSpeedPacket() { if(halt == true) { //send the stop packet serialPort.write((byte)0); serialPort.write((byte)255); serialPort.write((byte)241); serialPort.write((byte)2); serialPort.write((byte)0); serialPort.write((byte)0); serialPort.write((byte)221); } else { //send the current speed packet serialPort.write((byte)0); serialPort.write((byte)255); serialPort.write((byte)241); serialPort.write((byte)2); serialPort.write((byte)b1[curSpeed]); serialPort.write((byte)b2[curSpeed]); serialPort.write((byte)b3[curSpeed]); } if (halt == true){ curSpeed = 0; } if (curSpeed < setSpeed && halt == false) { //this ramps the sent speed up until it hits the set speed curSpeed++; } if (curSpeed > setSpeed && halt == false) { //this immediately reduces the sent speed to the set speed curSpeed = setSpeed; } Serial.print(halt); Serial.print(" "); Serial.println(curSpeed); }
$ sort tmp.txt | uniq -c 411 4 +1 4 +2 1 01 1a fe df 00 fd ce 1a ec fe 3a ac fe 1 01 1a fe df 00 fd ce 1a ec fe 5e f4 fd 1 01 1a fe df 00 fd ce 1a ec fe 76 2c fe 2 01 1a fe df 00 fd ce 1a ec fe 7a b4 fc 1 01 1a fe df 00 fd ce 1a ec fe e6 d4 fc 2 01 1a fe df 00 fd f2 1a ec fe fe fa ff 1 01 1a fe df 00 fd f6 1a ec fe fe b6 fe 2 01 1a fe df 00 fd fa 1a ec fe fe a6 fe 4 01 1a fe df 00 fd fe 1a ec fe fe ea ff 19 01 26 f6 ff af 1f 00 fd ce 26 fc 76 fe 1 01 26 f6 ff af 1f 00 fd f6 26 fc aa ff 1 01 26 f6 ff af 1f 00 fd fa 26 fc 82 fe 10 01 26 f6 ff af 1f 00 fd fe 26 fc 9a fe 18 01 3a f6 ff bd be 00 fd ce 3a fc ce ff 5 01 3a f6 ff bd be 00 fd f6 3a fc 12 fe 10 01 3a f6 ff bd be 00 fd fe 3a fc 22 ff 5 01 3a f6 ff ff 45 00 fd f2 3a fc 0a fe 6 01 3a f6 ff ff 45 00 fd fa 3a fc 3a ff 1 01 3a f6 ff ff 45 00 fd fe 3a fc 22 ff 1 01 0d fe df 00 fd ce 1a ec fe 1 01 13 f6 ff af 1f 00 fd ce 26 fc 76 fe 1 01 1a fe df 00 fd ce 1a ec fe 72 35 01 1a fe df 00 fd fe 1a ec fe fe ea ff 15 01 1a fe df 00 fd fe 1a ec fe fe ea ff 4 01 26 f6 ff af 1f 00 fd ce 26 fc 76 fe 5 01 3a f6 ff bd be 00 fd ce 3a fc ce ff 199 01 3a f6 ff ff 45 00 fd fe 3a fc 22 ff 41 01 3a f6 ff ff 45 00 fd fe 3a fc 22 ff 1 01 3a f6 ff ff 45 f4 fe 3a fc 22 ff 1 01 3e ff 1f 00 fd fe 3e fe 7e fe 1 01 be f6 ff 0b c2 00 fd fe be fc a6 fe
Byte Stream