python解析苹果identification信息 发表于 2023-10-19 | 分类于 tutorial 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145from construct import * def MessagesSentByAccessory(data): d = GreedyRange(Int16ub) pkt = d.parse(data) for i in pkt: print('%04x' % i) idmap = { 0x0000: { 'name': 'Name', 'handler': None }, 0x0001: { 'name': 'ModelIdentifier', 'handler': None }, 0x0002: { 'name': 'Manufacturer', 'handler': None }, 0x0003: { 'name': 'SerialNumber', 'handler': None }, 0x0004: { 'name': 'FirmwareVersion', 'handler': None }, 0x0005: { 'name': 'HardwareVersion', 'handler': None }, 0x0006: { 'name': 'MessagesSentByAccessory', 'handler': MessagesSentByAccessory }, 0x0007: { 'name': 'MessagesReceivedFromDevice', 'handler': None }, 0x0008: { 'name': 'PowerProvidingCapability', 'handler': None }, 0x0009: { 'name': 'MaximumCurrentDrawnFromDevice', 'handler': None }, 0x000a: { 'name': 'SupportedExternalAccessoryProtocol', 'handler': None }, 0x000b: { 'name': 'AppMatchTeamID', 'handler': None }, 0x000c: { 'name': 'CurrentLanguage', 'handler': None }, 0x000d: { 'name': 'SupportedLanguage', 'handler': None }, 0x000e: { 'name': 'UARTTransportComponent', 'handler': None }, 0x000f: { 'name': 'USBDeviceTransportComponent', 'handler': None }, 0x0010: { 'name': 'USBHostTransportComponent', 'handler': None }, 0x0011: { 'name': 'BluetoothTransportComponent', 'handler': None }, 0x0012: { 'name': 'iAP2HIDComponent', 'handler': None }, 0x0016: { 'name': 'LocationInformationComponent', 'handler': None }, 0x0017: { 'name': 'USBHostHIDComponent', 'handler': None }, 0x001d: { 'name': 'BluetoothHIDComponent', 'handler': None }, 0x0022: { 'name': 'ProductPlanUID', 'handler': None }, 0x0014: { 'name': 'VehicleInformationComponent', 'handler': None }, } data = bytes([ 0x40, 0x40, 0x01, 0xA5, 0x1D, 0x01, 0x00, 0x0F, 0x00, 0x00, 0x56, 0x6F, 0x6C, 0x6B, 0x73, 0x77, 0x61, 0x67, 0x65, 0x6E, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x31, 0x37, 0x47, 0x30, 0x33, 0x35, 0x32, 0x38, 0x30, 0x20, 0x00, 0x00, 0x18, 0x00, 0x02, 0x44, 0x65, 0x73, 0x61, 0x79, 0x20, 0x53, 0x56, 0x20, 0x41, 0x75, 0x74, 0x6F, 0x6D, 0x6F, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00, 0x13, 0x00, 0x03, 0x56, 0x57, 0x5A, 0x36, 0x5A, 0x32, 0x53, 0x30, 0x30, 0x32, 0x38, 0x34, 0x38, 0x30, 0x00, 0x00, 0x09, 0x00, 0x04, 0x30, 0x33, 0x39, 0x31, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x33, 0x36, 0x2E, 0x30, 0x2E, 0x30, 0x00, 0x00, 0x16, 0x00, 0x06, 0xAE, 0x00, 0xAE, 0x02, 0xAE, 0x03, 0xFF, 0xFB, 0x41, 0x54, 0x41, 0x56, 0x41, 0x57, 0x41, 0x59, 0xEA, 0x02, 0x00, 0x12, 0x00, 0x07, 0xAE, 0x01, 0xFF, 0xFA, 0xFF, 0xFC, 0x41, 0x55, 0x41, 0x58, 0xEA, 0x00, 0xEA, 0x01, 0x00, 0x05, 0x00, 0x08, 0x02, 0x00, 0x06, 0x00, 0x09, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0A, 0x00, 0x05, 0x00, 0x00, 0x0D, 0x00, 0x28, 0x00, 0x01, 0x63, 0x6F, 0x6D, 0x2E, 0x76, 0x77, 0x61, 0x67, 0x2E, 0x69, 0x6E, 0x66, 0x6F, 0x74, 0x61, 0x69, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x2E, 0x63, 0x61, 0x72, 0x70, 0x6C, 0x61, 0x79, 0x2E, 0x65, 0x78, 0x6C, 0x61, 0x70, 0x00, 0x00, 0x05, 0x00, 0x02, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x00, 0x05, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x01, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x70, 0x70, 0x6C, 0x65, 0x2E, 0x70, 0x31, 0x00, 0x00, 0x05, 0x00, 0x02, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x00, 0x05, 0x00, 0x00, 0x0F, 0x00, 0x11, 0x00, 0x01, 0x63, 0x6F, 0x6D, 0x2E, 0x61, 0x70, 0x70, 0x6C, 0x65, 0x2E, 0x70, 0x32, 0x00, 0x00, 0x05, 0x00, 0x02, 0x01, 0x00, 0x07, 0x00, 0x0C, 0x65, 0x6E, 0x00, 0x00, 0x07, 0x00, 0x0D, 0x65, 0x6E, 0x00, 0x00, 0x0A, 0x00, 0x0D, 0x7A, 0x68, 0x5F, 0x43, 0x4E, 0x00, 0x00, 0x2E, 0x00, 0x10, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1B, 0x00, 0x01, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x43, 0x6F, 0x6D, 0x70, 0x6F, 0x6E, 0x65, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x01, 0x00, 0x32, 0x00, 0x14, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x14, 0x00, 0x01, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4C, 0x45, 0x49, 0x4E, 0x46, 0x4F, 0x43, 0x4F, 0x4D, 0x50, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x0F, 0x00, 0x06, 0x56, 0x6F, 0x6C, 0x6B, 0x73, 0x77, 0x61, 0x67, 0x65, 0x6E, 0x00, 0x00, 0x23, 0x00, 0x16, 0x00, 0x06, 0x00, 0x00, 0x00, 0x29, 0x00, 0x15, 0x00, 0x01, 0x4C, 0x4F, 0x43, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x49, 0x4E, 0x46, 0x4F, 0x43, 0x4F, 0x4D, 0x50, 0x00, 0x00, 0x04, 0x00, 0x14]) #data = bytes.fromhex('404000E31D01000E000051756269692050726F00000C00014D4B5051532D5700001000024D616B74617220496E632E00001500034230373033323130323036413030433500000A0004312E302E3300000A0005312E302E3100000A0006AE00AE02AE0300060007AE010005000802000600090000002C000A000500000000180001636F6D2E6D616B7461722E717562696970726F000005000201000600030000000F000B4E4C354837544B475645000007000C656E000007000D656E0000260010000600000000001800014C696768746E696E6720436F6E6E6563746F72000004000268') #data = bytes.fromhex('404000E21D02000E0000636F6F6C6275696C6400000E0001636F6F6C6275696C6400000E0002636F6F6C6275696C6400000E0003636F6F6C6275696C640000120004636F6F6C6275696C642D312E300000080005312E3000000A0006AE00AE02AE0300060007AE0100050008020006000900000007000C656E000007000D656E00002C000A000500000000180001636F6D2E6D616B7461722E717562696970726F000005000201000600030000000F000B4E4C354837544B4756450000260010000600000000001800014C696768746E696E6720436F6E6E6563746F720000040002BE') format = Struct( "magic" / Bytes(2), "length" / Int16ub, "id" / Int16ub, "data" / Bytes(this.length - 6) ) pkt = format.parse(data) data = pkt.data while True: if len(data) <= 0: break format = Struct( "length" / Int16ub, "id" / Int16ub, "data" / Bytes(this.length - 4) ) pkt = format.parse(data) data = data[pkt.length:] if pkt.id in idmap: print('======%s======' % idmap[pkt.id]['name']) print(pkt.data) handler = idmap[pkt.id]['handler'] if handler != None: handler(pkt.data) else: print('=====> %d' % pkt.id)