[{"data":1,"prerenderedAt":772},["ShallowReactive",2],{"navigation":3,"\u002Fplatforms\u002Fble":116,"\u002Fplatforms\u002Fble-surround":767},[4,27,53,74,108,112],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":23,"path":24,"stem":25},"Example app and development","\u002Fgetting-started\u002Fdevelopment","1.getting-started\u002F4.development",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Guides","i-lucide-book-open","\u002Fguides","2.guides",[33,37,41,45,49],{"title":34,"path":35,"stem":36},"JavaScript API","\u002Fguides\u002Fjavascript-api","2.guides\u002F1.javascript-api",{"title":38,"path":39,"stem":40},"AT commands, exchange and CMUX","\u002Fguides\u002Fat-commands","2.guides\u002F2.at-commands",{"title":42,"path":43,"stem":44},"Rust","\u002Fguides\u002Frust","2.guides\u002F3.rust",{"title":46,"path":47,"stem":48},"Permissions","\u002Fguides\u002Fpermissions","2.guides\u002F4.permissions",{"title":50,"path":51,"stem":52},"Parsers","\u002Fguides\u002Fparsers","2.guides\u002F5.parsers",{"title":54,"icon":55,"path":56,"stem":57,"children":58,"page":26},"API reference","i-lucide-file-code","\u002Freference","3.reference",[59,63,67,71],{"title":60,"path":61,"stem":62},"SerialPort","\u002Freference\u002Fserial-port","3.reference\u002F1.serial-port",{"title":64,"path":65,"stem":66},"Types","\u002Freference\u002Ftypes","3.reference\u002F2.types",{"title":68,"path":69,"stem":70},"Tauri commands","\u002Freference\u002Fcommands","3.reference\u002F3.commands",{"title":46,"path":72,"stem":73},"\u002Freference\u002Fpermissions","3.reference\u002F4.permissions",{"title":75,"icon":76,"path":77,"stem":78,"children":79,"page":26},"Platforms","i-lucide-monitor-smartphone","\u002Fplatforms","4.platforms",[80,84,88,92,96,100,104],{"title":81,"path":82,"stem":83},"Overview","\u002Fplatforms\u002Foverview","4.platforms\u002F1.overview",{"title":85,"path":86,"stem":87},"Desktop","\u002Fplatforms\u002Fdesktop","4.platforms\u002F2.desktop",{"title":89,"path":90,"stem":91},"Android (USB)","\u002Fplatforms\u002Fandroid","4.platforms\u002F3.android",{"title":93,"path":94,"stem":95},"iOS","\u002Fplatforms\u002Fios","4.platforms\u002F4.ios",{"title":97,"path":98,"stem":99},"Serial over TCP","\u002Fplatforms\u002Ftcp","4.platforms\u002F5.tcp",{"title":101,"path":102,"stem":103},"Bluetooth LE (BLE)","\u002Fplatforms\u002Fble","4.platforms\u002F6.ble",{"title":105,"path":106,"stem":107},"DTR \u002F RTS on open","\u002Fplatforms\u002Fdtr-rts","4.platforms\u002F7.dtr-rts",{"title":109,"path":110,"stem":111},"Migration guide","\u002Fmigration","5.migration",{"title":113,"path":114,"stem":115},"Changelog","\u002Fchangelog","9.changelog",{"id":117,"title":101,"body":118,"description":760,"extension":761,"generated":26,"links":762,"meta":763,"navigation":764,"path":102,"seo":765,"stem":103,"__hash__":766},"docs\u002F4.platforms\u002F6.ble.md",{"type":119,"value":120,"toc":755},"minimark",[121,147,210,350,449,454,464,615,620,634,651,684,687,726,736,751],[122,123,124,125,129,130,133,134,138,139,142,143,146],"p",{},"With the ",[126,127,128],"code",{},"ble"," cargo feature, ",[126,131,132],{},"ble:\u002F\u002F\u003Cdevice id, MAC or name>"," talks to devices that\nexpose the ",[135,136,137],"strong",{},"Nordic UART Service"," (NUS): nRF52 boards, ESP32 BLE-UART sketches,\nAdafruit Bluefruit, micro:bit. HM-10 \u002F CC254x modules are not NUS (they use service\n",[126,140,141],{},"FFE0"," with one characteristic ",[126,144,145],{},"FFE1",") and are not supported.",[148,149,154],"pre",{"className":150,"code":151,"language":152,"meta":153,"style":153},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","tauri-plugin-serialplugin = { version = \"4\", features = [\"ble\"] }\n","toml","",[126,155,156],{"__ignoreMap":153},[157,158,161,165,169,172,175,177,180,184,187,190,193,195,198,200,202,204,207],"span",{"class":159,"line":160},"line",1,[157,162,164],{"class":163},"sTEyZ","tauri-plugin-serialplugin ",[157,166,168],{"class":167},"sMK4o","=",[157,170,171],{"class":167}," {",[157,173,174],{"class":163}," version ",[157,176,168],{"class":167},[157,178,179],{"class":167}," \"",[157,181,183],{"class":182},"sfazB","4",[157,185,186],{"class":167},"\"",[157,188,189],{"class":167},",",[157,191,192],{"class":163}," features ",[157,194,168],{"class":167},[157,196,197],{"class":167}," [",[157,199,186],{"class":167},[157,201,128],{"class":182},[157,203,186],{"class":167},[157,205,206],{"class":167},"]",[157,208,209],{"class":167}," }\n",[148,211,215],{"className":212,"code":213,"language":214,"meta":153,"style":153},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const found = await SerialPort.scanBlePorts({ timeoutMs: 4000 });\n\u002F\u002F { \"ble:\u002F\u002F\u003Cid>\": { type: \"BLE\", product: \"MyBoard\", rssi: \"-60\", … } }\nconst port = new SerialPort({ path: Object.keys(found)[0], baudRate: 115200 });\nawait port.open();\n","ts",[126,216,217,268,275,331],{"__ignoreMap":153},[157,218,219,223,226,228,232,235,238,242,245,248,252,255,259,262,265],{"class":159,"line":160},[157,220,222],{"class":221},"spNyl","const",[157,224,225],{"class":163}," found ",[157,227,168],{"class":167},[157,229,231],{"class":230},"s7zQu"," await",[157,233,234],{"class":163}," SerialPort",[157,236,237],{"class":167},".",[157,239,241],{"class":240},"s2Zo4","scanBlePorts",[157,243,244],{"class":163},"(",[157,246,247],{"class":167},"{",[157,249,251],{"class":250},"swJcz"," timeoutMs",[157,253,254],{"class":167},":",[157,256,258],{"class":257},"sbssI"," 4000",[157,260,261],{"class":167}," }",[157,263,264],{"class":163},")",[157,266,267],{"class":167},";\n",[157,269,271],{"class":159,"line":270},2,[157,272,274],{"class":273},"sHwdD","\u002F\u002F { \"ble:\u002F\u002F\u003Cid>\": { type: \"BLE\", product: \"MyBoard\", rssi: \"-60\", … } }\n",[157,276,278,280,283,285,288,290,292,294,297,299,302,304,307,310,313,315,317,320,322,325,327,329],{"class":159,"line":277},3,[157,279,222],{"class":221},[157,281,282],{"class":163}," port ",[157,284,168],{"class":167},[157,286,287],{"class":167}," new",[157,289,234],{"class":240},[157,291,244],{"class":163},[157,293,247],{"class":167},[157,295,296],{"class":250}," path",[157,298,254],{"class":167},[157,300,301],{"class":163}," Object",[157,303,237],{"class":167},[157,305,306],{"class":240},"keys",[157,308,309],{"class":163},"(found)[",[157,311,312],{"class":257},"0",[157,314,206],{"class":163},[157,316,189],{"class":167},[157,318,319],{"class":250}," baudRate",[157,321,254],{"class":167},[157,323,324],{"class":257}," 115200",[157,326,261],{"class":167},[157,328,264],{"class":163},[157,330,267],{"class":167},[157,332,334,337,340,342,345,348],{"class":159,"line":333},4,[157,335,336],{"class":230},"await",[157,338,339],{"class":163}," port",[157,341,237],{"class":167},[157,343,344],{"class":240},"open",[157,346,347],{"class":163},"()",[157,349,267],{"class":167},[351,352,353,360,370,388,407,425,435,446],"ul",{},[354,355,356,357,237],"li",{},"Writes go to the NUS RX characteristic in chunks of MTU − 3 bytes (at most 512, the\nlargest attribute value); TX notifications (or indications) become read data. When\nRX allows both write types, writes go without response and every 8th chunk with\nresponse, so the device can slow the sender down. A lost link ends in ",[126,358,359],{},"onDisconnect",[354,361,362,365,366,369],{},[126,363,364],{},"scanBlePorts()"," lists devices that advertise the NUS service UUID. ",[126,367,368],{},"open()"," by\nname or address scans for any device, so a board that does not advertise the UUID\ncan still be opened by name; the service is checked after connecting.",[354,371,372,373,376,377,380,381,383,384,387],{},"Port ids: ",[126,374,375],{},"ble:\u002F\u002F\u003CMAC>"," on Linux, Windows and Android (any case); macOS \u002F iOS hide\nthe MAC and give a per-host UUID (",[126,378,379],{},"ble:\u002F\u002F5D2A…","), which only that Mac knows.\nAn advertised name works everywhere. On desktop \u002F iOS an id or MAC match always\nwins and is taken at once; a name is used only when one device has it: after the\nfirst match the scan goes on for 1.5 s (within the 10 s find timeout), and if a\nsecond device with that name shows up, ",[126,382,368],{}," fails with an error listing their\n",[126,385,386],{},"ble:\u002F\u002F\u003Cid>"," paths instead of picking one; open the one you want by id.",[354,389,390,393,394,397,398,400,401,403,404,406],{},[135,391,392],{},"Timeout (desktop \u002F iOS):"," connect, service discovery and enabling notifications\nmust finish within 20 s (CoreBluetooth would otherwise try to connect forever);\nfinding the device has its own 10 s. Each write (one MTU chunk) must finish within\n5 s, else ",[126,395,396],{},"write()"," fails with a timeout instead of blocking the port; the link is\nthen dropped (a late completion of that write could otherwise be taken for the next\none), so the port ends with ",[126,399,359],{}," and is reopened like after link loss. If Bluetooth\nis off or the app is not authorized, ",[126,402,368],{}," and ",[126,405,364],{}," fail with a\nclear error.",[354,408,409,412,413,416,417,420,421,424],{},[135,410,411],{},"macOS \u002F iOS:"," add ",[126,414,415],{},"NSBluetoothAlwaysUsageDescription"," to\n",[126,418,419],{},"src-tauri\u002FInfo.plist"," (macOS) and ",[126,422,423],{},"src-tauri\u002FInfo.ios.plist"," (iOS). Without it\nthe OS kills the app on the first Bluetooth call. The example app has both.",[354,426,427,430,431,434],{},[135,428,429],{},"Linux:"," BlueZ, and ",[126,432,433],{},"libdbus-1-dev"," to build.",[354,436,437,440,441,237],{},[135,438,439],{},"Android:"," see ",[442,443,445],"a",{"href":444},"#android","below",[354,447,448],{},"Baud rate, parity and modem lines mean nothing over BLE and are only stored.",[450,451,453],"h2",{"id":452},"android","Android",[122,455,456,457,460,461,463],{},"Android uses its own ",[126,458,459],{},"BluetoothGatt"," bridge in the plugin's Kotlin code (btleplug\nis not built there), behind the same ",[126,462,128],{}," feature and the same API:",[351,465,466,485,491,500,514,530,542,555,565,571,603,612],{},[354,467,468,470,471,473,474,477,478,480,481,484],{},[126,469,364],{}," returns ",[126,472,375],{}," paths (e.g. ",[126,475,476],{},"ble:\u002F\u002FC4:4F:33:12:AB:01",");\n",[126,479,368],{}," also accepts ",[126,482,483],{},"ble:\u002F\u002F\u003Cadvertised name>",". A name is resolved from earlier\nscans of this app run, otherwise with a short scan (up to 10 s).",[354,486,487,490],{},[126,488,489],{},"open(\"ble:\u002F\u002F\u003CMAC>\")"," for a device that is not bonded and was not seen in a scan of\nthis app run first scans for that address (up to 5 s). Most nRF \u002F ESP32 boards use\na random static address and Android cannot connect to it until it has seen it.",[354,492,493,496,497,499],{},[135,494,495],{},"Timeout:"," one ",[126,498,368],{}," has a 20 s budget for everything: the scan, connect (with\none retry on the transient GATT errors 133, 62 and 129), service discovery, the MTU\nrequest, enabling notifications and pairing. Each step gets at most its own limit\n(discovery 10 s, MTU 3 s, notifications 5 s) and never more than what is left.",[354,501,502,503,505,506,509,510,513],{},"On connect the plugin waits 1.6 s before service discovery when the device is bonded\n(its Service Changed indication comes first), requests MTU 247 (Android 14+ always\nuses 517) and a high connection priority, enables notifications (or indications) on\nthe NUS TX characteristic and sends writes one at a time, in order. If the cached\nGATT table has no NUS (a reflashed board), it is refreshed once and discovered again.\nA Service Changed indication on an open port ends it with ",[126,504,359],{},". If a chunk fails after earlier\nchunks went out, ",[126,507,508],{},"write"," returns the bytes sent so far (so a ",[126,511,512],{},"write_all"," loop does not\nresend them); it fails only when nothing went out.",[354,515,516,519,520,522,523,525,526,529],{},[135,517,518],{},"Pairing:"," if the device refuses notifications until the link is encrypted (GATT\nstatus 5, 15 or 137), the plugin starts pairing (Android shows its prompt) and waits\nfor it within the ",[126,521,368],{}," budget, then retries once. If pairing does not finish in\ntime, ",[126,524,368],{}," fails with ",[126,527,528],{},"… requires pairing …","; pair the device and open again.",[354,531,532,535,536,538,539,237],{},[135,533,534],{},"Bluetooth switched off"," while a port is open closes the link and fires\n",[126,537,359],{}," (\"Bluetooth turned off\"). Opening or scanning with Bluetooth off fails\nwith ",[126,540,541],{},"Bluetooth is off",[354,543,544,547,548,550,551,554],{},[135,545,546],{},"Scan limit:"," Android lets an app start at most 5 scans per 30 s and then silently\nreturns nothing. The plugin counts its own scans (",[126,549,364],{},", name and address\nlookups) and fails fast with ",[126,552,553],{},"BLE scan throttled … retry in N s"," instead of an empty\nresult. Connecting by a name or MAC seen in an earlier scan needs no new scan.",[354,556,557,560,561,564],{},[135,558,559],{},"Receive buffer:"," notifications wait in a per-port queue of up to 1 MiB of unread\nbytes; ",[126,562,563],{},"bytesToRead()"," counts it. Past that, new notifications are dropped (with one\nwarning in the log) until the app reads again. The plugin's read loop normally drains\nit at once.",[354,566,567,570],{},[135,568,569],{},"Android 12 and older:"," the platform passes notification data through a shared\ncharacteristic object, so a peripheral that notifies very fast can have bytes lost or\nrepeated. This is an Android bug fixed in Android 13 and cannot be worked around here;\nadd flow control or framing with a checksum in the firmware if that matters.",[354,572,573,574,576,577,579,580,583,584,587,588,591,592,595,596,599,600,237],{},"The first ",[126,575,364],{}," \u002F ",[126,578,368],{}," asks for the runtime permission:\n",[135,581,582],{},"Nearby devices"," (",[126,585,586],{},"BLUETOOTH_SCAN"," + ",[126,589,590],{},"BLUETOOTH_CONNECT",") on Android 12+, location\n(",[126,593,594],{},"ACCESS_FINE_LOCATION",") on Android 11 and older. If the user declines, the call\nfails with ",[126,597,598],{},"Bluetooth permission denied (…)","; after \"don't ask again\" only the app\nsettings can grant it. When the app is in the background there is no dialog and the\ncall fails at once with ",[126,601,602],{},"… the app is in the background",[354,604,605,608,609,237],{},[135,606,607],{},"Location services"," (the system Location switch) must be on for BLE scans on\nAndroid 11 and older; otherwise the scan fails with ",[126,610,611],{},"Location services are off …",[354,613,614],{},"The emulator has no Bluetooth radio: test on a phone.",[616,617,619],"h3",{"id":618},"manifest","Manifest",[122,621,622,623,626,627,630,631,633],{},"The plugin's library manifest declares no Bluetooth or location permission (only\n",[126,624,625],{},"\u003Cuses-feature android:name=\"android.hardware.bluetooth_le\" android:required=\"false\" \u002F>",",\nwhich keeps the app installable on devices without BLE). An app built ",[135,628,629],{},"without"," the\n",[126,632,128],{}," feature gets no new permissions.",[122,635,124,636,638,639,642,643,646,647,650],{},[126,637,128],{}," feature, the plugin's ",[126,640,641],{},"build.rs"," writes this block into the app's\n",[126,644,645],{},"src-tauri\u002Fgen\u002Fandroid\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml"," when the Tauri CLI builds\nfor Android (between ",[126,648,649],{},"\u003C!-- SERIALPLUGIN BLE. AUTO-GENERATED. DO NOT REMOVE. -->","\nmarkers; dropping the feature empties the block again):",[148,652,656],{"className":653,"code":654,"language":655,"meta":153,"style":153},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cuses-permission android:name=\"android.permission.BLUETOOTH\" android:maxSdkVersion=\"30\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" android:maxSdkVersion=\"30\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" android:maxSdkVersion=\"30\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.BLUETOOTH_SCAN\" android:usesPermissionFlags=\"neverForLocation\" \u002F>\n\u003Cuses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\" \u002F>\n","xml",[126,657,658,663,668,673,678],{"__ignoreMap":153},[157,659,660],{"class":159,"line":160},[157,661,662],{},"\u003Cuses-permission android:name=\"android.permission.BLUETOOTH\" android:maxSdkVersion=\"30\" \u002F>\n",[157,664,665],{"class":159,"line":270},[157,666,667],{},"\u003Cuses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" android:maxSdkVersion=\"30\" \u002F>\n",[157,669,670],{"class":159,"line":277},[157,671,672],{},"\u003Cuses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" android:maxSdkVersion=\"30\" \u002F>\n",[157,674,675],{"class":159,"line":333},[157,676,677],{},"\u003Cuses-permission android:name=\"android.permission.BLUETOOTH_SCAN\" android:usesPermissionFlags=\"neverForLocation\" \u002F>\n",[157,679,681],{"class":159,"line":680},5,[157,682,683],{},"\u003Cuses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\" \u002F>\n",[122,685,686],{},"A permission the app already declares itself (outside the block) is left out of the\nblock, so the app's own line is kept exactly as written:",[351,688,689,698,711],{},[354,690,691,692,694,695,237],{},"Need location on every Android version (GPS, maps)? Declare\n",[126,693,594],{}," yourself without ",[126,696,697],{},"maxSdkVersion",[354,699,700,701,703,704,707,708,710],{},"Scan for beacons to derive location? Declare ",[126,702,586],{}," yourself without\n",[126,705,706],{},"neverForLocation",". The plugin then also asks for ",[126,709,594],{}," on\nAndroid 12+ (declare it too) and needs Location services on.",[354,712,713,714,717,718,721,722,725],{},"Do not want one of them at all? Declare it with ",[126,715,716],{},"tools:node=\"remove\"","\n(",[126,719,720],{},"xmlns:tools=\"http:\u002F\u002Fschemas.android.com\u002Ftools\""," on ",[126,723,724],{},"\u003Cmanifest>",").",[122,727,728,729,732,733,735],{},"The block lands in the app manifest, which has the highest merge priority, so its\n",[126,730,731],{},"maxSdkVersion=\"30\""," also caps the same permission declared by another library\n(for example a geolocation plugin). If another library needs location on Android 12+,\ndeclare ",[126,734,594],{}," in the app manifest yourself as above.",[122,737,738,739,741,742,744,745,747,748,237],{},"If the permissions are missing (for example the app was built with Gradle directly,\nnot through the Tauri CLI, so ",[126,740,641],{}," could not find the app manifest), ",[126,743,368],{}," and\n",[126,746,364],{}," fail with ",[126,749,750],{},"Bluetooth permission … is not declared in the app's AndroidManifest.xml",[752,753,754],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":153,"searchDepth":270,"depth":277,"links":756},[757],{"id":452,"depth":270,"text":453,"children":758},[759],{"id":618,"depth":277,"text":619},"ble:\u002F\u002F paths to Nordic UART Service devices behind the ble feature (desktop, iOS, Android).","md",null,{},true,{"title":101,"description":760},"lLXS5h2kfhUWHsw2NO6mOfw8ezR_PEeyzJOGqK9KnYY",[768,770],{"title":97,"path":98,"stem":99,"description":769,"children":-1},"tcp:\u002F\u002Fhost:port paths to a TCP serial bridge on every platform.",{"title":105,"path":106,"stem":107,"description":771,"children":-1},"Choosing the modem line levels when a port opens.",1794158002104]