5
0
mirror of https://github.com/cwinfo/envayasms.git synced 2025-01-10 04:05:38 +00:00

add page explaining how to test with emulator; faq for reverse tunnels; screenshot of pending messages

This commit is contained in:
Jesse Young 2011-10-01 15:47:55 -07:00
parent ba94500c10
commit 6781f9aa85
32 changed files with 385 additions and 81 deletions

View File

@ -2,6 +2,7 @@ id: faq
title: Frequently Asked Questions title: Frequently Asked Questions
q_alternative: Instead of implementing a SMS gateway as an Android app, why not use X instead? (where X = Twilio, Tropo, Clickatell, FrontlineSMS, RapidSMS, Kannel, etc.) q_alternative: Instead of implementing a SMS gateway as an Android app, why not use X instead? (where X = Twilio, Tropo, Clickatell, FrontlineSMS, RapidSMS, Kannel, etc.)
q_rate: How fast can EnvayaSMS send SMS messages? q_rate: How fast can EnvayaSMS send SMS messages?
q_tunnel: EnvayaSMS can't connect to my dev server! What's wrong?
q_phones: What phones are compatible with EnvayaSMS? q_phones: What phones are compatible with EnvayaSMS?
q_servers: Does EnvayaSMS use envaya.org's servers? q_servers: Does EnvayaSMS use envaya.org's servers?
q_envaya_org: What is the relationship between EnvayaSMS and envaya.org? q_envaya_org: What is the relationship between EnvayaSMS and envaya.org?
@ -17,6 +18,9 @@ q_smssync: What is the difference between EnvayaSMS and SMSSync?
<li> <li>
<a href='#q_rate'>{{ this.q_rate }}</a> <a href='#q_rate'>{{ this.q_rate }}</a>
</li> </li>
<li>
<a href='#q_tunnel'>{{ this.q_tunnel }}</a>
</li>
<li> <li>
<a href='#q_phones'>{{ this.q_phones }}</a> <a href='#q_phones'>{{ this.q_phones }}</a>
</li> </li>
@ -128,6 +132,45 @@ To increase the rate at which you can send SMS messages, you can install EnvayaS
In order to send more than 100 messages per hour with a single phone, it is necessary to install <a href='/install/#expansion'>EnvayaSMS Expansion Packs</a>. In order to send more than 100 messages per hour with a single phone, it is necessary to install <a href='/install/#expansion'>EnvayaSMS Expansion Packs</a>.
</p> </p>
<h4 id='q_tunnel'>{{ this.q_tunnel }}</h4>
<p>
EnvayaSMS may be unable to connect to your development web server if it is blocked by a firewall on your computer,
or if your computer has a IP address that's inaccessible from your phone's network.
</p>
<p>
If your Android phone is on the same Wi-Fi network as your development web server, configure the firewall on
your development computer to allow incoming connections to your web server, then simply enter your computer's IP address
in EnvayaSMS as the Server URL.
</p>
<p>
If you're testing with the phone's mobile data connection, or if your phone and development computer are on different
Wi-Fi networks, the IP address of your development web server is likely inaccessible to the phone.
</p>
<p>
To allow the phone to connect to your development computer, you can set up a reverse SSH tunnel between your
development computer and a server with a public IP address.
</p>
<p>
To set up a reverse SSH tunnel, you can either:
<ul>
<li>use a hosted service like <a href='http://progrium.com/localtunnel/'>localtunnel</a>, or</li>
<li>use <code>ssh -R</code> to connect to your own server accessible from the public internet. For example:
<pre>ssh -R 0.0.0.0:8765:localhost:80 [user]@[host]</pre>
<p>
This sets up port 8765 on <code>host</code> to forward to port 80 on your local development computer.
Then you can use <code>http://[host]:8765/</code> as the Server URL in EnvayaSMS, and it will be
forwarded to <code>http://localhost</code> on your development server.
</p>
<p>
Note: In order for SSH port forwarding to work, you will need to set <code>GatewayPorts yes</code> in the <code>/etc/sshd_config</code> file
on the public server.
</p>
</li>
</ul>
<h4 id='q_phones'>{{ this.q_phones }}</h4> <h4 id='q_phones'>{{ this.q_phones }}</h4>
<p> <p>

View File

@ -2,27 +2,25 @@ id: history
title: History title: History
--- ---
Version 2.0-rc2 (2011/09/29) Version 2.0 (2011/10/01)
<ul> <ul>
<li> <li>
Automatic failover between Wi-Fi and mobile data connection if server is unreachable Automatic failover between Wi-Fi and mobile data connection if server is unreachable
(e.g. when Wi-Fi router is on, but it has no internet access) (e.g. when Wi-Fi router is on, but it has no internet access)
</li> </li>
<li>
User can see all pending messages, and retry/delete individual messages
</li>
<li> <li>
Send timestamp of incoming messages to server Send timestamp of incoming messages to server
</li> </li>
</ul>
Version 2.0-rc1 (2011/09/28)
<ul>
<li> <li>
Allow outgoing SMS messages to be sent in priority order Allow outgoing SMS messages to be sent in priority order
</li> </li>
<li> <li>
Reschedule outgoing messages when the Android outgoing SMS limit would be exceeded Reschedule outgoing messages when the Android outgoing SMS limit would be exceeded
</li> </li>
</ul> </ul>
Version 2.0-beta (2011/09/23) Version 2.0-beta (2011/09/23)

