3D Druck | T-Rex Chrome Smartphone Halter

Ein kleiner aber schöner Halter für das Smartphone. Für das Model wurde als Vorlage das Projekt von „mightynozzle“ verwendet. Der Anschluss des Ladegeräts ist in diesem Halter kein Problem. Das Smartphone kann, durch die vielen verschiedenen Stufen auf dem Rücken des T-Rex, in verschiedene Positionen stabil aufgestellt werden. Die Position der beiden T-Rex auf der Grundplatte ist so gewählt, dass das Smartphone in jeder Position stabil auf dem Tisch steht.

T-Rex Chrome Pixel Phone Holder 3D Druck
T-Rex Chrome Pixel Phone Holder 3D Druck

Erstellt wurde das 3D-Model mit FreeCAD. Gedruckt wurde das Model in PLA (schwarz). Dabei wurde das Model auf eine Größe 80% skaliert. Die Größe ist ausreichend für die gängigen Smartphones. Der Druck dauert mit dem Anycubic Kossel plus ca. 9 Stunden. Hilfsstrukturen (Support) werden benötigt um die Hohlräume unterhalb des T-Rex zu überbrücken. Gefüllt (Infill) ist das Projekt zu 25%. Dadurch wird der Halter extrem leicht, bleibt aber robust genug. Gedruckt wurde mit einer Auflösung (Resolution) der Düse von 0,2 mm.

Das Model steht zum Download bei Thingiverse unter folgendem Link zur Verfügung: T-Rex – Chrome Phone Holder Phone Stand

3D T-Rex auf TikTok gefunden

Es ist erstaunlich zu sehen, dass das 3D Druck T-Rex Model auch andere Menschen immer noch fasziniert. Auf TikTok habe ich kürzlich ein Video entdeckt, in dem LeesyMae Cosplay mein Modell ausgedruckt hat. Es ist fantastisch zu sehen, wie mein Design in die Realität verwendung findet.

Es ist interessant zu sehen, dass LeesyMae Cosplay das T-Rex-Modell auch für andere Zwecke als nur für das Smartphone einsetzt. In dem Video hat sie gezeigt, wie der T-Rex-Halter auch als Halter für die TV-Fernbedienung oder den Gaming-Controller verwendet werden kann. Ich fand es cool zu sehen, wie das Modell in verschiedenen Situationen eingesetzt wird und von anderen noch kreativeren Menschen verwendet wird.

Klicken Sie auf den unteren Button, um den Inhalt von www.tiktok.com zu laden.

Inhalt laden

Das Model ist Lizenziert über  creativecommons.org

Creative Commons BY NC SA

Chrome to Cisco Phone

In diesem Beitrag Chrome to Cisco Phone möchte ich zeigen, wie ich mir eine Erweiterung (Add-on) für den Chrome Browser geschrieben habe, um eine markierte Telefonnummer an mein Cisco IP Telefon zu senden.
Ich nehme es vorweg, dass es solche Erweiterungen schon gibt. Das ist aber nicht der Anspruch dieses Artikels über etwas vollkommen Neues zu berichten. Vielmehr möchte ich den Programmcode meiner Erweiterung öffentlich zugänglich machen und auch für mich dokumentieren, welche Schritte für ein solches Add-on notwendig sind. Es ist natürlich auch möglich, die Erweiterung noch weiter auszubauen. Icons hinzuzufügen, die Optionen einstellbar zu machen oder spezielle Validierungen durchzuführen, die die Telefonnummer weiter prüfen.

Ich möchte mit dieser Erweiterung erreichen, dass ich eine Telefonnummer auf einer beliebigen Internetseite markieren kann und über einen Button im Kontextmenü diese Nummer dann direkt an mein Cisco IP Telefon übertragen kann. Dort wird die Nummer direkt gewählt. Dazu möchte ich eine Chrome-Erweiterung erstellen, die eine XML-Datei generiert. Diese XML-Datei sende ich dann direkt an das Telefon.

CB-IT_Services_Send_to_Cisco_Phone

Beginnen wir mit der Erweiterung (Add-on), die wir für den Browser benötigen. Ich habe in einem Ordner zwei Dokumente angelegt:

  • manifest.json
  • sentNumberToCisco.js

Chrome manifest.json

In der manifest.json Datei werden die Add-on benötigten Einstellungen, Deklarationen, Berechtigungen sowie Name und Beschreibung eingetragen. Ich habe mich hierbei an die von Chrome veröffentlichte Vorgabe Manifest File Format gehalten.

Hier der Auszug aus meiner „manifest.json“ Datei :

{
	"name": "Send Number to Cisco Phone",
	"version": "0.1",
	"description": "Mark a phone number on a website and press the button in context menü.",
	"author": "ChrisBue Blog",
	"permissions": [ 
		"contextMenus",
		"http://*/*" ],
	"background": {
		"persistent": false,
		"scripts": ["sendNumberToCisco.js"]
	},
	"manifest_version": 2	
}

Anmerkungen:

„permissions“: Ich benötige die „contextMenus“ Berechtigung, um einen Button dem Kontextmenü hinzuzufügen. Die „http://*/*“ Berechtigung ermöglicht mir das Senden der XML-Datei an das Telefon. Ohne diese Berechtigung kann keine Übertragung nach außen erfolgen. Die „storage“ Berechtigung ist optional. Ich verwende den Chrome-Speicher „storage“ um meine Optionen abzulegen.

