Skip to content

Commit eb279cc

Browse files
bluetooth: Add EIR appearance (#4610)
1 parent f793b27 commit eb279cc

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

scapy/layers/bluetooth.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,71 @@ class EIR_AdvertisingInterval(EIR_Element):
12701270
]
12711271

12721272

1273+
class EIR_Appearance(EIR_Element):
1274+
name = "EIR_Appearance2"
1275+
fields_desc = [
1276+
BitEnumField('category', 0, 10, tot_size=-2, enum={
1277+
0x000: 'Unknown',
1278+
0x001: 'Phone',
1279+
0x002: 'Computer',
1280+
0x003: 'Watch',
1281+
0x004: 'Clock',
1282+
0x005: 'Display',
1283+
0x006: 'Remote Control',
1284+
0x007: 'Eyeglasses',
1285+
0x008: 'Tag',
1286+
0x009: 'Keyring',
1287+
0x00A: 'Media Player',
1288+
0x00B: 'Barcode Scanner',
1289+
0x00C: 'Thermometer',
1290+
0x00D: 'Heart Rate Sensor',
1291+
0x00E: 'Blood Pressure',
1292+
0x00F: 'Human Interface Device',
1293+
0x010: 'Glucose Meter',
1294+
0x011: 'Running Walking Sensor',
1295+
0x012: 'Cycling',
1296+
0x013: 'Control Device',
1297+
0x014: 'Network Device',
1298+
0x015: 'Sensor',
1299+
0x016: 'Light Fixtures',
1300+
0x017: 'Fan',
1301+
0x018: 'HVAC',
1302+
0x019: 'Air Conditioning',
1303+
0x01A: 'Humidifier',
1304+
0x01B: 'Heating',
1305+
0x01C: 'Access Control',
1306+
0x01D: 'Motorized Device',
1307+
0x01E: 'Power Device',
1308+
0x01F: 'Light Source',
1309+
0x020: 'Window Covering',
1310+
0x021: 'Audio Sink',
1311+
0x022: 'Audio Source',
1312+
0x023: 'Motorized Vehicle',
1313+
0x024: 'Domestic Appliance',
1314+
0x025: 'Wearable Audio Device',
1315+
0x026: 'Aircraft',
1316+
0x027: 'AV Equipment',
1317+
0x028: 'Display Equipment',
1318+
0x029: 'Hearing aid',
1319+
0x02A: 'Gaming',
1320+
0x02B: 'Signage',
1321+
0x031: 'Pulse Oximeter',
1322+
0x032: 'Weight Scale',
1323+
0x033: 'Personal Mobility Device',
1324+
0x034: 'Continuous Glucose Monitor',
1325+
0x035: 'Insulin Pump',
1326+
0x036: 'Medication Delivery',
1327+
0x037: 'Spirometer',
1328+
0x051: 'Outdoor Sports Activity'
1329+
}),
1330+
XBitField('subcategory', 0, 6, end_tot_size=-2)
1331+
]
1332+
1333+
@property
1334+
def appearance(self):
1335+
return (self.category << 6) + self.subcategory
1336+
1337+
12731338
class EIR_ServiceData32BitUUID(EIR_Element):
12741339
name = 'EIR Service Data - 32-bit UUID'
12751340
fields_desc = [
@@ -2383,6 +2448,7 @@ class HCI_LE_Meta_Long_Term_Key_Request(Packet):
23832448
bind_layers(EIR_Hdr, EIR_ServiceSolicitation128BitUUID, type=0x15)
23842449
bind_layers(EIR_Hdr, EIR_ServiceData16BitUUID, type=0x16)
23852450
bind_layers(EIR_Hdr, EIR_PublicTargetAddress, type=0x17)
2451+
bind_layers(EIR_Hdr, EIR_Appearance, type=0x19)
23862452
bind_layers(EIR_Hdr, EIR_AdvertisingInterval, type=0x1a)
23872453
bind_layers(EIR_Hdr, EIR_ServiceData32BitUUID, type=0x20)
23882454
bind_layers(EIR_Hdr, EIR_ServiceData128BitUUID, type=0x21)

test/scapy/layers/bluetooth.uts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,13 @@ p = HCI_Event_Hdr(hex_bytes('3e23020100002e4961121110170201060f0954656c655361742
481481
assert EIR_AdvertisingInterval in p
482482
assert p[EIR_AdvertisingInterval].advertising_interval == 400
483483

484+
= Parse EIR_Appearance
485+
p = BTLE(hex_bytes("d6be898e201660d4d3cebffb0201050319420c0303e7fe040948393850c27c"))
486+
assert EIR_Appearance in p
487+
assert p[EIR_Appearance].appearance == 0x0c42
488+
assert p[EIR_Appearance].category == 0x31 #'Pulse Oximeter'
489+
assert p[EIR_Appearance].subcategory == 0x02 # Wrist Worn Pulse Oximeter
490+
484491
= Parse EIR_ServiceData32BitUUID
485492

486493
p = HCI_Hdr(hex_bytes('042fff01c47c80894df801000c0128a269a30c4a125d13f30196894df80c012820f61a1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'))

0 commit comments

Comments
 (0)