türöffner mit asterisk und relaiskarte --- selfmadetransponder?

n8isch

Mitglied
Mitglied seit
22 Mrz 2005
Beiträge
275
Punkte für Reaktionen
0
Punkte
0
hallöle,

ich glaube ich brauche mal ein paar kurze denkanstöße in die richtige richtung.

da wir dank meinem vermieter (dem freak ;) ) in unserer wohnung mehrere möglichkeiten haben, die haustür per tastendruck zu öffnen, habe ich mir gestern eine parport relaiskarte (K8 bei pollin.de) gegönnt, die ich mit diesem simplen aber chicen script unter linux ansteuere:

Code:
/*
 *	Parallel port control program
 *	
 *	Copyright 2002 Stefan Bachmaier <[email protected]>
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with this program; if not, write to the Free Software
 *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

/*
 This program can read and write the control, data and status bits on the parallel port.
*/

#include <string.h>
#include <sys/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <getopt.h>

#define DATA 0x278		/* lp0 0x378 - lp1 0x278 
				 * printer port base address 
				 */
#define STATUS DATA+1		/*
				 * status bits are 1 byte behind 
				 */
#define CONTROL DATA+2		/*
				 * control bits are 2 bytes behind 
				 */
/*

<= in   DB25    Cent    Name of         Reg
=> out  pin     pin     Signal          Bit     Function Notes
------  ----    ----    --------        ---     -----------------------------
=>       2       2      Data 0          D0      Set to least significant data
=>       3       3      Data 1          D1      ...
=>       4       4      Data 2          D2      ...
=>       5       5      Data 3          D3      ...
=>       6       6      Data 4          D4      ...
=>       7       7      Data 5          D5      ...
=>       8       8      Data 6          D6      ...
=>       9       9      Data 7          D7      Set to most significant data

<=      15      32      /Error          S3+     Low for Error/Offline/PaperEnd
<=      13      13      Select          S4+     High for printer selected
<=      12      12      PaperEnd        S5+     High for out of paper
<=      10      10      /Ack            S6+     IRQ Low Pulse ~ 5 uS, after accept
<=      11      11      Busy            S7-     High for Busy/Offline/Error

=>       1       1      /Strobe         C0-     Set Low pulse >0.5 us to send
=>      14      14      /AutoFd         C1-     Set Low to autofeed one line
=>      16      31      /Init           C2+     Set Low pulse > 50uS to init
=>      17      36      /SelectIn       C3-     Set Low to select printer

==      18-25   19-30,  Ground
               33,17,16

*/


short data = 0;
short status = 0;
short control = 0;
short x = 0, y = 0;

int c = 0, cr = 0;
int set_status = 0;
short quiet_mode = 0;

void printparams ();
void printbits ();

int main (int argc, char *argv[])
{

	if (ioperm (DATA, 3, 1))
	{
		fprintf (stderr, "Couldn't get the port at %x\ntry it as root.\n", DATA);
		exit (1);
	}

	data = inb (DATA);
	control = inb (CONTROL);


	// invert bit 0, 2 and 3 (1101)
	control ^= 0x0b;


	while (1)
	{
		cr = getopt (argc, argv, "q");
		if (cr == -1)
			break;
		switch (cr)
		{
		case 'q':
			quiet_mode = 1;
			break;
		}
	}

	if (argc < 2)
	{
		printparams ();
		printbits ();
		return 0;
	}

	if ((argc - optind) != 2)
	{
		printf ("wrong params!\n");
		printparams ();
		return 0;
	}

	c = argv[optind][0];

	if (argv[optind][1] != 0 || !((c >= '0' && c <= '8') || c == 'q' || c == 'w' || c == 'e' || c == 'r' || c == 't'))
	{
		printf ("wrong params!\n");
		printparams ();
		return 0;
	}

	set_status = 1;
	if (strcmp (argv[optind + 1], "on") != 0)
	{
		set_status = 0;
		if (strcmp (argv[optind + 1], "off") != 0)
		{
			set_status = 2;
			if (strcmp (argv[optind + 1], "toggle") != 0)
			{
				printf ("you must provide the status (on|off|toggle)!\n");
				return 0;
			}
		}
	}


	if (!quiet_mode)
		printf ("Pin #%c, status: %s (%d)\n", c, argv[optind + 1], set_status);


	x = -1;

	// DATA pins 2-9
	if (c == '0')
	{
		x = 1;
	}
	if (c == '1')
	{
		x = 2;
	}
	if (c == '2')
	{
		x = 4;
	}
	if (c == '3')
	{
		x = 8;
	}
	if (c == '4')
	{
		x = 16;
	}
	if (c == '5')
	{
		x = 32;
	}
	if (c == '6')
	{
		x = 64;
	}
	if (c == '7')
	{
		x = 128;
	}
	if (c == '8')
	{
		x = 255;
	}


	// SELECT, INIT, /AUTO_FEED, /STROBE at pins 17, 16, 14 and 1   

	y = -1;

	if (c == 'q')
	{
		y = 15;
	}
	if (c == 'w')
	{
		y = 1;
	}
	if (c == 'e')
	{
		y = 2;
	}
	if (c == 'r')
	{
		y = 4;
	}
	if (c == 't')
	{
		y = 8;
	}

	if (x != -1)
	{

		switch (set_status)
		{
		case 0:
			// put off

			if (x == 255)
				data = 0;
			else
				data = (data & (~x));

			break;
		case 1:
			// set to on

			if (x == 255)
				data = 255;
			else
				data = (data | x);

			break;
		case 2:
			// toggle
			if (x == 255)
			{
				data ^= 255;
			}
			else
			{
				// bit schon gesetzt?      falls schon ausmask.  falls nicht einmask.
				data = ((data & x) == x) ? (data & (~x)) : (data | x);
			}

			break;
		default:
			printf ("you must provide the status (on|off|toggle)!\n");
			return 0;
			break;
		}

		outb (data, DATA);

	}



	if (y != -1)
	{

		switch (set_status)
		{
		case 0:
			// put off

			if (y == 0)
				control = 15;
			else
				control = (control & (~y));

			break;
		case 1:
			// set to on

			if (y == 15)
				control = 15;
			else
				control = (control | y);

			break;
		case 2:
			// toggle
			if (y == 15)
			{
				control ^= 15;
			}
			else
			{
				// bit schon gesetzt?      falls schon ausmask.  falls nicht einmask.
				control = ((control & y) == y) ? (control & (~y)) : (control | y);
			}

			break;
		default:
			printf ("you must provide the status (on|off|toggle)!\n");
			return 0;
			break;
		}

		outb (control ^ 0x0b, CONTROL);

	}


	if (!quiet_mode)
		printbits ();

	ioperm (DATA, 3, 0);
	return 0;
}


void printparams ()
{
	printf ("usage: lpic [-q] <pin number> <off|on|toggle>\n");
	printf ("toggles level of pin\n");
	printf ("where <number> is from 0-8 (8=all) or one of q,w,e,r,t (q=all), pin on, off or toggle.\n");
	
	return;
}



void printbits ()
{
	int db = 0;
	int pb = 0;
	int cb = 0;


	status = inb (STATUS);
	// invert bit 7 (1000000)
	status ^= 128;
	
	
	if (data & 1)
		db += 1;
	if (data & 2)
		db += 10;
	if (data & 4)
		db += 100;
	if (data & 8)
		db += 1000;
	if (data & 16)
		db += 10000;
	if (data & 32)
		db += 100000;
	if (data & 64)
		db += 1000000;
	if (data & 128)
		db += 10000000;

	if (status & 8)
		pb += 1;
	if (status & 16)
		pb += 10;
	if (status & 32)
		pb += 100;
	if (status & 64)
		pb += 1000;
	if (status & 128)
		pb += 10000;

	if (status & 1)
		cb += 1;
	if (control & 2)
		cb += 10;
	if (control & 4)
		cb += 100;
	if (control & 8)
		cb += 1000;

	printf ("-------------\n");
	printf ("Data Bits: [%08d] (%d)\n", db, data);
	printf ("Data0:\t\t0(pin 2)\t%s\n", data & 1 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Data1:\t\t1(pin 3)\t%s\n", data & 2 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Data2:\t\t2(pin 4)\t%s\n", data & 4 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Data3:\t\t3(pin 5)\t%s\n", data & 8 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Data4:\t\t4(pin 6)\t%s\n", data & 16 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Data5:\t\t5(pin 7)\t%s\n", data & 32 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Data6:\t\t6(pin 8)\t%s\n", data & 64 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Data7:\t\t7(pin 9)\t%s\n", data & 128 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("-------------\n");
	printf ("Control Bits: [%04d] (%d)\n", cb, control);
	printf ("/Strobe:\tw(pin 1)\t%s\n", control & 1 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("/Auto_feed:\te(pin 14)\t%s\n", control & 2 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("Init:\t\tr(pin 16)\t%s\n", control & 4 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("/SelectIn:\tt(pin 17)\t%s\n", control & 8 ? "HIGH\t(+5V)" : "LOW\t(GND)");
	printf ("-------------\n");
	printf ("Input Bits: [%05d] (%d)\n", pb, status);
	printf ("Error:\t\t(pin 15)\t%s\n", status & 8 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
	printf ("Select:\t\t(pin 13)\t%s\n", status & 16 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
	printf ("Paperend:\t(pin 12)\t%s\n", status & 32 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
	printf ("Ack:\t\t(pin 10)\t%s\n", status & 64 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
	printf ("/Busy:\t\t(pin 11)\t%s\n", status & 128 ? "OPEN\t(N/C)" : "CLOSE\t(GND)");
	printf ("-------------\n");


	return;

}

ich habe das hier mal untergebracht, weil ich inetwa 5-6 stunden danach gesucht habe. sowas baut man sich scheinbar selbst oder kauft gleich die serielle von conrad.

das ganze wird fix compiliert mit

Code:
$:  gcc lpic.c -O -o lpic -Wall

und schon ist es einsatzbereit.
ein kleines shellscript, daß ein relais schaltet und nach 2 sek wieder ausschaltet:

Code:
#!/bin/sh
lpic -q 7 on
sleep 2
lpic -q 7 off

und in der extensions.conf

Code:
exten => 25,1,system(/var/lib/asterisk/agi-bin/opendoor.sh &)

die tür bekomme ich jetzt also auf. ich habe das mal alles (obwohl recht simpel) so ausführlich ausfallen lassen, falls jemand lust hat, das so nachzubauen.

mein eigentliches problem ist: wie mache ich das jetzt. ich könnte mir von meinem telefonanbieter eine zusätzliche nummer geben lassen, aber wenn sich jemand verwählt ist tag der offenen tür. (ok, das ist ziemlich unwahrscheinlich aber ich finde das auch zu unsicher (mein vermieter hat das so ^^). dann hatte ich gleich mehrere ideen:

- bluetoothmaus mit fingerabdruckscanner (und asterisk sagt: "hallo sounso") aber die reichweite ist nicht der hammer und teuer ist sowas auch noch.

- rfid lesegerät und transponder (und asterisk sagt: "hallo sounso"). das finde ich immer noch am stylichsten

- dect ;) und alles mit asterisk

und in ermangelung anderer hardware habe ich mir ein altes gigset s2000 genommen und "direktwahl bei gesperrtem gerät" eingestellt. eine interne nummer programmiert unter der asterisk die tür aufmacht.

jetzt ist jedem (selbst mir) selbstverständlich klar, daß man besser den schlüssel durch die gegend trägt, als ein gigaset und selbst unter der fußmatte macht das teil keine gute figur.

hat jemand eine besser idee, ohne große bauliche veränderungen (kabel im treppenhaus), möglicht günstig und strommäßig autonom ans ziel zu kommen?

viele grüße
n8|
 
Zuletzt bearbeitet:
Du könntest dir ne eigene Rufnummer für das Teil besorgen und erst nach Eingabe einer PIN die Tür aufmachen.

Der Nachteil: Der Anruf kostet, weil Asterisk erst abheben muss und nach der PIN fragen muss.
 
stimmt! die welt kann so einfach sein ;). das mach ich jetzt auch so. vielen dank.

btw.: hach .. ein admin aus dem saarland, da fühlt man sich gleich ganz zuhause ;)

edit: das mit dem transponder werde ich, glaube ich, trotzdem weiterverfolgen. das ist ungemein praktisch, wenn man viel zeugs auf dem arm hat.
 
n8isch schrieb:
stimmt! die welt kann so einfach sein ;). das mach ich jetzt auch so. vielen dank.

btw.: hach .. ein admin aus dem saarland, da fühlt man sich gleich ganz zuhause ;)

edit: das mit dem transponder werde ich, glaube ich, trotzdem weiterverfolgen. das ist ungemein praktisch, wenn man viel zeugs auf dem arm hat.

Und, schon was gemacht in der Richtung ?
Ich habe seit 2004 eine Zeiterfassung auf einem Modifizierten Fli4l
laufen. :rolleyes: Bei Interesse weitere Infos über einfache Uniqe Transponder und Lesekopf, Anbindung Seriell oder über Prolific USB-seriell Konverter. :D
Wollte jetzt alles mal auf die Box portieren, daher die USB Anbindung.
Z. Zt. benutze ich unter Fli4l miterm.
Für eine Asus WL-HDD 2.5 hab ich leider kein Passendes Binary und auch keine Entwicklungsumgebung. :noidea:
Auf der Fritz Box ist das auch ganz nett, so mit Zutrittskontrolle der ein oder anderen Tür :cool:
Also, ausgefuxter Linuxer bekommt gerne im Gegenzug alles, was ich dazu Beisteuern kann. :nemma:
 
;) ... nein, also so fix bin ich auch wieder nicht. aber das was du da erzählst, hört sich interessant an. ich denke da gerade an einen wlan-usb-server an den man dann mittels eines seriell zu usb (ohmeingott) dein lesegerät anbringen könnte ;). allerdings habe ich sowas auch schon, wie gesagt, für ca 30 eur als USB bei ebay gesehen. nur fehlt mir dazu das transponder-know-how.

wenn ich dich aber richtig verstanden habe willst du das ganze auf diesem asus wlan festplattenserver zum laufen bringen, oder willst du lediglich den asus mit der fritzbox verbinden (für letzteres schau mal hier). oder habe ich dich komplett mißverstanden?
 
n8isch schrieb:
;) ... nein, also so fix bin ich auch wieder nicht. aber das was du da erzählst, hört sich interessant an. ich denke da gerade an einen wlan-usb-server an den man dann mittels eines seriell zu usb (ohmeingott) dein lesegerät anbringen könnte ;).
Genau so dacht ich mirs.
n8isch schrieb:
allerdings habe ich sowas auch schon, wie gesagt, für ca 30 eur als USB bei ebay gesehen.
Meinst Du ein USB-Serial Adapter ?
n8isch schrieb:
nur fehlt mir dazu das transponder-know-how.
Es gibt einfache Transponder Leseköpfe, die incl. Antenne alles Nötige
beinhalten und eben mit einem z.b. umfunktionierten Handykabel (da TTL Low Volt 3.3-5V) mit wenig Aufwand direkt via USB mit der nötigen Spannung von 5V max. 200 mA die Tag Info ausliefern.
Soweit so gut.
Wie gesagt hab ich das auf x86 fli4l laufen.
Dazu benutze ich miterm.
n8isch schrieb:
wenn ich dich aber richtig verstanden habe willst du das ganze auf diesem asus wlan festplattenserver zum laufen bringen
Genau.
n8isch schrieb:
, oder willst du lediglich den asus mit der fritzbox verbinden (für letzteres schau mal hier).
Der Link ist mir bekannt, bringt einen aber in diesem Zusammenhang nicht viel weiter.
n8isch schrieb:
oder habe ich dich komplett mißverstanden?

Nein, die Fritz Box ist als alternative Hardware zur WL-HDD gedacht.
 
also, ohne daß ich jetzt ahnung von dem hätte, was ich dir jetzt erzähle, gibt es wohl die möglichkeit OpenWRT auf diesem wlan-server zu installieren, was du wahrscheinlich auch müsstest, wenn du den kram an die fritz-box anschließen wolltest. ich habe dazu hier was gefunden: http://wl500g.info/forumdisplay.php?f=77 &acute;
die lassen damit auch apache auf dem ding laufen, was ich doch schonmal sehr beachtlich finde. ich ahbe allerdings gar keine ahnung von diesem OpenWRT, aber es scheint hier im forum jede menge leute zu geben, die damit schon gearbeitet haben. vielleicht kann jemand mal was dazu sagen ;)
 
n8isch schrieb:
also, ohne daß ich jetzt ahnung von dem hätte, was ich dir jetzt erzähle, gibt es wohl die möglichkeit OpenWRT auf diesem wlan-server zu installieren, was du wahrscheinlich auch müsstest, wenn du den kram an die fritz-box anschließen wolltest.;)
Warum list du meine Kommentare nicht ? :mad:
(und Antwortest nicht auf Fragen ?)
Ich Zitiere mich selber: Nein, die Fritz Box ist als alternative Hardware zur WL-HDD gedacht. :)