„background“: Hier lege ich fest, welches Script ich ausführen möchte. In diesem Fall verwende ich das „sendNumberToCisco.js“ Skript. Darin werde ich die notwendigen Funktionen unterbringen, um die Nummer direkt zu senden und den Button im Kontextmenü zu verankern.

Chrome sendNumberToCisco.js

In der Javascript-Datei „sendNumberToCisco.js“ für das Chrome to Cisco Phone Projekt werden alle Funktionen erstellt, die den zusätzlichen Eintrag im Kontextmenü erzeugen, die XML-Datei mit der Telefonnummer erstellen und die Verbindung zum Telefon herstellen. Als Erstes erstellen wir den Button im Kontextmenü.

chrome.runtime.onInstalled.addListener(function() {
	// Create an item for a selected text in the menu
	var id = chrome.contextMenus.create({"title": "Send to Cisco phone", "contexts":["selection"], "id": "numberToCiscoPhoneSelection"});
});

Anmerkungen:

Ich erstelle einen Listener, der dem Kontextmenü einen Eintrag mit dem Namen „Send to Cisco phone“ hinzufügt. Die Option „contexts“: [„section“] ermöglicht es mir, dass der Eintrag im Kontextmenü nur angezeigt wird, wenn auch tatsächlich etwas markiert ist. Natürlich bekommt der Button auch eine „id“: „numberToCiscoPhoneSelection“.

Jetzt erstellen ich einen weiteren Listener, der auf den Klick im Kontextmenü reagiert und die entsprechenden Funktionen ausführt, die es ermöglichen die Daten an das Telefon zu senden. Vorher validiere ich noch notdürftig die Telefonnummer. Dies lässt sich bestimmt noch weiter ausbauen, genügt aber für meine Zwecke.

// The onClicked callback function.
function onClickHandler(info, tab) {

	// Check if the correct button is clicked
	if(info.menuItemId == "numberToCiscoPhoneSelection"){

		var ip = "000.000.000.000";
		var uid = "XXXX";
		var pwd = "XXXX";
	
		if(info.selectionText == undefined){
			alert("nothing marked!");
			exit;
		} 

		// Replace '+' to '00'
		var number = info.selectionText.replace('+', '00')
		// Only numbers
		number = number.replace(/\D+/g,"");

		// Check if there is a number to call
		if(number == ""){
			alert("nothing marked!");
			exit;
		}

		// Build XML
		var xml = '<?xml version="1.0"? encoding="UTF-8">\r\n' +
		'<CiscoIPPhoneExecute>' +
		'<ExecuteItem Priority="0" URL="Dial:' + number + ':1:Cisco/Dialer"/>\r\n'+
		'</CiscoIPPhoneExecute>\r\n';

		// XML request
		var xhttp = new XMLHttpRequest();
		xhttp.open("POST", "http://"+ip+"/CGI/Execute", true);
		xhttp.setRequestHeader ("Authorization", "Basic " + btoa(uid + ":" + pwd));
		xhttp.setRequestHeader ("Content-type", "application/x-www-form-urlencoded");
		xhttp.onreadystatechange = function(){

			// Log response from phone for connection debug
			console.log( this.responseText );
		}
		xhttp.send("XML="+xml);		
	}
};

chrome.contextMenus.onClicked.addListener(onClickHandler);

Anmerkungen:

Ich erstelle einen „chrome.contextMenus.onClicked.addListener“ der den „onClickHandler“ aufruft. Ich prüfe ab, ob das geklickte Objekt die selbe ID hat wie der Eintrag, den ich dem Kontextmenü hinzugefügt habe („numberToCiscoPhoneSelection“).

Die Variablen „ip“, „uid“ und „pwd“ sollten hier nicht hart codiert eingetragen werden. Es gibt eine schönere Möglichkeit diese Daten z. B. im Speicher von Google Chrome abzulegen.

In den nächsten Schritten prüfe ich, ob auch Daten an die Funktion übergeben wurde. Ich ändere das „+“ in „00“ um, da oft „+49“ in den Telefonnummern angegeben ist. Danach entferne ich alles was, keine Zahl ist aus der Telefonnummer, z. B. – / oder Leerzeichen.

Jetzt das Wichtigste. Ich erstelle die XML-Datei, die ich übertragen möchte. Ich habe den genauen Aufbau der XML-Datei der Cisco Dokumentation entnommen.
Ich erstelle nun ein Objekt um XML Daten zu senden „new XMLHttpRequest();“, füge die Zieladresse ein „http://“+ip+“/CGI/Execute“ und melde mich am Telefon an „Authorization“, „Basic “ + btoa(uid + „:“ + pwd)“.

Zum Schluss kann ich die Daten senden „xhttp.send(„XML=“+xml);“. Als Hilfe lasse ich mir die Antwort des Telefons in der Konsole von Chrome anzeigen.

Um nun die Erweiterung (Add-on) in Chrome zu laden, muss ich zuerst in den Einstellungen die Erweiterungen aufrufen. Hier den Haken für den „Entwicklermodus“ setzten und über den Dialog hinter „Entpackte Erweiterung laden …“ den Ordner mit den zwei Dateien auswählen.