View File

@ -22,7 +22,7 @@ work over the phone's mobile data connection, but Wi-Fi is likely to be faster,
<p> <p>
Then your network would look like this: Then your network would look like this:
<br /> <br />
<img src='/media/topology.png' width='690' height='284' /> <img src='/media/topology.png' width='650' height='262' />
</p> </p>
<p> <p>

View File

@ -6,7 +6,8 @@ layout: default.twig
<img src='/media/screenshot-main.png' width='212' height='350' /> <img src='/media/screenshot-main.png' width='212' height='350' />
<br /> <br />
<img src='/media/screenshot-settings.png' width='212' height='350' /> <img src='/media/screenshot-settings.png' width='212' height='350' />
<br />
<img src='/media/screenshot-pending.png' width='212' height='350' />
</div> </div>
EnvayaSMS is a SMS and MMS gateway running entirely as an Android app. EnvayaSMS is a SMS and MMS gateway running entirely as an Android app.
@ -51,9 +52,13 @@ It works wherever the phone can receive SMS messages and access the Internet
</p> </p>
<p> <p>
In order to deploy EnvayaSMS, you will need a messaging plan for your phone, and the phone itself. In order to deploy EnvayaSMS, you will need a messaging plan for your phone, and the phone itself.
EnvayaSMS is compatible with many old or inexpensive Android phones, e.g. the LG GT540, currently $120 on Amazon.com. EnvayaSMS is compatible with many old or inexpensive Android phones, e.g. the LG GT540, currently $120 on Amazon.com.
</p> </p>
<p>
Before deploying EnvayaSMS, you can test EnvayaSMS without an Android phone
by installing EnvayaSMS on an emulated phone on your computer. <a href='/test/'>Learn more...</a>
</p>
<a href='/install/' class='button'> <a href='/install/' class='button' style='margin-left:110px;'>
Install EnvayaSMS Now Install EnvayaSMS Now
</a> </a>

View File

@ -1,21 +1,26 @@
id: install id: install
title: Installing EnvayaSMS title: Installing EnvayaSMS
--- ---
Before installing EnvayaSMS, ensure that you have the following prerequisites: In order to install and deploy EnvayaSMS, you will need the following prerequisites:
<ul> <ul>
<li>One or more Android phones (1.6 Donut or higher) that are <li>One or more Android phones (1.6 or higher),
registered on a mobile network. </li> registered on a mobile network
</li>
<li>A way for the phones to connect to the internet, either via Wi-Fi <li>A way for the phones to connect to the internet, either via Wi-Fi
or the mobile data service. <br /> or the mobile data service<br />
(Even if using Wi-Fi, mobile data (Even if using Wi-Fi, mobile data
service is necessary to receive MMS messages.) </li> service is necessary to receive MMS messages.) </li>
<li> A web server accessible from the public internet </li> <li>A web server accessible from the public internet</li>
</ul> </ul>
Using an Android phone, open <a href='https://market.android.com/details?id=org.envaya.sms'>EnvayaSMS on Android Market</a> by clicking the link from your phone's browser, or scanning the barcode with a QR code app. Then, follow the steps shown below to install EnvayaSMS on your phone.<br /> <p>
Note: If you don't have these prerequisites yet, you can <a href='/test/'>test EnvayaSMS on your computer</a>.
</p>
<div style='float:left;padding-right:10px;padding-top:30px'> To install EnvayaSMS on an Android phone, open EnvayaSMS on Android Market by clicking the link below from your phone's browser, or scanning the barcode with a QR code app.<br />
<div style='float:left;padding-right:10px;padding-top:20px'>
<div style='font-size:16px;font-weight:bold; text-align:center'> <div style='font-size:16px;font-weight:bold; text-align:center'>
<a href="https://market.android.com/details?id=org.envaya.sms">Open Android Market</a> <a href="https://market.android.com/details?id=org.envaya.sms">Open Android Market</a>
</div> </div>
@ -25,7 +30,7 @@ Using an Android phone, open <a href='https://market.android.com/details?id=org.
</div> </div>
<div style='float:left;padding-top:10px'> <div style='float:left;padding-top:10px'>
<img src='/media/screenshot-market.png' style='border:1px solid black' width='484' height='240' /> <img src='/media/screenshot-market.png' style='border:1px solid black' width='440' height='218' />
</div> </div>
<div style='clear:both;padding-top:10px'> <div style='clear:both;padding-top:10px'>
@ -80,6 +85,9 @@ After your server is configured, configure EnvayaSMS on your phone to connect to
<li><em>Recommended:</em> under Wi-Fi sleep policy, select "always stay connected". <li><em>Recommended:</em> under Wi-Fi sleep policy, select "always stay connected".
(Otherwise, EnvayaSMS will be unable to forward messages after the phone goes to sleep.) (Otherwise, EnvayaSMS will be unable to forward messages after the phone goes to sleep.)
</li> </li>
<li><em>Optional:</em> enable Network Failover so that the phone will automatically switch
to mobile data if the Wi-Fi network stops working.
</li>
<li>Check "Enable EnvayaSMS"</li> <li>Check "Enable EnvayaSMS"</li>
<li>Click the Back button to return to the main screen</li> <li>Click the Back button to return to the main screen</li>
</ol> </ol>
@ -93,8 +101,11 @@ then click "Test Connection".
<p> <p>
<strong>Important:</strong> After EnvayaSMS is enabled, it will forward all SMS messages regardless of whether the <strong>Important:</strong> After EnvayaSMS is enabled, it will forward all SMS messages regardless of whether the
EnvayaSMS app is open. If you want to use SMS normally again, return to EnvayaSMS' settings screen EnvayaSMS app is open. If you want to use SMS normally again, return to EnvayaSMS' settings screen
and uncheck "Enable EnvayaSMS". and uncheck "Enable EnvayaSMS".</p>
</p>
<p>If you're testing EnvayaSMS with an Android phone that you're also using for normal communication,
you can enable "Test mode" on the settings screen so that EnvayaSMS only handles SMS messages
from particular phone numbers.</p>
<h3 id='expansion'>Installing Expansion Packs</h3> <h3 id='expansion'>Installing Expansion Packs</h3>

