Recently bought a J7-C USB tester to measure charging voltage/current.
It also features Bluetooth interface to connect to Android apk or PC app for data logging.
But I'm a little squirmish about side-loading application from a dubious mediafile folder.
Luckily, I've found some discussion regarding the Bluetooth protocol on Arduino forum USB Digital Tester (BT) Protocol
After a little experiment and reverse engineering, I've found that my device seems to output the data in a slightly different format. Once we open the Bluetooth serial port, it will send a 36-byte packet every 1 second. Example packet received:
ff 55 01 3 00 01 f4 00 0 34 00 0f fa 00 0 8 52 00 09 00 0a 00 20 00 03 2c 18 3c 0c 80 00 00 03 20 00 9e
Comparing the the info from the Arduino forum, it seems the packet format is still mostly similar but slightly offset as below:
| Offset | Data Byte | Multibyte hex | Value | Data Type |
|---|---|---|---|---|
| 0 | ff | |||
| 1 | 55 | |||
| 2 | 01 | |||
| 3 | 03 | |||
| 4 | 00 | 0001f4 | 5.00 | voltage |
| 5 | 01 | |||
| 6 | f4 | |||
| 7 | 00 | 000034 | 0.52 | current |
| 8 | 00 | |||
| 9 | 34 | |||
| 10 | 00 | 000ffa | 4090 | mAh |
| 11 | 0f | |||
| 12 | fa | |||
| 13 | 00 | 00000852 | 21.30 | energy, Wh |
| 14 | 00 | |||
| 15 | 08 | |||
| 16 | 52 | |||
| 17 | 00 | 0009 | 0.09 | D+ voltage |
| 18 | 09 | |||
| 19 | 00 | 000a | 0.1 | D- voltage |
| 20 | 0a | |||
| 21 | 00 | 0020 | 32 | CPU temperature (celcius) |
| 22 | 20 | |||
| 23 | 00 | 00 | 03:44:44 | duration day:hh:mm:ss |
| 24 | 03 | 03 | ||
| 25 | 2c | 2c | ||
| 26 | 18 | 18 | ||
| 27 | 3c | |||
| 28 | 0c | |||
| 29 | 80 | |||
| 30 | 00 | |||
| 31 | 00 | |||
| 32 | 03 | |||
| 33 | 20 | |||
| 34 | 00 | |||
| 35 | 9e |
It does not seems to provide power value but we can easily calculate power P = V x I
So, I've written a simple python script to read the data and save it as CSV file so that it can be processed by other apps such as Excel or LibreOffice.
Here's the steps:
- Connect to the bluetooth serial port.
- Run
python3 j7-c_usb_tester.py --csv out.csv <bluetooth_port>- for Linux:
/dev/rfcomm0for legacy Linux bluetooth rfcomm device- bluetooth MAC address for example:
D6:E6:53:AA:BB:CC
- COM port on Windows.
- for Linux:
- Press Ctrl-C to exit after you are done logging the data.
I've recorded the measurements when charging my OnePlus phone with the 65W SuperVOOC charger in supervooc_2022-09-03_131744.csv.
Using LibreOffice to open the CSV file, I've plotted the charging curve as below:
With --web=<port>option, it will create a nicer web dashboard interface, but will require python bottle framework.
For example:
python3 j7-c_usb_tester.py --relative --web=8080 <bluetooth_port>
Note: On Linux with Bluetooth MAC addresses, UV's managed Python doesn't support socket.AF_BLUETOOTH. Use your system's Python installation instead.
$ uv sync --no-managed-python
Using CPython 3.12.3 interpreter at: /usr/bin/python3
Removed virtual environment at: .venv
Creating virtual environment at: .venv
Resolved 3 packages in 7ms
Prepared 2 packages in 158ms
Installed 2 packages in 5ms
+ bottle==0.13.4
+ pyserial==3.5
$ uv run ./j7-c_usb_tester.py --relative --web=8080 D6:E6:53:AA:BB:CC
Web dashboard: http://localhost:8888/


