binární SMS: odesílání bohatého obsahu do zařízení pomocí SMS

tento článek vysvětlí z vysoké úrovně na nižší úroveň, jak napsat jednoduchou mobilní aplikaci s podporou SMS, která vám umožní posílat „zprávy o instalaci vzduchem“. Po přečtení tohoto článku budete moci vytvořit malý applet J2ME, který se teoreticky odešle na jiný telefon pomocí SMS zprávy jako doručovacího prostředku. Ve skutečnosti, z důvodu omezení v Wireless Messaging API v J2ME (JSR 120/205) port pro WAP Push zprávy jsou „vyhrazeny“ z bezpečnostních důvodů. Schopnost odesílat obsah prostřednictvím široce podporovaného kanálu SMS může být pro poskytovatele obsahu velmi užitečná.

SMS zprávy jsou malý počet zabalených bajtů odeslaných přes sítě operátora. Mnozí z vás již zažili odesílání „textových zpráv“ze zařízení a mnozí označují odesílání SMS zpráv jako „textové zprávy“.

malý technický úvod do SMS

rozsah tohoto článku má být praktický, takže nebudeme procházet všemi technickými a nudnými detaily sítí, ale tři pojmy jsou docela důležité pochopit o sms.

  • SMS používá pojem „port“ stejně jako standardní internetové zásuvky;
  • SMS zprávy mají limit v těle 160 znaků;
  • tělo není jediná věc, se kterou můžete hrát v SMS, je zde také záhlaví uživatelských dat.

porty

když v prohlížeči stisknete adresu URL, například http://dev.mobi, transparentně voláte port 80 webového serveru podle konvence. Připojení bude inicializováno na portu 80 a poté přepnuto na vyšší port, aby ostatní uživatelé měli přístup ke stejnému portu webového serveru. Port 80, jak uvádí IANA, odkazuje na protokol HTTP, to znamená, že server, který je schopen porozumět požadavku protokolu HTTP, bude probuzen a bude připraven odpovědět a zpracovat požadavky HTTP. Totéž se děje s SMS zprávami. Můžete poslat SMS na konkrétní port telefonu a probudíte konkrétní službu na tomto zařízení. Nyní, stejně jako ne všechny počítače mají standardní služby (například webový server), také ne všechna mobilní zařízení mají služby poslouchající porty. Jedná se o velmi“ výrobce související “ věci, takže budete muset zkontrolovat telefon, Co je povoleno přijmout.

tělo a kódování

to by mohlo být těžké téma k léčbě, ale budeme jen popsat velmi základní informace, které mohou být užitečné. SMS výchozí kódování používá 7 bitů pro zpracování znaku. To znamená, že v SMS můžete psát pouze ty znaky, které jsou přítomny na velmi základní tabulce znaků, Ano těch slavných 127 znaků. Pokud chcete jít složitější věci a poslat více „zajímavých“ znaků, pak je potřeba skupina 8 bitů a tabulka dostupných znaků se zvětší. Dostupný prostor je 1120 bitů na SMS, nic víc, nic méně. Můžete mít 160 znaků pomocí 7 bitů nebo 140 znaků pomocí 8 bitů

Poznámka: znak „É“ je zahrnut v „základní tabulce“ , zatímco znak “ È „je v “ větších tabulkách“. Pokud napíšete zprávu s druhým znakem, budete mít ve zprávě méně místa. Takže věnujte pozornost tomu, které znaky používáte při odesílání SMS

záhlaví uživatelských dat

záhlaví uživatelských dat (známé také jako UDH) je to, co může „vývojář na vysoké úrovni“ nastavit, zatímco dělá něco víc než jednoduchou „textovou zprávu“. UDH je velmi užitečné, protože můžete posílat „neviditelné textové zprávy“ do mobilní aplikace (kde na „mobilní aplikace“ mám na mysli ty, které běží na mobilních zařízeních například), nebo můžete říct zařízení, že zpráva bude obsahovat speciální informace. Je to velmi podobné souboru XML: musíte říct analyzátoru, co odesíláte, a obsah následující po prologu, který bude zpracován samotným analyzátorem.