View File

@ -32,12 +32,13 @@ HTTP Request Format
<pre> <pre>
POST /sg/app HTTP/1.1 POST /sg/app HTTP/1.1
X-Request-Signature: sAemG31uRllk/K9xck2WRNaF/WI= X-Request-Signature: sAemG31uRllk/K9xck2WRNaF/WI=
Content-Length: 96 Content-Length: 120
Content-Type: application/x-www-form-urlencoded Content-Type: application/x-www-form-urlencoded
Host: 192.168.70.1:3000 Host: 192.168.70.1:3000
Connection: Keep-Alive Connection: Keep-Alive
from=6505551234&message_type=sms&message=test&version=2&phone_number=16505551212&action=incoming from=6505551234&message_type=sms&message=test&version=2&phone_number=16505551212
&action=incoming&timestamp=1317506831000
</pre> </pre>
<p>An incoming MMS message with an <code>image/jpeg</code> part and a <code>text/plain</code> part with message 'Test':</p> <p>An incoming MMS message with an <code>image/jpeg</code> part and a <code>text/plain</code> part with message 'Test':</p>
@ -46,53 +47,61 @@ from=6505551234&message_type=sms&message=test&version=2&phone_number=16505551212
POST /sg/app HTTP/1.1 POST /sg/app HTTP/1.1
X-Request-Signature: OgpiQet9guVhEp+0klrONR8qGNs= X-Request-Signature: OgpiQet9guVhEp+0klrONR8qGNs=
Content-Length: 13087 Content-Length: 13087
Content-Type: multipart/form-data; boundary=i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO Content-Type: multipart/form-data; boundary=i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Host: 192.168.70.1:3000 Host: 192.168.70.1:3000
Connection: Keep-Alive Connection: Keep-Alive
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="from" Content-Disposition: form-data; name="from"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
+16505551234 +16505551234
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="timestamp"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1317506831000
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="message" Content-Disposition: form-data; name="message"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
Test Test
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="message_type" Content-Disposition: form-data; name="message_type"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
mms mms
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="mms_parts" Content-Disposition: form-data; name="mms_parts"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
[{"type":"application/smil","filename":"01smil","cid":"<0000>","name":"part0"},{"type":"text/plain","filename":"Text01.txt","cid":"<569>","name":"part1"},{"type":"image/jpeg","filename":"Image0001.jpg","cid":"<570>","name":"part2"}] [{"type":"application/smil","filename":"01smil","cid":"<0000>","name":"part0"},
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO {"type":"text/plain","filename":"Text01.txt","cid":"<569>","name":"part1"},
{"type":"image/jpeg","filename":"Image0001.jpg","cid":"<570>","name":"part2"}]
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="version" Content-Disposition: form-data; name="version"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
3 3
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="phone_number" Content-Disposition: form-data; name="phone_number"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
16505551212 16505551212
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="action" Content-Disposition: form-data; name="action"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
incoming incoming
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="part0"; filename="01smil" Content-Disposition: form-data; name="part0"; filename="01smil"
Content-Type: application/smil; charset=UTF-8 Content-Type: application/smil; charset=UTF-8
Content-Transfer-Encoding: binary Content-Transfer-Encoding: binary
@ -113,19 +122,19 @@ Content-Transfer-Encoding: binary
&lt;/body&gt; &lt;/body&gt;
&lt;/smil&gt; &lt;/smil&gt;
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="part1"; filename="Text01.txt" Content-Disposition: form-data; name="part1"; filename="Text01.txt"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: binary Content-Transfer-Encoding: binary
Test Test
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="part2"; filename="Image0001.jpg" Content-Disposition: form-data; name="part2"; filename="Image0001.jpg"
Content-Type: image/jpeg Content-Type: image/jpeg
Content-Transfer-Encoding: binary Content-Transfer-Encoding: binary
<em>BINARY IMAGE DATA</em> <em>BINARY IMAGE DATA</em>
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO-- --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG--
</pre> </pre>
<p>Checking for outgoing SMS messages:</p> <p>Checking for outgoing SMS messages:</p>

46
.phrozn/entries/test/index.twig Executable file
View File

@ -0,0 +1,46 @@
id: test
title: Testing EnvayaSMS
---
<p>
<img src='/media/avd.png' width='242' height='227' style='float:right;padding-left:10px;' />
If you don't yet have an Android phone, you can test EnvayaSMS in an emulated phone on your computer.
</p>
<p>
With this method, you can test EnvayaSMS for free
and figure out if EnvayaSMS will work for your project
without needing to get an actual phone or subscribe to mobile service.
</p>
<p>
The following steps explain how to set up EnvayaSMS on an Android Virtual Device:
</p>
<ol>
<li>Install the <a href='http://developer.android.com/sdk/'>Android SDK</a> on your computer (where you are running a "dev" copy of your website)</li>
<li>Create a new Android Virtual Device with a target of Android 1.6 or higher. Specify a size for the SD card (necessary to download EnvayaSMS via the browser)</li>
<li>Start the virtual device</li>
<li>Open the Browser app and go to <a href='/install/'>sms.envaya.org/install</a></li>
<li>Click on the EnvayaSMS-release.apk link to download EnvayaSMS.<br />
<small>Note: Android Market does not work in the emulator.</small></li>
<li>Install EnvayaSMS</li>
<li>Configure EnvayaSMS with the settings of your development server. <br />
<small>Note: Do not enter <code>localhost</code> as the Server URL (since this would refer to the AVD itself). Instead, use your computer's IP address on the local network, as shown by the <code>ipconfig</code>
or <code>ifconfig</code> utilities.</small>
</li>
<li>
<img src='/media/telnet.png' width='216' height='85' style='float:right' />
To simulate incoming SMS on the emulator:
<ul>
<li>using telnet from your host computer, connect to <code>localhost:5554</code><br />
<small>Note: on Windows, you can install <a href='http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html'>puttytel</a>.</small>
</li>
<li>type <code>sms send [phonenumber] [text message]</code> to send messages to the emulator.<br/>
<small>Note: the emulator cannot receive MMS messages.</small>
</li>
</ul>
</li>
</ol>
<p>
Of course, you can also test EnvayaSMS by connecting a real Android phone to your development web server.
For more information, see the <a href='/faq/#q_tunnel'>FAQ</a>.
</p>

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a {% if entry.id == 'install' %}class='active'{% endif %} href='/install/'>Install</a> <a {% if entry.id == 'install' %}class='active'{% endif %} href='/install/'>Install</a>
&middot; &middot;
<a {% if entry.id == 'test' %}class='active'{% endif %} href='/test/'>Test</a>
&middot;
<a {% if entry.id == 'how' %}class='active'{% endif %} href='/how/'>How it Works</a> <a {% if entry.id == 'how' %}class='active'{% endif %} href='/how/'>How it Works</a>
&middot; &middot;
<a {% if entry.id == 'serverapi' %}class='active'{% endif %} href='/serverapi/'>API Reference</a> <a {% if entry.id == 'serverapi' %}class='active'{% endif %} href='/serverapi/'>API Reference</a>

BIN
.phrozn/media/avd.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 26 KiB

