[{"data":1,"prerenderedAt":2376},["Reactive",2],{"kb-nav":3,"kb-doc":96},[4,10,15,20,25,30,35,40,45,50,55,60,65,70,75,81,86,91],{"_path":5,"title":6,"description":7,"part":8,"chapterNumber":9},"/knowledge-base/networks/introduction","Introduction","Overview of the communication networks used in modern vehicles, from LIN to Automotive Ethernet.","Vehicle Networks & Protocols",1,{"_path":11,"title":12,"description":13,"part":8,"chapterNumber":14},"/knowledge-base/networks/vehicle-documentation","Vehicle Documentation","Where to find manufacturer wiring diagrams, J2534 passthrough devices, and the different types of diagrams that are useful when researching a vehicle.",2,{"_path":16,"title":17,"description":18,"part":8,"chapterNumber":19},"/knowledge-base/networks/lin-bus","Local Interconnect Network (LIN)","Local Interconnect Network — a single-wire low-speed bus used as a low-cost alternative to CAN for non-critical body electronics.",3,{"_path":21,"title":22,"description":23,"part":8,"chapterNumber":24},"/knowledge-base/networks/controller-area-network","Controller Area Network (CAN)","ISO 11898 — the differential bus that became the backbone of automotive networking. Frames, bit timing, errors, CAN FD, message contents, and practical attacks.",4,{"_path":26,"title":27,"description":28,"part":8,"chapterNumber":29},"/knowledge-base/networks/flexray","FlexRay","Time-triggered, deterministic automotive bus standardized as ISO 17458, designed for higher speeds and drive-by-wire systems.",5,{"_path":31,"title":32,"description":33,"part":8,"chapterNumber":34},"/knowledge-base/networks/automotive-ethernet","Automotive Ethernet","Automotive variants of Ethernet — 100BASE-T1, 1000BASE-T1, and 10BASE-T1S — built around single twisted-pair cabling and strict EMC requirements.",6,{"_path":36,"title":37,"description":38,"part":8,"chapterNumber":39},"/knowledge-base/networks/secure-onboard-communication","Secure Onboard Communication (SecOC)","AUTOSAR's standard for cryptographic message authentication on in-vehicle networks — freshness values, MAC computation and key management.",7,{"_path":41,"title":6,"description":42,"part":43,"chapterNumber":44},"/knowledge-base/diagnostics/introduction","Overview of automotive diagnostic protocols — ISO-TP, OBD-II, UDS, CCP and XCP — and how they layer on top of CAN.","Diagnostic Protocols",8,{"_path":46,"title":47,"description":48,"part":43,"chapterNumber":49},"/knowledge-base/diagnostics/iso-tp","ISO 15765-2 (ISO-TP)","ISO 15765-2 transport layer for sending diagnostic payloads larger than 8 bytes over CAN — single, first, consecutive and flow-control frames.",9,{"_path":51,"title":52,"description":53,"part":43,"chapterNumber":54},"/knowledge-base/diagnostics/vw-tp20","VW Transport Protocol 2.0 (TP 2.0)","Volkswagen's pre-ISO-TP transport layer for KWP2000 over CAN — channel setup, parameter negotiation, and the data exchange counter scheme.",10,{"_path":56,"title":57,"description":58,"part":43,"chapterNumber":59},"/knowledge-base/diagnostics/obd-ii","On-board diagnostics (OBD-II)","On-Board Diagnostics II — the J1962 connector, signal protocols, service IDs, parameter IDs, and DTC encoding.",11,{"_path":61,"title":62,"description":63,"part":43,"chapterNumber":64},"/knowledge-base/diagnostics/uds","Unified Diagnostic Services (UDS)","ISO 14229-1 — the modern diagnostic protocol for sessions, Read/Write DID, Security Access, Routine Control and firmware Request Download / Upload.",12,{"_path":66,"title":67,"description":68,"part":43,"chapterNumber":69},"/knowledge-base/diagnostics/ccp","CAN Calibration Protocol (CCP)","A low-level debug/calibration protocol over CAN — Command Receive Object, Data Transfer Object, and the commands used to read and write ECU memory.",13,{"_path":71,"title":72,"description":73,"part":43,"chapterNumber":74},"/knowledge-base/diagnostics/xcp","Universal Measurement and Calibration Protocol (XCP)","ASAM XCP — successor to CCP supporting CAN, CAN FD, FlexRay, and Ethernet, with synchronous data acquisition, stimulation, and calibration.",14,{"_path":76,"title":77,"description":78,"part":79,"chapterNumber":80},"/knowledge-base/tools/can-adapters","CAN Adapters","USB-to-CAN adapters — comma.ai red panda and PEAK-System PCAN — and the standard DB-9 pinout for CAN.","Tools",15,{"_path":82,"title":83,"description":84,"part":79,"chapterNumber":85},"/knowledge-base/tools/can-analysis","CAN Analysis","Tools for analysing and reverse-engineering CAN traffic — comma.ai cabana, SavyCAN, VehicleSpy, and Wireshark.",16,{"_path":87,"title":88,"description":89,"part":79,"chapterNumber":90},"/knowledge-base/tools/scripting","Scripting","Python libraries and CLI tools for talking to a CAN bus — comma.ai panda, SocketCAN can-utils, python-can, and Scapy with ISO-TP and UDS examples.",17,{"_path":92,"title":93,"description":94,"part":79,"chapterNumber":95},"/knowledge-base/tools/dbc-files","DBC Files","The DBC file format used to describe the contents of CAN messages — nodes, messages, signals, comments, and value tables.",18,{"_path":87,"_dir":97,"_draft":98,"_partial":98,"_locale":99,"title":88,"description":89,"part":79,"chapterNumber":90,"body":100,"_type":2371,"_id":2372,"_source":2373,"_file":2374,"_extension":2375},"tools",false,"",{"type":101,"children":102,"toc":2354},"root",[103,111,118,124,129,432,439,444,559,565,570,787,799,811,871,884,913,918,943,948,956,976,989,1001,1040,1045,1105,1110,1118,1127,1139,1394,1399,1424,1670,1676,1681,1693,1960,1965,1978,2132,2137,2158,2348],{"type":104,"tag":105,"props":106,"children":108},"element","h1",{"id":107},"scripting",[109],{"type":110,"value":88},"text",{"type":104,"tag":112,"props":113,"children":115},"h2",{"id":114},"commaai-panda",[116],{"type":110,"value":117},"comma.ai panda",{"type":104,"tag":119,"props":120,"children":121},"p",{},[122],{"type":110,"value":123},"The comma.ai panda has a Python API that makes it easy to script CAN interactions. It has support for sending and receiving CAN messages, but also implements high-level protocols such as ISO-TP, UDS, and CCP.",{"type":104,"tag":119,"props":125,"children":126},{},[127],{"type":110,"value":128},"Sending and receiving messages can be done in the following way:",{"type":104,"tag":130,"props":131,"children":135},"pre",{"code":132,"language":133,"meta":99,"className":134,"style":99},"from panda import Panda\nfrom opendbc.car.structs import CarParams\n\npanda = Panda()\n\n# Disable silent mode\npanda.set_safety_mode(CarParams.SafetyModel.allOutput)\n\n# Send message to Arb ID 0x1aa on bus 0\npanda.can_send(0x1aa, b\"\\xaa\\xbb\\xcc\\xdd\", 0)\n\n# Receive messages\nfor arb_id, _, data, bus in panda.can_recv():\n    print(f\"Arb ID {arb_id}, bus {bus}: {data.hex()}\")\n","python","language-python shiki shiki-themes github-light github-dark",[136],{"type":104,"tag":137,"props":138,"children":139},"code",{"__ignoreMap":99},[140,167,188,197,215,222,231,239,246,254,312,319,327,350],{"type":104,"tag":141,"props":142,"children":144},"span",{"class":143,"line":9},"line",[145,151,157,162],{"type":104,"tag":141,"props":146,"children":148},{"style":147},"--shiki-default:#D73A49;--shiki-dark:#F97583",[149],{"type":110,"value":150},"from",{"type":104,"tag":141,"props":152,"children":154},{"style":153},"--shiki-default:#24292E;--shiki-dark:#E1E4E8",[155],{"type":110,"value":156}," panda ",{"type":104,"tag":141,"props":158,"children":159},{"style":147},[160],{"type":110,"value":161},"import",{"type":104,"tag":141,"props":163,"children":164},{"style":153},[165],{"type":110,"value":166}," Panda\n",{"type":104,"tag":141,"props":168,"children":169},{"class":143,"line":14},[170,174,179,183],{"type":104,"tag":141,"props":171,"children":172},{"style":147},[173],{"type":110,"value":150},{"type":104,"tag":141,"props":175,"children":176},{"style":153},[177],{"type":110,"value":178}," opendbc.car.structs ",{"type":104,"tag":141,"props":180,"children":181},{"style":147},[182],{"type":110,"value":161},{"type":104,"tag":141,"props":184,"children":185},{"style":153},[186],{"type":110,"value":187}," CarParams\n",{"type":104,"tag":141,"props":189,"children":190},{"class":143,"line":19},[191],{"type":104,"tag":141,"props":192,"children":194},{"emptyLinePlaceholder":193},true,[195],{"type":110,"value":196},"\n",{"type":104,"tag":141,"props":198,"children":199},{"class":143,"line":24},[200,205,210],{"type":104,"tag":141,"props":201,"children":202},{"style":153},[203],{"type":110,"value":204},"panda ",{"type":104,"tag":141,"props":206,"children":207},{"style":147},[208],{"type":110,"value":209},"=",{"type":104,"tag":141,"props":211,"children":212},{"style":153},[213],{"type":110,"value":214}," Panda()\n",{"type":104,"tag":141,"props":216,"children":217},{"class":143,"line":29},[218],{"type":104,"tag":141,"props":219,"children":220},{"emptyLinePlaceholder":193},[221],{"type":110,"value":196},{"type":104,"tag":141,"props":223,"children":224},{"class":143,"line":34},[225],{"type":104,"tag":141,"props":226,"children":228},{"style":227},"--shiki-default:#6A737D;--shiki-dark:#6A737D",[229],{"type":110,"value":230},"# Disable silent mode\n",{"type":104,"tag":141,"props":232,"children":233},{"class":143,"line":39},[234],{"type":104,"tag":141,"props":235,"children":236},{"style":153},[237],{"type":110,"value":238},"panda.set_safety_mode(CarParams.SafetyModel.allOutput)\n",{"type":104,"tag":141,"props":240,"children":241},{"class":143,"line":44},[242],{"type":104,"tag":141,"props":243,"children":244},{"emptyLinePlaceholder":193},[245],{"type":110,"value":196},{"type":104,"tag":141,"props":247,"children":248},{"class":143,"line":49},[249],{"type":104,"tag":141,"props":250,"children":251},{"style":227},[252],{"type":110,"value":253},"# Send message to Arb ID 0x1aa on bus 0\n",{"type":104,"tag":141,"props":255,"children":256},{"class":143,"line":54},[257,262,267,273,278,283,289,294,298,302,307],{"type":104,"tag":141,"props":258,"children":259},{"style":153},[260],{"type":110,"value":261},"panda.can_send(",{"type":104,"tag":141,"props":263,"children":264},{"style":147},[265],{"type":110,"value":266},"0x",{"type":104,"tag":141,"props":268,"children":270},{"style":269},"--shiki-default:#005CC5;--shiki-dark:#79B8FF",[271],{"type":110,"value":272},"1aa",{"type":104,"tag":141,"props":274,"children":275},{"style":153},[276],{"type":110,"value":277},", ",{"type":104,"tag":141,"props":279,"children":280},{"style":147},[281],{"type":110,"value":282},"b",{"type":104,"tag":141,"props":284,"children":286},{"style":285},"--shiki-default:#032F62;--shiki-dark:#9ECBFF",[287],{"type":110,"value":288},"\"",{"type":104,"tag":141,"props":290,"children":291},{"style":269},[292],{"type":110,"value":293},"\\xaa\\xbb\\xcc\\xdd",{"type":104,"tag":141,"props":295,"children":296},{"style":285},[297],{"type":110,"value":288},{"type":104,"tag":141,"props":299,"children":300},{"style":153},[301],{"type":110,"value":277},{"type":104,"tag":141,"props":303,"children":304},{"style":269},[305],{"type":110,"value":306},"0",{"type":104,"tag":141,"props":308,"children":309},{"style":153},[310],{"type":110,"value":311},")\n",{"type":104,"tag":141,"props":313,"children":314},{"class":143,"line":59},[315],{"type":104,"tag":141,"props":316,"children":317},{"emptyLinePlaceholder":193},[318],{"type":110,"value":196},{"type":104,"tag":141,"props":320,"children":321},{"class":143,"line":64},[322],{"type":104,"tag":141,"props":323,"children":324},{"style":227},[325],{"type":110,"value":326},"# Receive messages\n",{"type":104,"tag":141,"props":328,"children":329},{"class":143,"line":69},[330,335,340,345],{"type":104,"tag":141,"props":331,"children":332},{"style":147},[333],{"type":110,"value":334},"for",{"type":104,"tag":141,"props":336,"children":337},{"style":153},[338],{"type":110,"value":339}," arb_id, _, data, bus ",{"type":104,"tag":141,"props":341,"children":342},{"style":147},[343],{"type":110,"value":344},"in",{"type":104,"tag":141,"props":346,"children":347},{"style":153},[348],{"type":110,"value":349}," panda.can_recv():\n",{"type":104,"tag":141,"props":351,"children":352},{"class":143,"line":74},[353,358,363,368,373,378,383,388,393,397,402,406,411,415,420,424,428],{"type":104,"tag":141,"props":354,"children":355},{"style":269},[356],{"type":110,"value":357},"    print",{"type":104,"tag":141,"props":359,"children":360},{"style":153},[361],{"type":110,"value":362},"(",{"type":104,"tag":141,"props":364,"children":365},{"style":147},[366],{"type":110,"value":367},"f",{"type":104,"tag":141,"props":369,"children":370},{"style":285},[371],{"type":110,"value":372},"\"Arb ID ",{"type":104,"tag":141,"props":374,"children":375},{"style":269},[376],{"type":110,"value":377},"{",{"type":104,"tag":141,"props":379,"children":380},{"style":153},[381],{"type":110,"value":382},"arb_id",{"type":104,"tag":141,"props":384,"children":385},{"style":269},[386],{"type":110,"value":387},"}",{"type":104,"tag":141,"props":389,"children":390},{"style":285},[391],{"type":110,"value":392},", bus ",{"type":104,"tag":141,"props":394,"children":395},{"style":269},[396],{"type":110,"value":377},{"type":104,"tag":141,"props":398,"children":399},{"style":153},[400],{"type":110,"value":401},"bus",{"type":104,"tag":141,"props":403,"children":404},{"style":269},[405],{"type":110,"value":387},{"type":104,"tag":141,"props":407,"children":408},{"style":285},[409],{"type":110,"value":410},": ",{"type":104,"tag":141,"props":412,"children":413},{"style":269},[414],{"type":110,"value":377},{"type":104,"tag":141,"props":416,"children":417},{"style":153},[418],{"type":110,"value":419},"data.hex()",{"type":104,"tag":141,"props":421,"children":422},{"style":269},[423],{"type":110,"value":387},{"type":104,"tag":141,"props":425,"children":426},{"style":285},[427],{"type":110,"value":288},{"type":104,"tag":141,"props":429,"children":430},{"style":153},[431],{"type":110,"value":311},{"type":104,"tag":433,"props":434,"children":436},"h3",{"id":435},"iso-tp",[437],{"type":110,"value":438},"ISO-TP",{"type":104,"tag":119,"props":440,"children":441},{},[442],{"type":110,"value":443},"The example below requests the Manufacturer Part Number using a hand-crafted Read Data By Identifier UDS request. In the next section, we'll show how to do this in a more abstracted way using the UDS client.",{"type":104,"tag":130,"props":445,"children":447},{"code":446,"language":133,"meta":99,"className":134,"style":99},"from opendbc.car.isotp import isotp_send, isotp_recv\n\n# Request Manufacturer Spare Part Number\nisotp_send(panda, b\"\\x22\\xf1\\x87\", 0x7b7)\nresp = isotp_recv(panda, 0x7bf)\n",[448],{"type":104,"tag":137,"props":449,"children":450},{"__ignoreMap":99},[451,472,479,487,529],{"type":104,"tag":141,"props":452,"children":453},{"class":143,"line":9},[454,458,463,467],{"type":104,"tag":141,"props":455,"children":456},{"style":147},[457],{"type":110,"value":150},{"type":104,"tag":141,"props":459,"children":460},{"style":153},[461],{"type":110,"value":462}," opendbc.car.isotp ",{"type":104,"tag":141,"props":464,"children":465},{"style":147},[466],{"type":110,"value":161},{"type":104,"tag":141,"props":468,"children":469},{"style":153},[470],{"type":110,"value":471}," isotp_send, isotp_recv\n",{"type":104,"tag":141,"props":473,"children":474},{"class":143,"line":14},[475],{"type":104,"tag":141,"props":476,"children":477},{"emptyLinePlaceholder":193},[478],{"type":110,"value":196},{"type":104,"tag":141,"props":480,"children":481},{"class":143,"line":19},[482],{"type":104,"tag":141,"props":483,"children":484},{"style":227},[485],{"type":110,"value":486},"# Request Manufacturer Spare Part Number\n",{"type":104,"tag":141,"props":488,"children":489},{"class":143,"line":24},[490,495,499,503,508,512,516,520,525],{"type":104,"tag":141,"props":491,"children":492},{"style":153},[493],{"type":110,"value":494},"isotp_send(panda, ",{"type":104,"tag":141,"props":496,"children":497},{"style":147},[498],{"type":110,"value":282},{"type":104,"tag":141,"props":500,"children":501},{"style":285},[502],{"type":110,"value":288},{"type":104,"tag":141,"props":504,"children":505},{"style":269},[506],{"type":110,"value":507},"\\x22\\xf1\\x87",{"type":104,"tag":141,"props":509,"children":510},{"style":285},[511],{"type":110,"value":288},{"type":104,"tag":141,"props":513,"children":514},{"style":153},[515],{"type":110,"value":277},{"type":104,"tag":141,"props":517,"children":518},{"style":147},[519],{"type":110,"value":266},{"type":104,"tag":141,"props":521,"children":522},{"style":269},[523],{"type":110,"value":524},"7b7",{"type":104,"tag":141,"props":526,"children":527},{"style":153},[528],{"type":110,"value":311},{"type":104,"tag":141,"props":530,"children":531},{"class":143,"line":29},[532,537,541,546,550,555],{"type":104,"tag":141,"props":533,"children":534},{"style":153},[535],{"type":110,"value":536},"resp ",{"type":104,"tag":141,"props":538,"children":539},{"style":147},[540],{"type":110,"value":209},{"type":104,"tag":141,"props":542,"children":543},{"style":153},[544],{"type":110,"value":545}," isotp_recv(panda, ",{"type":104,"tag":141,"props":547,"children":548},{"style":147},[549],{"type":110,"value":266},{"type":104,"tag":141,"props":551,"children":552},{"style":269},[553],{"type":110,"value":554},"7bf",{"type":104,"tag":141,"props":556,"children":557},{"style":153},[558],{"type":110,"value":311},{"type":104,"tag":433,"props":560,"children":562},{"id":561},"uds",[563],{"type":110,"value":564},"UDS",{"type":104,"tag":119,"props":566,"children":567},{},[568],{"type":110,"value":569},"The example below requests the Manufacturer Spare Part Number using UDS.",{"type":104,"tag":130,"props":571,"children":573},{"code":572,"language":133,"meta":99,"className":134,"style":99},"from opendbc.car.uds import UdsClient\nfrom opendbc.car.uds import NegativeResponseError\nfrom opendbc.car.uds import DATA_IDENTIFIER_TYPE\n\nclient = UdsClient(panda, 0x7b7)\ntry:\n    resp = client.read_data_by_identifier(DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_SPARE_PART_NUMBER)\nexcept NegativeResponseError as e:\n    print(f\"Negative Response: {e}\")\n",[574],{"type":104,"tag":137,"props":575,"children":576},{"__ignoreMap":99},[577,598,618,638,645,674,687,723,746],{"type":104,"tag":141,"props":578,"children":579},{"class":143,"line":9},[580,584,589,593],{"type":104,"tag":141,"props":581,"children":582},{"style":147},[583],{"type":110,"value":150},{"type":104,"tag":141,"props":585,"children":586},{"style":153},[587],{"type":110,"value":588}," opendbc.car.uds ",{"type":104,"tag":141,"props":590,"children":591},{"style":147},[592],{"type":110,"value":161},{"type":104,"tag":141,"props":594,"children":595},{"style":153},[596],{"type":110,"value":597}," UdsClient\n",{"type":104,"tag":141,"props":599,"children":600},{"class":143,"line":14},[601,605,609,613],{"type":104,"tag":141,"props":602,"children":603},{"style":147},[604],{"type":110,"value":150},{"type":104,"tag":141,"props":606,"children":607},{"style":153},[608],{"type":110,"value":588},{"type":104,"tag":141,"props":610,"children":611},{"style":147},[612],{"type":110,"value":161},{"type":104,"tag":141,"props":614,"children":615},{"style":153},[616],{"type":110,"value":617}," NegativeResponseError\n",{"type":104,"tag":141,"props":619,"children":620},{"class":143,"line":19},[621,625,629,633],{"type":104,"tag":141,"props":622,"children":623},{"style":147},[624],{"type":110,"value":150},{"type":104,"tag":141,"props":626,"children":627},{"style":153},[628],{"type":110,"value":588},{"type":104,"tag":141,"props":630,"children":631},{"style":147},[632],{"type":110,"value":161},{"type":104,"tag":141,"props":634,"children":635},{"style":269},[636],{"type":110,"value":637}," DATA_IDENTIFIER_TYPE\n",{"type":104,"tag":141,"props":639,"children":640},{"class":143,"line":24},[641],{"type":104,"tag":141,"props":642,"children":643},{"emptyLinePlaceholder":193},[644],{"type":110,"value":196},{"type":104,"tag":141,"props":646,"children":647},{"class":143,"line":29},[648,653,657,662,666,670],{"type":104,"tag":141,"props":649,"children":650},{"style":153},[651],{"type":110,"value":652},"client ",{"type":104,"tag":141,"props":654,"children":655},{"style":147},[656],{"type":110,"value":209},{"type":104,"tag":141,"props":658,"children":659},{"style":153},[660],{"type":110,"value":661}," UdsClient(panda, ",{"type":104,"tag":141,"props":663,"children":664},{"style":147},[665],{"type":110,"value":266},{"type":104,"tag":141,"props":667,"children":668},{"style":269},[669],{"type":110,"value":524},{"type":104,"tag":141,"props":671,"children":672},{"style":153},[673],{"type":110,"value":311},{"type":104,"tag":141,"props":675,"children":676},{"class":143,"line":34},[677,682],{"type":104,"tag":141,"props":678,"children":679},{"style":147},[680],{"type":110,"value":681},"try",{"type":104,"tag":141,"props":683,"children":684},{"style":153},[685],{"type":110,"value":686},":\n",{"type":104,"tag":141,"props":688,"children":689},{"class":143,"line":39},[690,695,699,704,709,714,719],{"type":104,"tag":141,"props":691,"children":692},{"style":153},[693],{"type":110,"value":694},"    resp ",{"type":104,"tag":141,"props":696,"children":697},{"style":147},[698],{"type":110,"value":209},{"type":104,"tag":141,"props":700,"children":701},{"style":153},[702],{"type":110,"value":703}," client.read_data_by_identifier(",{"type":104,"tag":141,"props":705,"children":706},{"style":269},[707],{"type":110,"value":708},"DATA_IDENTIFIER_TYPE",{"type":104,"tag":141,"props":710,"children":711},{"style":153},[712],{"type":110,"value":713},".",{"type":104,"tag":141,"props":715,"children":716},{"style":269},[717],{"type":110,"value":718},"VEHICLE_MANUFACTURER_SPARE_PART_NUMBER",{"type":104,"tag":141,"props":720,"children":721},{"style":153},[722],{"type":110,"value":311},{"type":104,"tag":141,"props":724,"children":725},{"class":143,"line":44},[726,731,736,741],{"type":104,"tag":141,"props":727,"children":728},{"style":147},[729],{"type":110,"value":730},"except",{"type":104,"tag":141,"props":732,"children":733},{"style":153},[734],{"type":110,"value":735}," NegativeResponseError ",{"type":104,"tag":141,"props":737,"children":738},{"style":147},[739],{"type":110,"value":740},"as",{"type":104,"tag":141,"props":742,"children":743},{"style":153},[744],{"type":110,"value":745}," e:\n",{"type":104,"tag":141,"props":747,"children":748},{"class":143,"line":49},[749,753,757,761,766,770,775,779,783],{"type":104,"tag":141,"props":750,"children":751},{"style":269},[752],{"type":110,"value":357},{"type":104,"tag":141,"props":754,"children":755},{"style":153},[756],{"type":110,"value":362},{"type":104,"tag":141,"props":758,"children":759},{"style":147},[760],{"type":110,"value":367},{"type":104,"tag":141,"props":762,"children":763},{"style":285},[764],{"type":110,"value":765},"\"Negative Response: ",{"type":104,"tag":141,"props":767,"children":768},{"style":269},[769],{"type":110,"value":377},{"type":104,"tag":141,"props":771,"children":772},{"style":153},[773],{"type":110,"value":774},"e",{"type":104,"tag":141,"props":776,"children":777},{"style":269},[778],{"type":110,"value":387},{"type":104,"tag":141,"props":780,"children":781},{"style":285},[782],{"type":110,"value":288},{"type":104,"tag":141,"props":784,"children":785},{"style":153},[786],{"type":110,"value":311},{"type":104,"tag":112,"props":788,"children":790},{"id":789},"socketcan-can-utils",[791,793],{"type":110,"value":792},"SocketCAN ",{"type":104,"tag":137,"props":794,"children":796},{"className":795},[],[797],{"type":110,"value":798},"can-utils",{"type":104,"tag":119,"props":800,"children":801},{},[802,804,809],{"type":110,"value":803},"SocketCAN has some versatile CLI tools available in the ",{"type":104,"tag":137,"props":805,"children":807},{"className":806},[],[808],{"type":110,"value":798},{"type":110,"value":810}," package. It's also possible to use Python to talk to a SocketCAN device — see python-can below. Before we can use any of the tools we need to bring up the CAN interface:",{"type":104,"tag":130,"props":812,"children":816},{"code":813,"language":814,"meta":99,"className":815,"style":99},"sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 fd on sample-point 0.8\nsudo ip link set can0 up\n","bash","language-bash shiki shiki-themes github-light github-dark",[817],{"type":104,"tag":137,"props":818,"children":819},{"__ignoreMap":99},[820,859],{"type":104,"tag":141,"props":821,"children":822},{"class":143,"line":9},[823,829,834,839,844,849,854],{"type":104,"tag":141,"props":824,"children":826},{"style":825},"--shiki-default:#6F42C1;--shiki-dark:#B392F0",[827],{"type":110,"value":828},"sudo",{"type":104,"tag":141,"props":830,"children":831},{"style":285},[832],{"type":110,"value":833}," ip link set can0 type can bitrate ",{"type":104,"tag":141,"props":835,"children":836},{"style":269},[837],{"type":110,"value":838},"500000",{"type":104,"tag":141,"props":840,"children":841},{"style":285},[842],{"type":110,"value":843}," dbitrate ",{"type":104,"tag":141,"props":845,"children":846},{"style":269},[847],{"type":110,"value":848},"2000000",{"type":104,"tag":141,"props":850,"children":851},{"style":285},[852],{"type":110,"value":853}," fd on sample-point ",{"type":104,"tag":141,"props":855,"children":856},{"style":269},[857],{"type":110,"value":858},"0.8\n",{"type":104,"tag":141,"props":860,"children":861},{"class":143,"line":14},[862,866],{"type":104,"tag":141,"props":863,"children":864},{"style":825},[865],{"type":110,"value":828},{"type":104,"tag":141,"props":867,"children":868},{"style":285},[869],{"type":110,"value":870}," ip link set can0 up\n",{"type":104,"tag":119,"props":872,"children":873},{},[874,876,882],{"type":110,"value":875},"After the interface is brought up, we can send a message using ",{"type":104,"tag":137,"props":877,"children":879},{"className":878},[],[880],{"type":110,"value":881},"cansend",{"type":110,"value":883},":",{"type":104,"tag":130,"props":885,"children":887},{"code":886,"language":814,"meta":99,"className":815,"style":99},"cansend can0 1aa#aabbccdd\n",[888],{"type":104,"tag":137,"props":889,"children":890},{"__ignoreMap":99},[891],{"type":104,"tag":141,"props":892,"children":893},{"class":143,"line":9},[894,898,903,908],{"type":104,"tag":141,"props":895,"children":896},{"style":825},[897],{"type":110,"value":881},{"type":104,"tag":141,"props":899,"children":900},{"style":285},[901],{"type":110,"value":902}," can0 ",{"type":104,"tag":141,"props":904,"children":905},{"style":269},[906],{"type":110,"value":907},"1",{"type":104,"tag":141,"props":909,"children":910},{"style":285},[911],{"type":110,"value":912},"aa#aabbccdd\n",{"type":104,"tag":433,"props":914,"children":916},{"id":915},"iso-tp-1",[917],{"type":110,"value":438},{"type":104,"tag":119,"props":919,"children":920},{},[921,926,928,934,936,942],{"type":104,"tag":137,"props":922,"children":924},{"className":923},[],[925],{"type":110,"value":798},{"type":110,"value":927}," contains some nice tools to work with ISO-TP. You can sniff ISO-TP messages using ",{"type":104,"tag":137,"props":929,"children":931},{"className":930},[],[932],{"type":110,"value":933},"isotpsniffer",{"type":110,"value":935},", and send ISO-TP messages using ",{"type":104,"tag":137,"props":937,"children":939},{"className":938},[],[940],{"type":110,"value":941},"isotpsend",{"type":110,"value":713},{"type":104,"tag":119,"props":944,"children":945},{},[946],{"type":110,"value":947},"Example of sniffing ISO-TP:",{"type":104,"tag":130,"props":949,"children":951},{"code":950},"$ isotpsniffer -s 7b7 -d 7bf can0\n can0  7B7  [3]  22 F1 87  - '\"..'\n can0  7BF  [18]  62 F1 87 39 39 31 34 30 4C 30 30 30 30 20 20 20 20 20 \\\n          - 'b..99140L0000     '\n",[952],{"type":104,"tag":137,"props":953,"children":954},{"__ignoreMap":99},[955],{"type":110,"value":950},{"type":104,"tag":119,"props":957,"children":958},{},[959,961,966,968,974],{"type":110,"value":960},"Using ",{"type":104,"tag":137,"props":962,"children":964},{"className":963},[],[965],{"type":110,"value":941},{"type":110,"value":967}," and ",{"type":104,"tag":137,"props":969,"children":971},{"className":970},[],[972],{"type":110,"value":973},"isotprecv",{"type":110,"value":975}," it's possible to send and receive UDS messages manually, but there are no dedicated UDS tools.",{"type":104,"tag":119,"props":977,"children":978},{},[979,981,987],{"type":110,"value":980},"We can send the same UDS request that we sent from the panda example. Keep in mind that the ISO-TP CLI tools do not pad the CAN frame to 8 bytes by default, which is required by some implementations. To fix this, we specify a padding byte using the ",{"type":104,"tag":137,"props":982,"children":984},{"className":983},[],[985],{"type":110,"value":986},"-p",{"type":110,"value":988}," option.",{"type":104,"tag":119,"props":990,"children":991},{},[992,994,999],{"type":110,"value":993},"In one shell, we start ",{"type":104,"tag":137,"props":995,"children":997},{"className":996},[],[998],{"type":110,"value":973},{"type":110,"value":1000}," to catch the reply after we send the request and handle the flow control:",{"type":104,"tag":130,"props":1002,"children":1004},{"code":1003,"language":814,"meta":99,"className":815,"style":99},"isotprecv -s 7b7 -d 7bf -p AA can0\n",[1005],{"type":104,"tag":137,"props":1006,"children":1007},{"__ignoreMap":99},[1008],{"type":104,"tag":141,"props":1009,"children":1010},{"class":143,"line":9},[1011,1015,1020,1025,1030,1035],{"type":104,"tag":141,"props":1012,"children":1013},{"style":825},[1014],{"type":110,"value":973},{"type":104,"tag":141,"props":1016,"children":1017},{"style":269},[1018],{"type":110,"value":1019}," -s",{"type":104,"tag":141,"props":1021,"children":1022},{"style":269},[1023],{"type":110,"value":1024}," 7",{"type":104,"tag":141,"props":1026,"children":1027},{"style":285},[1028],{"type":110,"value":1029},"b7 -d ",{"type":104,"tag":141,"props":1031,"children":1032},{"style":269},[1033],{"type":110,"value":1034},"7",{"type":104,"tag":141,"props":1036,"children":1037},{"style":285},[1038],{"type":110,"value":1039},"bf -p AA can0\n",{"type":104,"tag":119,"props":1041,"children":1042},{},[1043],{"type":110,"value":1044},"In another shell we send the request:",{"type":104,"tag":130,"props":1046,"children":1048},{"code":1047,"language":814,"meta":99,"className":815,"style":99},"echo 22 F1 87 | isotpsend -s 7b7 -d 7bf -p AA can0\n",[1049],{"type":104,"tag":137,"props":1050,"children":1051},{"__ignoreMap":99},[1052],{"type":104,"tag":141,"props":1053,"children":1054},{"class":143,"line":9},[1055,1060,1065,1070,1075,1080,1085,1089,1093,1097,1101],{"type":104,"tag":141,"props":1056,"children":1057},{"style":269},[1058],{"type":110,"value":1059},"echo",{"type":104,"tag":141,"props":1061,"children":1062},{"style":269},[1063],{"type":110,"value":1064}," 22",{"type":104,"tag":141,"props":1066,"children":1067},{"style":285},[1068],{"type":110,"value":1069}," F1 ",{"type":104,"tag":141,"props":1071,"children":1072},{"style":269},[1073],{"type":110,"value":1074},"87",{"type":104,"tag":141,"props":1076,"children":1077},{"style":147},[1078],{"type":110,"value":1079}," |",{"type":104,"tag":141,"props":1081,"children":1082},{"style":825},[1083],{"type":110,"value":1084}," isotpsend",{"type":104,"tag":141,"props":1086,"children":1087},{"style":269},[1088],{"type":110,"value":1019},{"type":104,"tag":141,"props":1090,"children":1091},{"style":269},[1092],{"type":110,"value":1024},{"type":104,"tag":141,"props":1094,"children":1095},{"style":285},[1096],{"type":110,"value":1029},{"type":104,"tag":141,"props":1098,"children":1099},{"style":269},[1100],{"type":110,"value":1034},{"type":104,"tag":141,"props":1102,"children":1103},{"style":285},[1104],{"type":110,"value":1039},{"type":104,"tag":119,"props":1106,"children":1107},{},[1108],{"type":110,"value":1109},"The reply is then shown in the first shell:",{"type":104,"tag":130,"props":1111,"children":1113},{"code":1112},"$ isotprecv -s 7b7 -d 7bf -p AA can0\n  62 F1 87 39 39 31 34 30 4C 30 30 30 30 20 20 20 20 20\n",[1114],{"type":104,"tag":137,"props":1115,"children":1116},{"__ignoreMap":99},[1117],{"type":110,"value":1112},{"type":104,"tag":112,"props":1119,"children":1121},{"id":1120},"python-can",[1122],{"type":104,"tag":137,"props":1123,"children":1125},{"className":1124},[],[1126],{"type":110,"value":1120},{"type":104,"tag":119,"props":1128,"children":1129},{},[1130,1132,1137],{"type":110,"value":1131},"As mentioned previously, ",{"type":104,"tag":137,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":110,"value":1120},{"type":110,"value":1138}," can be used with a variety of adapters, but in these examples we will be using the SocketCAN interface on Linux. After installing the package, we can send and receive messages like this:",{"type":104,"tag":130,"props":1140,"children":1142},{"code":1141,"language":133,"meta":99,"className":134,"style":99},"import can\n\nbus = can.Bus(channel='can0', interface='socketcan')\nmsg = can.Message(arbitration_id=0x1aa, data=b\"\\xaa\\xbb\\xcc\\xdd\", is_extended_id=False)\nbus.send(msg)\n\nfor msg in bus:\n    print(f\"Arb ID {msg.arbitration_id}: {msg.data.hex()}\")\n",[1143],{"type":104,"tag":137,"props":1144,"children":1145},{"__ignoreMap":99},[1146,1158,1165,1219,1301,1309,1316,1337],{"type":104,"tag":141,"props":1147,"children":1148},{"class":143,"line":9},[1149,1153],{"type":104,"tag":141,"props":1150,"children":1151},{"style":147},[1152],{"type":110,"value":161},{"type":104,"tag":141,"props":1154,"children":1155},{"style":153},[1156],{"type":110,"value":1157}," can\n",{"type":104,"tag":141,"props":1159,"children":1160},{"class":143,"line":14},[1161],{"type":104,"tag":141,"props":1162,"children":1163},{"emptyLinePlaceholder":193},[1164],{"type":110,"value":196},{"type":104,"tag":141,"props":1166,"children":1167},{"class":143,"line":19},[1168,1173,1177,1182,1188,1192,1197,1201,1206,1210,1215],{"type":104,"tag":141,"props":1169,"children":1170},{"style":153},[1171],{"type":110,"value":1172},"bus ",{"type":104,"tag":141,"props":1174,"children":1175},{"style":147},[1176],{"type":110,"value":209},{"type":104,"tag":141,"props":1178,"children":1179},{"style":153},[1180],{"type":110,"value":1181}," can.Bus(",{"type":104,"tag":141,"props":1183,"children":1185},{"style":1184},"--shiki-default:#E36209;--shiki-dark:#FFAB70",[1186],{"type":110,"value":1187},"channel",{"type":104,"tag":141,"props":1189,"children":1190},{"style":147},[1191],{"type":110,"value":209},{"type":104,"tag":141,"props":1193,"children":1194},{"style":285},[1195],{"type":110,"value":1196},"'can0'",{"type":104,"tag":141,"props":1198,"children":1199},{"style":153},[1200],{"type":110,"value":277},{"type":104,"tag":141,"props":1202,"children":1203},{"style":1184},[1204],{"type":110,"value":1205},"interface",{"type":104,"tag":141,"props":1207,"children":1208},{"style":147},[1209],{"type":110,"value":209},{"type":104,"tag":141,"props":1211,"children":1212},{"style":285},[1213],{"type":110,"value":1214},"'socketcan'",{"type":104,"tag":141,"props":1216,"children":1217},{"style":153},[1218],{"type":110,"value":311},{"type":104,"tag":141,"props":1220,"children":1221},{"class":143,"line":24},[1222,1227,1231,1236,1241,1246,1250,1254,1259,1263,1267,1271,1275,1279,1283,1288,1292,1297],{"type":104,"tag":141,"props":1223,"children":1224},{"style":153},[1225],{"type":110,"value":1226},"msg ",{"type":104,"tag":141,"props":1228,"children":1229},{"style":147},[1230],{"type":110,"value":209},{"type":104,"tag":141,"props":1232,"children":1233},{"style":153},[1234],{"type":110,"value":1235}," can.Message(",{"type":104,"tag":141,"props":1237,"children":1238},{"style":1184},[1239],{"type":110,"value":1240},"arbitration_id",{"type":104,"tag":141,"props":1242,"children":1243},{"style":147},[1244],{"type":110,"value":1245},"=0x",{"type":104,"tag":141,"props":1247,"children":1248},{"style":269},[1249],{"type":110,"value":272},{"type":104,"tag":141,"props":1251,"children":1252},{"style":153},[1253],{"type":110,"value":277},{"type":104,"tag":141,"props":1255,"children":1256},{"style":1184},[1257],{"type":110,"value":1258},"data",{"type":104,"tag":141,"props":1260,"children":1261},{"style":147},[1262],{"type":110,"value":209},{"type":104,"tag":141,"props":1264,"children":1265},{"style":147},[1266],{"type":110,"value":282},{"type":104,"tag":141,"props":1268,"children":1269},{"style":285},[1270],{"type":110,"value":288},{"type":104,"tag":141,"props":1272,"children":1273},{"style":269},[1274],{"type":110,"value":293},{"type":104,"tag":141,"props":1276,"children":1277},{"style":285},[1278],{"type":110,"value":288},{"type":104,"tag":141,"props":1280,"children":1281},{"style":153},[1282],{"type":110,"value":277},{"type":104,"tag":141,"props":1284,"children":1285},{"style":1184},[1286],{"type":110,"value":1287},"is_extended_id",{"type":104,"tag":141,"props":1289,"children":1290},{"style":147},[1291],{"type":110,"value":209},{"type":104,"tag":141,"props":1293,"children":1294},{"style":269},[1295],{"type":110,"value":1296},"False",{"type":104,"tag":141,"props":1298,"children":1299},{"style":153},[1300],{"type":110,"value":311},{"type":104,"tag":141,"props":1302,"children":1303},{"class":143,"line":29},[1304],{"type":104,"tag":141,"props":1305,"children":1306},{"style":153},[1307],{"type":110,"value":1308},"bus.send(msg)\n",{"type":104,"tag":141,"props":1310,"children":1311},{"class":143,"line":34},[1312],{"type":104,"tag":141,"props":1313,"children":1314},{"emptyLinePlaceholder":193},[1315],{"type":110,"value":196},{"type":104,"tag":141,"props":1317,"children":1318},{"class":143,"line":39},[1319,1323,1328,1332],{"type":104,"tag":141,"props":1320,"children":1321},{"style":147},[1322],{"type":110,"value":334},{"type":104,"tag":141,"props":1324,"children":1325},{"style":153},[1326],{"type":110,"value":1327}," msg ",{"type":104,"tag":141,"props":1329,"children":1330},{"style":147},[1331],{"type":110,"value":344},{"type":104,"tag":141,"props":1333,"children":1334},{"style":153},[1335],{"type":110,"value":1336}," bus:\n",{"type":104,"tag":141,"props":1338,"children":1339},{"class":143,"line":44},[1340,1344,1348,1352,1356,1360,1365,1369,1373,1377,1382,1386,1390],{"type":104,"tag":141,"props":1341,"children":1342},{"style":269},[1343],{"type":110,"value":357},{"type":104,"tag":141,"props":1345,"children":1346},{"style":153},[1347],{"type":110,"value":362},{"type":104,"tag":141,"props":1349,"children":1350},{"style":147},[1351],{"type":110,"value":367},{"type":104,"tag":141,"props":1353,"children":1354},{"style":285},[1355],{"type":110,"value":372},{"type":104,"tag":141,"props":1357,"children":1358},{"style":269},[1359],{"type":110,"value":377},{"type":104,"tag":141,"props":1361,"children":1362},{"style":153},[1363],{"type":110,"value":1364},"msg.arbitration_id",{"type":104,"tag":141,"props":1366,"children":1367},{"style":269},[1368],{"type":110,"value":387},{"type":104,"tag":141,"props":1370,"children":1371},{"style":285},[1372],{"type":110,"value":410},{"type":104,"tag":141,"props":1374,"children":1375},{"style":269},[1376],{"type":110,"value":377},{"type":104,"tag":141,"props":1378,"children":1379},{"style":153},[1380],{"type":110,"value":1381},"msg.data.hex()",{"type":104,"tag":141,"props":1383,"children":1384},{"style":269},[1385],{"type":110,"value":387},{"type":104,"tag":141,"props":1387,"children":1388},{"style":285},[1389],{"type":110,"value":288},{"type":104,"tag":141,"props":1391,"children":1392},{"style":153},[1393],{"type":110,"value":311},{"type":104,"tag":433,"props":1395,"children":1397},{"id":1396},"iso-tp-2",[1398],{"type":110,"value":438},{"type":104,"tag":119,"props":1400,"children":1401},{},[1402,1407,1409,1415,1417,1422],{"type":104,"tag":137,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":110,"value":1120},{"type":110,"value":1408}," has no built-in support for ISO-TP, so we need to install the ",{"type":104,"tag":137,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":110,"value":1414},"can-isotp",{"type":110,"value":1416}," package first. Then we can send the same Read Data By Identifier request that we sent in previous examples. ",{"type":104,"tag":137,"props":1418,"children":1420},{"className":1419},[],[1421],{"type":110,"value":1414},{"type":110,"value":1423}," has an asynchronous API, so we need to keep polling the stack until the response is available.",{"type":104,"tag":130,"props":1425,"children":1427},{"code":1426,"language":133,"meta":99,"className":134,"style":99},"import isotp\n\naddr = isotp.Address(txid=0x7b7, rxid=0x7bf)\nparams = {\"tx_padding\": 0xaa}\nstack = isotp.CanStack(bus, address=addr, params=params)\nstack.send(b\"\\x22\\xf1\\x87\")\n\nwhile not stack.available():\n   stack.process()\n\nresp = stack.recv()\n",[1428],{"type":104,"tag":137,"props":1429,"children":1430},{"__ignoreMap":99},[1431,1443,1450,1501,1541,1586,1614,1621,1639,1647,1654],{"type":104,"tag":141,"props":1432,"children":1433},{"class":143,"line":9},[1434,1438],{"type":104,"tag":141,"props":1435,"children":1436},{"style":147},[1437],{"type":110,"value":161},{"type":104,"tag":141,"props":1439,"children":1440},{"style":153},[1441],{"type":110,"value":1442}," isotp\n",{"type":104,"tag":141,"props":1444,"children":1445},{"class":143,"line":14},[1446],{"type":104,"tag":141,"props":1447,"children":1448},{"emptyLinePlaceholder":193},[1449],{"type":110,"value":196},{"type":104,"tag":141,"props":1451,"children":1452},{"class":143,"line":19},[1453,1458,1462,1467,1472,1476,1480,1484,1489,1493,1497],{"type":104,"tag":141,"props":1454,"children":1455},{"style":153},[1456],{"type":110,"value":1457},"addr ",{"type":104,"tag":141,"props":1459,"children":1460},{"style":147},[1461],{"type":110,"value":209},{"type":104,"tag":141,"props":1463,"children":1464},{"style":153},[1465],{"type":110,"value":1466}," isotp.Address(",{"type":104,"tag":141,"props":1468,"children":1469},{"style":1184},[1470],{"type":110,"value":1471},"txid",{"type":104,"tag":141,"props":1473,"children":1474},{"style":147},[1475],{"type":110,"value":1245},{"type":104,"tag":141,"props":1477,"children":1478},{"style":269},[1479],{"type":110,"value":524},{"type":104,"tag":141,"props":1481,"children":1482},{"style":153},[1483],{"type":110,"value":277},{"type":104,"tag":141,"props":1485,"children":1486},{"style":1184},[1487],{"type":110,"value":1488},"rxid",{"type":104,"tag":141,"props":1490,"children":1491},{"style":147},[1492],{"type":110,"value":1245},{"type":104,"tag":141,"props":1494,"children":1495},{"style":269},[1496],{"type":110,"value":554},{"type":104,"tag":141,"props":1498,"children":1499},{"style":153},[1500],{"type":110,"value":311},{"type":104,"tag":141,"props":1502,"children":1503},{"class":143,"line":24},[1504,1509,1513,1518,1523,1527,1531,1536],{"type":104,"tag":141,"props":1505,"children":1506},{"style":153},[1507],{"type":110,"value":1508},"params ",{"type":104,"tag":141,"props":1510,"children":1511},{"style":147},[1512],{"type":110,"value":209},{"type":104,"tag":141,"props":1514,"children":1515},{"style":153},[1516],{"type":110,"value":1517}," {",{"type":104,"tag":141,"props":1519,"children":1520},{"style":285},[1521],{"type":110,"value":1522},"\"tx_padding\"",{"type":104,"tag":141,"props":1524,"children":1525},{"style":153},[1526],{"type":110,"value":410},{"type":104,"tag":141,"props":1528,"children":1529},{"style":147},[1530],{"type":110,"value":266},{"type":104,"tag":141,"props":1532,"children":1533},{"style":269},[1534],{"type":110,"value":1535},"aa",{"type":104,"tag":141,"props":1537,"children":1538},{"style":153},[1539],{"type":110,"value":1540},"}\n",{"type":104,"tag":141,"props":1542,"children":1543},{"class":143,"line":29},[1544,1549,1553,1558,1563,1567,1572,1577,1581],{"type":104,"tag":141,"props":1545,"children":1546},{"style":153},[1547],{"type":110,"value":1548},"stack ",{"type":104,"tag":141,"props":1550,"children":1551},{"style":147},[1552],{"type":110,"value":209},{"type":104,"tag":141,"props":1554,"children":1555},{"style":153},[1556],{"type":110,"value":1557}," isotp.CanStack(bus, ",{"type":104,"tag":141,"props":1559,"children":1560},{"style":1184},[1561],{"type":110,"value":1562},"address",{"type":104,"tag":141,"props":1564,"children":1565},{"style":147},[1566],{"type":110,"value":209},{"type":104,"tag":141,"props":1568,"children":1569},{"style":153},[1570],{"type":110,"value":1571},"addr, ",{"type":104,"tag":141,"props":1573,"children":1574},{"style":1184},[1575],{"type":110,"value":1576},"params",{"type":104,"tag":141,"props":1578,"children":1579},{"style":147},[1580],{"type":110,"value":209},{"type":104,"tag":141,"props":1582,"children":1583},{"style":153},[1584],{"type":110,"value":1585},"params)\n",{"type":104,"tag":141,"props":1587,"children":1588},{"class":143,"line":34},[1589,1594,1598,1602,1606,1610],{"type":104,"tag":141,"props":1590,"children":1591},{"style":153},[1592],{"type":110,"value":1593},"stack.send(",{"type":104,"tag":141,"props":1595,"children":1596},{"style":147},[1597],{"type":110,"value":282},{"type":104,"tag":141,"props":1599,"children":1600},{"style":285},[1601],{"type":110,"value":288},{"type":104,"tag":141,"props":1603,"children":1604},{"style":269},[1605],{"type":110,"value":507},{"type":104,"tag":141,"props":1607,"children":1608},{"style":285},[1609],{"type":110,"value":288},{"type":104,"tag":141,"props":1611,"children":1612},{"style":153},[1613],{"type":110,"value":311},{"type":104,"tag":141,"props":1615,"children":1616},{"class":143,"line":39},[1617],{"type":104,"tag":141,"props":1618,"children":1619},{"emptyLinePlaceholder":193},[1620],{"type":110,"value":196},{"type":104,"tag":141,"props":1622,"children":1623},{"class":143,"line":44},[1624,1629,1634],{"type":104,"tag":141,"props":1625,"children":1626},{"style":147},[1627],{"type":110,"value":1628},"while",{"type":104,"tag":141,"props":1630,"children":1631},{"style":147},[1632],{"type":110,"value":1633}," not",{"type":104,"tag":141,"props":1635,"children":1636},{"style":153},[1637],{"type":110,"value":1638}," stack.available():\n",{"type":104,"tag":141,"props":1640,"children":1641},{"class":143,"line":49},[1642],{"type":104,"tag":141,"props":1643,"children":1644},{"style":153},[1645],{"type":110,"value":1646},"   stack.process()\n",{"type":104,"tag":141,"props":1648,"children":1649},{"class":143,"line":54},[1650],{"type":104,"tag":141,"props":1651,"children":1652},{"emptyLinePlaceholder":193},[1653],{"type":110,"value":196},{"type":104,"tag":141,"props":1655,"children":1656},{"class":143,"line":59},[1657,1661,1665],{"type":104,"tag":141,"props":1658,"children":1659},{"style":153},[1660],{"type":110,"value":536},{"type":104,"tag":141,"props":1662,"children":1663},{"style":147},[1664],{"type":110,"value":209},{"type":104,"tag":141,"props":1666,"children":1667},{"style":153},[1668],{"type":110,"value":1669}," stack.recv()\n",{"type":104,"tag":112,"props":1671,"children":1673},{"id":1672},"scapy",[1674],{"type":110,"value":1675},"Scapy",{"type":104,"tag":119,"props":1677,"children":1678},{},[1679],{"type":110,"value":1680},"Scapy is a Python library for crafting and sending packets. It also has support for CAN, ISO-TP, UDS, and more automotive protocols. It can be a very powerful tool since it supports a large variety of protocols, and it's easy to use the same protocol over different communication networks. For example, it's possible to use the same UDS code to talk over CAN or Ethernet. The downside is that the code is sometimes a bit verbose.",{"type":104,"tag":119,"props":1682,"children":1683},{},[1684,1686,1691],{"type":110,"value":1685},"After installing ",{"type":104,"tag":137,"props":1687,"children":1689},{"className":1688},[],[1690],{"type":110,"value":1672},{"type":110,"value":1692},", we can send our first packets:",{"type":104,"tag":130,"props":1694,"children":1696},{"code":1695,"language":133,"meta":99,"className":134,"style":99},"from scapy.all import load_layer, load_contrib\n\nload_layer(\"can\")\nload_contrib('cansocket')\n\nsocket = CANSocket(channel='can0')\n\npacket = CAN(identifier=0x1aa, data=b'\\xaa\\xbb\\xcc\\xdd')\nsocket.send(packet)\n\nmsg = socket.recv()\nprint(f\"Arb ID {msg.identifier}: {msg.data.hex()}\")\n",[1697],{"type":104,"tag":137,"props":1698,"children":1699},{"__ignoreMap":99},[1700,1721,1728,1745,1762,1769,1802,1809,1872,1880,1887,1903],{"type":104,"tag":141,"props":1701,"children":1702},{"class":143,"line":9},[1703,1707,1712,1716],{"type":104,"tag":141,"props":1704,"children":1705},{"style":147},[1706],{"type":110,"value":150},{"type":104,"tag":141,"props":1708,"children":1709},{"style":153},[1710],{"type":110,"value":1711}," scapy.all ",{"type":104,"tag":141,"props":1713,"children":1714},{"style":147},[1715],{"type":110,"value":161},{"type":104,"tag":141,"props":1717,"children":1718},{"style":153},[1719],{"type":110,"value":1720}," load_layer, load_contrib\n",{"type":104,"tag":141,"props":1722,"children":1723},{"class":143,"line":14},[1724],{"type":104,"tag":141,"props":1725,"children":1726},{"emptyLinePlaceholder":193},[1727],{"type":110,"value":196},{"type":104,"tag":141,"props":1729,"children":1730},{"class":143,"line":19},[1731,1736,1741],{"type":104,"tag":141,"props":1732,"children":1733},{"style":153},[1734],{"type":110,"value":1735},"load_layer(",{"type":104,"tag":141,"props":1737,"children":1738},{"style":285},[1739],{"type":110,"value":1740},"\"can\"",{"type":104,"tag":141,"props":1742,"children":1743},{"style":153},[1744],{"type":110,"value":311},{"type":104,"tag":141,"props":1746,"children":1747},{"class":143,"line":24},[1748,1753,1758],{"type":104,"tag":141,"props":1749,"children":1750},{"style":153},[1751],{"type":110,"value":1752},"load_contrib(",{"type":104,"tag":141,"props":1754,"children":1755},{"style":285},[1756],{"type":110,"value":1757},"'cansocket'",{"type":104,"tag":141,"props":1759,"children":1760},{"style":153},[1761],{"type":110,"value":311},{"type":104,"tag":141,"props":1763,"children":1764},{"class":143,"line":29},[1765],{"type":104,"tag":141,"props":1766,"children":1767},{"emptyLinePlaceholder":193},[1768],{"type":110,"value":196},{"type":104,"tag":141,"props":1770,"children":1771},{"class":143,"line":34},[1772,1777,1781,1786,1790,1794,1798],{"type":104,"tag":141,"props":1773,"children":1774},{"style":153},[1775],{"type":110,"value":1776},"socket ",{"type":104,"tag":141,"props":1778,"children":1779},{"style":147},[1780],{"type":110,"value":209},{"type":104,"tag":141,"props":1782,"children":1783},{"style":153},[1784],{"type":110,"value":1785}," CANSocket(",{"type":104,"tag":141,"props":1787,"children":1788},{"style":1184},[1789],{"type":110,"value":1187},{"type":104,"tag":141,"props":1791,"children":1792},{"style":147},[1793],{"type":110,"value":209},{"type":104,"tag":141,"props":1795,"children":1796},{"style":285},[1797],{"type":110,"value":1196},{"type":104,"tag":141,"props":1799,"children":1800},{"style":153},[1801],{"type":110,"value":311},{"type":104,"tag":141,"props":1803,"children":1804},{"class":143,"line":39},[1805],{"type":104,"tag":141,"props":1806,"children":1807},{"emptyLinePlaceholder":193},[1808],{"type":110,"value":196},{"type":104,"tag":141,"props":1810,"children":1811},{"class":143,"line":44},[1812,1817,1821,1826,1831,1835,1839,1843,1847,1851,1855,1860,1864,1868],{"type":104,"tag":141,"props":1813,"children":1814},{"style":153},[1815],{"type":110,"value":1816},"packet ",{"type":104,"tag":141,"props":1818,"children":1819},{"style":147},[1820],{"type":110,"value":209},{"type":104,"tag":141,"props":1822,"children":1823},{"style":153},[1824],{"type":110,"value":1825}," CAN(",{"type":104,"tag":141,"props":1827,"children":1828},{"style":1184},[1829],{"type":110,"value":1830},"identifier",{"type":104,"tag":141,"props":1832,"children":1833},{"style":147},[1834],{"type":110,"value":1245},{"type":104,"tag":141,"props":1836,"children":1837},{"style":269},[1838],{"type":110,"value":272},{"type":104,"tag":141,"props":1840,"children":1841},{"style":153},[1842],{"type":110,"value":277},{"type":104,"tag":141,"props":1844,"children":1845},{"style":1184},[1846],{"type":110,"value":1258},{"type":104,"tag":141,"props":1848,"children":1849},{"style":147},[1850],{"type":110,"value":209},{"type":104,"tag":141,"props":1852,"children":1853},{"style":147},[1854],{"type":110,"value":282},{"type":104,"tag":141,"props":1856,"children":1857},{"style":285},[1858],{"type":110,"value":1859},"'",{"type":104,"tag":141,"props":1861,"children":1862},{"style":269},[1863],{"type":110,"value":293},{"type":104,"tag":141,"props":1865,"children":1866},{"style":285},[1867],{"type":110,"value":1859},{"type":104,"tag":141,"props":1869,"children":1870},{"style":153},[1871],{"type":110,"value":311},{"type":104,"tag":141,"props":1873,"children":1874},{"class":143,"line":49},[1875],{"type":104,"tag":141,"props":1876,"children":1877},{"style":153},[1878],{"type":110,"value":1879},"socket.send(packet)\n",{"type":104,"tag":141,"props":1881,"children":1882},{"class":143,"line":54},[1883],{"type":104,"tag":141,"props":1884,"children":1885},{"emptyLinePlaceholder":193},[1886],{"type":110,"value":196},{"type":104,"tag":141,"props":1888,"children":1889},{"class":143,"line":59},[1890,1894,1898],{"type":104,"tag":141,"props":1891,"children":1892},{"style":153},[1893],{"type":110,"value":1226},{"type":104,"tag":141,"props":1895,"children":1896},{"style":147},[1897],{"type":110,"value":209},{"type":104,"tag":141,"props":1899,"children":1900},{"style":153},[1901],{"type":110,"value":1902}," socket.recv()\n",{"type":104,"tag":141,"props":1904,"children":1905},{"class":143,"line":64},[1906,1911,1915,1919,1923,1927,1932,1936,1940,1944,1948,1952,1956],{"type":104,"tag":141,"props":1907,"children":1908},{"style":269},[1909],{"type":110,"value":1910},"print",{"type":104,"tag":141,"props":1912,"children":1913},{"style":153},[1914],{"type":110,"value":362},{"type":104,"tag":141,"props":1916,"children":1917},{"style":147},[1918],{"type":110,"value":367},{"type":104,"tag":141,"props":1920,"children":1921},{"style":285},[1922],{"type":110,"value":372},{"type":104,"tag":141,"props":1924,"children":1925},{"style":269},[1926],{"type":110,"value":377},{"type":104,"tag":141,"props":1928,"children":1929},{"style":153},[1930],{"type":110,"value":1931},"msg.identifier",{"type":104,"tag":141,"props":1933,"children":1934},{"style":269},[1935],{"type":110,"value":387},{"type":104,"tag":141,"props":1937,"children":1938},{"style":285},[1939],{"type":110,"value":410},{"type":104,"tag":141,"props":1941,"children":1942},{"style":269},[1943],{"type":110,"value":377},{"type":104,"tag":141,"props":1945,"children":1946},{"style":153},[1947],{"type":110,"value":1381},{"type":104,"tag":141,"props":1949,"children":1950},{"style":269},[1951],{"type":110,"value":387},{"type":104,"tag":141,"props":1953,"children":1954},{"style":285},[1955],{"type":110,"value":288},{"type":104,"tag":141,"props":1957,"children":1958},{"style":153},[1959],{"type":110,"value":311},{"type":104,"tag":433,"props":1961,"children":1963},{"id":1962},"iso-tp-3",[1964],{"type":110,"value":438},{"type":104,"tag":119,"props":1966,"children":1967},{},[1968,1970,1976],{"type":110,"value":1969},"By creating an ",{"type":104,"tag":137,"props":1971,"children":1973},{"className":1972},[],[1974],{"type":110,"value":1975},"ISOTPSoftSocket",{"type":110,"value":1977}," we can send ISO-TP messages over our existing SocketCAN socket:",{"type":104,"tag":130,"props":1979,"children":1981},{"code":1980,"language":133,"meta":99,"className":134,"style":99},"load_contrib('isotp')\n\nwith ISOTPSoftSocket(socket, tx_id=0x7b7, rx_id=0x7bf, padding=True) as isotp_socket:\n    resp = isotp_socket.sr1(ISOTP(b\"\\x22\\xf1\\x87\"))\n    print(resp.data)\n",[1982],{"type":104,"tag":137,"props":1983,"children":1984},{"__ignoreMap":99},[1985,2001,2008,2083,2120],{"type":104,"tag":141,"props":1986,"children":1987},{"class":143,"line":9},[1988,1992,1997],{"type":104,"tag":141,"props":1989,"children":1990},{"style":153},[1991],{"type":110,"value":1752},{"type":104,"tag":141,"props":1993,"children":1994},{"style":285},[1995],{"type":110,"value":1996},"'isotp'",{"type":104,"tag":141,"props":1998,"children":1999},{"style":153},[2000],{"type":110,"value":311},{"type":104,"tag":141,"props":2002,"children":2003},{"class":143,"line":14},[2004],{"type":104,"tag":141,"props":2005,"children":2006},{"emptyLinePlaceholder":193},[2007],{"type":110,"value":196},{"type":104,"tag":141,"props":2009,"children":2010},{"class":143,"line":19},[2011,2016,2021,2026,2030,2034,2038,2043,2047,2051,2055,2060,2064,2069,2074,2078],{"type":104,"tag":141,"props":2012,"children":2013},{"style":147},[2014],{"type":110,"value":2015},"with",{"type":104,"tag":141,"props":2017,"children":2018},{"style":153},[2019],{"type":110,"value":2020}," ISOTPSoftSocket(socket, ",{"type":104,"tag":141,"props":2022,"children":2023},{"style":1184},[2024],{"type":110,"value":2025},"tx_id",{"type":104,"tag":141,"props":2027,"children":2028},{"style":147},[2029],{"type":110,"value":1245},{"type":104,"tag":141,"props":2031,"children":2032},{"style":269},[2033],{"type":110,"value":524},{"type":104,"tag":141,"props":2035,"children":2036},{"style":153},[2037],{"type":110,"value":277},{"type":104,"tag":141,"props":2039,"children":2040},{"style":1184},[2041],{"type":110,"value":2042},"rx_id",{"type":104,"tag":141,"props":2044,"children":2045},{"style":147},[2046],{"type":110,"value":1245},{"type":104,"tag":141,"props":2048,"children":2049},{"style":269},[2050],{"type":110,"value":554},{"type":104,"tag":141,"props":2052,"children":2053},{"style":153},[2054],{"type":110,"value":277},{"type":104,"tag":141,"props":2056,"children":2057},{"style":1184},[2058],{"type":110,"value":2059},"padding",{"type":104,"tag":141,"props":2061,"children":2062},{"style":147},[2063],{"type":110,"value":209},{"type":104,"tag":141,"props":2065,"children":2066},{"style":269},[2067],{"type":110,"value":2068},"True",{"type":104,"tag":141,"props":2070,"children":2071},{"style":153},[2072],{"type":110,"value":2073},") ",{"type":104,"tag":141,"props":2075,"children":2076},{"style":147},[2077],{"type":110,"value":740},{"type":104,"tag":141,"props":2079,"children":2080},{"style":153},[2081],{"type":110,"value":2082}," isotp_socket:\n",{"type":104,"tag":141,"props":2084,"children":2085},{"class":143,"line":24},[2086,2090,2094,2099,2103,2107,2111,2115],{"type":104,"tag":141,"props":2087,"children":2088},{"style":153},[2089],{"type":110,"value":694},{"type":104,"tag":141,"props":2091,"children":2092},{"style":147},[2093],{"type":110,"value":209},{"type":104,"tag":141,"props":2095,"children":2096},{"style":153},[2097],{"type":110,"value":2098}," isotp_socket.sr1(ISOTP(",{"type":104,"tag":141,"props":2100,"children":2101},{"style":147},[2102],{"type":110,"value":282},{"type":104,"tag":141,"props":2104,"children":2105},{"style":285},[2106],{"type":110,"value":288},{"type":104,"tag":141,"props":2108,"children":2109},{"style":269},[2110],{"type":110,"value":507},{"type":104,"tag":141,"props":2112,"children":2113},{"style":285},[2114],{"type":110,"value":288},{"type":104,"tag":141,"props":2116,"children":2117},{"style":153},[2118],{"type":110,"value":2119},"))\n",{"type":104,"tag":141,"props":2121,"children":2122},{"class":143,"line":29},[2123,2127],{"type":104,"tag":141,"props":2124,"children":2125},{"style":269},[2126],{"type":110,"value":357},{"type":104,"tag":141,"props":2128,"children":2129},{"style":153},[2130],{"type":110,"value":2131},"(resp.data)\n",{"type":104,"tag":433,"props":2133,"children":2135},{"id":2134},"uds-1",[2136],{"type":110,"value":564},{"type":104,"tag":119,"props":2138,"children":2139},{},[2140,2142,2148,2150,2156],{"type":110,"value":2141},"By loading the ",{"type":104,"tag":137,"props":2143,"children":2145},{"className":2144},[],[2146],{"type":110,"value":2147},"automotive.uds",{"type":110,"value":2149}," layer we can send UDS messages over an ISO-TP socket. The UDS layer has support for many common UDS services, and can also be extended with custom services. We use ",{"type":104,"tag":137,"props":2151,"children":2153},{"className":2152},[],[2154],{"type":110,"value":2155},"UDS() / UDS_RDBI(identifiers=[0xf187])",{"type":110,"value":2157}," to craft the request.",{"type":104,"tag":130,"props":2159,"children":2161},{"code":2160,"language":133,"meta":99,"className":134,"style":99},"load_contrib('automotive.uds')\nwith ISOTPSoftSocket(socket, tx_id=0x7b7, rx_id=0x7bf, padding=True, basecls=UDS) as isotp_socket:\n    pkt = UDS() / UDS_RDBI(identifiers=[0xf187])\n    resp = isotp_socket.sr1(pkt)\n    print(resp.load)\n",[2162],{"type":104,"tag":137,"props":2163,"children":2164},{"__ignoreMap":99},[2165,2181,2265,2320,2336],{"type":104,"tag":141,"props":2166,"children":2167},{"class":143,"line":9},[2168,2172,2177],{"type":104,"tag":141,"props":2169,"children":2170},{"style":153},[2171],{"type":110,"value":1752},{"type":104,"tag":141,"props":2173,"children":2174},{"style":285},[2175],{"type":110,"value":2176},"'automotive.uds'",{"type":104,"tag":141,"props":2178,"children":2179},{"style":153},[2180],{"type":110,"value":311},{"type":104,"tag":141,"props":2182,"children":2183},{"class":143,"line":14},[2184,2188,2192,2196,2200,2204,2208,2212,2216,2220,2224,2228,2232,2236,2240,2245,2249,2253,2257,2261],{"type":104,"tag":141,"props":2185,"children":2186},{"style":147},[2187],{"type":110,"value":2015},{"type":104,"tag":141,"props":2189,"children":2190},{"style":153},[2191],{"type":110,"value":2020},{"type":104,"tag":141,"props":2193,"children":2194},{"style":1184},[2195],{"type":110,"value":2025},{"type":104,"tag":141,"props":2197,"children":2198},{"style":147},[2199],{"type":110,"value":1245},{"type":104,"tag":141,"props":2201,"children":2202},{"style":269},[2203],{"type":110,"value":524},{"type":104,"tag":141,"props":2205,"children":2206},{"style":153},[2207],{"type":110,"value":277},{"type":104,"tag":141,"props":2209,"children":2210},{"style":1184},[2211],{"type":110,"value":2042},{"type":104,"tag":141,"props":2213,"children":2214},{"style":147},[2215],{"type":110,"value":1245},{"type":104,"tag":141,"props":2217,"children":2218},{"style":269},[2219],{"type":110,"value":554},{"type":104,"tag":141,"props":2221,"children":2222},{"style":153},[2223],{"type":110,"value":277},{"type":104,"tag":141,"props":2225,"children":2226},{"style":1184},[2227],{"type":110,"value":2059},{"type":104,"tag":141,"props":2229,"children":2230},{"style":147},[2231],{"type":110,"value":209},{"type":104,"tag":141,"props":2233,"children":2234},{"style":269},[2235],{"type":110,"value":2068},{"type":104,"tag":141,"props":2237,"children":2238},{"style":153},[2239],{"type":110,"value":277},{"type":104,"tag":141,"props":2241,"children":2242},{"style":1184},[2243],{"type":110,"value":2244},"basecls",{"type":104,"tag":141,"props":2246,"children":2247},{"style":147},[2248],{"type":110,"value":209},{"type":104,"tag":141,"props":2250,"children":2251},{"style":269},[2252],{"type":110,"value":564},{"type":104,"tag":141,"props":2254,"children":2255},{"style":153},[2256],{"type":110,"value":2073},{"type":104,"tag":141,"props":2258,"children":2259},{"style":147},[2260],{"type":110,"value":740},{"type":104,"tag":141,"props":2262,"children":2263},{"style":153},[2264],{"type":110,"value":2082},{"type":104,"tag":141,"props":2266,"children":2267},{"class":143,"line":19},[2268,2273,2277,2282,2287,2292,2297,2301,2306,2310,2315],{"type":104,"tag":141,"props":2269,"children":2270},{"style":153},[2271],{"type":110,"value":2272},"    pkt ",{"type":104,"tag":141,"props":2274,"children":2275},{"style":147},[2276],{"type":110,"value":209},{"type":104,"tag":141,"props":2278,"children":2279},{"style":153},[2280],{"type":110,"value":2281}," UDS() ",{"type":104,"tag":141,"props":2283,"children":2284},{"style":147},[2285],{"type":110,"value":2286},"/",{"type":104,"tag":141,"props":2288,"children":2289},{"style":153},[2290],{"type":110,"value":2291}," UDS_RDBI(",{"type":104,"tag":141,"props":2293,"children":2294},{"style":1184},[2295],{"type":110,"value":2296},"identifiers",{"type":104,"tag":141,"props":2298,"children":2299},{"style":147},[2300],{"type":110,"value":209},{"type":104,"tag":141,"props":2302,"children":2303},{"style":153},[2304],{"type":110,"value":2305},"[",{"type":104,"tag":141,"props":2307,"children":2308},{"style":147},[2309],{"type":110,"value":266},{"type":104,"tag":141,"props":2311,"children":2312},{"style":269},[2313],{"type":110,"value":2314},"f187",{"type":104,"tag":141,"props":2316,"children":2317},{"style":153},[2318],{"type":110,"value":2319},"])\n",{"type":104,"tag":141,"props":2321,"children":2322},{"class":143,"line":24},[2323,2327,2331],{"type":104,"tag":141,"props":2324,"children":2325},{"style":153},[2326],{"type":110,"value":694},{"type":104,"tag":141,"props":2328,"children":2329},{"style":147},[2330],{"type":110,"value":209},{"type":104,"tag":141,"props":2332,"children":2333},{"style":153},[2334],{"type":110,"value":2335}," isotp_socket.sr1(pkt)\n",{"type":104,"tag":141,"props":2337,"children":2338},{"class":143,"line":29},[2339,2343],{"type":104,"tag":141,"props":2340,"children":2341},{"style":269},[2342],{"type":110,"value":357},{"type":104,"tag":141,"props":2344,"children":2345},{"style":153},[2346],{"type":110,"value":2347},"(resp.load)\n",{"type":104,"tag":2349,"props":2350,"children":2351},"style",{},[2352],{"type":110,"value":2353},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":99,"searchDepth":14,"depth":14,"links":2355},[2356,2360,2364,2367],{"id":114,"depth":14,"text":117,"children":2357},[2358,2359],{"id":435,"depth":19,"text":438},{"id":561,"depth":19,"text":564},{"id":789,"depth":14,"text":2361,"children":2362},"SocketCAN can-utils",[2363],{"id":915,"depth":19,"text":438},{"id":1120,"depth":14,"text":1120,"children":2365},[2366],{"id":1396,"depth":19,"text":438},{"id":1672,"depth":14,"text":1675,"children":2368},[2369,2370],{"id":1962,"depth":19,"text":438},{"id":2134,"depth":19,"text":564},"markdown","content:7.knowledge-base:3.tools:3.scripting.md","content","7.knowledge-base/3.tools/3.scripting.md","md",1778093002018]