UDH se používá hlavně k určení, na jaké porty náš klient (telefon) pošle SMS. Je vyroben sadou hexadecimálních čísel, které popisují:

<jak dlouho je UDH> <formát používaný k určení čísel portů> < délka čísla portu> < číslo cílového portu> <zdrojové číslo portu> <.

jako praktický příklad Řekněme, že chci vytvořit UDH pro odeslání WAP Push, kde standardní cílový port pro WAP tlačí je 2948, UDH bude:

1
06 05 04 0B 84 23 F0

kde:

  • 06 znamená „Hej číst následující 6 bajtů“
  • 05 je formát pro čísla, v tomto případě hexadecimální čísla
  • 04 řekne UDH, že každý port je reprezentován pomocí 4 znaků
  • 0B84 je cílový port, 2948 (desetinná reprezentace) nebo 0B84 (hexadecimální reprezentace)
  • 23F0 je zdrojový port, 9200 (desetinná reprezentace) nebo 23F0(hexadecimální reprezentace).

poznámka: Pomocí jednoduché kalkulačky převeďte desetinná čísla na hex; vyberte „Dec“, vložte do kalkulačky 2948 a poté stiskněte tlačítko „Hex“. Jakákoli vědecká kalkulačka to dokáže a mnoho operačních systémů má někde malou aplikaci „calc“, která to dokáže.

binární SMS

„binární SMS“ je textová SMS ve formátu XML, která byla transformována pomocí WBXML. WBXML je „tag transformer“, to znamená, že pro každou značku XML je přidružen binární bajt. Například značka < SI> je převedena jako binární znak &#x0005;

proč WBXML?

snadná odpověď: výsledek transformace WBXML je menší v počtu generovaných bajtů než samotný textový soubor XML.

Poznámka: mnoho značek je převedeno na bajty, ale někdy i obsah (například adresy URL), např. URL http://www.dev.mobi lze zapsat v WBXML jako 0Ddev.mobi ,kde “ 0D “ znamená http://www.

„0C“ je obecnější a znamená http: / / takže můžete napsat adresu URL dvěma způsoby:

1
<rozpětí>0Ddev.mobi < / rozpětí>

nebo

1
<rozpětí>0Cwww.rozvoj.mobi< / span>

první používá 9 znaků (0D je jeden byte), druhý 13 znaků! Miluji WBXML Terms

termíny

aby bylo jasné, „WAP push“ nemáme na mysli způsob, jak posílat SMS pomocí WAP. Máme na mysli to, co je technicky známé jako SI (indikace služby). Indikace služby je binární SMS odeslaná na vyhrazený port na zařízení, která informuje zařízení, že existuje adresa URL, která čeká na návštěvu. Adresa URL může být adresa vyzváněcího tónu na webovém serveru, adresa souboru JAD pro instalaci aplikace J2ME nebo JPG nebo jednoduše stránky WAP; je na „webmasterovi“ webového serveru, aby obsah vložil na web, a je na zařízení, aby pochopilo, jak s obsahem zacházet. Pro více informací o tomto aspektu puzzle, naleznete v našem obsahu adaptace série článků.

poznámka: Když řeknu „webový server“, mám na mysli web i WAP server, protože většina webových serverů může být nakonfigurována tak, aby poskytovala obsah WAP. Pod pojmem „Ota Configuration SMS“ mám na mysli binární SMS, která obsahuje podrobnosti APN (ale může obsahovat více) také známý jako „Konfigurace přístupu k internetu“.

Poznámka: existují speciální zprávy „Service Indication“, které se obvykle nazývají SL (Service Load), které jsou podobné „SI“. SI požádá uživatele o povolení před načtením obsahu přes síťové připojení, SL automaticky stahuje obsah bez vyžádání oprávnění uživateli. „SL“ jsou velmi podobné zprávám MMS: obsah je na webovém serveru a SMS říká telefonu, aby zprávu stáhl.

začněme tedy