BIN
.phrozn/media/telnet.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -55,7 +55,7 @@ dd
#container { #container {
margin: 0 auto; margin: 0 auto;
width: 700px; width: 650px;
} }
h1 { margin-top:0; font-size: 42px; color: #6b9412; margin-bottom: 3px; } h1 { margin-top:0; font-size: 42px; color: #6b9412; margin-bottom: 3px; }
h1 .small { font-size: 20px; color:#666; } h1 .small { font-size: 20px; color:#666; }
@ -74,7 +74,7 @@ hr { border: 0; width: 80%; border-bottom: 1px solid #aaa}
.button .button
{ {
text-decoration:none; text-decoration:none;
display:block;margin:0 auto;width:200px;background:#6b9412;color:white;padding:8px;font-weight:bold;text-align:center; display:block;width:200px;background:#6b9412;color:white;padding:8px;font-weight:bold;text-align:center;
} }
a.button:hover a.button:hover
@ -87,7 +87,7 @@ img
border:0px; border:0px;
} }
.faq_links li li
{ {
padding-bottom:5px; padding-bottom:5px;
} }
@ -100,4 +100,5 @@ img
.faq_links a:hover .faq_links a:hover
{ {
text-decoration:underline; text-decoration:underline;
} }

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a href='/install/'>Install</a> <a href='/install/'>Install</a>
&middot; &middot;
<a href='/test/'>Test</a>
&middot;
<a href='/how/'>How it Works</a> <a href='/how/'>How it Works</a>
&middot; &middot;
<a href='/serverapi/'>API Reference</a> <a href='/serverapi/'>API Reference</a>

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a href='/install/'>Install</a> <a href='/install/'>Install</a>
&middot; &middot;
<a href='/test/'>Test</a>
&middot;
<a href='/how/'>How it Works</a> <a href='/how/'>How it Works</a>
&middot; &middot;
<a href='/serverapi/'>API Reference</a> <a href='/serverapi/'>API Reference</a>
@ -47,6 +49,9 @@
<li> <li>
<a href='#q_rate'>How fast can EnvayaSMS send SMS messages?</a> <a href='#q_rate'>How fast can EnvayaSMS send SMS messages?</a>
</li> </li>
<li>
<a href='#q_tunnel'>EnvayaSMS can't connect to my dev server! What's wrong?</a>
</li>
<li> <li>
<a href='#q_phones'>What phones are compatible with EnvayaSMS?</a> <a href='#q_phones'>What phones are compatible with EnvayaSMS?</a>
</li> </li>
@ -158,6 +163,45 @@ To increase the rate at which you can send SMS messages, you can install EnvayaS
In order to send more than 100 messages per hour with a single phone, it is necessary to install <a href='/install/#expansion'>EnvayaSMS Expansion Packs</a>. In order to send more than 100 messages per hour with a single phone, it is necessary to install <a href='/install/#expansion'>EnvayaSMS Expansion Packs</a>.
</p> </p>
<h4 id='q_tunnel'>EnvayaSMS can't connect to my dev server! What's wrong?</h4>
<p>
EnvayaSMS may be unable to connect to your development web server if it is blocked by a firewall on your computer,
or if your computer has a IP address that's inaccessible from your phone's network.
</p>
<p>
If your Android phone is on the same Wi-Fi network as your development web server, configure the firewall on
your development computer to allow incoming connections to your web server, then simply enter your computer's IP address
in EnvayaSMS as the Server URL.
</p>
<p>
If you're testing with the phone's mobile data connection, or if your phone and development computer are on different
Wi-Fi networks, the IP address of your development web server is likely inaccessible to the phone.
</p>
<p>
To allow the phone to connect to your development computer, you can set up a reverse SSH tunnel between your
development computer and a server with a public IP address.
</p>
<p>
To set up a reverse SSH tunnel, you can either:
<ul>
<li>use a hosted service like <a href='http://progrium.com/localtunnel/'>localtunnel</a>, or</li>
<li>use <code>ssh -R</code> to connect to your own server accessible from the public internet. For example:
<pre>ssh -R 0.0.0.0:8765:localhost:80 [user]@[host]</pre>
<p>
This sets up port 8765 on <code>host</code> to forward to port 80 on your local development computer.
Then you can use <code>http://[host]:8765/</code> as the Server URL in EnvayaSMS, and it will be
forwarded to <code>http://localhost</code> on your development server.
</p>
<p>
Note: In order for SSH port forwarding to work, you will need to set <code>GatewayPorts yes</code> in the <code>/etc/sshd_config</code> file
on the public server.
</p>
</li>
</ul>
<h4 id='q_phones'>What phones are compatible with EnvayaSMS?</h4> <h4 id='q_phones'>What phones are compatible with EnvayaSMS?</h4>
<p> <p>

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a href='/install/'>Install</a> <a href='/install/'>Install</a>
&middot; &middot;
<a href='/test/'>Test</a>
&middot;
<a href='/how/'>How it Works</a> <a href='/how/'>How it Works</a>
&middot; &middot;
<a href='/serverapi/'>API Reference</a> <a href='/serverapi/'>API Reference</a>
@ -40,27 +42,25 @@
<h2>History</h2> <h2>History</h2>
Version 2.0-rc2 (2011/09/29) Version 2.0 (2011/10/01)
<ul> <ul>
<li> <li>
Automatic failover between Wi-Fi and mobile data connection if server is unreachable Automatic failover between Wi-Fi and mobile data connection if server is unreachable
(e.g. when Wi-Fi router is on, but it has no internet access) (e.g. when Wi-Fi router is on, but it has no internet access)
</li> </li>
<li>
User can see all pending messages, and retry/delete individual messages
</li>
<li> <li>
Send timestamp of incoming messages to server Send timestamp of incoming messages to server
</li> </li>
</ul>
Version 2.0-rc1 (2011/09/28)
<ul>
<li> <li>
Allow outgoing SMS messages to be sent in priority order Allow outgoing SMS messages to be sent in priority order
</li> </li>
<li> <li>
Reschedule outgoing messages when the Android outgoing SMS limit would be exceeded Reschedule outgoing messages when the Android outgoing SMS limit would be exceeded
</li> </li>
</ul> </ul>
Version 2.0-beta (2011/09/23) Version 2.0-beta (2011/09/23)

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a href='/install/'>Install</a> <a href='/install/'>Install</a>
&middot; &middot;
<a href='/test/'>Test</a>
&middot;
<a class='active' href='/how/'>How it Works</a> <a class='active' href='/how/'>How it Works</a>
&middot; &middot;
<a href='/serverapi/'>API Reference</a> <a href='/serverapi/'>API Reference</a>
@ -59,7 +61,7 @@ work over the phone's mobile data connection, but Wi-Fi is likely to be faster,
<p> <p>
Then your network would look like this: Then your network would look like this:
<br /> <br />
<img src='/media/topology.png' width='690' height='284' /> <img src='/media/topology.png' width='650' height='262' />
</p> </p>
<p> <p>

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a href='/install/'>Install</a> <a href='/install/'>Install</a>
&middot; &middot;
<a href='/test/'>Test</a>
&middot;
<a href='/how/'>How it Works</a> <a href='/how/'>How it Works</a>
&middot; &middot;
<a href='/serverapi/'>API Reference</a> <a href='/serverapi/'>API Reference</a>
@ -44,7 +46,8 @@
<img src='/media/screenshot-main.png' width='212' height='350' /> <img src='/media/screenshot-main.png' width='212' height='350' />
<br /> <br />
<img src='/media/screenshot-settings.png' width='212' height='350' /> <img src='/media/screenshot-settings.png' width='212' height='350' />
<br />
<img src='/media/screenshot-pending.png' width='212' height='350' />
</div> </div>
EnvayaSMS is a SMS and MMS gateway running entirely as an Android app. EnvayaSMS is a SMS and MMS gateway running entirely as an Android app.
@ -89,10 +92,14 @@ It works wherever the phone can receive SMS messages and access the Internet
</p> </p>
<p> <p>
In order to deploy EnvayaSMS, you will need a messaging plan for your phone, and the phone itself. In order to deploy EnvayaSMS, you will need a messaging plan for your phone, and the phone itself.
EnvayaSMS is compatible with many old or inexpensive Android phones, e.g. the LG GT540, currently $120 on Amazon.com. EnvayaSMS is compatible with many old or inexpensive Android phones, e.g. the LG GT540, currently $120 on Amazon.com.
</p> </p>
<p>
Before deploying EnvayaSMS, you can test EnvayaSMS without an Android phone
by installing EnvayaSMS on an emulated phone on your computer. <a href='/test/'>Learn more...</a>
</p>
<a href='/install/' class='button'> <a href='/install/' class='button' style='margin-left:110px;'>
Install EnvayaSMS Now Install EnvayaSMS Now
</a> </a>

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a class='active' href='/install/'>Install</a> <a class='active' href='/install/'>Install</a>
&middot; &middot;
<a href='/test/'>Test</a>
&middot;
<a href='/how/'>How it Works</a> <a href='/how/'>How it Works</a>
&middot; &middot;
<a href='/serverapi/'>API Reference</a> <a href='/serverapi/'>API Reference</a>
@ -39,21 +41,26 @@
<h2>Installing EnvayaSMS</h2> <h2>Installing EnvayaSMS</h2>
Before installing EnvayaSMS, ensure that you have the following prerequisites: In order to install and deploy EnvayaSMS, you will need the following prerequisites:
<ul> <ul>
<li>One or more Android phones (1.6 Donut or higher) that are <li>One or more Android phones (1.6 or higher),
registered on a mobile network. </li> registered on a mobile network
</li>
<li>A way for the phones to connect to the internet, either via Wi-Fi <li>A way for the phones to connect to the internet, either via Wi-Fi
or the mobile data service. <br /> or the mobile data service<br />
(Even if using Wi-Fi, mobile data (Even if using Wi-Fi, mobile data
service is necessary to receive MMS messages.) </li> service is necessary to receive MMS messages.) </li>
<li> A web server accessible from the public internet </li> <li>A web server accessible from the public internet</li>
</ul> </ul>
Using an Android phone, open <a href='https://market.android.com/details?id=org.envaya.sms'>EnvayaSMS on Android Market</a> by clicking the link from your phone's browser, or scanning the barcode with a QR code app. Then, follow the steps shown below to install EnvayaSMS on your phone.<br /> <p>
Note: If you don't have these prerequisites yet, you can <a href='/test/'>test EnvayaSMS on your computer</a>.
</p>
<div style='float:left;padding-right:10px;padding-top:30px'> To install EnvayaSMS on an Android phone, open EnvayaSMS on Android Market by clicking the link below from your phone's browser, or scanning the barcode with a QR code app.<br />
<div style='float:left;padding-right:10px;padding-top:20px'>
<div style='font-size:16px;font-weight:bold; text-align:center'> <div style='font-size:16px;font-weight:bold; text-align:center'>
<a href="https://market.android.com/details?id=org.envaya.sms">Open Android Market</a> <a href="https://market.android.com/details?id=org.envaya.sms">Open Android Market</a>
</div> </div>
@ -63,7 +70,7 @@ Using an Android phone, open <a href='https://market.android.com/details?id=org.
</div> </div>
<div style='float:left;padding-top:10px'> <div style='float:left;padding-top:10px'>
<img src='/media/screenshot-market.png' style='border:1px solid black' width='484' height='240' /> <img src='/media/screenshot-market.png' style='border:1px solid black' width='440' height='218' />
</div> </div>
<div style='clear:both;padding-top:10px'> <div style='clear:both;padding-top:10px'>
@ -118,6 +125,9 @@ After your server is configured, configure EnvayaSMS on your phone to connect to
<li><em>Recommended:</em> under Wi-Fi sleep policy, select "always stay connected". <li><em>Recommended:</em> under Wi-Fi sleep policy, select "always stay connected".
(Otherwise, EnvayaSMS will be unable to forward messages after the phone goes to sleep.) (Otherwise, EnvayaSMS will be unable to forward messages after the phone goes to sleep.)
</li> </li>
<li><em>Optional:</em> enable Network Failover so that the phone will automatically switch
to mobile data if the Wi-Fi network stops working.
</li>
<li>Check "Enable EnvayaSMS"</li> <li>Check "Enable EnvayaSMS"</li>
<li>Click the Back button to return to the main screen</li> <li>Click the Back button to return to the main screen</li>
</ol> </ol>
@ -131,8 +141,11 @@ then click "Test Connection".
<p> <p>
<strong>Important:</strong> After EnvayaSMS is enabled, it will forward all SMS messages regardless of whether the <strong>Important:</strong> After EnvayaSMS is enabled, it will forward all SMS messages regardless of whether the
EnvayaSMS app is open. If you want to use SMS normally again, return to EnvayaSMS' settings screen EnvayaSMS app is open. If you want to use SMS normally again, return to EnvayaSMS' settings screen
and uncheck "Enable EnvayaSMS". and uncheck "Enable EnvayaSMS".</p>
</p>
<p>If you're testing EnvayaSMS with an Android phone that you're also using for normal communication,
you can enable "Test mode" on the settings screen so that EnvayaSMS only handles SMS messages
from particular phone numbers.</p>
<h3 id='expansion'>Installing Expansion Packs</h3> <h3 id='expansion'>Installing Expansion Packs</h3>

BIN
media/avd.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 30 KiB

BIN
media/screenshot-pending.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 26 KiB

BIN
media/telnet.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -26,6 +26,8 @@
&middot; &middot;
<a href='/install/'>Install</a> <a href='/install/'>Install</a>
&middot; &middot;
<a href='/test/'>Test</a>
&middot;
<a href='/how/'>How it Works</a> <a href='/how/'>How it Works</a>
&middot; &middot;
<a class='active' href='/serverapi/'>API Reference</a> <a class='active' href='/serverapi/'>API Reference</a>
@ -70,12 +72,13 @@ HTTP Request Format
<pre> <pre>
POST /sg/app HTTP/1.1 POST /sg/app HTTP/1.1
X-Request-Signature: sAemG31uRllk/K9xck2WRNaF/WI= X-Request-Signature: sAemG31uRllk/K9xck2WRNaF/WI=
Content-Length: 96 Content-Length: 120
Content-Type: application/x-www-form-urlencoded Content-Type: application/x-www-form-urlencoded
Host: 192.168.70.1:3000 Host: 192.168.70.1:3000
Connection: Keep-Alive Connection: Keep-Alive
from=6505551234&message_type=sms&message=test&version=2&phone_number=16505551212&action=incoming from=6505551234&message_type=sms&message=test&version=2&phone_number=16505551212
&action=incoming&timestamp=1317506831000
</pre> </pre>
<p>An incoming MMS message with an <code>image/jpeg</code> part and a <code>text/plain</code> part with message 'Test':</p> <p>An incoming MMS message with an <code>image/jpeg</code> part and a <code>text/plain</code> part with message 'Test':</p>
@ -84,53 +87,61 @@ from=6505551234&message_type=sms&message=test&version=2&phone_number=16505551212
POST /sg/app HTTP/1.1 POST /sg/app HTTP/1.1
X-Request-Signature: OgpiQet9guVhEp+0klrONR8qGNs= X-Request-Signature: OgpiQet9guVhEp+0klrONR8qGNs=
Content-Length: 13087 Content-Length: 13087
Content-Type: multipart/form-data; boundary=i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO Content-Type: multipart/form-data; boundary=i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Host: 192.168.70.1:3000 Host: 192.168.70.1:3000
Connection: Keep-Alive Connection: Keep-Alive
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="from" Content-Disposition: form-data; name="from"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
+16505551234 +16505551234
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="timestamp"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1317506831000
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="message" Content-Disposition: form-data; name="message"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
Test Test
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="message_type" Content-Disposition: form-data; name="message_type"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
mms mms
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="mms_parts" Content-Disposition: form-data; name="mms_parts"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
[{"type":"application/smil","filename":"01smil","cid":"<0000>","name":"part0"},{"type":"text/plain","filename":"Text01.txt","cid":"<569>","name":"part1"},{"type":"image/jpeg","filename":"Image0001.jpg","cid":"<570>","name":"part2"}] [{"type":"application/smil","filename":"01smil","cid":"<0000>","name":"part0"},
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO {"type":"text/plain","filename":"Text01.txt","cid":"<569>","name":"part1"},
{"type":"image/jpeg","filename":"Image0001.jpg","cid":"<570>","name":"part2"}]
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="version" Content-Disposition: form-data; name="version"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
3 3
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="phone_number" Content-Disposition: form-data; name="phone_number"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
16505551212 16505551212
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="action" Content-Disposition: form-data; name="action"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
incoming incoming
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="part0"; filename="01smil" Content-Disposition: form-data; name="part0"; filename="01smil"
Content-Type: application/smil; charset=UTF-8 Content-Type: application/smil; charset=UTF-8
Content-Transfer-Encoding: binary Content-Transfer-Encoding: binary
@ -151,19 +162,19 @@ Content-Transfer-Encoding: binary
&lt;/body&gt; &lt;/body&gt;
&lt;/smil&gt; &lt;/smil&gt;
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="part1"; filename="Text01.txt" Content-Disposition: form-data; name="part1"; filename="Text01.txt"
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: binary Content-Transfer-Encoding: binary
Test Test
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG
Content-Disposition: form-data; name="part2"; filename="Image0001.jpg" Content-Disposition: form-data; name="part2"; filename="Image0001.jpg"
Content-Type: image/jpeg Content-Type: image/jpeg
Content-Transfer-Encoding: binary Content-Transfer-Encoding: binary
<em>BINARY IMAGE DATA</em> <em>BINARY IMAGE DATA</em>
--i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RGB6_wkjO-- --i66xAht5IMn1Tfk7tL9DgY8ZHZxq0d0RG--
</pre> </pre>
<p>Checking for outgoing SMS messages:</p> <p>Checking for outgoing SMS messages:</p>

View File

@ -55,7 +55,7 @@ dd
#container { #container {
margin: 0 auto; margin: 0 auto;
width: 700px; width: 650px;
} }
h1 { margin-top:0; font-size: 42px; color: #6b9412; margin-bottom: 3px; } h1 { margin-top:0; font-size: 42px; color: #6b9412; margin-bottom: 3px; }
h1 .small { font-size: 20px; color:#666; } h1 .small { font-size: 20px; color:#666; }
@ -74,7 +74,7 @@ hr { border: 0; width: 80%; border-bottom: 1px solid #aaa}
.button .button
{ {
text-decoration:none; text-decoration:none;
display:block;margin:0 auto;width:200px;background:#6b9412;color:white;padding:8px;font-weight:bold;text-align:center; display:block;width:200px;background:#6b9412;color:white;padding:8px;font-weight:bold;text-align:center;
} }
a.button:hover a.button:hover
@ -87,7 +87,7 @@ img
border:0px; border:0px;
} }
.faq_links li li
{ {
padding-bottom:5px; padding-bottom:5px;
} }

110
test/index.html Executable file
View File

@ -0,0 +1,110 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv="cache-control" content="no-cache, must-revalidate" >
<title>EnvayaSMS: Testing EnvayaSMS</title>
<link rel='stylesheet' type='text/css' href='/styles/site.css' />
</head>
<body>
<a href="http://github.com/youngj/EnvayaSMS"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
<div id="container">
<a style='float:left' href="/"><img src='/media/icon.png' height='72' width='72' style='margin-right:10px' /></a>
<h1 style='padding-top:13px'><a href="/">EnvayaSMS</a>
<span class="small">
SMS gateway for Android
</span>
</h1>
<div class='menu' style='clear:both;padding-top:5px'>
<a href='/'>Home</a>
&middot;
<a href='/install/'>Install</a>
&middot;
<a class='active' href='/test/'>Test</a>
&middot;
<a href='/how/'>How it Works</a>
&middot;
<a href='/serverapi/'>API Reference</a>
&middot;
<a href='/faq/'>FAQ</a>
&middot;
<a href='/history/'>History</a>
&middot;
<a href='/community/'>Community</a>
</div>
<h2>Testing EnvayaSMS</h2>
<p>
<img src='/media/avd.png' width='242' height='227' style='float:right;padding-left:10px;' />
If you don't yet have an Android phone, you can test EnvayaSMS in an emulated phone on your computer.
</p>
<p>
With this method, you can test EnvayaSMS for free
and figure out if EnvayaSMS will work for your project
without needing to get an actual phone or subscribe to mobile service.
</p>
<p>
The following steps explain how to set up EnvayaSMS on an Android Virtual Device:
</p>
<ol>
<li>Install the <a href='http://developer.android.com/sdk/'>Android SDK</a> on your computer (where you are running a "dev" copy of your website)</li>
<li>Create a new Android Virtual Device with a target of Android 1.6 or higher. Specify a size for the SD card (necessary to download EnvayaSMS via the browser)</li>
<li>Start the virtual device</li>
<li>Open the Browser app and go to <a href='/install/'>sms.envaya.org/install</a></li>
<li>Click on the EnvayaSMS-release.apk link to download EnvayaSMS.<br />
<small>Note: Android Market does not work in the emulator.</small></li>
<li>Install EnvayaSMS</li>
<li>Configure EnvayaSMS with the settings of your development server. <br />
<small>Note: Do not enter <code>localhost</code> as the Server URL (since this would refer to the AVD itself). Instead, use your computer's IP address on the local network, as shown by the <code>ipconfig</code>
or <code>ifconfig</code> utilities.</small>
</li>
<li>
<img src='/media/telnet.png' width='216' height='85' style='float:right' />
To simulate incoming SMS on the emulator:
<ul>
<li>using telnet from your host computer, connect to <code>localhost:5554</code><br />
<small>Note: on Windows, you can install <a href='http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html'>puttytel</a>.</small>
</li>
<li>type <code>sms send [phonenumber] [text message]</code> to send messages to the emulator.<br/>
<small>Note: the emulator cannot receive MMS messages.</small>
</li>
</ul>
</li>
</ol>
<p>
Of course, you can also test EnvayaSMS by connecting a real Android phone to your development web server.
For more information, see the <a href='/faq/#q_tunnel'>FAQ</a>.
</p>
<div class="footer">
get the source code on GitHub : <a href="http://github.com/youngj/EnvayaSMS">youngj/EnvayaSMS</a>
</div>
</div>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-25868450-2']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</body>
</html>