@jjlmoya/utils-hardware 1.23.0 → 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/src/category/index.ts +4 -1
- package/src/entries.ts +10 -1
- package/src/index.ts +3 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/keyboardChatterTest/bibliography.astro +15 -0
- package/src/tool/keyboardChatterTest/bibliography.ts +20 -0
- package/src/tool/keyboardChatterTest/component.astro +353 -0
- package/src/tool/keyboardChatterTest/entry.ts +30 -0
- package/src/tool/keyboardChatterTest/i18n/de.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/en.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/es.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/fr.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/id.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/it.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/ja.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/ko.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/nl.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/pl.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/pt.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/ru.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/sv.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/tr.ts +232 -0
- package/src/tool/keyboardChatterTest/i18n/zh.ts +232 -0
- package/src/tool/keyboardChatterTest/index.ts +12 -0
- package/src/tool/keyboardChatterTest/keyboard-chatter-test.css +512 -0
- package/src/tool/keyboardChatterTest/logic.ts +23 -0
- package/src/tool/keyboardChatterTest/seo.astro +16 -0
- package/src/tool/keyboardChatterTest/ui.ts +34 -0
- package/src/tool/stereoAudioTest/bibliography.astro +14 -0
- package/src/tool/stereoAudioTest/bibliography.ts +16 -0
- package/src/tool/stereoAudioTest/component.astro +251 -0
- package/src/tool/stereoAudioTest/entry.ts +29 -0
- package/src/tool/stereoAudioTest/i18n/de.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/en.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/es.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/fr.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/id.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/it.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/ja.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/ko.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/nl.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/pl.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/pt.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/ru.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/sv.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/tr.ts +229 -0
- package/src/tool/stereoAudioTest/i18n/zh.ts +229 -0
- package/src/tool/stereoAudioTest/index.ts +11 -0
- package/src/tool/stereoAudioTest/logic.ts +22 -0
- package/src/tool/stereoAudioTest/seo.astro +15 -0
- package/src/tool/stereoAudioTest/stereo-audio-test.css +411 -0
- package/src/tool/stereoAudioTest/ui.ts +24 -0
- package/src/tool/webBluetoothBleScanner/bibliography.astro +14 -0
- package/src/tool/webBluetoothBleScanner/bibliography.ts +16 -0
- package/src/tool/webBluetoothBleScanner/component.astro +339 -0
- package/src/tool/webBluetoothBleScanner/entry.ts +29 -0
- package/src/tool/webBluetoothBleScanner/i18n/de.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/en.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/es.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/fr.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/id.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/it.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/ja.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/ko.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/nl.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/pl.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/pt.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/ru.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/sv.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/tr.ts +233 -0
- package/src/tool/webBluetoothBleScanner/i18n/zh.ts +233 -0
- package/src/tool/webBluetoothBleScanner/index.ts +11 -0
- package/src/tool/webBluetoothBleScanner/logic.ts +79 -0
- package/src/tool/webBluetoothBleScanner/seo.astro +15 -0
- package/src/tool/webBluetoothBleScanner/ui.ts +41 -0
- package/src/tool/webBluetoothBleScanner/web-bluetooth-ble-scanner.css +406 -0
- package/src/tools.ts +4 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { WebBluetoothBleScannerUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'web-bluetooth-ble-scanner';
|
|
7
|
+
const title = 'Web Bluetooth BLE Scanner';
|
|
8
|
+
const description = 'Scan nearby Bluetooth Low Energy devices from the browser, inspect exposed GATT service UUIDs, and test whether your IoT or wearable hardware is discoverable.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Can a website scan Bluetooth devices without permission?',
|
|
13
|
+
answer: 'No. Web Bluetooth always requires a user gesture and a browser permission chooser. This tool only sees the device you explicitly select, and it does not store MAC addresses, device IDs, or scan results.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: 'Why does the scanner not show every BLE device nearby?',
|
|
17
|
+
answer: 'Browsers intentionally expose Bluetooth through a permission picker, not as a silent background scanner. Some devices also stop advertising, hide their name, require pairing, or expose services only after a connection.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Which browsers support Web Bluetooth?',
|
|
21
|
+
answer: 'Web Bluetooth is best supported in Chromium-based desktop browsers such as Chrome and Edge. It usually requires HTTPS or localhost and is not available in many Firefox, Safari, and iOS browser configurations.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: 'Can this read private sensor data from a wearable?',
|
|
25
|
+
answer: 'Only if the device exposes compatible GATT services and the browser grants access. Many commercial wearables require vendor apps, encryption, bonding, or proprietary characteristics that a generic browser scanner cannot decode.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: 'What are GATT service UUIDs?',
|
|
29
|
+
answer: 'A GATT service UUID identifies a group of Bluetooth Low Energy features, such as Battery Service, Heart Rate, Device Information, or a custom vendor service used by maker and IoT hardware.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Use a compatible browser',
|
|
36
|
+
text: 'Open the tool in Chrome or Edge over HTTPS or localhost, then make sure Bluetooth is enabled on the computer or phone.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Put the hardware in advertising mode',
|
|
40
|
+
text: 'Wake the BLE device, power-cycle it, press its pairing button, or open its advertising mode so it appears in the browser permission chooser.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Scan the environment',
|
|
44
|
+
text: 'Press Scan Environment and select the BLE device you want to inspect. The browser permission dialog controls exactly which device becomes visible to the page.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Read the GATT services',
|
|
48
|
+
text: 'After connection, review the service UUID cards to identify standard Bluetooth profiles, custom firmware services, and whether the device exposes the data path you expected.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowTo> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'DeveloperApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
83
|
+
inLanguage: 'en',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<WebBluetoothBleScannerUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliography,
|
|
92
|
+
howTo: howToData,
|
|
93
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
seo: [
|
|
95
|
+
{
|
|
96
|
+
type: 'title',
|
|
97
|
+
text: 'BLE Tester Online for IoT, Wearables, and Maker Hardware',
|
|
98
|
+
level: 2,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: 'paragraph',
|
|
102
|
+
html: 'This Web Bluetooth scanner lets you test whether a nearby Bluetooth Low Energy device is discoverable from a browser and which GATT services it exposes after permission is granted. It is useful when debugging ESP32 firmware, Arduino BLE sketches, smart sensors, fitness wearables, keyboards, custom beacons, environmental monitors, and prototype hardware before building a native mobile app.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'message',
|
|
106
|
+
title: 'Privacy model',
|
|
107
|
+
html: 'GameBob does not store MAC addresses, device IDs, names, UUIDs, signal data, or scan history. The browser permission chooser decides which single device the page can access, and results stay in your current browser session.',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'table',
|
|
111
|
+
headers: ['What you see', 'What it means', 'What to check next'],
|
|
112
|
+
rows: [
|
|
113
|
+
['Device name', 'The advertised Bluetooth name, if the hardware broadcasts one.', 'If it is blank, check firmware advertising data or use a known name prefix during testing.'],
|
|
114
|
+
['Device ID', 'A browser-scoped identifier, not the raw public MAC address.', 'Use it only for this browser session; do not treat it as a universal hardware serial number.'],
|
|
115
|
+
['GATT service UUIDs', 'The service groups exposed after the connection is accepted.', 'Compare standard UUIDs with the Bluetooth SIG list or your firmware service table.'],
|
|
116
|
+
['Custom service', 'A vendor-specific or project-specific UUID.', 'Open your firmware, mobile app profile, or BLE documentation to map characteristics and permissions.'],
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: 'Why Browser Bluetooth Scanning Is Different',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Native BLE scanner apps often show continuous advertisements from many nearby devices. Web Bluetooth is deliberately stricter: the page must be opened in a secure context, the scan must start from a user click, and the browser shows a permission chooser. This protects users from silent tracking while still giving developers a practical way to connect to selected BLE hardware from JavaScript.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'comparative',
|
|
130
|
+
items: [
|
|
131
|
+
{
|
|
132
|
+
title: 'Web Bluetooth scanner',
|
|
133
|
+
description: 'Best for quick firmware validation, demos, support flows, classroom labs, and browser-based diagnostics where installation friction matters.',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
title: 'Native BLE app',
|
|
137
|
+
description: 'Better for background scanning, RSSI logging, pairing workflows, encrypted vendor protocols, large characteristic trees, and long-term field diagnostics.',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'title',
|
|
143
|
+
text: 'Common Reasons a BLE Device Does Not Appear',
|
|
144
|
+
level: 3,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'list',
|
|
148
|
+
items: [
|
|
149
|
+
'Bluetooth is disabled at the operating system level or the browser does not have Bluetooth permission.',
|
|
150
|
+
'The device is connected to another phone, laptop, vendor app, or gateway and has stopped advertising.',
|
|
151
|
+
'The hardware advertises only for a short window after boot or after pressing a pairing button.',
|
|
152
|
+
'The browser is not Chromium-based, the page is not served over HTTPS, or the platform blocks Web Bluetooth.',
|
|
153
|
+
'The firmware advertises manufacturer data but hides the local name, so the chooser may show an unnamed device.',
|
|
154
|
+
'The device requires bonding, encryption, or proprietary authentication before services become readable.',
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'title',
|
|
159
|
+
text: 'How to Use GATT UUIDs During Debugging',
|
|
160
|
+
level: 3,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'paragraph',
|
|
164
|
+
html: 'A successful connection with service UUIDs tells you that the browser can reach the peripheral and that the peripheral exposes at least part of its GATT table. Standard services such as Battery Service, Device Information, Heart Rate, Human Interface Device, and Environmental Sensing are easy to recognize. Custom UUIDs usually point to firmware-specific features and need the characteristic map from your source code or vendor documentation.',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'table',
|
|
168
|
+
headers: ['Symptom', 'Likely cause', 'Practical fix'],
|
|
169
|
+
rows: [
|
|
170
|
+
['Permission chooser is empty', 'Device is not advertising or browser support is missing.', 'Reboot the device, enable pairing mode, move closer, or retry in Chrome/Edge.'],
|
|
171
|
+
['Connection fails immediately', 'Device is busy, out of range, or rejects the browser connection.', 'Disconnect vendor apps and keep the peripheral near the computer.'],
|
|
172
|
+
['No services are listed', 'GATT is unavailable, services are hidden, or access was not granted for those UUIDs.', 'Add known optional services in firmware tests or inspect with a native BLE tool.'],
|
|
173
|
+
['Only custom UUIDs appear', 'The hardware uses vendor-specific firmware services.', 'Map UUIDs to source code constants and document characteristic read/write permissions.'],
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'title',
|
|
178
|
+
text: 'Security and Privacy Limits',
|
|
179
|
+
level: 3,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
type: 'list',
|
|
183
|
+
items: [
|
|
184
|
+
'The page cannot silently collect nearby Bluetooth devices in the background.',
|
|
185
|
+
'The browser may hide real MAC addresses and provide a scoped device ID instead.',
|
|
186
|
+
'Access starts only after the user clicks the scan button and chooses a device.',
|
|
187
|
+
'Results are not uploaded or stored by GameBob.',
|
|
188
|
+
'Sensitive commercial devices may require encryption or a vendor pairing flow that this generic scanner cannot bypass.',
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
ui: {
|
|
193
|
+
unsupportedTitle: 'Web Bluetooth is not available',
|
|
194
|
+
unsupportedBody: 'Try Chrome or Edge on desktop or Android, enable Bluetooth, and open the page over HTTPS or localhost.',
|
|
195
|
+
secureContext: 'Web Bluetooth requires a secure HTTPS page or localhost. Reload the tool from a secure origin and try again.',
|
|
196
|
+
scanButton: 'Scan Environment',
|
|
197
|
+
scanning: 'Scanning',
|
|
198
|
+
reconnect: 'Scan again',
|
|
199
|
+
disconnect: 'Disconnect',
|
|
200
|
+
privacyTitle: 'Private by design',
|
|
201
|
+
privacyBody: 'GameBob does not store MAC addresses, device IDs, names, UUIDs, or scan history. The browser only exposes the device you choose.',
|
|
202
|
+
deviceLabel: 'Selected device',
|
|
203
|
+
nameFallback: 'Unnamed BLE device',
|
|
204
|
+
idLabel: 'Browser device ID',
|
|
205
|
+
servicesLabel: 'GATT services',
|
|
206
|
+
noServices: 'No readable primary services were returned for this connection.',
|
|
207
|
+
statusIdle: 'Ready to scan nearby BLE hardware',
|
|
208
|
+
statusPermission: 'Waiting for the browser permission chooser',
|
|
209
|
+
statusConnecting: 'Connecting to the selected BLE device',
|
|
210
|
+
statusConnected: 'Connected and services loaded',
|
|
211
|
+
statusDisconnected: 'Device disconnected',
|
|
212
|
+
statusCancelled: 'No BLE device was selected, or Bluetooth is turned off/unavailable on this device.',
|
|
213
|
+
statusUnavailable: 'Bluetooth appears to be turned off, blocked, or missing on this device. Enable Bluetooth or try from hardware that has a BLE adapter.',
|
|
214
|
+
statusError: 'Bluetooth scan failed',
|
|
215
|
+
signalUnknown: 'Signal strength is controlled by the browser chooser',
|
|
216
|
+
gattUnavailable: 'This device did not expose a GATT server to the browser',
|
|
217
|
+
customServiceName: 'Custom or vendor-specific service',
|
|
218
|
+
serviceGenericAccess: 'Generic Access',
|
|
219
|
+
serviceGenericAttribute: 'Generic Attribute',
|
|
220
|
+
serviceDeviceInformation: 'Device Information',
|
|
221
|
+
serviceHeartRate: 'Heart Rate',
|
|
222
|
+
serviceBattery: 'Battery Service',
|
|
223
|
+
serviceHumanInterfaceDevice: 'Human Interface Device',
|
|
224
|
+
serviceCyclingSpeedCadence: 'Cycling Speed and Cadence',
|
|
225
|
+
serviceEnvironmentalSensing: 'Environmental Sensing',
|
|
226
|
+
serviceUserData: 'User Data',
|
|
227
|
+
serviceFitnessMachine: 'Fitness Machine',
|
|
228
|
+
uuidHelp: 'UUIDs identify Bluetooth services. Standard services are named automatically; vendor-specific UUIDs need your firmware or device documentation.',
|
|
229
|
+
compatibilityHint: 'Works best in Chromium-based browsers with Bluetooth enabled. Web Bluetooth is intentionally permission-gated and may not show every nearby advertiser.',
|
|
230
|
+
serviceCountSingular: 'service',
|
|
231
|
+
serviceCountPlural: 'services',
|
|
232
|
+
},
|
|
233
|
+
};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { WebBluetoothBleScannerUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'escaner-ble-web-bluetooth';
|
|
7
|
+
const title = 'Escáner Web Bluetooth BLE';
|
|
8
|
+
const description = 'Escanea dispositivos Bluetooth Low Energy cercanos desde el navegador, inspecciona los UUIDs de servicios GATT expuestos y prueba si tu hardware IoT o wearable es detectable.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: '¿Puede un sitio web escanear dispositivos Bluetooth sin permiso?',
|
|
13
|
+
answer: 'No. Web Bluetooth siempre requiere un gesto del usuario y un selector de permisos del navegador. Esta herramienta solo ve el dispositivo que seleccionas explícitamente y no almacena direcciones MAC, IDs de dispositivo ni resultados del escaneo.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
question: '¿Por qué el escáner no muestra todos los dispositivos BLE cercanos?',
|
|
17
|
+
answer: 'Los navegadores exponen Bluetooth intencionadamente a través de un selector de permisos, no como un escáner silencioso en segundo plano. Algunos dispositivos también dejan de anunciarse, ocultan su nombre, requieren emparejamiento o exponen servicios solo tras la conexión.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: '¿Qué navegadores admiten Web Bluetooth?',
|
|
21
|
+
answer: 'Web Bluetooth funciona mejor en navegadores de escritorio basados en Chromium como Chrome y Edge. Normalmente requiere HTTPS o localhost y no está disponible en muchas configuraciones de Firefox, Safari y navegadores de iOS.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
question: '¿Puede leer datos privados de sensores de un wearable?',
|
|
25
|
+
answer: 'Solo si el dispositivo expone servicios GATT compatibles y el navegador concede acceso. Muchos wearables comerciales requieren aplicaciones del fabricante, cifrado, vinculación o características propietarias que un escáner de navegador genérico no puede decodificar.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
question: '¿Qué son los UUIDs de servicio GATT?',
|
|
29
|
+
answer: 'Un UUID de servicio GATT identifica un grupo de funcionalidades Bluetooth Low Energy, como Servicio de Batería, Frecuencia Cardíaca, Información del Dispositivo o un servicio personalizado del fabricante usado por hardware maker e IoT.',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const howToData = [
|
|
34
|
+
{
|
|
35
|
+
name: 'Usa un navegador compatible',
|
|
36
|
+
text: 'Abre la herramienta en Chrome o Edge a través de HTTPS o localhost y asegúrate de que Bluetooth esté activado en el ordenador o teléfono.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Pon el hardware en modo publicitario',
|
|
40
|
+
text: 'Activa el dispositivo BLE, apágalo y enciéndelo, pulsa su botón de emparejamiento o abre su modo publicitario para que aparezca en el selector de permisos del navegador.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'Escanea el entorno',
|
|
44
|
+
text: 'Pulsa Escanear Entorno y selecciona el dispositivo BLE que quieres inspeccionar. El diálogo de permisos del navegador controla exactamente qué dispositivo se vuelve visible para la página.',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Lee los servicios GATT',
|
|
48
|
+
text: 'Tras la conexión, revisa las tarjetas de UUID de servicio para identificar perfiles Bluetooth estándar, servicios de firmware personalizados y si el dispositivo expone la ruta de datos que esperabas.',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
53
|
+
'@context': 'https://schema.org',
|
|
54
|
+
'@type': 'FAQPage',
|
|
55
|
+
mainEntity: faqData.map((item) => ({
|
|
56
|
+
'@type': 'Question',
|
|
57
|
+
name: item.question,
|
|
58
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const howToSchema: WithContext<HowTo> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'HowTo',
|
|
65
|
+
name: title,
|
|
66
|
+
description,
|
|
67
|
+
step: howToData.map((step, i) => ({
|
|
68
|
+
'@type': 'HowToStep',
|
|
69
|
+
position: i + 1,
|
|
70
|
+
name: step.name,
|
|
71
|
+
text: step.text,
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
76
|
+
'@context': 'https://schema.org',
|
|
77
|
+
'@type': 'SoftwareApplication',
|
|
78
|
+
name: title,
|
|
79
|
+
description,
|
|
80
|
+
applicationCategory: 'DeveloperApplication',
|
|
81
|
+
operatingSystem: 'All',
|
|
82
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
83
|
+
inLanguage: 'es',
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: ToolLocaleContent<WebBluetoothBleScannerUI> = {
|
|
87
|
+
slug,
|
|
88
|
+
title,
|
|
89
|
+
description,
|
|
90
|
+
faq: faqData,
|
|
91
|
+
bibliography,
|
|
92
|
+
howTo: howToData,
|
|
93
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
94
|
+
seo: [
|
|
95
|
+
{
|
|
96
|
+
type: 'title',
|
|
97
|
+
text: 'Probador BLE online para IoT, Wearables y Hardware Maker',
|
|
98
|
+
level: 2,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: 'paragraph',
|
|
102
|
+
html: 'Este escáner Web Bluetooth te permite probar si un dispositivo Bluetooth Low Energy cercano es detectable desde un navegador y qué servicios GATT expone tras conceder el permiso. Es útil para depurar firmware ESP32, sketches Arduino BLE, sensores inteligentes, wearables de fitness, teclados, balizas personalizadas, monitores ambientales y hardware prototipo antes de crear una aplicación móvil nativa.',
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'message',
|
|
106
|
+
title: 'Modelo de privacidad',
|
|
107
|
+
html: 'GameBob no almacena direcciones MAC, IDs de dispositivo, nombres, UUIDs, datos de señal ni historial de escaneos. El selector de permisos del navegador decide a qué único dispositivo puede acceder la página y los resultados permanecen en tu sesión actual del navegador.',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'table',
|
|
111
|
+
headers: ['Lo que ves', 'Lo que significa', 'Qué comprobar a continuación'],
|
|
112
|
+
rows: [
|
|
113
|
+
['Nombre del dispositivo', 'El nombre Bluetooth anunciado, si el hardware lo emite.', 'Si está vacío, revisa los datos publicitarios del firmware o usa un prefijo de nombre conocido durante las pruebas.'],
|
|
114
|
+
['ID del dispositivo', 'Un identificador con ámbito de navegador, no la dirección MAC pública real.', 'Úsalo solo para esta sesión del navegador; no lo trates como un número de serie universal del hardware.'],
|
|
115
|
+
['UUIDs de servicio GATT', 'Los grupos de servicios expuestos tras aceptar la conexión.', 'Compara los UUIDs estándar con la lista de Bluetooth SIG o tu tabla de servicios del firmware.'],
|
|
116
|
+
['Servicio personalizado', 'Un UUID específico del fabricante o del proyecto.', 'Abre tu firmware, perfil de app móvil o documentación BLE para mapear características y permisos.'],
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'title',
|
|
121
|
+
text: 'Por qué el escaneo Bluetooth del navegador es diferente',
|
|
122
|
+
level: 3,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'paragraph',
|
|
126
|
+
html: 'Las aplicaciones nativas de escáner BLE a menudo muestran anuncios continuos de muchos dispositivos cercanos. Web Bluetooth es deliberadamente más estricto: la página debe abrirse en un contexto seguro, el escaneo debe iniciarse con un clic del usuario y el navegador muestra un selector de permisos. Esto protege a los usuarios del seguimiento silencioso a la vez que da a los desarrolladores una forma práctica de conectarse al hardware BLE seleccionado desde JavaScript.',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'comparative',
|
|
130
|
+
items: [
|
|
131
|
+
{
|
|
132
|
+
title: 'Escáner Web Bluetooth',
|
|
133
|
+
description: 'Ideal para validación rápida de firmware, demos, flujos de soporte, laboratorios educativos y diagnósticos basados en navegador donde importa la fricción de instalación.',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
title: 'App BLE nativa',
|
|
137
|
+
description: 'Mejor para escaneo en segundo plano, registro RSSI, flujos de emparejamiento, protocolos cifrados del fabricante, grandes árboles de características y diagnósticos de campo a largo plazo.',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'title',
|
|
143
|
+
text: 'Razones comunes por las que un dispositivo BLE no aparece',
|
|
144
|
+
level: 3,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'list',
|
|
148
|
+
items: [
|
|
149
|
+
'Bluetooth está desactivado a nivel del sistema operativo o el navegador no tiene permiso de Bluetooth.',
|
|
150
|
+
'El dispositivo está conectado a otro teléfono, portátil, aplicación del fabricante o pasarela y ha dejado de anunciarse.',
|
|
151
|
+
'El hardware se anuncia solo durante un breve periodo tras el arranque o tras pulsar un botón de emparejamiento.',
|
|
152
|
+
'El navegador no está basado en Chromium, la página no se sirve por HTTPS o la plataforma bloquea Web Bluetooth.',
|
|
153
|
+
'El firmware anuncia datos del fabricante pero oculta el nombre local, por lo que el selector puede mostrar un dispositivo sin nombre.',
|
|
154
|
+
'El dispositivo requiere vinculación, cifrado o autenticación propietaria antes de que los servicios sean legibles.',
|
|
155
|
+
],
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'title',
|
|
159
|
+
text: 'Cómo usar UUIDs GATT durante la depuración',
|
|
160
|
+
level: 3,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
type: 'paragraph',
|
|
164
|
+
html: 'Una conexión exitosa con UUIDs de servicio te indica que el navegador puede alcanzar el periférico y que el periférico expone al menos parte de su tabla GATT. Los servicios estándar como Servicio de Batería, Información del Dispositivo, Frecuencia Cardíaca, Dispositivo de Interfaz Humana y Detección Ambiental son fáciles de reconocer. Los UUIDs personalizados normalmente apuntan a funciones específicas del firmware y necesitan el mapa de características de tu código fuente o documentación del fabricante.',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
type: 'table',
|
|
168
|
+
headers: ['Síntoma', 'Causa probable', 'Solución práctica'],
|
|
169
|
+
rows: [
|
|
170
|
+
['El selector de permisos está vacío', 'El dispositivo no se está anunciando o falta soporte del navegador.', 'Reinicia el dispositivo, activa el modo de emparejamiento, acércate o reintenta en Chrome/Edge.'],
|
|
171
|
+
['La conexión falla inmediatamente', 'El dispositivo está ocupado, fuera de alcance o rechaza la conexión del navegador.', 'Desconecta las aplicaciones del fabricante y mantén el periférico cerca del ordenador.'],
|
|
172
|
+
['No se listan servicios', 'GATT no está disponible, los servicios están ocultos o no se concedió acceso para esos UUIDs.', 'Añade servicios opcionales conocidos en pruebas de firmware o inspecciona con una herramienta BLE nativa.'],
|
|
173
|
+
['Solo aparecen UUIDs personalizados', 'El hardware usa servicios de firmware específicos del fabricante.', 'Mapea los UUIDs a constantes del código fuente y documenta los permisos de lectura/escritura de características.'],
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
type: 'title',
|
|
178
|
+
text: 'Límites de seguridad y privacidad',
|
|
179
|
+
level: 3,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
type: 'list',
|
|
183
|
+
items: [
|
|
184
|
+
'La página no puede recopilar silenciosamente dispositivos Bluetooth cercanos en segundo plano.',
|
|
185
|
+
'El navegador puede ocultar las direcciones MAC reales y proporcionar en su lugar un ID de dispositivo con ámbito.',
|
|
186
|
+
'El acceso solo comienza después de que el usuario haga clic en el botón de escanear y elija un dispositivo.',
|
|
187
|
+
'GameBob no sube ni almacena los resultados.',
|
|
188
|
+
'Los dispositivos comerciales sensibles pueden requerir cifrado o un flujo de emparejamiento del fabricante que este escáner genérico no puede eludir.',
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
ui: {
|
|
193
|
+
unsupportedTitle: 'Web Bluetooth no está disponible',
|
|
194
|
+
unsupportedBody: 'Prueba Chrome o Edge en escritorio o Android, activa Bluetooth y abre la página a través de HTTPS o localhost.',
|
|
195
|
+
secureContext: 'Web Bluetooth requiere una página HTTPS segura o localhost. Recarga la herramienta desde un origen seguro e inténtalo de nuevo.',
|
|
196
|
+
scanButton: 'Escanear Entorno',
|
|
197
|
+
scanning: 'Escaneando',
|
|
198
|
+
reconnect: 'Escanear de nuevo',
|
|
199
|
+
disconnect: 'Desconectar',
|
|
200
|
+
privacyTitle: 'Privacidad por diseño',
|
|
201
|
+
privacyBody: 'GameBob no almacena direcciones MAC, IDs de dispositivo, nombres, UUIDs ni historial de escaneos. El navegador solo expone el dispositivo que tú eliges.',
|
|
202
|
+
deviceLabel: 'Dispositivo seleccionado',
|
|
203
|
+
nameFallback: 'Dispositivo BLE sin nombre',
|
|
204
|
+
idLabel: 'ID de dispositivo del navegador',
|
|
205
|
+
servicesLabel: 'Servicios GATT',
|
|
206
|
+
noServices: 'No se devolvieron servicios primarios legibles para esta conexión.',
|
|
207
|
+
statusIdle: 'Listo para escanear hardware BLE cercano',
|
|
208
|
+
statusPermission: 'Esperando el selector de permisos del navegador',
|
|
209
|
+
statusConnecting: 'Conectando al dispositivo BLE seleccionado',
|
|
210
|
+
statusConnected: 'Conectado y servicios cargados',
|
|
211
|
+
statusDisconnected: 'Dispositivo desconectado',
|
|
212
|
+
statusCancelled: 'No se seleccionó ningún dispositivo BLE o Bluetooth está apagado/no disponible en este dispositivo.',
|
|
213
|
+
statusUnavailable: 'Bluetooth parece estar apagado, bloqueado o ausente en este dispositivo. Activa Bluetooth o prueba desde hardware que tenga un adaptador BLE.',
|
|
214
|
+
statusError: 'Escaneo Bluetooth fallido',
|
|
215
|
+
signalUnknown: 'La intensidad de la señal es controlada por el selector del navegador',
|
|
216
|
+
gattUnavailable: 'Este dispositivo no expuso un servidor GATT al navegador',
|
|
217
|
+
customServiceName: 'Servicio personalizado o específico del fabricante',
|
|
218
|
+
serviceGenericAccess: 'Acceso Genérico',
|
|
219
|
+
serviceGenericAttribute: 'Atributo Genérico',
|
|
220
|
+
serviceDeviceInformation: 'Información del Dispositivo',
|
|
221
|
+
serviceHeartRate: 'Frecuencia Cardíaca',
|
|
222
|
+
serviceBattery: 'Servicio de Batería',
|
|
223
|
+
serviceHumanInterfaceDevice: 'Dispositivo de Interfaz Humana',
|
|
224
|
+
serviceCyclingSpeedCadence: 'Velocidad y Cadencia de Ciclismo',
|
|
225
|
+
serviceEnvironmentalSensing: 'Detección Ambiental',
|
|
226
|
+
serviceUserData: 'Datos de Usuario',
|
|
227
|
+
serviceFitnessMachine: 'Máquina de Fitness',
|
|
228
|
+
uuidHelp: 'Los UUIDs identifican servicios Bluetooth. Los servicios estándar se nombran automáticamente; los UUIDs específicos del fabricante necesitan la documentación de tu firmware o dispositivo.',
|
|
229
|
+
compatibilityHint: 'Funciona mejor en navegadores basados en Chromium con Bluetooth activado. Web Bluetooth está intencionadamente limitado por permisos y puede no mostrar todos los anunciantes cercanos.',
|
|
230
|
+
serviceCountSingular: 'servicio',
|
|
231
|
+
serviceCountPlural: 'servicios',
|
|
232
|
+
},
|
|
233
|
+
};
|