nejprve si musíme přečíst některé dokumenty (bohužel), abychom si přečetli některé specifikace, jak psát obsah XML, který má být odeslán přes SMS. Dobrým výchozím bodem může být Nokia „Smart Messaging Specification 3.0.0“, ze které lze stáhnout www.forum.nokia.com a také další technické dokumenty z Open Mobile Alliance (OMA) od www.openmobilealliance.org/tech/affiliates/wap/wapindex.html

takže naše kroky budou:

  • rozhodněte se, co chceme odeslat
  • Najděte dokumenty o tomto tématu
  • Najděte strukturu XML zprávy, která má být odeslána
  • Přizpůsobte XML
  • převeďte XML na WBXML
  • připravte UDH
  • odešlete UDH a tělo

, protože chceme poslat aplikaci J2ME na WBXML

  • nový telefon, pak musíme poslat zprávu „indikace služby“, známou také jako „WAP Push“. Toto “ SI “ lze použít k posunutí SMS, která bude čtena jako odkaz ke stažení něčeho. Jakýkoli typ obsahu (image / jpeg, application / java-archive,…) je platný, pokud jej telefon může otevřít.

    kdo tedy může říct, které typy obsahu může zařízení otevřít ? DeviceAtlas nám může pomoci zde! (viz reference)

    Najděte dokumenty o tomto tématu

    Ok, otevřeme odkaz OMA a přejdeme do „funkční oblasti“ označené „push“. Pojďme získat „specifikaci indikace služby WAP“. Abychom pochopili, jak funguje WBXML, doporučuji si přečíst odstavec 8.3.2 „atribut Start tokeny“.

    Najděte strukturu XML zprávy

    pro ty z vás, kteří se více podobají DTDs, se podívejte do oddílu 7.2. Všichni ostatní mohou přeskočit všechny dokumenty a přejít na příklad čtení v části 9. XML je docela samozřejmý, takže udělám nějaké přizpůsobení přímo.

    1
    2
    3
    4
    5
    6
    7

    <?xml version=“1.0″?>
    <!DOCTYPE si PUBLIC „- //WAPFORUM//DTD si 1.0 / / CS“ „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 konce strun
    11 atribut si-id
    03 řetězec začíná
    ** 36353332 6532
    00 konce strun
    07 atribut akce (signal-medium)
    01 konce atributů, nyní obsah
    03 řetězec začíná
    * 446576446F744D6F62692069732046756E2021 DevDotMobi je zábava !
    00 konce strun
    01 </indikace>
    01 </SI>

    * Jedná se o řetězce používané k předávání obsahu SI, každý znak v řetězci je převeden na jeho hexadecimální reprezentaci.
    ** „6532“ je třeba považovat za řetězec znaků a ne za číslo, takže k převodu tohoto čísla nepoužívejte kalkulačku

    naše tělo je, dává všechna čísla dohromady:

    1
    02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br / >011033635333200070103446576446F744D6F62692069732046756E2021000101

    (což je 130 znaků)

    připravte UDH

    Příprava UDH je docela snadná. Stačí začít s „06 05 04“ a poté přidat čísla portů. Zprávy WAP Push používají „cílový port“ 2948, zatímco zdrojový port je 9200. Převést desetinná čísla portů na hexadecimální formáty, takže 2948 se stává 0B84 a 9200 se stává 23F0. Magicky je UDH: 06 05 04 0B 84 23 F0

    Pošlete SMS a UDH

    co s tím musíte udělat? Docela jednoduché, stačí dát vše dohromady a SMS je připravena k odeslání.

    <UDH> + < tělo>

    1
    UDH: 06 05 04 0B 84 23 F0<br / > tělo: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101

    The complete message is then:

    1
    <span><strong>0605040B8423F0</strong><br /> 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446f744d6f62692069732046756e2021000101</span>

    což je 137 znaků dlouhé (hej, je to binární SMS, Java používá kódování UTF-8 pro binární zprávy, takže limit pro 1 SMS je 140 znaků, nejsme v pohodě ?

    aplikace J2ME

    abychom byli co nejpraktičtější, budeme potřebovat prostředí, které bude použito k odesílání SMS zpráv a popisu skutečného světa, ale protože ne každý má přístup k SMS Bráně s UDHs a rozhraní, kde zadat binární kód, popíšeme, jak to udělat s aplikací J2ME.

    zřeknutí se odpovědnosti: pokud jde o SPECIFIKACE WMA, aplikace J2ME nemají přístup ke speciálním vyhrazeným portům pro odesílání binárních SMS, takže aplikace J2ME v telefonu dostane bezpečnostní výjimku a zpráva nebude doručena.

    MIDP2. 0 má dvě metody, které umožňují odesílat zprávy: jeden vyžaduje řetězec, jeden vyžaduje pole bajtů. Ano, první se používá k nastavení obsahu textu, druhý k nastavení binárního obsahu.

    textová metoda: setPayloadText (String textualSMS);
    binární metoda: setPayloadData (byte binarySMS);

    aby bylo možné intall J2ME aplikace „Over the Air“, zkompilujte ji s vaším oblíbeným prostředím J2ME (mám rád NetBeans s mobility Pack), zkopírujte .JAD a .JAR soubory na váš webový server a přizpůsobit URL ve zprávě Wap Push.

    pojďme nyní napsat jednoduchou třídu J2ME, která odešle zprávu:

    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 rozšiřuje MIDlet {
    / / připojení k odeslání zprávy
    private MessageConnection conn;
    public void startApp() {
    // vložte zde své mobilní číslo
    String myMobileNumber=“+39335…“;
    zkuste {
    / / vytvořit binární zprávu
    / / cílový port je vyjádřen pomocí desetinné notace
    toto.conn = (MessageConnection) konektor.otevřít („sms: / / „+myMobileNumber+“:2948″);
    // určete, že budeme posílat binární zprávu
    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();
    }
    /** tato metoda pochází z affinitystudios
    * číst dál http://discussion.forum.nokia.com/forum/member.php?u=56142
    * převádí řetězce na datové pole znaků
    */
    private static byte convertHexToBinary (String hexData) vyvolá výjimku {
    System.mimo.println („Délka:“ +(hexData.délka()/2));
    if (hexData.délka () % 2 != 0 ) {
    hodit novou výjimku („musí být sudý počet šestihranných číslic“ );
    }
    byte binaryData = nový byte;
    pro (int i = 0; i < binaryData.délka; ++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;
    }
    veřejné void pauseApp() {}
    public void destroyApp (boolean bezpodmínečné) {}
    }

    použití Online SMS brány

    protože J2ME blokuje mnoho binárních zpráv, můžete zkusit online bránu k odeslání binárních zpráv. Mnoho společností poskytuje služby SMS brány a většina z nich má rozhraní pro odesílání syrových binárních SMS zpráv (jedná se o „plus“ pro mě), zatímco některé jiné společnosti vám dávají rozhraní pro nastavení přizpůsobených polí a vytváření binárních věcí pro vás.

    pokud chcete používat online SMS bránu, nezapomeňte si přečíst jejich technické specifikace. Pokud si chcete nainstalovat SMS bránu, která se připojuje k externím službám (operátorům / operátorům), doporučuji Kannel, což je bezplatný software SMS brány a je rozšířen po celém světě; Kannel má rád oddělení UDH a těla.

    1. vyhrazené porty a další: J2ME „Wireless Messaging API“ specifikace
      http://java.sun.com/products/wma/index.jsp
    2. standardní formát pro obsah OTA: Open Mobile Alliance
      http://www.openmobilealliance.org/tech/affiliates/wap/wapindex.html
    3. jak odeslat konfigurační soubory OTA, vyzváněcí tóny a loga operátorů: NOKIA
      http://www.forum.nokia.com (seach pro „Smart Messaging Specification“)
    4. jak detekovat mobilní telefon: WURFL
      http://deviceatlas.com
    5. Sms brána software: Kannel
      www.kannel.org
  • Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna.