1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

sms über bluetooth?

  • MrBurns
  • 20. April 2005 um 17:37
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • MrBurns
    Punkte
    375
    Beiträge
    59
    • 20. April 2005 um 17:37
    • #1

    Hi!

    Habe folgendes vor: jeden, der in bluetooth-range ist, eine Nachricht zukommen lassen. Das ganze sollte in java sein (weil ich mich mit C wirklich nicht auskenn) und möglichst auf Linux laufen (noch lieber auf mac os x, aber die haben eine grausige eigene bluetooth bzw. serielle-ports Implementierung ...)

    Es gibt hier im Forum eh schon einen ähnlichen Thread (die sms-wall), und ich hab mir die jsmsengine eh auch schon angeschaut, nur is das halt die falsche Richtung. (mensch -> computer, nicht computer -> mensch ...) So wie ich das sehe, muss man wohl echt AT - Commands ans Handy schicken (80er lassen grüssen) und ihm vorgaukeln, eine sms zu bekommen, obwohl die message eigentlich über bluetooth kommt.

    Die andere Möglichkeit die ich angedacht hab ist, beim Finden eines neuen Geräts seine tel# vom sim auszulesen und dann mit sowas wie jsms eine sms zu schicken, aber ich befürchte das geht dann doch nicht so leicht. man kann zwar schon Info über die sim auslesen, aber ob das auch für die tel# geht ....? ausserdem wär das ja auch nicht wirklich nett / legal ... :devil:

    Optimal wäre es, wenn der Benutzer eine Nachricht bekommt "xxx will über bluetooth kontakt aufnehmen" und wenn er mit "ja" antwortet bekommt er eine generierte Nachricht ...

    hat da jemand eine Idee? ich bin schon so weit, bluetooth-geräte zu finden (in java: http://www.avetana-gmbh.de/avetana-gmbh/p…/jsr82.eng.xml), aber dann kommt die ganze g'schicht mit den services, und da steh ich irgendwie an: messages zu empfangen sollte doch eigentlich prinzipiell auf jedem bluetooth-handy möglich sein (von mir aus auch in der form von vCards, wurscht) ... :confused:

  • MarvinTheRobot
    Punkte
    7.308
    Beiträge
    1.368
    • 20. April 2005 um 18:29
    • #2

    ich kann nur zum letzten absatz was sagen: natürlich is text empfangen mit bluetooth möglich... schon mal was von bluejacking gehört? :devil: macht spass, hab ich letztens wieder exzessiv gegenüber n-gage phones praktiziert.... vcard auswählen in der ein text steht, via bluetooth senden.... fertig.

    blöd isses halt wenn das handy bei der verbindung mit einem bluetooth dongle einen code verlangt.... (schlüssel der auf beiden geräten eingegeben werden muss) dann stehst natürlich an, ist klar....

  • MrBurns
    Punkte
    375
    Beiträge
    59
    • 20. April 2005 um 18:31
    • #3

    ok, so eine vCard würd ich jetzt gern am PC generieren und verschicken ... bloß ... wie geht?

  • MarvinTheRobot
    Punkte
    7.308
    Beiträge
    1.368
    • 20. April 2005 um 18:36
    • #4

    ähm am pc? outlook?

    osX -> das stinknormale Adressbuch liest vCards und erzeugt diese auch.... das übernimmt sogar das adressbuch vom telefon beim iSync als vCards....

    EDIT: rename txt to vcf -> das is das layout einer vcard datei. ich hab grad von meiner windows kiste via bluetooth sowas aufs S65 versandt... hat funktioniert nur weiss ich net wo die datei am handy gelandet is....

  • MrBurns
    Punkte
    375
    Beiträge
    59
    • 20. April 2005 um 19:04
    • #5

    ok, Du hast das mit irgendeinem Programm geschickt, ich würd das gern programmatisch aus java aus machen ...

    = so eine vcard nehmen, in bytecode umwandeln, die nötigen headers anhängen und dann einen kanal finden, über den man das verschicken kann ... bin dabei ...

  • MrBurns
    Punkte
    375
    Beiträge
    59
    • 23. April 2005 um 19:40
    • #6

    ok, hab das jetzt hinbekommen, falls es wen interessiert, hier eine vcard-klasse, die sich im passenden obex-bytecode zurückgibt. Is noch alles andere als perfekt, aber als proof of concept passts (so kann z.B. eine vCard noch nicht länger als 8kb = 1 packet sein).
    Den bytecode schickt man dann über einen passenden stream ans andere bluetooth-device (http://www.avetana-gmbh.de/avetana-gmbh/jsr82.xml).
    mehr Info unter http://benhui.net/

    Java
    import java.io.UnsupportedEncodingException;
    
    
    
    
    // VCard 3.0 defintion: http://www.ietf.org/rfc/rfc2425.txt
    public class VCard {
    
    
    	 private byte[] toByteArray(String hex) {
    	 	 java.util.Vector res = new java.util.Vector();
    	 	 String part;
    	 	 int pos = 0;
    	 	 int len = 0;
    
    	 	 while (pos<hex.length()) {
    	 	 	len = ((hex.substring(pos,pos+1).equals("-")) ? 3 : 2);
    	 	 	part = hex.substring(pos,pos+len);
    	 	 	pos += len;
    	 	 	int test = Integer.parseInt(part,16);
    	 	 	res.add(new Byte((byte)test));
    	 	 }
    
    	 	 if (res.size()>0) {
    	 	 	byte[] b = new byte[res.size()];
    
    	 	 	for (int i=0; i<res.size(); i++) {
    	 	 		Byte a = (Byte)res.elementAt(i);
    	 	 		b[i] = a.byteValue();
    	 	  	}
    
    	 	 	return b;
    
    	 	 } else {
    	 	 	return null;
    	 	 }
     	 }
    
    
    	
    
    	private String title, firstname, lastname, phone, email;
    
    	public VCard(String title, String firstName, String lastName, String phone, String email) {
    		this.title = title;
    		this.firstname = firstName;
    		this.lastname = lastName;
    		this.phone = phone;
    		this.email = email;
    
    	}
    
    	public byte[] getBodyHeader() throws UnsupportedEncodingException {
    		byte[] header = new byte[3];
    
    		header[0] = 0x49;
    
    		byte[] headerRest = toByteArray(Integer.toHexString(getBody().length+3));
    
    		switch(headerRest.length) {
    
    			case 1:
    				header[1] = 0x00;
    				header[2] = headerRest[0];
    				return header;
    			case 2:
    				header[1] = headerRest[1];
    				header[2] = headerRest[2];
    				return header;
    			default:
    				throw new UnsupportedEncodingException(); 
    		}
    
    	}
    
    	public byte[] getBody() {
    
    		byte[] value = null;
    		String vcardBody = "BEGIN:VCARD\r\nVERSION:3.0\r\nN:";
    
    
    
    		if(lastname != null) {
    			vcardBody += lastname;
    		}
    
    		vcardBody += ";";
    
    		if(firstname != null) {
    			vcardBody += firstname;
    		}
    
    		vcardBody += ";;;\r\n";
    
    		if(phone != null) {
    			vcardBody += "TEL;type=pref:"+phone+"\r\n";
    		}
    
    
    		if(email != null) {
    			vcardBody += "EMAIL;INTERNET:"+email+"\r\n";
    		}
    
    		vcardBody += "END:VCARD\r\n";
    
    		return vcardBody.getBytes();
    	}
    
    	public byte[] getBodyHeaderWO() throws UnsupportedEncodingException {
    		byte[] header = new byte[5];
    
    		// HI for "name"
    		header[0] = (byte) 0xc3;
    
    		// +3 for the header
    		byte[] headerRest = toByteArray(Integer.toHexString(getBody().length));
    
    		switch (headerRest.length)
    		{
    			case 1:
    				header[1] = 0x00;
    				header[2] = 0x00;
    				header[3] = 0x00;
    				header[4] = headerRest[0];
    				return header;
    			case 2:
    				header[1] = 0x00;
    				header[2] = 0x00;
    				header[3] = headerRest[0];
    				header[4] = headerRest[1];
    				return header;
    			case 3:
    				header[1] = 0x00;
    				header[2] = headerRest[0];
    				header[3] = headerRest[1];
    				header[4] = headerRest[2];
    				return header;
    			case 4:
    				header[1] = headerRest[0];
    				header[2] = headerRest[1];
    				header[3] = headerRest[2];
    				header[4] = headerRest[3];
    				return header;
    			default:
    				// throws exception if title is too long
    				throw new UnsupportedEncodingException();
    
    
    		}
    
    	}
    
    
    	/**
    	 * 
    	 * @return The "name" header
    	 * @throws UnsupportedEncodingException if the title is too long
    	 */
    	public byte[] getTitleHeader() throws UnsupportedEncodingException {
    		byte[] header = new byte[3];
    
    		// HI for "name"
    		header[0] = 0x01;
    
    		// +3 for the header
    		byte[] headerRest = toByteArray(Integer.toHexString(getTitle().length+3));
    
    		switch (headerRest.length)
    		{
    			case 1:
    				header[1] = 0x00;
    				header[2] = headerRest[0];
    				return header;
    			case 2:
    				header[1] = headerRest[0];
    				header[2] = headerRest[1];
    				return header;
    			default:
    				// throws exception if title is too long
    				throw new UnsupportedEncodingException();
    		}
    
    	}
    
    	public byte[] getTitle() {
    		byte[] title = this.title.getBytes();
    		byte[] title2 = new byte[title.length*2+2];
    
    		int j=0;
    		int i=0;
    		for(i=0; i<title.length; i++) {
    			title2[j] = 0x00;
    			title2[j+1] = title[i];
    			j += 2;
    		}
    		j -= 1;
    
    		title2[j+1] = 0x00;
    		title2[j+2] = 0x00;
    
    		return title2;
    	}
    
    	public byte[] getCardBytes() throws UnsupportedEncodingException {
    
    		int pos = 0;
    		int totalLength = 13 + getTitle().length + 3 + getBody().length + 3;
    
    		byte[] data = new byte[totalLength];
    
    		byte[] headerRest = toByteArray(Integer.toHexString(totalLength));
    		byte[] header = new byte[3];
    		header[0] = (byte) 0x82;
    
    		switch(headerRest.length) {
    
    			case 1:
    				header[1] = 0x00;
    				header[2] = headerRest[0];
    				break;
    			case 2:
    				header[1] = headerRest[0];
    				header[2] = headerRest[1];
    				break;
    			default:
    				throw new UnsupportedEncodingException();
    
    		}
    
    
    		for(int i=0; i<header.length; i++)
    			data[pos++] = header[i];
    
    
    		data[pos++] = (byte) 0xcb;
    		data[pos++] = (byte) 0xc3;
    		data[pos++] = (byte) 0x0f;
    		data[pos++] = (byte) 0xa5;
    		data[pos++] = (byte) 0x96;
    
    		for(int i=0; i<getTitleHeader().length; i++)
    			data[pos++] = getTitleHeader()[i];
    
    		for(int i=0; i<getTitle().length; i++)
    			data[pos++] = getTitle()[i];
    
    		for(int i=0; i<getBodyHeaderWO().length; i++)
    			data[pos++] = getBodyHeaderWO()[i];
    
    		for(int i=0; i<getBodyHeader().length; i++)
    			data[pos++] = getBodyHeader()[i];
    
    		for(int i=0; i<getBody().length; i++)
    			data[pos++] = getBody()[i];
    
    		return data;
    	}
    }
    Alles anzeigen
  • Superwinki
    Punkte
    832
    Beiträge
    161
    • 25. April 2005 um 11:58
    • #7
    Zitat von MarvinTheRobot

    hat funktioniert nur weiss ich net wo die datei am handy gelandet is....



    Im Normalfall landet das Ganze zuerst auf dem Display und man darf sich entscheiden, ob man die Nachricht speichert oder nicht - VCards landen im Telefonbuch in der Gruppe "Empfangene".
    Was ich auch amüsant fand - bei den alten BT Headsets konnte man diese ansprechen und danach die Zeitansage wählen, toll für den, ders im Ohr hat :verycool:

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum