バイナリSMS:smsを使用してデバイスにリッチコンテンツを送信する

この記事では、”Over The Air installation messages”を送信できる簡単なSMS対応モバイルアプ この記事を読んだ後、理論的にはSMSメッセージを配信手段として使用して別の電話に送信する小さなJ2MEアプレットを作成することができます。 実際、J2ME(JSR120/205)のWireless Messaging APIの制限により、wapプッシュメッセージのポートはセキュリティ上の理由から「予約」されています。 広くサポートされているSMSチャネルを介してコンテンツを送信する機能は、コンテンツプロバイダにとって非常に便利です。

SMSメッセージは、オペレータネットワークを介して送信されるパックされたバイト数が少な あなたの多くはすでにデバイスから”テキストメッセージ”を送信することを経験しており、多くはSMSメッセージを”テキストメッセージ”として送信するこ

SMSに少し技術的な紹介

この記事の範囲は実用的であることですので、我々はネットワークのすべての技術的かつ退屈な詳細を通過しませんが、三つの概念は、sms

  • SMSは、標準的なインターネットソケットと同じように”ポート”の概念を使用します。
  • SMSメッセージは160文字の本文に制限があります。
  • 本文はSMSで遊ぶことができる唯一のものではなく、ユーザーデータヘッダーもあります。

Ports

ブラウザでhttp://dev.mobiなどのURLをヒットすると、慣例により、webサーバーのポート80を透過的に呼び出します。 接続はポート80で初期化され、他のユーザーがwebサーバーの同じポートにアクセスできるように上位のポートに切り替えられます。 Ianaが述べているように、ポート80はHTTPプロトコルを指し、これはHTTPプロトコル要求を理解できるサーバーが目覚め、HTTP要求に応答して処理する準備ができていることを意味します。 SMSメッセージでも同じことが起こります。 あなたは携帯電話の特定のポートにSMSを送信することができ、あなたはそのデバイス上の特定のサービスをウェイクアップします。 今では、すべてのコンピュータが標準的なサービス(webサーバーなど)を持っているわけではないように、すべてのモバイルデバイスがポートをリッスンするサー これは非常に”メーカー関連”のものなので、あなたが受け入れることが有効になっているものをお使いの携帯電話を確認する必要があります。

Body and encoding

これは扱いにくいトピックかもしれませんが、有用な非常に基本的な情報について説明します。 SMSの既定のエンコードは、文字を処理するために7ビットを使用します。 これは、非常に基本的なcharテーブルに存在する文字のみをSMSに書き込むことができることを意味します。 より複雑なものに行き、より多くの「面白い」文字を送信したい場合は、8ビットのグループが必要であり、利用可能な文字のテーブルが大きくなります。 利用可能なスペースは、SMSあたり1120ビットであり、これ以上、それ以下ではありません。 7ビットを使用して160文字、または8ビットを使用して140文字を持つことができます

注:文字”É”は”基本テーブル”に含まれていますが、文字”È”は”より大きなテーブル”に含まれています。 2番目の文字でメッセージを書き込むと、メッセージ内で使用可能なスペースが少なくなります。 だから、SMSを送信するときに使用している文字に注意してください😉

User Data Header

User Data Header(別名UDH)は、単純な”テキストメッセージ”以上の何かをするために”高レベル UDHは、モバイルアプリケーションに”目に見えないテキストメッセージ”を送信することができます(”モバイルアプリケーション”とは、モバイルデバイス上で実 これはXMLファイルと非常によく似ています: あなたが送信しているものと、パーサー自身によって処理されるprologに続くコンテンツをパーサーに伝える必要があります。UDHは主に、クライアント(電話)がSMSを送信するポートを指定するために使用されます。 それは記述する六進数のセットによって作られています:

<UDHの長さは><ポート番号を指定するために使用される形式><ポート番号の長さ><宛先ポート番号><送信元ポート番号>。実用的な例として、WAPプッシュの標準宛先ポートが2948であるWAPプッシュを送信するためのUDHを作成したいとすると、UDHは次のようになります。:

1
06 05 04 084-232-0000

どこで:

  • 06 とこんにちは、読み込みは以下の6バイトを”
  • 05フォーマットのために、この場合には十六進番号
  • 04くのUDH各港代表される4つの文字
  • 0B84は送信先のポート2948(小数の表現は0B84(進数で表現)
  • 23F0のソースポート、9200(小数点表現) や23F0(進数で表現).

注:単純な電卓を使用して10進数を16進数に変換します。”Dec”を選択し、電卓に2948を入れてから、”Hex”ボタンを押します。 どの関数電卓でもこれを行うことができ、多くのオペレーティングシステムにはこれを行うことができる小さな”calc”アプリケーションがあります。

Binary SMS

“binary SMS”は、WBXMLで変換されたXML形式のテキストSMSです。 WBXMLは”タグ変換”であり、これは各XMLタグに対してバイナリバイトが関連付けられていることを意味します。 たとえば、タグ<SI>はバイナリ文字&#x0005;

WBXMLとして変換されます。簡単な答え:WBXML変換の結果は、詳細なテキストXMLファイル自体よりも生成されるバイト数が少なくなります。

注:多くのタグはバイトに変換されますが、URLhttp://www.dev.mobiなどのコンテンツ(URLアドレスなど)もWBXMLで次のように書くことができます0Ddev.mobi ここで、”0D”はhttp://wwwを表します。

“0C”はより一般的であり、http://を表しているため、URLを二つの方法で書くことができます:

1
<スパン>0Ddev.mobi </>

または

1
<スパン>0cwww.デヴモビ</>

最初は9文字(0Dは1バイト)、2番目の13文字を使用します! 私はWBXMLを愛しています🙂

Terms

明確にするために、”WAP push”によって、WAPを使用してSMSを送信する方法を意味するものではありません。 私たちが意味するのは、技術的にはSI(サービス表示)として知られているものです。 サービス指示は、訪問されるのを待っているURLがあることをデバイスに通知するデバイス上の専用ポートに送信されるバイナリSMSです。 URLには、webサーバー内の着信音のアドレス、J2MEアプリケーションをインストールするためのJADファイルのアドレス、JPGまたは単にWAPページを指定できます。 パズルのこの側面の詳細については、記事の私たちのコンテンツAdapationシリーズを参照してください。注:「webサーバー」と言うときは、ほとんどのwebサーバーをWAPコンテンツを配信するように構成できるため、webサーバーとWAPサーバーの両方を意味します。 「OTA構成SMS」とは、「インターネットアクセス構成」とも呼ばれるAPNの詳細を含むバイナリSMSを意味します(ただし、それ以上を含むことができます)。

注:通常SL(Service Load)と呼ばれる特別な”Service Indication”メッセージがあり、これは”SI”に似ています。 SIは、ネットワーク接続を介してコンテンツをフェッチする前にユーザに許可を要求し、SLはユーザに許可を要求せずにコンテンツを自動的にダウンロー コンテンツはwebサーバー上にあり、SMSは電話にメッセージをダウンロードするように指示します。それでは、

を始めましょうまず、SMSで送信するXMLコンテンツを記述する方法に関するいくつかの仕様を読むために、いくつかの論文(悲しいかな)を読む必 良いスタートポイントは、Nokiaの”Smart Messaging Specification3.0.0″である可能性があります。www.forum.nokia.com また、Open Mobile Alliance(OMA)からのより多くの技術的なドキュメントもありますwww.openmobilealliance.org/tech/affiliates/wap/wapindex.html

だから私たちのステップは次のようになります:

  • 送信する内容を決定する
  • そのトピックに関するドキュメントを見つける
  • 送信するメッセージのXML構造を見つける
  • XMLをカスタマイズ
  • XMLをWBXMLに変換
  • UDHを準備する
  • 送信するメッセージのXML構造を見つける
  • 送信するメッセージのXML構造を見つける
  • 送信するメッセージのXML構造を見つける
  • 送信するメッセージのXML構造を見つける
  • 送信するメッセージのXML構造を見つける
  • 送信するメッセージのXML構造を見つける
  • 送信するメッセージのXML構造を見つける

J2MEアプリケーションを新しい電話機に送信する場合、「WAPプッシュ」とも呼ばれる「サービス表示」メッセージを送信する必要があります。 この「SI」は、何かをダウンロードするためのリンクとして読み取られるSMSをプッシュするために使用できます。 任意のコンテンツタイプ(image/jpeg、application/java-archive、…)は、電話機が開くことができる場合に有効です。

では、どのコンテンツタイプがデバイスを開くことができるかを誰が知ることができますか? DeviceAtlasはここで私たちを助けることができます! (参考文献を参照)

そのトピックに関するドキュメントを見つける

Ok、OMAリンクを開き、”Push”と書かれた”Functional area”に行きましょう。 “WAPサービス表示仕様”を取得しましょう。 WBXMLがどのように機能するかを理解するために、段落8.3.2「Attribute Start Tokens」を読むことをお勧めします。

メッセージのXML構造を見つける

Dtdに似ている人のために、セクション7.2を見てください。 他のすべては、すべてのドキュメントをスキップし、セクション9の読み取り例に行くことができます。 そこにあるXMLはかなり自明なので、私はいくつかのカスタマイズを直接行います。

1
2
3
4
5
6
7

<?xmlバージョン=”1.0″?>
<!DOCTYPE si PUBLIC”-//WAPFORUM//DTD SI1.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 文字列の終わり
11 si-id属性
03 文字列の開始
** 36353332 6532
00 文字列の終わり
07 アクション属性(signal-medium)
01 属性の終わり、今のコンテンツ
03 文字列の開始
* 446576446F744D6F62692069732046756E2021 DevDotMobiは楽しいです!
00 文字列の終わり
01 </表示>
01 </SI>

* これらはSIに内容を渡すために使用される文字列であり、文字列内の各文字はその16進表現に変換されます。
**”6532″は数字ではなく文字列とみなされるので、この数字を変換するために電卓を使用しないでください

私たちの体は、すべての数字を一緒に入れています:

1
02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br/>011033635333200070103446576446F744D6F62692069732046756E2021000101

(これは130文字です)

UDHを準備する

UDHを準備するのは非常に簡単です。 “06 05 04″で始まり、ポート番号を追加するだけです。 送信元ポートが9200である間、WAPプッシュメッセージは「宛先ポート」2948を使用します。 10進数のポート番号を16進数形式に変換するので、2948は0B84になり、9200は23F0になります。 魔法のように、UDHは次のとおりです:06 05 04 0B84 23F0

SMSとUDHを送信します

さて、あなたはこれで何をする必要がありますか? 非常にシンプルな、ちょうど一緒にすべてを入れて、SMSを送信する準備ができています。

<UDH>+<本体>

1
UDH:06 05 04 0B84 23F0<br/>ボディ: 02056A0045C60C037777772E6465762E6D6F62692F69735F66756E2E68746D6C0<br /> 011033635333200070103446576446F744D6F62692069732046756E2021000101

The complete message is then:

1
<span><strong>0605040B8423F0</strong><br/>02056a0045c60c037777772E6465762E6D6f62692f69735f66756e2e68746d6C0<BR/>011033635333200070103446576446F744d6f62692069732046756e2021000101</SPAN>

これは137文字の長さです(ねえ、それはバイナリSMSです、JavaはバイナリメッセージにUTF-8エンコーディングを使用するので、1SMSの制限は140文字です、クールではあこんにちはありませんか?)

J2MEアプリケーション

できるだけ実用的にするためには、SMSメッセージを送信し、現実の世界を記述するために使用する環境が必要ですが、誰もがUDHsとバイナリコードを入力するインターフェイスを持つSMSゲートウェイにアクセスできるわけではないため、J2MEアプリケーションで同じことを行う方法について説明します。

免責事項:WMA仕様に関しては、J2MEアプリケーションはバイナリSMSを送信するために特別な予約ポートにアクセスできないため、電話機のJ2MEアプリケーシ

MIDP2.0には、メッセージの送信を可能にする二つのメソッドがあります。 はい、最初のものはテキストの内容を設定するために使用され、2番目のものはバイナリの内容を設定するために使用されます。

テキストメソッド:setPayloadText(String textualSMS);
バイナリメソッド:setPayloadData(byte binarySMS);

J2MEアプリケーションを”Over The Air”でintallできるようにするには、お気に入りのJ2ME環境でコンパジャドと…あなたのwebサーバにJARファイルを作成し、WapプッシュメッセージのURLをカスタマイズします。

ここで、メッセージを送信する単純なJ2MEクラスを記述しましょう:

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{
//メッセージを送信するための接続
private MessageConnection conn;
public void startApp() {
// ここにあなたの携帯電話番号を入れてください
文字列myMobileNumber=”+39335。..”;
try{
//バイナリメッセージを作成します
//宛先ポートは、十進表記
これを使用して表現されます。conn=(MessageConnection)コネクタ。open(“sms://”+myMobileNumber+”:2948″);
// バイナリメッセージ
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();
}
/** このメソッドはaffinitystudios
から来ています*続きを読むhttp://discussion.forum.nokia.com/forum/member.php?u=56142
* 文字列を文字のデータ配列に変換します
*/
プライベート静的バイトconvertHexToBinary(String hexData)例外{
システムをスローします。出ろprintln(“長さ:”+(hexData.長さ()/2));
(hexData.長さ()%2!= 0 ) {
throw new Exception(“は偶数桁のhex桁でなければなりません” );
}
byte binaryData=新しいバイト;
for(int i=0;i<binaryData.長さ;++i){
文字列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;
}
パブリックボイドpauseApp() {}
パブリック-ボイド-デストロイアップ(ブール値)) {}
}

オンラインSMSゲートウェイの使用

J2MEは多くのバイナリメッセージをブロックするため、オンラインゲートウェイを試してバイナリメッセージを送 多くの企業は、SMSゲートウェイサービスを提供し、それらのほとんどは、生のバイナリSMSメッセージを送信するためのインターフェイスを持っている(これらは私には”プラス”である)いくつかの他の企業はちょうどあなたにカスタマイズされたフィールドを設定し、あなたのためのバイナリのものを作るためのインターフェイスを与える一方で。

オンラインSMSゲートウェイを使用する場合は、技術仕様をお読みください。 外部サービス(キャリア/事業者)に接続するSMSゲートウェイを自分でインストールしたい場合は、無料のSMSゲートウェイソフトウェアであり、世界中に広がって

  1. 予約ポートなど:J2ME”Wireless Messaging API”仕様
    http://java.sun.com/products/wma/index.jsp
  2. OTAコンテンツの標準形式:Open Mobile Alliance
    http://www。openmobilealliance.org/tech/affiliates/wap/wapindex…..html
  3. OTA設定、着信音、オペレータロゴを送信する方法:NOKIA
    http://www。forum.nokia.com (”スマートメッセージング仕様”のseach)
  4. 携帯電話を検出する方法:WURFL
    http://deviceatlas.com
  5. Smsの出入口ソフトウェア:Kannel
    www.kannel.org

コメントを残す

メールアドレスが公開されることはありません。