RC G1 Tactile Glove — Data Protocol & Pairing Reference

Use this page when you’re writing your own reader or integrating the G1 into a custom data pipeline. It covers the binary frame format, the AT command set on the serial channel, every LED state, and the most common failure modes. If you only need to plug in and record, start with the Windows, macOS, or Linux setup pages.

Reference Updated May 2026 Difficulty: Advanced

1. Hardware Architecture

A G1 deployment has five components. Only the first four are required for a single-glove rig; the USB hub is for multi-glove (LH + RH) setups.

  1. Fabric sensor array. 162 piezoresistive sensing points arranged on a 16×16 logical matrix (256 ADC slots, of which 162 are physically wired to sensors; the unwired slots read near zero and can be masked in software).
  2. Data-acquisition module (A-board). ESP32-based Bluetooth MCU with an integrated 300 mAh / 3.7 V battery, USB-C for charge / data / firmware, a hardware tactile button, and a status LED. 50 × 32 × 15.5 mm; 6.6 g board + ~15 g battery.
  3. Bluetooth USB receiver (dongle). 1:1 paired with a single A-board. USB-A, 66.1 × 23.2 × 13 mm. Optional — cable-only operation is fully supported.
  4. USB 3.0-to-Type-C cable (2 m). Serial connection at 921 600 bps default, optional 3 000 000 bps high-speed mode.
  5. USB hub. For multi-glove rigs (e.g. bimanual LH + RH).

Data flow:

  +--------------------+     +--------------------+        +--------+
  |  Fabric sensors    | --> |  A-board ADC       | --+--> | Host   |
  |  (162 / 16x16)     |     |  (ESP32 + IMU)     |   |    |        |
  +--------------------+     +--------------------+   |    +--------+
                                       |              |
                                       | BLE 30 Hz    | USB-C 100 Hz
                                       v              | (921600 / 3M)
                              +--------------------+  |
                              |  BT USB dongle     | -+
                              |  (CH340 endpoint)  |
                              +--------------------+

2. Serial Configuration

The same binary protocol described in §3 works on either the wired or the BT-dongle serial path — you should not need to special-case the transport in your reader.

3. Binary Frame Format

A complete sensor reading is delivered as two packets that together carry 256 pressure values plus 16 bytes of IMU data. Each packet begins with the constant 4-byte sync header AA 55 03 99, followed by a 1-byte sequence number (0x01 or 0x02) and a 1-byte sensor-type ID.

Byte layout for one sensor pair (packet 1 + packet 2)
OffsetLengthFieldDescription
Packet 1 (sequence = 0x01) — 134 bytes total
0–34 BSync headerConstant AA 55 03 99
41 BSequence0x01 = first half
51 BSensor type0x01 LH, 0x02 RH, 0x03 LF, 0x04 RF, 0x05 WB
6–133128 BPressure payload AFirst 128 of 256 raw pressure values, 8-bit unsigned ADC (0–255)
Packet 2 (sequence = 0x02) — 150 bytes total
0–34 BSync headerConstant AA 55 03 99
41 BSequence0x02 = second half
51 BSensor typeSame value as packet 1
6–133128 BPressure payload BLast 128 of 256 raw pressure values
134–14916 BIMU quaternion4 little-endian IEEE-754 floats: w, x, y, z

Sensor-type IDs

IDCodeDevice class
0x01LHLeft Hand
0x02RHRight Hand
0x03LFLeft Foot
0x04RFRight Foot
0x05WBWhole Body

Worked hex capture

Raw bytes off the wire from a live left-hand device sitting on a desk (truncated for readability):

[14:04:29.427]  AA 55 03 99 01 01 00 00 00 00 00 00 00 00 00 00 ...  (128 B payload)
[14:04:29.428]  AA 55 03 99 02 01 00 00 ... 00 62 F3 00 00 00 ...      (144 B payload, last 16 B = IMU quaternion)

Reference parser (Python)

Minimal parser that takes the two raw packets and returns a sensor ID, the 256-cell pressure vector, and the quaternion. Mirror of what the Linux setup guide uses.

import struct, numpy as np

def parse_pair(packet1: bytes, packet2: bytes):
    assert packet1[:4] == packet2[:4] == b"\xAA\x55\x03\x99"
    assert packet1[4] == 0x01 and packet2[4] == 0x02
    sensor_id = packet1[5]                              # same on both halves
    pressure = np.frombuffer(packet1[6:134] + packet2[6:134], dtype=np.uint8)  # 256 pts
    qw, qx, qy, qz = struct.unpack("<ffff", packet2[134:150])
    return sensor_id, pressure, (qw, qx, qy, qz)
Framing tip: on a noisy USB link, scan for the 4-byte sync header rather than trusting fixed offsets. If you receive a sequence-2 packet without a preceding sequence-1, drop it and resync — the IMU quaternion is only meaningful when paired with its matching pressure half.

4. Logical-channel map

The 162 wired sensing points are addressed in a 16×16 grid (256 cells, indexed row-major 1–256). The exact wired-cell list ships in ~/Documents/JQTools/docs/channel-map.csv with the companion app. Use it to mask out the 94 unwired cells when computing per-finger averages.

Sample rate: 100 Hz wired or 30 Hz Bluetooth. Single-point dynamic range: 0–350 N, resolution 0.01 N.

12345678910111213141516
17181920212223242526272829303132
33343536373839404142434445464748
49505152535455565758596061626364
65666768697071727374757677787980
81828384858687888990919293949596
979899100101102103104105106107108109110111112
113114115116117118119120121122123124125126127128
129130131132133134135136137138139140141142143144
145146147148149150151152153154155156157158159160
161162163164165166167168169170171172173174175176
177178179180181182183184185186187188189190191192
193194195196197198199200201202203204205206207208
209210211212213214215216217218219220221222223224
225226227228229230231232233234235236237238239240
241242243244245246247248249250251252253254255256

5. AT Command Set (Bluetooth pairing)

Send these as ASCII strings with a \r\n line ending on the BT dongle’s serial port at 921 600 baud. The dongle responds in ASCII, then switches to binary sensor data once a connection is established.

CommandResponsePurpose
ATOKSanity check the serial link.
AT+SCAN=1OK, then one +SCAN=<i>,<MAC>,<RSSI>,<adv-len>,<name_MAC> line per discovered deviceStart a BLE scan; look for lines containing JQ-LH, JQ-RH, JQ-LF, JQ-RF, or JQ-WB.
AT+CONN=<MAC>OK, then binary sensor frames begin streamingOpen a connection to the discovered MAC. Pairing is persistent across power cycles.
AT+DISCONNOKDrop the current link.
AT+VERfirmware version stringFor support reports.

Worked example

> AT+SCAN=1
< OK
< +SCAN=1, 8277169C745A, -1, 18, Redmi Watch 3 745A
< +SCAN=2, 3C8A1F2E9A36, -1, 23, JQ-RH_3C:8A:1F:2E:9A:36   ← the device we want
< +SCAN=3, 0,88F3079C11B4, -1,9, KeepB4-B4

> AT+CONN=3C8A1F2E9A361
< OK
< (binary sensor frames begin streaming ...)
Identifier note: the JQ-LH / JQ-RH / JQ-LF / JQ-RF / JQ-WB prefixes are literal BLE advertising names baked into the G1 firmware. Match them exactly when filtering scan results — they are how your reader recognizes a G1 device on a noisy BLE channel.

6. LED State Reference

Data-acquisition module — button functions

ActionEffect
Short press while in standbyWake device and run IMU calibration. Red LED on briefly, then blue flashes while advertising.
Short press while operationalTrigger an IMU re-calibration. Keep the module flat and still for ~2 s.
Long pressPower off. Red LED on solid until the device is off.

Data-acquisition module — status LED color

ColorMeaningBattery
Solid BlueBluetooth connected, high battery> 3.3 V
Solid GreenBluetooth connected, medium battery3.1 – 3.3 V
Solid RedBluetooth connected, low battery (charge soon)≤ 3.1 V
Red flashingBluetooth disconnected / advertising
Blue flashingPairing mode / advertising
Solid WhiteCharging via USB-C
LED offStandby (auto-entered after 1 min of no pressure change — press button to wake)

Bluetooth dongle LED

StateMeaning
Red flashingNot connected to any device.
Red + Blue both solidConnected to a paired device.
Red solid onlyCommunication abnormal. Unplug and replug the dongle to recover.

7. Re-pairing (if a glove “lost” its dongle)

  1. Power-cycle the data-acquisition module: long-press until red, then short-press to advertise (blue flashing).
  2. Plug the Bluetooth dongle into your host. Red flashing on the dongle means it’s scanning.
  3. Open the host’s serial port to the dongle at 921 600 baud — use screen, minicom, the SSCOM utility shipped on the USB drive, or the Companion App.
  4. Run AT+SCAN=1. Copy the MAC from the line ending in JQ-LH / JQ-RH / etc.
  5. Run AT+CONN=<that MAC>. OK followed by binary frames means you’re paired. The link is persistent — you don’t have to re-pair after future power-cycles unless you swap modules or dongles.

8. Troubleshooting cheat-sheet

SymptomResolution
Module won’t power onBattery flat. Charge for 10 min via USB-C (solid white LED), then retry the button.
LED red-flashing forever after AT+CONNThe MAC isn’t a G1 device (you copied the wrong line from AT+SCAN=1). Re-scan and look for JQ-LH/RH/LF/RF/WB.
Stream starts and stops every minute1-minute no-pressure standby has kicked in. Bend a finger to keep traffic flowing, or short-press the wake button.
Quaternion = (NaN, NaN, NaN, NaN)IMU lost calibration. Lay the module flat on a still surface and short-press the button to re-calibrate (takes ~2 s).
Pressure values all 255Cable is reversed (TX/RX swapped) on a custom harness, or you’re reading at the wrong baud. Reset to 921 600.
Dongle LED solid redCommunication abnormal. Unplug and replug the dongle.
Companion App activation failsDisable VPN / corporate proxy and retry.

9. Specifications snapshot

RC G1 Tactile Glove — engineering specifications
Sensing
Sensing points per hand162
Resolution4 × 6 mm
Sensing area179 × 145 mm (±3%)
Max single-point load350 N
Accuracy0.01 N
Repeatability±8%
Response time< 0.2 ms
Durability200 000 cycles @ 3 MPa (automotive-grade)
Physical
Ingress ratingIP21
Weight per glove35.4 g
Minimum fold radius< 0.2 mm
Streaming
Sample rate100 Hz wired / 30 Hz Bluetooth (customizable ≤ 600 Hz)
Baud rate921 600 (default); 3 000 000 high-speed
Power
Operating voltage3.5 – 5.0 V
Operating current48 mA
Bluetooth battery life3.75 h active
Standby1 week
Environment
Operating temperature−20 °C to 60 °C (textile sensor) / −25 °C to 85 °C (PCB)
Operating humidity< 90% RH, non-condensing
IMU
PartTDK InvenSense ICM-42688
Gyroscope3-axis, ±2000 °/s
Accelerometer3-axis, ±16 g
ADC16-bit
InterfaceI²C up to 1 MHz / SPI 24 MHz / I3C 12.5 MHz

10. Related pages