Ten artykuł wyjaśni od wysokiego do niższego poziomu, jak napisać prostą aplikację mobilną z obsługą SMS, która pozwoli Ci wysyłać „wiadomości instalacyjne przez powietrze”. Po przeczytaniu tego artykułu będziesz mógł utworzyć mały aplet J2ME, który teoretycznie wyśle się do innego telefonu za pomocą wiadomości SMS jako środka dostawy. W rzeczywistości, ze względu na ograniczenia w bezprzewodowym interfejsie API wiadomości w J2ME (JSR 120/205) port dla wiadomości Push WAP jest „zarezerwowany” ze względów bezpieczeństwa. Możliwość wysyłania treści za pośrednictwem szeroko obsługiwanego kanału SMS może być bardzo przydatna dla dostawców treści.
wiadomości SMS to niewielka liczba spakowanych bajtów wysyłanych przez sieci operatora. Wielu z was już doświadczyło wysyłania „wiadomości tekstowych” z urządzeń, a wielu określa wysyłanie wiadomości SMS jako „SMS-y”.
trochę techniczne wprowadzenie do SMS
zakres tego artykułu ma być praktyczny, więc nie będziemy przechodzić przez wszystkie techniczne i nudne szczegóły sieci, ale trzy koncepcje są dość ważne, aby zrozumieć sms.
- SMS używa pojęcia „portu” tak jak standardowe gniazda internetowe;
- wiadomości SMS mają limit w treści 160 znaków;
- ciało nie jest jedyną rzeczą, którą możesz grać w SMS, istnieje również nagłówek danych użytkownika.
porty
kiedy trafisz adres URL w przeglądarce, taki jak http://dev.mobi, przejrzyście wywołujesz port 80 serwera www, zgodnie z konwencją. Połączenie zostanie zainicjowane na porcie 80, a następnie przełączone na wyższy port, aby umożliwić innym użytkownikom dostęp do tego samego portu serwera www. Port 80, jak stwierdził IANA odnosi się do protokołu HTTP, oznacza to, że serwer, który jest w stanie zrozumieć żądanie protokołu HTTP, zostanie obudzony i będzie gotowy do odpowiedzi i przetwarzania żądań HTTP. To samo dzieje się z wiadomościami SMS. Możesz wysłać SMS do określonego portu telefonu, a obudzisz określoną usługę na tym urządzeniu. Teraz, tak jak nie wszystkie komputery mają standardowe usługi (takie jak serwer WWW), również nie wszystkie urządzenia mobilne mają usługi nasłuchujące portów. Jest to bardzo” związane z producentem ” rzeczy, więc trzeba będzie sprawdzić telefon, co jest włączone, aby zaakceptować.
Body and encoding
to może być trudny temat do potraktowania, ale opiszemy tylko bardzo podstawowe informacje, które mogą być przydatne. Domyślne kodowanie SMS używa 7 bitów do obsługi znaku. Oznacza to, że możesz pisać w SMS tylko te znaki, które są obecne na bardzo podstawowej tabeli znaków, tak te słynne 127 znaków. Jeśli chcesz przejść do bardziej skomplikowanych rzeczy i wysłać więcej „interesujących” znaków, potrzebna jest grupa 8 bitów i tabela dostępnych znaków staje się większa. Dostępna przestrzeń to 1120 bitów na SMS, nie więcej, nie mniej. Możesz mieć 160 znaków używając 7 bitów lub 140 znaków używając 8 bitów
Uwaga: znak „É” jest zawarty w „tabeli podstawowej”, podczas gdy znak „È” jest w „większych tabelach”. Jeśli napiszesz wiadomość z drugim znakiem, będziesz miał mniej miejsca w wiadomości. Zwróć więc uwagę, jakich znaków używasz podczas wysyłania wiadomości SMS 😉
nagłówek danych użytkownika
nagłówek danych użytkownika (znany również jako UDH) jest tym, co „programista wysokiego poziomu” może ustawić, aby zrobić coś więcej niż zwykłą „wiadomość tekstową”. UDH jest bardzo przydatne, ponieważ można wysyłać ” niewidoczne wiadomości tekstowe „do aplikacji mobilnej (gdzie na przykład” aplikacje mobilne ” mam na myśli te działające na urządzeniach mobilnych) lub można powiedzieć urządzeniu, że wiadomość będzie zawierać specjalne informacje. Jest bardzo podobny do pliku XML: musisz powiedzieć parserowi, co wysyłasz, i zawartość po prologu, która będzie obsługiwana przez sam parser.
UDH służy głównie do określenia, do jakich portów nasz klient (telefon) wyśle SMS. Składa się ze zbioru liczb sześciokątnych, które opisują:
<jak długi jest UDH> < format używany do określania numerów portów>< Długość numeru portu>< numer portu docelowego><numer portu źródłowego>.
jako praktyczny przykład powiedzmy, że chcę utworzyć UDH, aby wysłać Push Wap, gdzie standardowym portem docelowym dla Push WAP jest 2948, UDH będzie:
1
|
06 05 04 0B 84 23 F0
|
gdzie:
- 06 oznacza „Hej odczyt następujących 6 bajtów”
- 05 jest formatem liczb, w tym przypadku liczby szesnastkowe
- 04 powie UDH, że każdy port jest reprezentowany za pomocą 4 znaków
- 0b84 jest portem docelowym, 2948 (reprezentacja dziesiętna) lub 0B84 (reprezentacja szesnastkowa)
- 23F0 jest portem źródłowym Port, 9200 (reprezentacja dziesiętna) lub 23f0 (reprezentacja szesnastkowa).
Uwaga: Użyj prostego kalkulatora, aby przekonwertować liczby dziesiętne na hex; wybierz „Dec”, umieść 2948 w kalkulatorze, a następnie naciśnij przycisk „Hex”. Każdy kalkulator naukowy może to zrobić, a wiele systemów operacyjnych ma gdzieś małą aplikację „calc”, która może to zrobić.
binarny SMS
„binarny SMS” to tekstowy SMS w formacie XML, który został przekształcony za pomocą WBXML. WBXML jest „transformatorem znaczników”, co oznacza, że dla każdego znacznika XML powiązany jest bajt binarny. Na przykład znacznik < SI > jest konwertowany jako znak binarny & #x0005;
dlaczego WBXML?
prosta odpowiedź: wynik transformacji WBXML jest mniejszy pod względem liczby wygenerowanych bajtów niż sam tekstowy plik XML.
Uwaga: wiele tagów jest konwertowanych na bajty, ale czasami również zawartość (np. adresy URL) np. URL http://www.dev.mobi może być zapisana w WBXML jako 0Ddev.mobi , gdzie ” 0D ” oznacza http://www.
„0C” jest bardziej ogólne i oznacza http:// więc można napisać adres URL na dwa sposoby:
1
|
<span>0Ddev.mobi < / span>
|
lub
1
|
<span> 0Cwww.dev.mobi< / span>
|
pierwszy używa 9 znaków (0D to jeden bajt), drugi 13 znaków! I love WBXML 🙂
terminy
żeby było jasne, przez „WAP push” nie mamy na myśli sposobu wysyłania SMS-ów za pomocą WAP. Mamy na myśli to, co jest technicznie znane jako SI (Service Indication). Wskazanie usługi to binarny SMS wysyłany do dedykowanego portu na urządzeniu, który informuje urządzenie, że czeka na odwiedziny URL. Adres URL może być adresem dzwonka na serwerze internetowym, adresem pliku JAD do zainstalowania aplikacji J2ME lub JPG lub po prostu stroną WAP; to do” webmastera ” serwera internetowego, aby umieścić zawartość na stronie internetowej, i to do urządzenia, aby zrozumieć, jak obsługiwać zawartość. Aby uzyskać więcej informacji na temat tego aspektu układanki, zapoznaj się z serią artykułów o adaptacji treści.
Uwaga: Kiedy mówię „serwer WWW” mam na myśli zarówno serwer WWW, jak i serwer WAP, ponieważ większość serwerów internetowych można skonfigurować tak, aby dostarczać zawartość WAP. Przez „OTA configuration SMS” mam na myśli binarny SMS, który zawiera szczegóły APN (ale może zawierać więcej) znany również jako „Konfiguracja dostępu do Internetu”.
uwaga: istnieją specjalne komunikaty „Service Indication”, które są zwykle nazywane SL (Service Load), które są podobne do”SI”. Si pyta o pozwolenie do użytkownika przed pobraniem zawartości przez połączenie sieciowe, SL pobrać zawartość automatycznie bez pytania o pozwolenie do użytkownika. „SL” są bardzo podobne do wiadomości MMS: treść znajduje się na serwerze WWW, a SMS mówi telefonowi, aby pobrać wiadomość.
Zacznijmy więc
po pierwsze, musimy przeczytać kilka dokumentów (niestety), aby przeczytać specyfikacje dotyczące pisania treści XML, które mają być wysyłane przez SMS. Dobrym punktem wyjścia może być Nokia „Smart Messaging Specification 3.0.0”, który można pobrać z www.forum.nokia.com a także bardziej techniczne dokumenty z Open Mobile Alliance (OMA) z www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
więc nasze kroki będą:
- zdecyduj, co chcemy wysłać
- Znajdź dokumenty dotyczące tego tematu
- Znajdź strukturę XML Wiadomości do wysłania
- Dostosuj XML
- przekonwertuj XML do WBXML
- przygotuj UDH
- wyślij UDH i ciało
ponieważ chcemy wysłać aplikację J2ME na nowy telefon, musimy wysłać wiadomość „service indication”, znaną również jako „WAP Push”. To ” SI ” może być użyte do wysłania wiadomości SMS, która zostanie odczytana jako link do pobrania czegoś. Każdy typ zawartości (image / jpeg, application / java-archive,…) jest ważny, jeśli telefon może go otworzyć.
więc kto może powiedzieć, które typy zawartości mogą otworzyć urządzenie ? DeviceAtlas może nam pomóc tutaj! (zobacz referencje)
Znajdź dokumenty dotyczące tego tematu
Ok, otwórzmy link OMA i przejdźmy do” Obszaru Funkcjonalnego „oznaczonego”push”. Zdobądźmy „specyfikację wskazania usługi WAP”. Aby zrozumieć, jak działa WBXML, proponuję przeczytać paragraf 8.3.2 „tokeny startowe atrybutów”.
Znajdź strukturę XML wiadomości
dla tych z Was, którzy bardziej lubią DTDs, spójrz na sekcję 7.2. Wszystkie inne mogą pominąć wszystkie dokumenty i przejść do przykładu odczytu w sekcji 9. XML jest dość oczywisty, więc zrobię kilka dostosowań bezpośrednio.
1
2
3
4
5
6
7
|
<?XML version= „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 ends |
11 | atrybut si-id |
03 | String starts |
** 36353332 | 6532 |
00 | String ends |
07 | atrybut akcji (sygnał-medium) |
01 | koniec atrybutów, teraz zawartość |
03 | String starts |
* 446576446f744d6f62692069732046756e2021 | DevDotMobi to zabawa ! |
00 | String ends |
01 | </wskazania> |
01 | </SI> |
* są to łańcuchy używane do przekazywania zawartości Do SI, każdy znak w łańcuchu jest konwertowany na jego szesnastkową reprezentację.
* * „6532” należy traktować jako ciąg znaków, a nie liczbę, więc nie używaj kalkulatora do konwersji tej liczby
nasze ciało jest, składając wszystkie liczby razem:
1
|
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br />011033635333200070103446576446F744D6F62692069732046756E2021000101
|
(130 znaków)
przygotuj UDH
przygotowanie UDH jest dość łatwe. Po prostu zacznij od „06 05 04”, a następnie dodaj numery portów. Wiadomości Push WAP używają „portu docelowego” 2948, podczas gdy port źródłowy to 9200. Konwertuj dziesiętne numery portów na formaty szesnastkowe, więc 2948 staje się 0B84, a 9200 staje się 23f0. Magicznie, UDH jest: 06 05 04 0B 84 23 F0
Wyślij SMS i UDH
teraz, co musisz z tym zrobić? Dość proste, po prostu złóż wszystko razem i SMS jest gotowy do wysłania.
<UDH> + < BODY>
1
|
UDH: 06 05 04 0B 84 23 F0<br /> BODY: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101
|
The complete message is then:
1
|
<span><strong>0605040b8423f0</strong><br /> 02056a0045c60c037777772e6465762e6d6f62692f69735f66756e2e68746d6c0<br /> 011033635333200070103446576446f744d6f62692069732046756e2021000101</span>
|
który ma długość 137 znaków (hej, to jest binarny SMS, Java używa kodowania UTF-8 dla wiadomości binarnych, więc limit dla 1 SMS to 140 znaków, czyż nie jest spoko ?)
aplikacja J2ME
aby była jak najbardziej praktyczna, będziemy potrzebować środowiska do wysyłania wiadomości SMS i opisywania świata rzeczywistego, ale ponieważ nie każdy ma dostęp do bramki SMS z UDHs i interfejsu, w którym można wprowadzić kod binarny, opiszemy, jak zrobić to samo z aplikacją J2ME.
zastrzeżenie: co do specyfikacji WMA, aplikacje J2ME nie mogą uzyskać dostępu do specjalnych zarezerwowanych portów do wysyłania binarnych wiadomości SMS, więc pechowo aplikacja J2ME w telefonie otrzyma wyjątek bezpieczeństwa, a wiadomość nie zostanie dostarczona.
MIDP2. 0 ma dwie metody, które umożliwiają wysyłanie wiadomości: jedna wymaga łańcucha, druga wymaga tablicy bajtów. Tak, pierwszy służy do ustawiania zawartości tekstowej, drugi do ustawiania zawartości binarnej.
metoda tekstowa: setPayloadText (String textualSMS);
metoda binarna: setPayloadData (Byte binarySMS);
aby móc zainstalować aplikację J2ME „w powietrzu”, skompilować ją z ulubionym środowiskiem J2ME (Lubię NetBeans z pakietem Mobility Pack), skopiuj .JAD i .Pliki JAR na serwer WWW i dostosuj adres URL w wiadomości Push Wap.
napiszmy teraz prostą klasę J2ME, która wysyła wiadomość:
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 extends MIDlet {
/ / Connection to send a message
private MessageConnection conn;
public void startApp() {
// Wpisz tutaj swój numer telefonu komórkowego
String myMobileNumber= ” +39335…”;
try {
// Utwórz binarną wiadomość
// port docelowy jest wyrażany za pomocą notacji dziesiętnej
this.Conn = (MessageConnection) Connector.open („sms: / / „+myMobileNumber+”:2948″);
// określ, że będziemy wysyłać wiadomość binarną
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();
}
/** ta metoda pochodzi z affinitystudios
* Czytaj dalej http://discussion.forum.nokia.com/forum/member.php?u=56142
* konwertuje ciągi znaków na tablicę danych znaków
*/
private static byte convertextobinary (String hexData) wyrzuca wyjątek {
System.Wynocha.println („Length:” +(hexData.długość()/2));
if (hexData.długość () % 2 != 0 ) {
throw new Exception („musi być parzystą liczbą szesnastkowych cyfr” );
}
byte binaryData = new byte;
for (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;
}
Public void pauseApp() {}
public void destroyApp (boolean unconditional) {}
}
|
korzystając z bramki SMS online
ponieważ J2ME blokuje wiele wiadomości binarnych, możesz wypróbować bramę online, aby wysyłać wiadomości binarne. Wiele firm świadczy usługi bramki SMS, a większość z nich ma interfejs do wysyłania surowych binarnych wiadomości SMS (są to dla mnie „plus”), podczas gdy niektóre inne firmy po prostu dają interfejs do ustawiania niestandardowych pól i tworzenia binarnych rzeczy dla Ciebie.
jeśli chcesz skorzystać z bramki SMS online, pamiętaj, aby przeczytać ich specyfikacje techniczne. Jeśli chcesz zainstalować sobie bramkę SMS, która łączy się z zewnętrznymi usługami (przewoźnikami / operatorami), proponuję Kannel, który jest darmowym oprogramowaniem do bramek SMS i jest rozpowszechniony na całym świecie; Kannel lubi mieć UDH i ciało do oddzielenia.
- porty zarezerwowane i więcej: Specyfikacja J2ME” Wireless Messaging API”
http://java.sun.com/products/wma/index.jsp - standardowy format zawartości OTA: Open Mobile Alliance
http://www. openmobilealliance.org/tech/affiliates/wap/wapindex.html - jak wysłać konfiguracje OTA, dzwonki i loga operatora: NOKIA
http://www.forum.nokia.com - jak wykryć telefon komórkowy: Wurfl
http://deviceatlas.com - oprogramowanie bramki Sms: Kannel
www.kannel.org