dit artikel zal van hoog naar lager niveau uitleggen hoe je een eenvoudige SMS-enabled mobiele applicatie kunt schrijven waarmee je “over de lucht installatie berichten” kunt verzenden. Na het lezen van dit artikel, bent u in staat om een kleine J2ME applet die zich in theorie zal sturen naar een andere telefoon met behulp van een SMS-bericht als het middel van levering te creëren. In feite, als gevolg van beperkingen in de Wireless Messaging API in J2ME (JSR 120/205) de poort voor WAP Push berichten zijn “gereserveerd” om veiligheidsredenen. De mogelijkheid om content te verzenden via het breed ondersteunde SMS-kanaal kan zeer nuttig zijn voor contentproviders.
SMS-berichten zijn een klein aantal ingepakte bytes die via de netwerken van de operator worden verzonden. Velen van jullie hebben al ervaren het verzenden van “tekstberichten” van apparaten en velen verwijzen naar het verzenden van SMS-berichten als “SMS”.
een kleine technische inleiding tot SMS
het toepassingsgebied van dit artikel is praktisch, dus we zullen niet alle technische en saaie details van netwerken doornemen, maar drie concepten zijn vrij belangrijk begrijpen over sms.
- SMS gebruikt het concept “poort” net als een standaard internet sockets;
- SMS-berichten hebben een limiet in de body van 160 tekens;
- de body is niet het enige waarmee je kunt spelen in een SMS, er is ook de User Data Header.
poorten
wanneer u een URL in uw browser klikt, zoals http://dev.mobi, belt u normaal gesproken op transparante wijze poort 80 van een webserver. De verbinding wordt geïnitialiseerd op poort 80 en vervolgens overgeschakeld naar een hogere poort om andere gebruikers toegang te geven tot dezelfde poort van de webserver. Poort 80, zoals gezegd door IANA verwijst naar het HTTP-protocol, betekent dit dat een server, die in staat is om HTTP-protocol verzoek te begrijpen, zal worden gewekt en zal klaar zijn om HTTP-verzoeken te beantwoorden en te verwerken. Hetzelfde gebeurt met SMS-berichten. U kunt een SMS te sturen naar een specifieke poort van een telefoon en je zal wakker een specifieke Dienst op dat apparaat. Net zoals niet alle computers standaarddiensten hebben (zoals een webserver), hebben ook niet alle mobiele apparaten diensten die naar poorten luisteren. Dit is een zeer “fabrikant gerelateerde” spullen, dus je moet je telefoon controleren wat is ingeschakeld om te accepteren.
Body en codering
dit kan een moeilijk onderwerp zijn om te behandelen, maar we zullen alleen zeer basisinformatie beschrijven die nuttig kan zijn. SMS standaard codering gebruikt 7 bits om een karakter te verwerken. Dit betekent dat je in een SMS alleen die karakters kunt schrijven die aanwezig zijn op een zeer basic char tafel, ja die beroemde 127 karakters. Als je meer ingewikkelde dingen wilt doen en meer “interessante” karakters wilt versturen, dan is een groep van 8 bits nodig en wordt de tabel met beschikbare karakters groter. De beschikbare ruimte is 1120 bits per SMS, niet meer, niet minder. U kunt 160 tekens hebben met 7 bits of 140 tekens met 8 bits
opmerking: het teken “É” is opgenomen in de “basic table”, terwijl het teken “È” in de “bigger tables”staat. Als je een bericht schrijft met het tweede teken, dan heb je minder ruimte beschikbaar in het bericht. Let dus op welke karakters u gebruikt bij het versturen van SMS 😉
User Data Header
de User Data Header (ook bekend als UDH) is wat een “high level developer” kan instellen om iets meer te doen dan een eenvoudig “sms-bericht”. Een UDH is erg handig omdat je “onzichtbare tekstberichten” kunt verzenden naar mobiele applicatie (waar naar “mobiele applicaties” bedoel ik die op mobiele apparaten bijvoorbeeld) of je kunt een apparaat vertellen dat het bericht Speciale informatie zal bevatten. Het lijkt erg op een XML-bestand: je moet de parser vertellen wat je verzendt, en de inhoud die volgt op de prolog die door de parser zelf zal worden afgehandeld.
de UDH wordt voornamelijk gebruikt om aan te geven naar welke poorten onze client (telefoon) de SMS zal sturen. Het is gemaakt door een set van Hexuitdraai-getallen die beschrijven:
<hoe lang de UDH> <het formaat dat wordt gebruikt om poortnummers> <de poortnummer lengte> <doelpoortnummer> <bronpoortnummer>op te geven.
als praktisch voorbeeld, stel Ik wil een UDH maken om een WAP Push te sturen, waar de standaard doelpoort voor WAP pushes 2948 is, zal de UDH zijn:
1
|
06 05 04 0B 84 23 F0
|
waarbij:
- 06 betekent “hey the read the following 6 bytes”
- 05 is het formaat voor getallen, in dit geval zullen hexadecimale getallen
- 04 de UDH vertellen dat elke poort wordt weergegeven met 4 tekens
- 0B84 is de bestemmingspoort, 2948 (decimale weergave) of 0B84 (hexadecimale weergave)
- 23F0 is de bronpoort, 9200 (decimale weergave) of 23F0 (hexadecimale weergave)).
opmerking: gebruik een eenvoudige rekenmachine om decimale getallen om te zetten in hex; selecteer “Dec”, plaats 2948 in de rekenmachine en druk vervolgens op de knop “Hex”. Elke wetenschappelijke calculator kan dit doen en veel besturingssystemen hebben een beetje “calc” applicatie ergens die dit kan doen.
binair SMS
een “binair SMS” is een XML-geformatteerde tekstuele SMS die is getransformeerd met WBXML. WBXML is een “tag transformer”, dit betekent dat voor elke XML tag, een binaire byte is gekoppeld. Bijvoorbeeld, de tag < SI> wordt geconverteerd als het binaire teken 
waarom WBXML?Gemakkelijk antwoord: het resultaat van een WBXML-transformatie is kleiner in het aantal gegenereerde bytes dan het uitgebreide tekstuele XML-bestand zelf.
opmerking: veel tags worden geconverteerd naar bytes, maar soms ook inhoud (zoals URL-adressen) bijvoorbeeld de URL http://www.dev.mobi kan in WBXML worden geschreven als 0Ddev.mobi , waarbij ” 0D ” staat voor http://www.
“0 C” is een meer generieke en staat voor http:// je kunt dus schrijven de URL op twee manieren:
1
|
<span>0Ddev.mobi </span>
|
of
1
|
<span>0Cwww.dev.mobi< / span>
|
de eerste gebruikt 9 tekens (0D is één byte), de tweede 13 tekens! Ik hou van wbxml 🙂
termen
om duidelijk te zijn, met” WAP push ” bedoelen we niet een manier om SMS te versturen met WAP. Wat we bedoelen is wat technisch bekend staat als SI (Service Indication). Een Service indicatie is een binaire SMS verzonden naar een dedicated poort op een apparaat dat het apparaat informeert dat er een URL wacht om te worden bezocht. De URL kan het adres zijn van een ring-tone in een webserver, het adres van een JAD-bestand om een J2ME-applicatie of een JPG of gewoon een WAP-pagina te installeren; het is aan de “webmaster” van de webserver om de inhoud op de website te plaatsen, en het is aan het apparaat om te begrijpen hoe de inhoud te behandelen. Meer informatie over dit aspect van de puzzel vindt u in de Artikelserie onze Content adaptation.
Opmerking: Als ik “webserver” zeg, bedoel ik zowel web-als WAP-server, omdat de meeste webservers geconfigureerd kunnen worden om WAP-inhoud te leveren. Met “Ota configuratie SMS” bedoel ik een binaire SMS die APN details bevat (maar kan meer bevatten) ook bekend als “Internet Access Configuration”.
Opmerking: Er zijn speciale “Service Indication” – berichten die gewoonlijk SL (Service Load) worden genoemd en vergelijkbaar zijn met “SI”. Een SI vraagt de toestemming aan de gebruiker voordat het ophalen van de inhoud via de netwerkverbinding, SL inhoud automatisch downloaden zonder toestemming te vragen aan de gebruiker. “SL” zijn zeer vergelijkbaar met MMS berichten: de inhoud is op een webserver en de SMS vertelt de telefoon om het bericht te downloaden.
dus laten we beginnen
allereerst moeten we (helaas) een aantal papers lezen om enkele specificaties te lezen over het schrijven van XML-inhoud die via SMS verzonden moet worden. Een goed startpunt zou de Nokia ‘ s “Smart Messaging Specification 3.0.0” die kan worden gedownload van www.forum.nokia.com en ook meer technische documenten van de Open Mobile Alliance (OMA) van www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
dus onze stappen zullen:
- bepaal wat we willen verzenden
- zoek de documenten over dat onderwerp
- Zoek de XML-structuur van het te verzenden bericht
- Pas de XML
- converteer de XML naar WBXML
- maak de UDH
- stuur de UDH en de BODY
omdat we een J2ME-applicatie naar een nieuwe telefoon willen sturen, moeten we een “service indication” – bericht sturen, ook bekend als “WAP Push”. Deze ” SI ” kan worden gebruikt om een SMS die zal worden gelezen als een link om iets te downloaden pushen. Elk content-type (image / jpeg, application/java-archive,…) is geldig als de telefoon het kan openen.
dus, wie kan vertellen welke content-types een apparaat kan openen ? DeviceAtlas kunnen ons hier helpen! (zie referenties)
Zoek de documenten over dat onderwerp
Ok, laten we de OMA-link openen en laten we naar het “functionele gebied” gaan met de aanduiding “push”. Laten we de “WAP service indicatie specificatie “. Om te begrijpen hoe WBXML werkt, stel ik voor om paragraaf 8.3.2 “attribuut Start Tokens”te lezen.
vind de XML-structuur van het bericht
voor degenen onder u die meer op DTD ‘ s lijken, kijk naar paragraaf 7.2. Alle anderen kunnen alle doc overslaan en naar het lees voorbeeld gaan in Paragraaf 9. De XML daar is vrij vanzelfsprekend, dus Ik zal wat aanpassing direct doen.
1
2
3
4
5
6
7
|
<?xml versie = “1.0”?>
<!DOCTYPE si PUBLIC “- //WAPFORUM//DTD SI 1.0 / / EN” “http://www.wapforum.org/DTD/si.dtd”>
<si>
<indication href=http://www.dev.mobi/is_fun.html si-id=”6532″>
DevDotMobi is Fun !
</indication>
</si>
|
Convert to WBXML
Hex code | Meaning |
---|---|
02 | WBXML Version 1.2 |
05 | SI 1.0 Public Identifier |
6A | Charset UTF-8 |
00 | String table length = 0 |
45 | <SI> |
C6 | <indication> |
0C | href=”http:// |
03 | String starts |
* 7777772E6465762E6D6F62692F69735F66756E2E68746D6C | www.dev.mobi/is_fun.html |
00 | String eindigt |
11 | si-id-kenmerk |
03 | String begint |
** 36353332 | 6532 |
00 | String eindigt |
07 | Action-attribuut (signaal – medium) |
01 | Uiteinden van de attributen, nu de inhoud |
03 | String begint |
* 446576446F744D6F62692069732046756E2021 | DevDotMobi is Leuk ! |
00 | String eindigt |
01 | </indicatie> |
01 | </SI> |
* Dit zijn de snaren gebruikt om inhoud aan de SI, elk karakter in de string wordt geconverteerd naar de hexadecimale representatie.
** “6532” moet worden beschouwd als een tekenreeks en niet als een getal, dus gebruik de rekenmachine niet om dit getal
om te zetten.:
1
|
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br / >011033635333200070103446576446F744D6F62692069732046756E2021000101
|
(dat is 130 tekens)
bereid de UDH
het voorbereiden van de UDH is vrij eenvoudig. Begin gewoon met “06 05 04” en voeg dan de poortnummers toe. WAP Push berichten gebruikt “bestemming poort” 2948 terwijl de bron poort is 9200. Converteer decimale poortnummers naar hexadecimale formaten, dus 2948 wordt 0B84 en 9200 wordt 23F0. Magisch, de UDH is: 06 05 04 0B 84 23 F0
stuur de SMS en de UDH
nu, wat moet u doen met deze? Vrij eenvoudig, gewoon alles in elkaar zetten en de SMS is klaar om te worden verzonden.
<UDH> + < lichaam>
1
|
UDH: 06 05 04 0B 84 23 F0< br / > BODY: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101
|
The complete message is then:
1
|
<span><sterk>0605040B8423F0</strong><br /> 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101</span>
|
Dat is 137 tekens lang (hey, het is een binaire SMS, Java maakt gebruik van UTF-8-codering voor binaire berichten, dus de limiet voor 1 SMS is 140 tekens, zijn we niet cool ?)
de J2ME applicatie
om zo praktisch mogelijk te zijn, zullen we een omgeving nodig hebben om SMS berichten te versturen en de echte wereld te beschrijven, maar omdat niet iedereen toegang heeft tot een SMS gateway met UDHs en een interface waar binaire code moet worden ingevoerd, zullen we beschrijven hoe hetzelfde te doen met een J2ME applicatie.
Disclaimer: wat de WMA-specificaties betreft, kunnen J2ME-toepassingen geen toegang krijgen tot speciale gereserveerde poorten om binaire SMS te verzenden, dus helaas krijgt de J2ME-toepassing in de telefoon een beveiligingsuitzondering en wordt het bericht niet afgeleverd.
MIDP2. 0 heeft twee methoden die het mogelijk maken om berichten te verzenden: een vereist een String, een vereist een array van bytes. Ja, de eerste wordt gebruikt om tekstinhoud in te stellen, de tweede om binaire inhoud in te stellen.
Text method: setPayloadText (String textualSMS);
Binary method: setPayloadData(byte binarySMS);
om de J2ME applicatie “Over the Air” te kunnen intall compileren met je favoriete J2ME omgeving (Ik vind NetBeans leuk met het Mobility Pack), kopieer de .JAD en .JAR bestanden naar uw webserver en pas de URL in de Wap Push bericht.
laten we nu een eenvoudige J2ME-klasse schrijven die het bericht verstuurt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.wireless.messaging.*;
import java.io.*;
import javax.microedition.io.*;
public class WapPush breidt MIDlet {
/ / verbinding uit om een bericht
private MessageConnection conn;
public void startApp() {
// zet hier uw mobiele nummer
String myMobileNumber=” + 39335…”;
try {
/ / Create a binary message
/ / Destination port is expressed using the decimal notation
this.conn=(MessageConnection) Connector.open (“sms: / /” +myMobileNumber+”:2948″);
// Geef op dat we een binair bericht
BinaryMessage BM = (BinaryMessage)conn gaan sturen.newMessage(MessageConnection.BINARY_MESSAGE);
String ourContent=”0605040B8423F0″ +
“02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0” +
“011033635333200070103446576446F744D6F62692069732046756E2021000101”;
bm.setPayloadData(convertHexToBinary(ourContent));
this.conn.send(bm);
}
// Let’s throw exceptions
catch (IOException ex) {
ex.printStackTrace();
}
catch (Exception ex) {
ex.printStackTrace();
}
/** deze methode komt van affinitystudio ‘ s
* Lees verder http://discussion.forum.nokia.com/forum/member.php?u=56142
* het converteert Strings naar data array van tekens
*/
private statische Byte convertHexToBinary (String hexData) gooit uitzondering {
systeem.uit.println (“Length:” +(hexData.lengte()/2));
if (hexData.length () % 2 != 0 ) {
gooi nieuwe uitzondering (“moet een even aantal hexadecimale cijfers” );
}
byte binaryData = nieuwe byte;
voor (int i = 0; i < binaryData.length; ++i) {
String byteStr = hexData.substring(i*2, i*2+2);
int value;
try {
value = Integer.parseInt(byteStr,16);
}
catch (NumberFormatException e) {
e.printStackTrace();
throw new Exception(“”);
}
binaryData = (byte)value;
}
return binaryData;
}
openbare void pauseApp() {}
public void destroyApp (boolean onvoorwaardelijke) {}
}
|
met behulp van een online SMS gateway
omdat J2ME veel binaire berichten blokkeert, kunt u een online gateway proberen om uw binaire berichten te verzenden. Veel bedrijven bieden SMS gateway diensten, en de meeste van hen hebben een interface om raw binaire SMS-berichten te sturen (deze zijn een “plus” voor mij), terwijl sommige andere bedrijven gewoon geven u een interface om de aangepaste velden in te stellen en maken de binaire dingen voor u.
als u een online SMS-gateway wilt gebruiken, vergeet dan niet de technische specificaties te lezen. Als u zelf een SMS-gateway wilt installeren die verbinding maakt met externe diensten (carriers/operators), stel ik Kannel voor, een gratis SMS-gateway-software die over de hele wereld verspreid is; Kannel vindt het leuk om de UDH en het lichaam te scheiden.
- gereserveerde poorten en meer: J2ME” Wireless Messaging API ” specificaties
http://java.sun.com/products/wma/index.jsp - standaardformaat voor OTA-inhoud: Open Mobile Alliance
http://www.openmobilealliance.org/tech/affiliates/wap/wapindex.html - hoe stuur ik OTA-configuraties, beltonen en bedrijfslogo ‘ s: NOKIA
http://www.forum.nokia.com (seach voor de “Smart Messaging Specification”) - een mobiele telefoon detecteren: WURFL
http://deviceatlas.com - Sms gateway-software: Kannel
www.kannel.org