Ich bräuchte lediglich ein binary von z.B. miterm, das auf der FritzBox ODER der WL-HDD läuft.
Oder eine Alternative dazu.
Alle Versuche, direkt das /dev/ttyUSB0 Abzufragen ohne miterm scheiterten bisher.
 
Maik schrieb:
Du könntest dir ne eigene Rufnummer für das Teil besorgen und erst nach Eingabe einer PIN die Tür aufmachen.

Der Nachteil: Der Anruf kostet, weil Asterisk erst abheben muss und nach der PIN fragen muss.

Da hätte ich auh ne Idee: Inzwischen gibt es ja schon Wlan-Handies mit Voip. So man vor deiner Tür Wlan hat, wäre das auch eine Möglichkeit. Und Kostenlos ist sie auchnoch (Wenn man mal den Preis für die Beschaffung ignoriert :))
 
ich hätte ja den pda, aber bis der mal im wlan ist ... nein, das muß mindestens so komfortabel sein, wie den schlüssel benutzen, sonst mach das keinen sinn. spracherkennung über die sprechanlage wäre auch mal anzudenken. ;)
 
Maik schrieb:
Du könntest dir ne eigene Rufnummer für das Teil besorgen und erst nach Eingabe einer PIN die Tür aufmachen.

Der Nachteil: Der Anruf kostet, weil Asterisk erst abheben muss und nach der PIN fragen muss.

das mit dem Abheben muß ja nicht sein.

Ich schalte so

Code:
 exten => 1234,1,GotoIf($["${CALLERIDNUM}" = "0815" | "${CALLERIDNUM}" = "4711"]?3:7)
 exten => 1234,3,System(eib-switch.py -a 0/0/1 -c on "${CALLERIDNUM}")
 exten => 1234,4,Busy
 exten => 1234,7,Congestion

z.B. meine Außenbeleuchtung ein.

Ciao,
dev
 
Naja, die CallerId ist ja keine sichere Identifikation. Also für Türen eher ungeeignet. Für licht ist das aber Ok.
 
Warum soll die Callerid unsicher sein???

nehmen wir doch einfach die Handynummer. Wie bitte soll man einen Anruf von einer Handynummer fälschen können?
 
Naja, wenn du z.B. mal dus.net nimmst. Dort gibt es die Möglichkeit, dass Du eine beliebige Festnetznummer als Callerid übertragen läst (die wird allerdings vorher verifiziert, ob es auch wirklich Deine ist). Aber alleine das zeigt schon, das es offensichtlich möflicg ist, von einem Fremdanschluss eine beliebige CallerId zu senden (und wieso nicht auch die Handy-Nummer!). Daher ist die CallerId auch als eher unsicher anzusehen. Außerdem besteht ja immer die Möglichkeit, dass jemand Dein Handy zockt, bzw. kurzfristig Zugriff darauf bekommt. Ein Anruf, und die Tür ist auf (egal, wo Du dich gerade befindest).
 
Hallo,

das mit der CallerID kann man auch über folgende Syntax "vereinfachen"

exten => 384263/01601234567,1,System(dooropen.sh....)

Damit wird diese exten nur berücksichtigt, wenn der Anrufer mit 01601234567 reinkommt.

Allerdings muß ich den Kritikern auch recht geben, die CallerID ist keine sichere Authentifizierung. Man kann (sofern beim Telefonprovider freigegeben -siehe ClipNoScreening-) beliebige CallerIDs übermitteln. Dieses wird auch oft in Firmen genutzt, um z.B. auch von Telefonanschlüssen in OrtA mit der Zentralen Nummer von OrtB nach außen zu erscheinen. Ebenso wird das benötigt wenn eine Telefonanlage eine Rufumleitung nach extern handelt, wo die Anrufende Telefonnummer beim Angerufenen sichtbar sein soll...
In wieweit Privatpersonen das beantragen können, kann ich aber nicht sagen. Aber die Gefahr ist da.


MfG
Sascha
 
oh, danke, das kannte ich noch nicht
 
Couldn't get the port on 378

Bei mir funktioniert alles recht gut. Als root kann ich das Program (bei mir lpiclp0) starten und ie Relais schalten. Aber wenn ich das Script unter dem user asterisk ausführe, kommt folgende Meldung.

Code:
[asterisk@asterisk1 bin]$ lpiclp0 1 on
Couldn't get the port at 378
try it as root.
Die Berechtigungen habe ich auch gesetzt:
Code:
[root@asterisk1 ~]# ls -al /dev/lp*
crw-rw-rw-  1 root lp 6, 0 Sep 29 12:57 /dev/lp0
crw-rw----  1 root lp 6, 1 Sep 29 12:57 /dev/lp1
crw-rw----  1 root lp 6, 2 Sep 29 12:57 /dev/lp2
crw-rw----  1 root lp 6, 3 Sep 29 12:57 /dev/lp3

Code:
[root@asterisk1 ~]# ls -al /dev/parport*
crw-rw-rw-  1 root lp 99, 0 Sep 29 12:57 /dev/parport0
crw-rw----  1 root lp 99, 1 Sep 29 12:57 /dev/parport1
crw-rw----  1 root lp 99, 2 Sep 29 12:57 /dev/parport2
crw-rw----  1 root lp 99, 3 Sep 29 12:57 /dev/parport3

Entsprechend funktioniert der Befehl auch nicht im Asterisk Dialplan.
Hat jemand eine Lösung parat?
 
Zuletzt bearbeitet:
Hallo,
ich würde mal schaun das der User Asterisk berechtigungen auf die parallel bzw. seriell devices bekommt.
Als einfachere Variante kannst auch anstatt lpiclp0 direkt zu starten, das ganze mit
Code:
su root -c "lpiclp0 1 on"
starten. dann wird das programm eben als root ausgeführt.
 
Habe es mit Sudo gemacht - funktioniert

In /etc/sudoers Zeile angefügt
Code:
asterisk ALL = NOPASSWD: /usr/local/bin/lpiclp0
Dann im Dialplan:
Code:
exten => 780,n,System(sudo lpiclp0 0 on)
geht.

Danke.
 
Zuletzt bearbeitet:
füge eventuell den user asterisk zur gruppe lp hinzu
 

Statistik des Forums

Themen
246,149
Beiträge
2,246,977
Mitglieder
373,668
Neuestes Mitglied
Stripi
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.