31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/sendFile/languages/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "btn_cancel_experiment": "Cancel experiment",
3 | "btn_task_done": "Task completed",
4 | "btn_task_not_done": "Task could not be completed",
5 | "dialog_bt_guide": "Guide",
6 | "dialog_bt_guide_step1": "Open the Bluetooth settings on the smartphone.",
7 | "dialog_bt_guide_step2": "Connect the smartphone to the device with the name ",
8 | "dialog_btn_cancel": "Cancel",
9 | "dialog_btn_go_to_task": "Go to the task",
10 | "dialog_btn_waiting_for_connection": "Waiting for connection…",
11 | "dialog_header": "🛜 Bluetooth connection",
12 | "dialog_text": "To start the task, you must first connect the smartphone to the browser via Bluetooth.",
13 | "loading": "Loading…",
14 | "pairing_code": "Pairing code",
15 | "task": "Task",
16 | "task_description": "Your task is to send a file to the browser via Bluetooth. If you no longer have the website open, go back to the website. Alternatively, you can also find a link to the website on your smartphone's home screen. Now select the photo that is already on the device using the buttons below and send it to the browser via Bluetooth by pressing the \"Send file via Bluetooth\" button.",
17 | "title": "File send"
18 | }
--------------------------------------------------------------------------------
/sendFile/languages/de.json:
--------------------------------------------------------------------------------
1 | {
2 | "btn_cancel_experiment": "Experiment abbrechen",
3 | "btn_task_done": "Aufgabe erledigt",
4 | "btn_task_not_done": "Aufgabe konnte nicht erledigt werden",
5 | "dialog_bt_guide": "Anleitung",
6 | "dialog_bt_guide_step1": "Öffne die Bluetooth Einstellungen auf dem Smartphone.",
7 | "dialog_bt_guide_step2": "Verbinde das Smartphone mit dem Gerät mit dem Namen ",
8 | "dialog_btn_cancel": "Abbrechen",
9 | "dialog_btn_go_to_task": "Zur Aufgabe",
10 | "dialog_btn_waiting_for_connection": "Warte auf Verbindung…",
11 | "dialog_header": "🛜 Bluetooth Verbindung",
12 | "dialog_text": "Um die Aufgabe zu starten, musst du zuerst das Smartphone per Bluetooth mit dem Browser verbinden.",
13 | "loading": "Lade…",
14 | "pairing_code": "Kopplungscode",
15 | "task": "Aufgabe",
16 | "task_description": "Deine Aufgabe ist es, eine Datei per Bluetooth an den Browser zu senden. Falls du aktuell nicht mehr die Webseite geöffnet hast, gehe zurück zur Webseite. Alternativ findest du auch auf dem Startbildschirm des Smartphones einen Link zur Webseite. Wähle nun das Foto aus, das sich bereits auf dem Gerät befindet, indem du die Schaltflächen unten verwendest und sende es durch Drücken des Knopfes „Datei per Bluetooth senden“ per Bluetooth an den Browser.",
17 | "title": "Datei senden"
18 | }
--------------------------------------------------------------------------------
/2fa-device/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Zwei-Faktor-Authentifizierung
9 |
15 |
16 |
17 |
18 |
19 |
Zwei-Faktor-Authentifizierung
20 |
21 |
22 |
Ersteinrichtung
23 |
24 | Damit du dein Telefon zur Verifizierung von Transaktionen verwenden kannst verbinde es bitte per Bluetooth mit dem 2FA Bluetooth Bridge.
25 | Gehe dazu in die Bluetooth Einstellungen deines Smartphones und suche nach dem Gerät 2FA Bluetooth Bridge.
26 | Nachdem die Kopplung erfolgreich war, kannst du dein Telefon zur Verifizierung von Transaktionen verwenden.
27 | Anschließend findest du dann hier die zu bestätigenden Aufträge.
28 |
29 | Aktueller Status: Nicht Verbunden
30 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/logger.js:
--------------------------------------------------------------------------------
1 | function actionIdToString(actionId) {
2 | switch (actionId) {
3 | case 0:
4 | return 'started Experiment';
5 | case 1:
6 | return 'connected his Smartphone via Bluetooth';
7 | case 2:
8 | return 'disconnected his Smartphone';
9 | case 3:
10 | return 'pressed the "Go to Task" button in the dialog';
11 | case 4:
12 | return 'pressed the cancel button in the dialog';
13 | case 5:
14 | return 'confirmed the pairing code on his Smartphone';
15 | case 6:
16 | return 'started remote control';
17 | case 7:
18 | return 'stopped remote control';
19 | case 8:
20 | return 'finished the task';
21 | case 9:
22 | return 'could not finish the task';
23 | case 10:
24 | return 'submitted the survey';
25 | case 11:
26 | return 'skipped the survey';
27 | case 200:
28 | return 'went to the cancel Experiment page';
29 | case 201:
30 | return 'went back to the Experiment';
31 | case 202:
32 | return 'cancelled the Experiment but went to the survey';
33 | case 203:
34 | return 'completly cancelled the Experiment';
35 | case 254:
36 | return 'encountered an error';
37 | case 255:
38 | return 'completed Experiment';
39 | default:
40 | return 'did something';
41 | }
42 | }
43 |
44 | async function logParticipantAction(actionId) {
45 | console.log(`🕵️ Participant ${actionIdToString(actionId)}.`);
46 |
47 | const formData = new FormData();
48 | formData.append("action", actionId);
49 |
50 | const myRequest = new Request("/logger.php", {
51 | method: "POST",
52 | body: formData
53 | });
54 |
55 | await fetch(myRequest);
56 | }
--------------------------------------------------------------------------------
/control/languages/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "btn_cancel_experiment": "Cancel experiment",
3 | "btn_start_remote_control": "Start remote control",
4 | "btn_task_done": "Task completed",
5 | "btn_task_not_done": "Task could not be completed",
6 | "dialog_bt_guide": "Guide",
7 | "dialog_bt_guide_step1": "Open the Bluetooth settings on your smartphone.",
8 | "dialog_bt_guide_step2": "Enable Bluetooth.",
9 | "dialog_bt_guide_step3": "Connect your smartphone to the device with the name ",
10 | "dialog_btn_cancel": "Cancel",
11 | "dialog_btn_go_to_task": "Go to the task",
12 | "dialog_btn_waiting_for_connection": "Waiting for connection…",
13 | "dialog_header": "🛜 Bluetooth connection",
14 | "dialog_text": "To start the task, you must first connect your smartphone to the browser via Bluetooth.",
15 | "esc_hint": "You can end remote control by pressing the ",
16 | "esc_hint_ac1": " key.",
17 | "esc_hint2": "This allows you to make entries on the computer again.",
18 | "hint": "Hint",
19 | "hint_text": "On Apple devices, AssistiveTouch must be activated to enable mouse control. To do this, go to \"Settings\" > \"Accessibility\" > \"Touch\" > \"AssistiveTouch\" and activate AssistiveTouch. You will now see an AssistiveTouch button that will take you to the Home screen. AssistiveTouch can be deactivated again after the experiment.",
20 | "loading": "Loading…",
21 | "pairing_code": "Pairing code",
22 | "remote_control": "Remote control",
23 | "remote_control_explanation": "By pressing the \"Start remote control\" button, you can control your smartphone remotely via the browser. You can cancel remote control at any time by pressing the ",
24 | "remote_control_explanation_ac1": "-key on the keyboard.",
25 | "task": "Task",
26 | "task_description": "Your task is to search for the YouTube video shown below on your smartphone. You can use the YouTube app or open the YouTube website in your browser. Once you have found the video, start it and pause it after 10 seconds. When completing the task, please only use the browser to control your smartphone and do not make any entries on the smartphone itself.",
27 | "title": "Remote control"
28 | }
--------------------------------------------------------------------------------
/sendFile/phone/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
25 |
26 |
27 |
28 |
29 |
47 |
48 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/i18n.js:
--------------------------------------------------------------------------------
1 | var langData = {};
2 |
3 | // Function to update content based on selected language
4 | function updateContent(langData) {
5 | document.querySelectorAll('[data-i18n]').forEach(element => {
6 | const key = element.getAttribute('data-i18n');
7 | let childs = 0;
8 | if (element.getAttribute('data-i18n-childs')) {
9 | childs = element.getAttribute('data-i18n-childs');
10 | }
11 | if (langData[key] === undefined) {
12 | console.warn(`Translation not found for key: ${key}`);
13 | return;
14 | }
15 |
16 | if (element.tagName === "INPUT") {
17 | if (element.type === "text") {
18 | element.placeholder = langData[key];
19 | } else {
20 | element.value = langData[key];
21 | }
22 | return;
23 | }
24 | element.firstChild.textContent = langData[key];
25 | for (let i = 2; i <= childs * 2; i += 2) {
26 | let j = i / 2;
27 | if (i < element.childNodes.length) {
28 | if (element.childNodes[i].nodeType === 3) { // Text node
29 | element.childNodes[i].textContent = langData[key + "_ac" + j];
30 | } else {
31 | element.childNodes[i].before(langData[key + "_ac" + j]);
32 | }
33 | } else {
34 | element.append(langData[key + "_ac" + j]);
35 | }
36 | }
37 | });
38 | }
39 |
40 | // Function to set the language preference
41 | function setLanguagePreference(lang) {
42 | localStorage.setItem('language', lang);
43 | }
44 |
45 | // Function to fetch language data
46 | async function fetchLanguageData(lang) {
47 | const response = await fetch(`languages/${lang}.json`);
48 | return response.json();
49 | }
50 |
51 | // Function to change language
52 | async function changeLanguage(lang) {
53 | setLanguagePreference(lang);
54 |
55 | langData = await fetchLanguageData(lang);
56 | updateContent(langData);
57 | }
58 |
59 | // Call updateContent() on page load
60 | window.onload = async () => {
61 | const userPreferredLanguage = localStorage.getItem('language') || 'en';
62 | langData = await fetchLanguageData(userPreferredLanguage);
63 | updateContent(langData);
64 | };
--------------------------------------------------------------------------------
/control/languages/de.json:
--------------------------------------------------------------------------------
1 | {
2 | "btn_cancel_experiment": "Experiment abbrechen",
3 | "btn_start_remote_control": "Starte Fernsteuerung",
4 | "btn_task_done": "Aufgabe erledigt",
5 | "btn_task_not_done": "Aufgabe konnte nicht erledigt werden",
6 | "dialog_bt_guide": "Anleitung",
7 | "dialog_bt_guide_step1": "Öffne die Bluetooth Einstellungen auf deinem Smartphone.",
8 | "dialog_bt_guide_step2": "Aktiviere Bluetooth.",
9 | "dialog_bt_guide_step3": "Verbinde dein Smartphone mit dem Gerät mit dem Namen ",
10 | "dialog_btn_cancel": "Abbrechen",
11 | "dialog_btn_go_to_task": "Zur Aufgabe",
12 | "dialog_btn_waiting_for_connection": "Warte auf Verbindung…",
13 | "dialog_header": "🛜 Bluetooth Verbindung",
14 | "dialog_text": "Um die Aufgabe zu starten, musst du zuerst dein Smartphone per Bluetooth mit dem Browser verbinden.",
15 | "esc_hint": "Durch Drücken der ",
16 | "esc_hint_ac1": "-Taste kannst du die Fernsteuerung beenden.",
17 | "esc_hint2": "Somit kannst du wieder Eingaben auf dem Computer machen.",
18 | "hint": "Hinweis",
19 | "hint_text": "Auf Apple Geräten muss AssistiveTouch aktiviert werden, um die Steuerung der Maus zu ermöglichen. Gehe dazu in die „Einstellungen“ > „Bedienungshilfen“ > „Tippen“ > „AssistiveTouch“ und aktiviere AssistiveTouch. Nun wird dir eine AssistiveTouch Taste angezeigt, mit der du zum Home Bildschirm kommst. AssistiveTouch kann nach dem Experiment wieder deaktiviert werden.",
20 | "loading": "Lade…",
21 | "pairing_code": "Kopplungscode",
22 | "remote_control": "Fernsteuerung",
23 | "remote_control_explanation": "Durch das Drücken des Knopfes „Starte Fernsteuerung“ kannst du dein Smartphone über den Browser fernsteuern. Die Fernsteuerung kannst du jederzeit durch das Drücken der ",
24 | "remote_control_explanation_ac1": "-Taste auf der Tastatur beenden.",
25 | "task": "Aufgabe",
26 | "task_description": "Deine Aufgabe ist es auf deinem Smartphone nach dem YouTube-Video zu suchen, das dir unten angezeigt wird. Du kannst dazu die YouTube-App verwenden oder die YouTube-Webseite im Browser öffnen. Wenn du das Video gefunden hast, starte es und pausiere es nach 10 Sekunden. Bitte verwende beim Durchführen der Aufgabe ausschließlich den Browser zum Steuern deines Smartphones und mache keine Eingaben auf dem Smartphone selbst.",
27 | "title": "Fernsteuerung"
28 | }
--------------------------------------------------------------------------------
/webSerial.js:
--------------------------------------------------------------------------------
1 | class WebSerialPort {
2 | constructor() {
3 | this.port = new Promise((resolve, reject) => {
4 | navigator.serial.getPorts().then(async (ports) => {
5 | if (ports.length === 0) {
6 | reject("No ports available");
7 | } else {
8 | console.log("Ports: ", ports);
9 | let port = ports[0];
10 | await port.open({ baudRate: 115200 });
11 | resolve(port);
12 | }
13 | });
14 | });
15 |
16 | this.startReader();
17 | }
18 |
19 | async getPort() {
20 | return this.port;
21 | }
22 |
23 | async startReader() {
24 | let port = await this.port;
25 | let buffer = '';
26 | while (port.readable) {
27 | const reader = port.readable.getReader();
28 | try {
29 | while (true) {
30 | const { value, done } = await reader.read();
31 | if (done) {
32 | // |reader| has been canceled.
33 | break;
34 | }
35 |
36 | const eventOnData = new CustomEvent("ondata", { detail: value });
37 | port.dispatchEvent(eventOnData);
38 |
39 | for (const byte of new Uint8Array(value)) {
40 | buffer += String.fromCharCode(byte);
41 | if (byte === 10) { // newline
42 | console.debug("📩 ", buffer);
43 | const eventOnLine = new CustomEvent("online", { detail: buffer });
44 | port.dispatchEvent(eventOnLine);
45 | buffer = '';
46 | }
47 | }
48 | }
49 | } catch (error) {
50 | // Handle |error|…
51 | } finally {
52 | reader.releaseLock();
53 | }
54 | }
55 | }
56 |
57 | writeToPort(data) {
58 | this.port.then((port) => {
59 | const writer = port.writable.getWriter();
60 | const encoder = new TextEncoder();
61 | console.debug("📤 ", data);
62 | writer.write(encoder.encode(data));
63 | writer.releaseLock();
64 | });
65 | }
66 | }
67 |
68 | navigator.serial.addEventListener("connect", (e) => {
69 | console.log("Connected with port");
70 | });
71 |
72 | navigator.serial.addEventListener("disconnect", (e) => {
73 | console.log("Disconnected with port");
74 | window.location.href = "/error/";
75 | });
76 |
--------------------------------------------------------------------------------
/task.js:
--------------------------------------------------------------------------------
1 | var connected = false;
2 |
3 | const webSerialPort = new WebSerialPort();
4 |
5 | btnCancelExperiment.addEventListener('click', cancelExperiment);
6 | dialogClose.addEventListener('click', closeDialog);
7 | dialogBtnCancel.addEventListener('click', closeDialog);
8 | dialogBtnGoToTask.addEventListener('click', goToTask);
9 |
10 | restartESP();
11 |
12 | async function closeDialog() {
13 | await logParticipantAction(4);
14 | window.location.href = "/";
15 | }
16 |
17 | webSerialPort.getPort().then((port) => {
18 | port.addEventListener('online', async (e) => {
19 | if (e.detail.startsWith("Connected")) {
20 | await logParticipantAction(1);
21 | connected = true;
22 | }
23 | if (e.detail.startsWith("The passkey YES/NO number:")) {
24 | let passkey = e.detail.split(":")[1].trim();
25 | pairingCodeNumber.innerText = Math.floor(Math.random() * 900000) + 100000;
26 | while (passkey === pairingCode.innerText) {
27 | pairingCodeNumber.innerText = Math.floor(Math.random() * 900000) + 100000;
28 | }
29 | pairingCode.hidden = false;
30 | pairingCodeNumber.hidden = false;
31 | }
32 | if (e.detail.startsWith("Authentication Complete") && connected) {
33 | dialogBtnWaitingForConnection.hidden = true;
34 | dialogBtnGoToTask.hidden = false;
35 | setTimeout(async () => {
36 | if (connected) {
37 | await logParticipantAction(5);
38 | dialogBtnGoToTask.disabled = false;
39 | }
40 | }, 3000);
41 | }
42 | if (e.detail.startsWith("Disconnected")) {
43 | await logParticipantAction(2);
44 | connected = false;
45 | btDialog.show();
46 | restartESP();
47 | pairingCode.hidden = true;
48 | pairingCodeNumber.hidden = true;
49 | dialogBtnWaitingForConnection.hidden = false;
50 | dialogBtnGoToTask.hidden = true;
51 | dialogBtnGoToTask.disabled = true;
52 | document.exitPointerLock();
53 | }
54 | });
55 | });
56 |
57 | function restartESP() {
58 | console.info("♻️ Restarting ESP32");
59 | webSerialPort.writeToPort('\x1B');
60 | }
61 |
62 | async function goToTask() {
63 | await logParticipantAction(3);
64 | btDialog.close();
65 | }
66 |
67 | btnTaskNotDone.addEventListener("click", async () => {
68 | await logParticipantAction(9);
69 | window.location.href = "/survey/";
70 | });
71 |
72 | btnTaskDone.addEventListener("click", async () => {
73 | logParticipantAction(8);
74 | window.location.href = "/survey/";
75 | });
76 |
77 | function cancelExperiment() {
78 | window.location.href = "/cancel/";
79 | }
--------------------------------------------------------------------------------
/sendFile/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/languages/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "btn_cancel_experiment": "Cancel Experiment",
3 | "btn_start_experiment": "Experiment starten",
4 | "summary": "Summary",
5 | "summary_text0": "Before you can start the task, you must first connect your smartphone to the browser via Bluetooth. After you have clicked on the \"Start experiment\" button, instructions will be displayed in the browser. You can then start the actual task.",
6 | "summary_text1": "Before you can start the task, you must first connect the smartphone to the browser via Bluetooth. After you have clicked on the \"Start experiment\" button, instructions will be displayed in the browser. You can then start the actual task.",
7 | "title": "Web Bluetooth Test",
8 | "user_study_about": "What is this study about?",
9 | "user_study_about_text0": "This user study is about testing the usability and compatibility of the Web Bluetooth API. To get started, you first need to connect your smartphone to the browser via Bluetooth. Instructions on how to do this are also displayed in the browser. Once the connection has been established, you can transfer all mouse and keyboard inputs that you make in the browser to your smartphone. You can therefore control and access your entire smartphone via the browser. The browser will now give you a small task to complete using the browser controls. When carrying out the task, please only use the browser to control your smartphone and do not make any entries on the smartphone itself. When completing the task, pay attention to the ease of use and factors such as the input delay. After completing the task, you will then be asked a short survey in which you will be asked questions about your experiences during the user study. You do not have to answer every question, you can also leave questions unanswered that you do not want to answer. You are free to stop the trial whenever you feel it is appropriate. For example, if you get stuck at any point. There is also always a “Cancel experiment” button at the top center, which you can use to go straight to the final survey or cancel the experiment altogether. I will now leave the room. As soon as you have finished, simply leave the room. There is no time limit, so you can take as much time as you like. Do you have any questions?",
10 | "user_study_about_text1": "This user study is about testing the usability and compatibility of the Web Bluetooth API. To get started, you must first connect the smartphone to the browser via Bluetooth. Instructions on how to do this are also displayed in the browser. Once the connection has been established, the browser will give you a small task to complete. When completing the task, pay attention to the ease of use and factors such as the transmission speed. After completing the task, you will then be asked a short survey in which you will be asked questions about your experiences during the user study. You do not have to answer every question, you can also leave questions unanswered that you do not want to answer. You are free to stop the trial whenever you feel it is appropriate. For example, if you get stuck at any point. There is also always a “Cancel experiment” button at the top center which you can use to go straight to the final survey or cancel the experiment altogether. I will now leave the room. As soon as you have finished, simply leave the room. There is no time limit, so you can take as much time as you like. Do you have any questions?",
11 | "web_bluetooth_usability_test": "Web Bluetooth Usability Test"
12 | }
--------------------------------------------------------------------------------
/survey/survey.php:
--------------------------------------------------------------------------------
1 | prepare("INSERT INTO Survey (participant, age, gender, num_electronic_devices, regular_tablet_laptop_use, technical_experience, encountered_problems, bt_pairing_problems, problems_explaination, bluetooth_security, situation_already_encountered, know_pairing_code, improvements, additional_thoughts) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
5 | $stmt->bind_param("siiiiiiisiiiss", $uniqid, $age, $gender, $num_electronic_devices, $regular_tablet_laptop_use, $technical_experience, $encountered_problems, $bt_pairing_problems, $problems_explaination, $bluetooth_security, $situation_already_encountered, $know_pairing_code, $improvements, $additional_thoughts);
6 |
7 | $uniqid = $_COOKIE['participant'];
8 | $age = parsePost('age');
9 | $gender = parsePost('gender');
10 | $num_electronic_devices = parsePost('num_electronic_devices');
11 | $regular_tablet_laptop_use = parsePost('regular_tablet_laptop_use');
12 | $technical_experience = parsePost('technical_experience');
13 | $encountered_problems = parsePost('encountered_problems');
14 | $bt_pairing_problems = parsePost('bt_pairing_problems');
15 | $problems_explaination = parsePost('problems_explaination');
16 | $bluetooth_security = parsePost('bluetooth_security');
17 | $situation_already_encountered = parsePost('situation_already_encountered');
18 | $know_pairing_code = parsePost('know_pairing_code');
19 | $improvements = parsePost('improvements');
20 | $additional_thoughts = parsePost('additional_thoughts');
21 |
22 | $stmt->execute();
23 | $stmt->close();
24 |
25 |
26 | $stmt = $conn->prepare("INSERT INTO electronic_devices_main_application (participant, social_media, communication, entertainment, work_and_productivity, information_search, organization_and_planning, navigation_and_maps, health_and_fitness, smart_home) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
27 | $stmt->bind_param("siiiiiiiii", $uniqid, $social_media, $communication, $entertainment, $work_and_productivity, $information_search, $organization_and_planning, $navigation_and_maps, $health_and_fitness, $smart_home);
28 |
29 | $prefix = 'electronic_devices_main_application_';
30 | $social_media = parseSelectPost($prefix . 'social_media');
31 | $communication = parseSelectPost($prefix . 'communication');
32 | $entertainment = parseSelectPost($prefix . 'entertainment');
33 | $work_and_productivity = parseSelectPost($prefix . 'work_and_productivity');
34 | $information_search = parseSelectPost($prefix . 'information_search');
35 | $organization_and_planning = parseSelectPost($prefix . 'organization_and_planning');
36 | $navigation_and_maps = parseSelectPost($prefix . 'navigation_and_maps');
37 | $health_and_fitness = parseSelectPost($prefix . 'health_and_fitness');
38 | $smart_home = parseSelectPost($prefix . 'smart_home');
39 |
40 | $stmt->execute();
41 | $stmt->close();
42 |
43 |
44 | $stmt = $conn->prepare("INSERT INTO bt_devices (participant, car, smartwatches_fitness_trackers, headphones, keyboard_mouse, others) VALUES (?, ?, ?, ?, ?, ?)");
45 | $stmt->bind_param("siiiii", $uniqid, $car, $smartwatches_fitness_trackers, $headphones, $keyboard_mouse, $others);
46 |
47 | $prefix = 'bt_devices_';
48 | $car = parseSelectPost($prefix . 'car');
49 | $smartwatches_fitness_trackers = parseSelectPost($prefix . 'smartwatches_fitness_trackers');
50 | $headphones = parseSelectPost($prefix . 'headphones');
51 | $keyboard_mouse = parseSelectPost($prefix . 'keyboard_mouse');
52 | $others = parseSelectPost($prefix . 'others');
53 |
54 | $stmt->execute();
55 | $stmt->close();
56 |
57 | $conn->close();
58 |
59 | echo 'Thank you for participating in our survey!';
--------------------------------------------------------------------------------
/survey/languages/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "additional_thoughts": "Do you have any additional thoughts or comments you would like to share with us?",
3 | "age": "Age",
4 | "bluetooth_security_1_to_5": "On a scale of 1 to 5, how secure do you think Bluetooth connections are? (1 is not secure, 5 is very secure)",
5 | "bt_pairing_problems": "Did the Bluetooth pairing with your smartphone work without any problems?",
6 | "btn_cancel_experiment": "Cancel Experiment",
7 | "can_anything_be_improved": "Is there anything that could be improved?",
8 | "car": "Car / hands-free system",
9 | "communication": "Communication (e-mail / calls / text messages)",
10 | "demographics": "Demographics",
11 | "encountered_problems": "Have you encountered any problems?",
12 | "entertainment": "Entertainment (videos / music / games)",
13 | "experiment": "Experiment",
14 | "female": "Female",
15 | "gender": "Gender",
16 | "gender_select": "Select your gender…",
17 | "headphones": "Headphones",
18 | "health_and_fitness": "Health and fitness (smartwatches / fitness trackers)",
19 | "how_many_electronic_devices": "How many electronic devices do you use every day?",
20 | "how_many_electronic_devices_hint": "This refers to devices such as tablets, PCs, smartphones, smartwatches, laptops, e-readers, fitness trackers and similar technologies. It does not include simple household appliances such as toasters, hair dryers or blenders.",
21 | "if_encountered_problems_explain": "If you have encountered any problems, please explain them here.",
22 | "information_search": "Information search",
23 | "keyboard_mouse": "Keyboard / mouse",
24 | "know_pairing_code": "Do you know what the pairing code is used for during Bluetooth pairing?",
25 | "know_pairing_code_hint": "If you do not know what this means, please select “No”.",
26 | "loading": "Loading…",
27 | "male": "Male",
28 | "navigation_and_maps": "Navigation and maps",
29 | "no": "No",
30 | "organization_and_planning": "Organization and planning (calendar / notes / reminders)",
31 | "other": "Other",
32 | "others": "Others",
33 | "regularly_tablet_laptop_use": "Do you regularly use a Tablet or Laptop at work / university?",
34 | "situation_already_encountered": "Have you ever encountered a situation like the one in the experiment in your private life?",
35 | "skip_survey": "Skip survey",
36 | "smart_home": "Smart Home",
37 | "smartwatches_fitness_trackers": "Smartwatches / fitness trackers",
38 | "social_media": "Social media",
39 | "submit_survey": "Submit survey",
40 | "survey": "Survey",
41 | "survey_text": "Finally, please answer the following questions. Your answers are anonymous and will be treated confidentially. If you do not wish to answer a question, you can skip it.",
42 | "technical_experience": "Technical Experience",
43 | "technical_experience_1_to_5": "On a scale from 1 to 5, how experienced would you rate yourself with technical devices? (1 is no experience, 5 is expert)",
44 | "title": "Survey",
45 | "value": "Value: ",
46 | "what_bt_devices_do_you_use": "Which Bluetooth devices do you use regularly?",
47 | "what_is_main_application_for_electronic_devices": "What is your main application for electronic devices?",
48 | "work_and_productivity": "Work and productivity",
49 | "yes": "Yes",
50 | "yes_completely": "Yes, I have already controlled my smartphone via Bluetooth from a browser.",
51 | "yes_only_browser": "I have already connected my smartphone to a browser via Bluetooth.",
52 | "yes_pairing": "I have already paired my phone with another device using Bluetooth."
53 | }
--------------------------------------------------------------------------------
/survey/languages/de.json:
--------------------------------------------------------------------------------
1 | {
2 | "additional_thoughts": "Hast du sonst noch Gedanken oder Anmerkungen, die du mit uns teilen möchtest?",
3 | "age": "Alter",
4 | "bluetooth_security_1_to_5": "Auf einer Skala von 1 bis 5, wie sicher denkst du sind Bluetooth-Verbindungen? (1 ist nicht sicher, 5 ist sehr sicher)",
5 | "bt_pairing_problems": "Hat die Bluetooth-Kopplung mit deinem Smartphone problemlos funktioniert?",
6 | "btn_cancel_experiment": "Experiment abbrechen",
7 | "can_anything_be_improved": "Gibt es deiner Meinung nach Verbesserungsmöglichkeiten?",
8 | "car": "Auto / Freisprechanlage",
9 | "communication": "Kommunikation (E-Mail / Anrufe / Textnachrichten)",
10 | "demographics": "Demografische Informationen",
11 | "encountered_problems": "Bist du auf irgendwelche Probleme gestoßen?",
12 | "entertainment": "Unterhaltung (Videos / Musik / Spiele)",
13 | "experiment": "Experiment",
14 | "female": "Weiblich",
15 | "gender": "Geschlecht",
16 | "gender_select": "Wähle dein Geschlecht aus…",
17 | "headphones": "Kopfhörer",
18 | "health_and_fitness": "Gesundheit und Fitness (Smartwatches/Fitness-Tracker)",
19 | "how_many_electronic_devices": "Wie viele elektronische Geräte benutzt du jeden Tag?",
20 | "how_many_electronic_devices_hint": "Gemeint sind Geräte wie Tablets, PCs, Smartphones, Smartwatches, Laptops, E-Reader, Fitness-Tracker und ähnliche Technologien. Nicht gemeint sind einfache Haushaltsgeräte wie Toaster, Föhn oder Mixer.",
21 | "if_encountered_problems_explain": "Wenn du auf Probleme gestoßen bist, erläutere diese bitte hier.",
22 | "information_search": "Informationssuche",
23 | "keyboard_mouse": "Tastatur / Maus",
24 | "know_pairing_code": "Weißt du, wofür der Kopplungscode bei der Bluetooth-Kopplung verwendet wird?",
25 | "know_pairing_code_hint": "Wenn du nicht weißt, was das bedeutet, wähle bitte „Nein“.",
26 | "loading": "Lade…",
27 | "male": "Männlich",
28 | "navigation_and_maps": "Navigation und Karten",
29 | "no": "Nein",
30 | "organization_and_planning": "Organisation und Planung (Kalender / Notizen / Erinnerungen)",
31 | "other": "Anderes",
32 | "others": "Andere",
33 | "regularly_tablet_laptop_use": "Verwendest du regelmäßig ein Tablet oder einen Laptop bei der Arbeit / in der Universität?",
34 | "situation_already_encountered": "Bist du in deinem Privatleben schon einmal mit einer Situation wie in diesem Experiment konfrontiert worden?",
35 | "skip_survey": "Umfrage überspringen",
36 | "smart_home": "Smart Home",
37 | "smartwatches_fitness_trackers": "Smartwatches / Fitness-Tracker",
38 | "social_media": "Soziale Medien",
39 | "submit_survey": "Umfrage abschicken",
40 | "survey": "Umfrage",
41 | "survey_text": "Bitte beantworte abschließend die folgenden Fragen. Deine Antworten sind anonym und werden vertraulich behandelt. Wenn du eine Frage nicht beantworten möchtest, kannst du sie überspringen.",
42 | "technical_experience": "Technische Erfahrung",
43 | "technical_experience_1_to_5": "Auf einer Skala von 1 bis 5, wie erfahren würdest du dich im Umgang mit technischen Geräten einschätzen? (1 ist keine Erfahrung, 5 ist Experte)",
44 | "title": "Umfrage",
45 | "value": "Wert: ",
46 | "what_bt_devices_do_you_use": "Welche Bluetooth-Geräte verwendest du regelmäßig?",
47 | "what_is_main_application_for_electronic_devices": "Was ist dein Haupteinsatzgebiet für elektronische Geräte?",
48 | "work_and_productivity": "Arbeit und Produktivität",
49 | "yes": "Ja",
50 | "yes_completely": "Ja, ich habe mein Smartphone bereits per Bluetooth von einem Browser aus gesteuert.",
51 | "yes_only_browser": "Ich habe mein Smartphone bereits per Bluetooth mit einem Browser verbunden.",
52 | "yes_pairing": "Ich habe mein Smartphone bereits über Bluetooth mit einem anderen Gerät gekoppelt."
53 | }
--------------------------------------------------------------------------------
/languages/de.json:
--------------------------------------------------------------------------------
1 | {
2 | "btn_cancel_experiment": "Experiment abbrechen",
3 | "btn_start_experiment": "Experiment starten",
4 | "summary": "Zusammenfassung",
5 | "summary_text0": "Bevor du mit der Aufgabe beginnen kannst, musst du zuerst dein Smartphone per Bluetooth mit dem Browser verbinden. Nachdem du auf den Knopf „Experiment starten“ geklickt hast, wird dir dazu eine Anleitung im Browser angezeigt. Danach kannst du mit der eigentlichen Aufgabe anfangen.",
6 | "summary_text1": "Bevor du mit der Aufgabe beginnen kannst, musst du zuerst das Smartphone per Bluetooth mit dem Browser verbinden. Nachdem du auf den Knopf „Experiment starten“ geklickt hast, wird dir dazu eine Anleitung im Browser angezeigt. Danach kannst du mit der eigentlichen Aufgabe anfangen.",
7 | "title": "Web Bluetooth Test",
8 | "user_study_about": "Worum geht es in dieser Studie?",
9 | "user_study_about_text0": "In dieser User Study geht es darum die Nutzbarkeit und Kompatibilität der Web Bluetooth API zu testen. Damit es losgehen kann, musst du zuerst dein Smartphone mit dem Browser per Bluetooth verbinden. Eine Anleitung dazu wird dir auch nochmal im Browser angezeigt. Nachdem die Verbindung hergestellt wurde, kannst du alle Maus und Tastatureingaben, die du im Browser tätigst, an dein Smartphone übertragen lassen. Du kannst also dein komplettes Smartphone über den Browser steuern auf darauf zugreifen. Nun wird dir vom Browser eine kleine Aufgabe gegeben, die du mittels der Steuerung durch den Browser erledigen sollst. Bitte verwende beim Durchführen der Aufgabe ausschließlich den Browser zum Steuern deines Smartphones und mache keine Eingaben auf dem Smartphone selbst. Achte beim Erledigen der Aufgabe auf die Einfachheit der Nutzbarkeit und Faktoren wie die Eingabeverzögerung. Nach dem Durchführen der Aufgabe kommt dann abschließend noch eine kleine Umfrage, in der dir Fragen zu deinen Erfahrungen gestellt werden, die du während der User Study gesammelt hast. Du musst nicht jede Frage beantworten, du kannst auch Fragen unbeantwortet lassen, die du nicht beantworten willst. Es steht dir frei, den Versuch abzubrechen, wann immer du es für angebracht hältst. Zum Beispiel, wenn du an irgendeinem Punkt nicht mehr weiter kommst. Es ist auch immer oben in der Mitte ein Knopf „Experiment abbrechen“ mit dem du sofort zur abschließenden Umfrage kommst oder das Experiment ganz abbrechen kannst. Ich werde jetzt den Raum verlassen. Sobald du fertig bist, verlasse dann einfach auch den Raum. Es gibt kein Zeitlimit, also kannst du dir so viel Zeit lassen wie du willst. Hast du noch irgendwelche Fragen?",
10 | "user_study_about_text1": "In dieser User Study geht es darum die Nutzbarkeit und Kompatibilität der Web Bluetooth API zu testen. Damit es losgehen kann, musst du zuerst das Smartphone mit dem Browser per Bluetooth verbinden. Eine Anleitung dazu wird dir auch nochmal im Browser angezeigt. Nachdem die Verbindung hergestellt wurde, wird dir vom Browser eine kleine Aufgabe gegeben, die du erledigen sollst. Achte beim Erledigen der Aufgabe auf die Einfachheit der Nutzbarkeit und Faktoren wie die Übertragungsgeschwindigkeit. Nach dem Durchführen der Aufgabe kommt dann abschließend noch eine kleine Umfrage, in der dir Fragen zu deinen Erfahrungen gestellt werden, die du während der User Study gesammelt hast. Du musst nicht jede Frage beantworten, du kannst auch Fragen unbeantwortet lassen, die du nicht beantworten willst. Es steht dir frei, den Versuch abzubrechen, wann immer du es für angebracht hältst. Zum Beispiel, wenn du an irgendeinem Punkt nicht mehr weiter kommst. Es ist auch immer oben in der Mitte ein Knopf „Experiment abbrechen“ mit dem du sofort zur abschließenden Umfrage kommst oder das Experiment ganz abbrechen kannst. Ich werde jetzt den Raum verlassen. Sobald du fertig bist, verlasse dann einfach auch den Raum. Es gibt kein Zeitlimit, also kannst du dir so viel Zeit lassen wie du willst. Hast du noch irgendwelche Fragen?",
11 | "web_bluetooth_usability_test": "Web Bluetooth Nutzbarkeitstest"
12 | }
--------------------------------------------------------------------------------
/debug/createTables.php:
--------------------------------------------------------------------------------
1 | query($sql) === TRUE) {
13 | echo "Table Participants created successfully\n";
14 | } else {
15 | echo "Error creating table: " . $conn->error . "\n";
16 | }
17 |
18 | // sql to create table Survey
19 | $sql = "CREATE TABLE Survey (
20 | participant CHAR(13) NOT NULL PRIMARY KEY,
21 | age TINYINT UNSIGNED,
22 | gender BOOLEAN,
23 | num_electronic_devices TINYINT UNSIGNED,
24 | regular_tablet_laptop_use BOOLEAN,
25 | technical_experience TINYINT UNSIGNED,
26 | encountered_problems BOOLEAN,
27 | bt_pairing_problems BOOLEAN,
28 | problems_explaination TEXT,
29 | bluetooth_security TINYINT UNSIGNED,
30 | situation_already_encountered TINYINT UNSIGNED,
31 | know_pairing_code BOOLEAN,
32 | improvements TEXT,
33 | additional_thoughts TEXT,
34 | FOREIGN KEY (participant) REFERENCES Participants(id) ON DELETE CASCADE)";
35 |
36 | if ($conn->query($sql) === TRUE) {
37 | echo "Table Survey created successfully\n";
38 | } else {
39 | echo "Error creating table: " . $conn->error . "\n";
40 | }
41 |
42 |
43 | // sql to create table electronic_devices_main_application
44 | $sql = "CREATE TABLE electronic_devices_main_application (
45 | participant CHAR(13) NOT NULL PRIMARY KEY,
46 | social_media BOOLEAN NOT NULL,
47 | communication BOOLEAN NOT NULL,
48 | entertainment BOOLEAN NOT NULL,
49 | work_and_productivity BOOLEAN NOT NULL,
50 | information_search BOOLEAN NOT NULL,
51 | organization_and_planning BOOLEAN NOT NULL,
52 | navigation_and_maps BOOLEAN NOT NULL,
53 | health_and_fitness BOOLEAN NOT NULL,
54 | smart_home BOOLEAN NOT NULL,
55 | FOREIGN KEY (participant) REFERENCES Survey(participant) ON DELETE CASCADE)";
56 |
57 | if ($conn->query($sql) === TRUE) {
58 | echo "Table electronic_devices_main_application created successfully\n";
59 | } else {
60 | echo "Error creating table: " . $conn->error . "\n";
61 | }
62 |
63 | // sql to create table bt_devices
64 | $sql = "CREATE TABLE bt_devices (
65 | participant CHAR(13) NOT NULL PRIMARY KEY,
66 | car BOOLEAN NOT NULL,
67 | smartwatches_fitness_trackers BOOLEAN NOT NULL,
68 | headphones BOOLEAN NOT NULL,
69 | keyboard_mouse BOOLEAN NOT NULL,
70 | others BOOLEAN NOT NULL,
71 | FOREIGN KEY (participant) REFERENCES Survey(participant) ON DELETE CASCADE)";
72 |
73 | if ($conn->query($sql) === TRUE) {
74 | echo "Table bt_devices created successfully\n";
75 | } else {
76 | echo "Error creating table: " . $conn->error . "\n";
77 | }
78 |
79 | // sql to create table action_log
80 | $sql = "CREATE TABLE action_log (
81 | participant CHAR(13) NOT NULL,
82 | action TINYINT UNSIGNED NOT NULL,
83 | date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
84 | FOREIGN KEY (participant) REFERENCES Participants(id) ON DELETE CASCADE)";
85 |
86 | if ($conn->query($sql) === TRUE) {
87 | echo "Table action_log created successfully\n";
88 | } else {
89 | echo "Error creating table: " . $conn->error . "\n";
90 | }
91 |
92 | // sql to create table Screenshots
93 | $sql = "CREATE TABLE Screenshots (
94 | participant CHAR(13) NOT NULL PRIMARY KEY,
95 | screenshot MEDIUMBLOB NOT NULL,
96 | filename TINYTEXT NOT NULL,
97 | device_model TINYTEXT NOT NULL,
98 | user_agent TEXT NOT NULL,
99 | date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
100 | FOREIGN KEY (participant) REFERENCES Participants(id) ON DELETE CASCADE)";
101 |
102 | if ($conn->query($sql) === TRUE) {
103 | echo "Table Screenshots created successfully\n";
104 | } else {
105 | echo "Error creating table: " . $conn->error . "\n";
106 | }
107 |
108 | $conn->close();
109 |
--------------------------------------------------------------------------------
/debug/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | Debug
13 |
14 |
15 |
16 |
17 |
18 |
36 |
37 |
38 |
39 |
40 |
Debug
41 |
42 |
Terminal
43 |
44 |
45 |
46 |
Participant Management
47 | Here you can manage the participants of the study.
48 | Current ID:
49 | Current Task:
50 |