den här artikeln kommer att förklara från en hög nivå till en lägre nivå hur man skriver en enkel SMS-aktiverad mobilapplikation som gör att du kan skicka ”över luften installationsmeddelanden”. Efter att ha läst den här artikeln kommer du att kunna skapa en liten J2ME-applet som teoretiskt skickar sig till en annan telefon med ett SMS-meddelande som leveransmedel. På grund av begränsningar i Wireless Messaging API i J2ME (JSR 120/205) är porten för WAP-Pushmeddelanden ”reserverade” av säkerhetsskäl. Möjligheten att skicka innehåll via den allmänt stödda SMS-kanalen kan vara mycket användbar för innehållsleverantörer.
SMS-meddelanden är ett litet antal packade byte som skickas över operatörens nätverk. Många av er har redan upplevt att skicka ”textmeddelanden” från enheter och många hänvisar till att skicka SMS-meddelanden som ”SMS”.
en liten teknisk introduktion till SMS
omfattningen av denna artikel ska vara praktisk, så vi kommer inte att gå igenom alla tekniska och tråkiga detaljer i nätverk, men tre begrepp är ganska viktiga förstår om sms.
- SMS använder begreppet ”port” precis som en vanlig Internet uttag gör;
- SMS-meddelanden har en gräns i kroppen av 160 tecken;
- kroppen är inte det enda du kan spela med i ett SMS, Det finns också användardata Header.
portar
när du träffar en webbadress i din webbläsare som http://dev.mobi, ringer du Öppet port 80 på en webbserver, enligt konvention. Anslutningen initieras på port 80 och växlas sedan till en högre port för att låta andra användare komma åt samma port på webbservern. Port 80, som anges av IANA hänvisar till HTTP-protokollet, betyder det att en server, som kan förstå HTTP-protokollförfrågan, kommer att väckas och kommer att vara redo att svara och bearbeta HTTP-förfrågningar. Detsamma händer med SMS-meddelanden. Du kan skicka ett SMS till en viss port på en telefon och du kommer att väcka en specifik tjänst på den enheten. Nu, precis som inte alla datorer har standardtjänster (till exempel en webbserver), har inte alla mobila enheter tjänster som lyssnar på portar. Detta är en mycket ”tillverkare relaterade” saker, så du kommer att behöva kontrollera telefonen vad som är aktiverat för att acceptera.
kropp och kodning
detta kan vara ett tufft ämne att behandla men vi kommer bara att beskriva mycket grundläggande information som kan vara användbar. SMS standardkodning använder 7 bitar för att hantera ett tecken. Det betyder att du bara kan skriva i ett SMS de tecken som finns på ett mycket grundläggande char-bord, ja de berömda 127 tecknen. Om du vill gå mer komplicerade saker och skicka mer ”intressanta” tecken, behövs en grupp på 8 bitar och tabellen med tillgängliga tecken blir större. Det tillgängliga utrymmet är 1120 bitar per SMS, inte mer, inte mindre. Du kan ha 160 tecken som använder 7 bitar eller 140 tecken som använder 8 bitar
Obs: tecknet ”Bisexual” ingår i ”basic table”, medan tecknet ”exceptional” finns i ”bigger tables”. Om du skriver ett meddelande med den andra karaktären har du mindre utrymme tillgängligt i meddelandet. Så var uppmärksam på vilka tecken du använder när du skickar sms-meddelanden
användardata Header
användardata Header (även känd som UDH) är vad en ”high level developer” kan ställa in för att göra något mer än ett enkelt ”textmeddelande”. En UDH är mycket användbar eftersom du kan skicka ” osynliga textmeddelanden ”till mobilapplikation (var till” mobilapplikationer ” menar jag de som körs på mobila enheter till exempel) eller så kan du berätta för en enhet att meddelandet kommer att innehålla speciell information. Det är mycket lik en XML-fil: du måste berätta för tolkaren vad du skickar och innehållet som följer prologen som kommer att hanteras av tolkaren själv.
UDH används främst för att ange vilka portar vår klient (telefon) ska skicka SMS till. Den är gjord av en uppsättning hex-nummer som beskriver:
<hur länge UDH är> <formatet som används för att ange portnummer> <portnummerlängden> <destinationsportnummer> <källportnummer>.
som ett praktiskt exempel, säg att jag vill skapa en UDH för att skicka ett WAP-Tryck, där standarddestinationsporten för WAP-tryck är 2948, kommer UDH att vara:
1
|
06 05 04 0B 84 23 F0
|
där:
- 06 betyder ”hej läs följande 6 byte”
- 05 är formatet för siffror, i det här fallet kommer hexadecimala tal
- 04 att berätta för UDH att varje port representeras med 4 tecken
- 0B84 är destinationsporten, 2948 (decimalrepresentation) eller 0B84 (hexadecimal representation)
- 23F0 är källporten, 9200 (decimalrepresentation) eller 23f0 (hexadecimal representation).
Obs: Använd en enkel kalkylator för att konvertera decimaltal till hex; välj ”Dec”, sätt 2948 i räknaren och tryck sedan på knappen ”Hex”. Alla vetenskapliga kalkylator kan göra detta och många operativsystem har en liten ”calc” program någonstans som kan göra detta.
binärt SMS
ett ”binärt SMS” är ett XML-formaterat text-SMS som har transformerats med WBXML. WBXML är en” taggtransformator”, det betyder att för varje XML-tagg är en binär byte associerad. Till exempel konverteras taggen <SI> som binärt tecken 
varför WBXML?
enkelt svar: resultatet av en WBXML-transformation är mindre i antalet genererade byte än den verbala text-XML-filen själv.
Obs: många taggar konverteras till byte, men ibland även innehåll (t. ex. URL-adresser) t. ex. URL http://www.dev.mobi kan skrivas i WBXML som 0Ddev.mobi , där ” 0D ” står för http://www.
” 0C ” är mer generisk och står för http: / / så att du kan skriva webbadressen på två sätt:
1
|
<span>0Ddev.mobi < / span>
|
eller
1
|
<span> 0Cwww.dev.mobi< / span>
|
den första använder 9 tecken (0D är en byte), den andra 13 tecken! Jag älskar WBXML brasilian
villkor
för att vara tydlig, med ”WAP push” menar vi inte ett sätt att skicka SMS med WAP. Vad vi menar är vad som är tekniskt känt som SI (Service Indication). En Serviceindikering är ett binärt SMS som skickas till en dedikerad port på en enhet som informerar enheten om att det finns en URL som väntar på att besökas. Webbadressen kan vara adressen till en ringsignal i en webbserver, adressen till en JAD-fil för att installera en J2ME-applikation eller en JPG eller helt enkelt en WAP-sida; det är upp till webbserverns ”webmaster” att lägga innehållet på webbplatsen, och det är upp till enheten att förstå hur man hanterar innehållet. För mer information om denna aspekt av pusslet, se vår Innehållsanpassning serie artiklar.
Obs: När jag säger ”webbserver” menar jag både webb-och WAP-server eftersom de flesta webbservrar kan konfigureras för att leverera WAP-innehåll. Med ”OTA Configuration SMS” menar jag ett binärt SMS som innehåller APN-detaljer (men kan innehålla mer) även känd som ”Internet access Configuration”.
Obs: Det finns speciella ”Service Indication” – meddelanden som normalt kallas sl (Service Load) som liknar ”SI”. En SI frågar tillstånd till användaren innan hämta innehållet via nätverksanslutningen, sl hämta innehåll automatiskt utan att be om tillstånd till användaren. ”SL” liknar mycket MMS-meddelanden: innehållet finns på en webbserver och SMS ber telefonen att ladda ner meddelandet.
så låt oss börja
först och främst måste vi läsa några papper (tyvärr) för att läsa några specifikationer för hur man skriver XML-innehåll som ska skickas via SMS. En bra startpunkt kan vara Nokias ”Smart Messaging Specification 3.0.0” som kan laddas ner från www.forum.nokia.com och även mer tekniska dokument från Open Mobile Alliance (OMA) från www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
så våra steg kommer att vara:
- Bestäm vad vi vill skicka
- hitta dokumenten om det ämnet
- hitta XML-strukturen för meddelandet som ska skickas
- anpassa XML
- konvertera XML till WBXML
- Förbered UDH
- skicka udh och kroppen
eftersom vi vill skicka en J2ME-applikation till en ny telefon måste vi skicka ett ”service indication” – meddelande, även känt som ”WAP push”. Denna ” SI ” Kan användas för att driva ett SMS som kommer att läsas som en länk för att ladda ner något. Alla innehållstyper (bild/jpeg, applikation/java-arkiv, …) är giltiga om telefonen kan öppna den.
så, vem kan berätta vilka innehållstyper kan en enhet Öppna ? DeviceAtlas kan hjälpa oss här! (se referenser)
hitta dokumenten om det ämnet
Ok, låt oss öppna oma-länken och låt oss gå till ”funktionellt område” betecknat ”push”. Låt oss få ”Wap Service Indication Specification ”. För att förstå hur WBXML fungerar, föreslår jag att du läser punkt 8.3.2 ”Attribute Start Tokens”.
hitta XML-strukturen för meddelandet
för de av er som mer gillar DTDs, titta på avsnitt 7.2. Alla andra kan hoppa över alla dokument och gå till läsexemplet i avsnitt 9. XML där är ganska självförklarande så jag kommer att göra lite anpassning direkt.
1
2
3
4
5
6
7
|
<?xml version= ”1.0”?>
<!DOCTYPE si PUBLIC ”- //WAPFORUM//DTD SI 1.0 / / sv” ”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 | sträng slutar |
11 | si-id attribut |
03 | sträng startar |
** 36353332 | 6532 |
00 | sträng slutar |
07 | Åtgärdsattribut (signal-medium) |
01 | slutar av attribut, nu innehållet |
03 | sträng startar |
* 446576446F744D6F62692069732046756E2021 | DevDotMobi är kul ! |
00 | sträng slutar |
01 | </indikation> |
01 | </SI> |
* dessa är strängar som används för att skicka innehåll till SI, varje tecken i strängen konverteras till sin hexadecimala representation.
** ”6532” ska betraktas som en sträng av tecken och inte ett tal, så använd inte räknaren för att konvertera detta nummer
vår kropp är att sätta alla siffror tillsammans:
1
|
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br />011033635333200070103446576446F744D6F62692069732046756E2021000101
|
(vilket är 130 tecken)
Förbered UDH
förbereda UDH är ganska enkelt. Börja bara med” 06 05 04 ” och lägg sedan till portnumren. WAP Push-meddelanden använder ”destination port” 2948 medan Källporten är 9200. Konvertera decimalportnummer till hexadecimala format, så 2948 blir 0B84 och 9200 blir 23f0. Magiskt är UDH: 06 05 04 0B 84 23 F0
skicka SMS och UDH
nu, vad du behöver göra med detta? Ganska enkelt, bara sätta ihop allt och SMS är redo att skickas.
<udh> + <kropp>
1
|
UDH: 06 05 04 0B 84 23 F0<br />kropp: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101
|
The complete message is then:
1
|
<span><stark>0605040B8423F0</stark><br /> 02056a0045c60c037777772e6465762e6d6f62692f69735f66756e2e68746d6c0<br /> 011033635333200070103446576446f744d6f62692069732046756e2021000101</span>
|
vilket är 137 tecken långt (hej, det är ett binärt SMS, Java använder UTF-8-kodning för binära meddelanden, så gränsen för 1 SMS är 140 tecken, är vi inte coola ?)
J2ME-applikationen
för att vara så praktisk som möjligt behöver vi en miljö som ska användas för att skicka SMS-meddelanden och för att beskriva den verkliga världen, men eftersom inte alla har tillgång till en SMS-gateway med UDHs och ett gränssnitt där man ska ange binär kod, kommer vi att beskriva hur man gör detsamma med en J2ME-applikation.
ansvarsfriskrivning: när det gäller WMA-specifikationer kan J2ME-applikationer inte komma åt speciella reserverade portar för att skicka binärt SMS så olyckligtvis kommer J2ME-applikationen i telefonen att få ett säkerhetsundantag och meddelandet kommer inte att levereras.
MIDP2.0 har två metoder som gör det möjligt att skicka meddelanden: en kräver en sträng, en kräver en rad byte. Ja, den första används för att ställa in textinnehåll, den andra för att ställa in binärt innehåll.
Textmetod: setPayloadText (String textualSMS);
binär metod: setPayloadData(byte binarySMS);
för att kunna intall J2ME-applikationen ”över luften”, kompilera den med din favorit J2ME-miljö (Jag gillar NetBeans med Mobilitetspaketet), kopiera .JAD och .JAR filer till din webbserver och anpassa webbadressen i WAP Push-meddelandet.
låt oss nu skriva en enkel J2ME-klass som skickar meddelandet:
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.*;
Offentlig klass WapPush förlänger MIDlet {
/ / anslutning för att skicka ett meddelande
privat MessageConnection conn;
public void startApp() {
// sätt här ditt mobilnummer
sträng myMobileNumber=”+39335…”;
försök {
// skapa ett binärt meddelande
// destinationsport uttrycks med decimalnotationen
detta.conn=(MessageConnection) kontakt.öppna (”sms: / /” + myMobileNumber+”:2948″);
// ange att vi ska skicka ett binärt meddelande
BinaryMessage bm=(BinaryMessage)conn.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();
}
/** denna metod kommer från affinitystudios
* läs vidare http://discussion.forum.nokia.com/forum/member.php?u=56142
* den konverterar strängar till data array av tecken
*/
privat statisk byte convertHexToBinary (sträng hexData) kastar undantag {
systemet.ut.println (”längd:” +(hexData.längd()/2));
om (hexData.längd () % 2 != 0 ) {
kasta nytt undantag (”måste vara ett jämnt antal hex-siffror” );
}
byte binaryData = ny byte;
för (int i = 0; jag < binaryData.längd; ++i) {
sträng 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;
}
allmänna void pauseApp() {}
allmänna void destroyApp (booleska ovillkorlig) {}
}
|
använda en online SMS gateway
som J2ME blockerar många binära meddelanden, kan du prova en online gateway för att skicka dina binära meddelanden. Många företag tillhandahåller SMS gateway-tjänster, och de flesta har ett gränssnitt för att skicka råa binära SMS-meddelanden (det här är ett ”plus” för mig) medan vissa andra företag bara ger dig ett gränssnitt för att ställa in de anpassade fälten och göra binära saker för dig.
om du vill använda en online SMS-gateway, kom bara ihåg att läsa deras tekniska specifikationer. Om du vill installera dig själv en SMS-gateway som ansluter till externa tjänster (bärare/operatörer), föreslår jag Kannel, som är en gratis SMS-gateway-programvara och den är spridd över hela världen; Kannel gillar att ha UDH och kroppen som ska separeras.
- reserverade portar och mer: J2ME” Wireless Messaging API ” specifikationer
http://java.sun.com/products/wma/index.jsp - standardformat för OTA innehåll: öppna Mobile Alliance
http://www. openmobilealliance.org/tech/affiliates/wap/wapindex.html - så här skickar du ota-konfigurationer, ringsignaler och operatörslogotyper: NOKIA
http://www.forum.nokia.com (seach för ”Smart Messaging Specification”) - hur man upptäcker en mobiltelefon: WURFL
http://deviceatlas.com - Sms gateway programvara: Kannel
www.kannel.org