Giter Site home page Giter Site logo

wiflyhq's Introduction

A library for the Roving Networks WiFly RN-XV.

The library provides functions for setting up and managing the WiFly module, sending UDP packets, opening TCP connections and sending and receiving data over the TCP connection.

Doxygen documentation for WiFlyHQ

Examples

Example code to setup and use the hardware serial interface:

Serial.begin(9600);
wifly.begin(&Serial, NULL);

Setup and use a software serial interface:

#include <SoftwareSerial.h>
SoftwareSerial wifiSerial(8,9);

wifiSerial.begin(9600);
wifly.begin(&wifiSerial);

Join a WiFi network:

wifly.setSSID("mySSID");
wifly.setPassphrase("myWPApassword");
wifly.enableDHCP();
wifly.join();

Create an Ad Hoc WiFi network on channel 10:

wifly.createAdhocNetwork("myssid", 10);

Send a UDP packet:

wifly.setIpProtocol(WIFLY_PROTOCOL_UDP);
wifly.sendto("Hello, world", "192.168.1.100", 2042);

Open a TCP connection and send some data, and close the connection:

wifly.setIpProtocol(WIFLY_PROTOCOL_TCP);
wifly.open("192.168.1.100",8042);
wifly.println("Hello, world!");
wifly.close();

Receive UDP or TCP data (assumes software serial interface):

if (wifly.available() > 0) {
    Serial.write(wifly.read());
}

Easy handling of multiple receive options with multiMatch_P():

    if (wifly.available() > 0) {
    int match = wifly.multiMatch_P(100, 3,
		    F("button"), F("slider="), F("switch="));
    switch (match) {
    case 0: /* button */
	Serial.print(F("button: pressed"));
	break;
    case 1: /* slider */
	int slider = wifly.parseInt();
	Serial.print(F("slider: "));
	Serial.println(slider);
	break;
    case 2: /* switch */
	char ch = wifly.read();
	Serial.print(F("switch: "));
	Serial.println(ch);
	break;
    default: /* timeout */
	break;
    }
}

Known Issues

Limitations with WiFly RN-XV rev 2.32 firmware

  1. Cannot determine the IP address of the TCP client that has connected.
  2. Changing the local port does not take effect until after a save and reboot.
  3. Closing a TCP connection may not work. Client may stay connected and send additional data. Packet analysis shows that no FIN is sent by the WiFly, but it still sends the CLOS message back to the arduino.
  4. Only supports one TCP connection at a time, which means its easy for a web browser to lock out other users.
  5. Changing the flush timeout (set comm time x) does not take affect until after a save and reboot.

To do

  1. Add FTP support.

wiflyhq's People

Contributors

chrwei avatar harlequin-tech avatar ivankravets avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wiflyhq's Issues

Multiple Access

I have read the documentation, and I know that is allowed only one access at a time using the library, but when I make a request via the web browser the time for another client to perform access to RN-VX is 5 minutes, however I'm using an app developed for Android, and when I make the request via the app time to access new never expires why?
Using an app via Android is only possible to perform a new customer if I restart the Arduino.
I need help.
Thank you.

Failed to get prompt

I'm using RN-XV (Rev 3) with Arduino Uno (R3). Everytime I want to connect to any website I get this message "Failed to get prompt". Any help would be appreciated.

Free memory: 1167
getCon: TCP disconnected
Already joined network
MAC: xxx
IP: 192.168.0.8
Netmask: 255.255.255.0
Gateway: 192.168.0.1
DeviceID: Wifly-WebClient
open http://google.com 80
Failed to get prompt
WiFly has crashed and will reboot...

Problem pulling down webpage via GET

In the httpclient example I'm connecting to to my AP just fine and it's connecting to the web server fine however when it sends the get command it's getting back a 404.

Only code changes to the httpclient example were the SSID, passphrase, site name, and GET command as follows:

const char site[] = "rss.aviatorjoe.net";

wifly.println("GET /2/KQWM.rss HTTP/1.0");

Important part of the serial output follows:

404 Not Found

The server can not find the requested page:

95.154.244.83/2/KQWM.rss (port 80)

Please forward this error screen to 95.154.244.83's 

<a href="mailto:[email protected]?subject=Error message [404] 404 Not Found for 95.154.244.83/2/KQWM.rss port 80 on Wednesday, 11-Apr-2012 17:43:10 BST">

WebMaster</a>.


So it looks like it's pulling down the IP address for the DNS name and using that IP address to try to connect directly to the site however for sites that use redirects like this I don't think it's working well. I have no issues parsing this XML data using the WiFlySerial.h or WiFly.h libraries so I know it's not the website itself. Perhaps the solution is to be found in comparing your library to WiFlySerial?
Or maybe it's an issue with the RN-XV not being in HTTP client mode when it's trying to pull this down?

Compile Errors with webclient example on Raspberry / Alamode

Hello I am getting compile errors when try and run the examples on Raspberry PI / Alamode. I have searched around for a solution, but still have not found a fix that works so I thought I would post here to see if others have run into this issue. I am using RN-XU wifly rev. 3 on a seeedstudio bees shield.

http://baldwisdom.com/category/raspberry-pi/alamode/

The sample I am compiling is (no changes):
/home/pi/WiFlyHQ-master/examples/httpclient

Here are the errors:

In file included from httpclient.cpp:12:0:
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:325:27: error: prog_char does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:325:38: error: ISO C++ forbids declaration of str with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:326:31: error: prog_char does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:326:46: error: ISO C++ forbids declaration of str with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:328:23: error: prog_char does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:328:34: error: ISO C++ forbids declaration of str with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:342:26: error: prog_char does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:342:37: error: ISO C++ forbids declaration of cmd with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:343:26: error: prog_char does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:343:37: error: ISO C++ forbids declaration of opt with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:346:31: error: prog_char does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:346:42: error: ISO C++ forbids declaration of str with no type [-fpermissive]

Here are the errors I am getting when I compile
/home/pi/downloads/WiFlyHQ-master/examples/httpclient_progmem

In file included from httpclient_progmem.cpp:24:0:
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:328:27: error: ‘prog_char’ does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:328:38: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:329:31: error: ‘prog_char’ does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:329:46: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:331:23: error: ‘prog_char’ does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:331:34: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:345:26: error: ‘prog_char’ does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:345:37: error: ISO C++ forbids declaration of ‘cmd’ with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:346:26: error: ‘prog_char’ does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:346:37: error: ISO C++ forbids declaration of ‘opt’ with no type [-fpermissive]
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:349:31: error: ‘prog_char’ does not name a type
/usr/share/arduino/libraries/WiFlyHQ/WiFlyHQ.h:349:42: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
httpclient_progmem.cpp:31:20: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:31:31: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
httpclient_progmem.cpp:32:22: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:32:33: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
httpclient_progmem.cpp:49:20: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:49:31: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
httpclient_progmem.cpp:50:22: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:50:33: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
httpclient_progmem.cpp: In function ‘void setup()’:
httpclient_progmem.cpp:57:15: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:57:15: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:58:13: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:58:13: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:63:19: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:63:19: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:70:12: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:70:12: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:76:16: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:76:16: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:78:16: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:78:16: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:82:19: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:82:19: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:87:13: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:87:13: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:89:13: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:89:13: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:91:13: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:91:13: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:93:13: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:93:13: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:95:13: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:95:13: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:99:13: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:99:13: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:103:19: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:103:19: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:108:17: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:108:17: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp:115:19: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:115:19: error: ‘__c’ was not declared in this scope
httpclient_progmem.cpp: At global scope:
httpclient_progmem.cpp:151:20: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:151:31: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]
httpclient_progmem.cpp:159:22: error: ‘prog_char’ does not name a type
httpclient_progmem.cpp:159:33: error: ISO C++ forbids declaration of ‘str’ with no type [-fpermissive]

Any help would be greatly appreciated.

Problem when wifi power off or down

when i use isAssociated and my wifi goes down or it´s powers off this function still says the net is conected.

Sugestion:
Includes in function WiFly::isAssociated the function getConnection(); before return

WebSocket Example Not Working

Already joined network
open echo.websocket.org 80
connect: handshake failed
close: failed, no CLOS
Failed to connect to echo.websocket.org
Terminal ready

OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN__CLOS__OPEN

I know its establishing the connection since I've monitored the TCP and tried it with my own server, but the handshake seems to fail... The only change I made to the example is swapping Serial and wifiSerial (along with all the println stuff)

stability issues

I have a sketch based mostly off the httpclient running on Fio that sends data from 2 sensors via a HTTP GET every 2.5 minutes. it would lock up after a few minutes, and after many changes that seemed needed and only getting it to a few hours I got a Leonardo and enabled full debug. this allowed me to make more changes and actually fix it, it ran all weekend.

in short, issue is fixed, but I've made way more changes than are actually required to fix it. main changes include:

  • normalized formatting (indents were 4 spaces, 3 spaces, tabs, and none at all)
  • fixed some "\n\r" line endings to "\r\n"
  • updated to support Arduino 1.5+ (namely, change the PSTR stuff and const datatypes for the newer avrgcc)
  • changed the code that handles a wifly lockup+reboot to return false and let the sketch decide what to do
  • changed close() to look for "CLOS*" before flushing, this cleanly handles cases where the server closes the connection, as HTTP 1.0 does
  • replaced at least one hard coded timeout
  • removed some doubled up code
  • other stuff I don't remember

My branch is https://github.com/chrwei/WiFlyHQ/tree/massive. should I do pull request for the whole thing, or would you rather I break this up?

updating the firmware sketch

Hello,

I am running crashing issues on the rn-xv that has 2.32 version of the firmware installed. I have been trying to find away to easily upgrade to version 2.38 and version 4.0 to see if these resolve the crashing issues. I noticed in ftp.cpp a function to restore that includes downloading ftping in downloading. but there is not an example that uses the ftp functionality. Has anyone create a .ino script to do this that I can leverage?

Failed to get prompt after some successful messages

Hi, I am using Seeedstudio Stalker V2.1 and RN-XV rev3.
I am sending data to a server (ubidots.com) and after some successful messages sent I get "Failed to get prompt" and "WiFly has crashed and will reboot..."

Successful message

Sleeping
Interruption
Awake from sleep
Free RAM Memory=433
2014/8/7 17:23:0 Thu 26.75ºC, Battery Voltage -> 3.82V ,Charge status --> On
Trying to send data: 3.82V
open things.ubidots.com 80
Connected to 539eec807625422e808b2a92
close: got CLOS
open things.ubidots.com 80
Connected to 539eebc27625422e1a16dfd3
close: got CLOS

Error message

Sleeping
Interruption
Awake from sleep
Free RAM Memory=433
2014/8/7 17:24:0 Thu 26.75ºC, Battery Voltage -> 3.82V ,Charge status --> On
Trying to send data: 3.82V
open things.ubidots.com 80
Failed to get prompt
WiFly has crashed and will reboot...

Any suggestion?

#problems to connect with portable hotspot (Android) or personal hotspot (Iphone)

I´ve been trying hard (i guess) to connect my RN-XV (2.32) shield with wireless hotspot from smartphone (Iphone or Android). I want to send post/get through this way.
Otherwise, to any other wifi router its works fine.

I received IP, netmask, gateway...What´s going on?
I would really appreciate some help.

Here we have the serial monitor output, testing a httplclient sample code (WiflyHQ):
///////////////////
Starting
Free memory: 1075
Joining network
Joined wifi network
MAC: 00:06:66:80:35:50
IP: 192.168.43.245
Netmask: 255.255.255.0
Gateway: 192.168.43.1
DeviceID: Wifly-WebClient
open hunt.net.nz 80
Failed to get prompt
WiFly has crashed and will reboot...
///////////////////

And now, a debug output:
///////////////////
Starting
Free memory: 1069
send_P: $$$
match_P: CMD

0: 43 C
1: 4D M
2: 44 D
3: D
4: A
match_P: true

setPrompt

5: D
6: D
7: A
8: 3C <
9: 32 2
10: 2E .
11: 33 3
12: 32 2
13: 3E >
14: 20
setPrompt: <2.32>

gets:
readTimeout - timed out
Already in command mode

send_P: set u m 1
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

15: 73 s
16: FFFFFFD1
17: FFFFFFFF
18: FFFFFF81
19: FFFFFFFE
20: FFFFFF81
21: FFFFFFFE
22: 35 5
23: FFFFFFD6
24: 4C L
25: 58 X
26: FFFFFFB4
27: FFFFFFDA
28: FFFFFFB4
29: FFFFFFC3
30: FFFFFF85
31: 3C <
32: 32 2
33: 2E .
34: 33 3
35: 32 2
36: 3E >
37: 20
38: D
39: A
readTimeout - timed out
multiMatch_P: failed
timeout
getPrompt "<2.32> "

match: <2.32>
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

40: 45 E
41: 58 X
42: 49 I
43: 54 T
44: D
45: A
match_P: true

Failed to turn off echo
send_P: $$$
match_P: CMD

46: 43 C
47: 4D M
48: 44 D
49: D
50: A
match_P: true

send_P: set sys printlvl 0
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

51: 41 A
52: 4F O
53: 4B K
54: D
55: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
56: 3C <
57: 32 2
58: 2E .
59: 33 3
60: 32 2
61: 3E >
62: 20
match: true

send_P: exit

match_P: EXIT

63: D
64: A
65: 45 E
66: 58 X
67: 49 I
68: 54 T
69: D
70: A
match_P: true

send_P: $$$
match_P: CMD

71: 43 C
72: 4D M
73: 44 D
74: D
75: A
match_P: true

send_P: set comm remote 0
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

76: 41 A
77: 4F O
78: 4B K
79: D
80: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
81: 3C <
82: 32 2
83: 2E .
84: 33 3
85: 32 2
86: 3E >
87: 20
match: true

send_P: exit

match_P: EXIT

88: D
89: A
90: 45 E
91: 58 X
92: 49 I
93: 54 T
94: D
95: A
match_P: true

send_P: $$$
match_P: CMD

96: 43 C
97: 4D M
98: 44 D
99: D
100: A
match_P: true

getCon

show c

send_P: show c

gets:
101: 38 8
102: 30 0
103: 30 0
104: 33 3
105: D
106: A
getPrompt "<2.32> "

match: <2.32>
107: 3C <
108: 32 2
109: 2E .
110: 33 3
111: 32 2
112: 3E >
113: 20
match: true

send_P: exit

match_P: EXIT

114: D
115: A
116: 45 E
117: 58 X
118: 49 I
119: 54 T
120: D
121: A
match_P: true

getCon: TCP disconnected
tcp status: 3

assoc status: 0

authen status: 0

dns status: 0

dns found status: 0

channel status: 0

send_P: $$$
match_P: CMD

122: 43 C
123: 4D M
124: 44 D
125: D
126: A
match_P: true

send_P: get ip

match_P: DHCP=
127: 49 I
128: 46 F
129: 3D =
130: 44 D
131: 4F O
132: 57 W
133: 4E N
134: D
135: A
136: 44 D
137: 48 H
138: 43 C
139: 50 P
140: 3D =
match_P: true

gets:
141: 4F O
142: 4E N
143: D
144: A
getPrompt "<2.32> "

match: <2.32>
145: 49 I
146: 50 P
147: 3D =
148: 30 0
149: 2E .
150: 30 0
151: 2E .
152: 30 0
153: 2E .
154: 30 0
155: 3A :
156: 32 2
157: 30 0
158: 30 0
159: 30 0
160: D
161: A
162: 4E N
163: 4D M
164: 3D =
165: 32 2
166: 35 5
167: 35 5
168: 2E .
169: 32 2
170: 35 5
171: 35 5
172: 2E .
173: 32 2
174: 35 5
175: 35 5
176: 2E .
177: 30 0
178: D
179: A
180: 47 G
181: 57 W
182: 3D =
183: 30 0
184: 2E .
185: 30 0
186: 2E .
187: 30 0
188: 2E .
189: 30 0
190: D
191: A
192: 48 H
193: 4F O
194: 53 S
195: 54 T
196: 3D =
197: 30 0
198: 2E .
199: 30 0
200: 2E .
201: 30 0
202: 2E .
203: 30 0
204: 3A :
205: 32 2
206: 30 0
207: 30 0
208: 30 0
209: 50 P
210: 54 T
211: 43 C
212: A
213: 55 U
214: 32 2
215: 46 F
216: 47 G
217: 78 x
218: 54 T
219: 4D M
220: 3D =
221: D
222: 41 A
223: 50 P
224: 2E .
225: 30 0
226: D
227: 2E .
228: 3E >
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

229: 45 E
230: 58 X
231: 49 I
232: 54 T
233: D
234: A
match_P: true

send_P: $$$
match_P: CMD

235: 43 C
236: 4D M
237: 44 D
238: D
239: A
match_P: true

send_P: get opt

match_P: Replace=
240: 4A J
241: 6F o
242: 69 i
243: 6E n
244: 54 T
245: 6D m
246: 72 r
247: 3D =
248: 31 1
249: 30 0
250: 30 0
251: 30 0
252: D
253: A
254: 52 R
255: 65 e
256: 70 p
257: 6C l
258: 61 a
259: 63 c
260: 65 e
261: 3D =
match_P: true

gets:
262: 30 0
263: 78 x
264: 32 2
265: 34 4
266: D
267: A
getPrompt "<2.32> "

match: <2.32>
268: 44 D
269: 65 e
270: 76 v
271: 69 i
272: 63 c
273: 65 e
274: 49 I
275: 64 d
276: 3D =
277: 57 W
278: 69 i
279: 46 F
280: 6C l
281: 79 y
282: 2D -
283: 45 E
284: 5A Z
285: 58 X
286: D
287: A
288: 50 P
289: 61 a
290: 73 s
291: 73 s
292: 77 w
293: 6F o
294: 72 r
295: 64 d
296: 3D =
297: D
298: A
299: 46 F
300: 6F o
301: 72 r
302: 6D m
303: 61 a
304: 74 t
305: 3D =
306: 30 0
307: 78 x
308: 30 0
309: D
310: A
311: 53 S
312: 69 i
313: 67 g
314: 6E n
315: 61 a
316: 6C l
317: 3D =
318: 30 0
319: D
320: A
321: 41 A
322: 76 v
323: 65 e
324: 72 r
325: 61 a
326: 65 e
327: A
328: 33 3
329: 20
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

330: 45 E
331: 58 X
332: 49 I
333: 54 T
334: D
335: A
match_P: true

Joining network
send_P: $$$
match_P: CMD

336: 43 C
337: 4D M
338: 44 D
339: D
340: A
match_P: true

send_P: set wlan ssid
send: AndroidAPbonf

getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

341: 41 A
342: 4F O
343: 4B K
344: D
345: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
346: 3C <
347: 32 2
348: 2E .
349: 33 3
350: 32 2
351: 3E >
352: 20
match: true

send_P: exit

match_P: EXIT

353: D
354: A
355: 45 E
356: 58 X
357: 49 I
358: 54 T
359: D
360: A
match_P: true

send_P: $$$
match_P: CMD

361: 43 C
362: 4D M
363: 44 D
364: D
365: A
match_P: true

send_P: set wlan phrase
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

366: 41 A
367: 4F O
368: 4B K
369: D
370: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
371: 3C <
372: 32 2
373: 2E .
374: 33 3
375: 32 2
376: 3E >
377: 20
match: true

send_P: exit

match_P: EXIT

378: D
379: A
380: 45 E
381: 58 X
382: 49 I
383: 54 T
384: D
385: A
match_P: true

send_P: $$$
match_P: CMD

386: 43 C
387: 4D M
388: 44 D
389: D
390: A
match_P: true

send_P: set wlan hide 1
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

391: 41 A
392: 4F O
393: 4B K
394: D
395: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
396: 3C <
397: 32 2
398: 2E .
399: 33 3
400: 32 2
401: 3E >
402: 20
match: true

send_P: exit

match_P: EXIT

403: D
404: A
405: 45 E
406: 58 X
407: 49 I
408: 54 T
409: D
410: A
match_P: true

send_P: $$$
match_P: CMD

411: 43 C
412: 4D M
413: 44 D
414: D
415: A
match_P: true

send_P: set ip dhcp
send: 1

getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

416: 41 A
417: 4F O
418: 4B K
419: D
420: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
421: 3C <
422: 32 2
423: 2E .
424: 33 3
425: 32 2
426: 3E >
427: 20
match: true

send_P: exit

match_P: EXIT

428: D
429: A
430: 45 E
431: 58 X
432: 49 I
433: 54 T
434: D
435: A
match_P: true

send_P: $$$
match_P: CMD

436: 43 C
437: 4D M
438: 44 D
439: D
440: A
match_P: true

send_P: get wlan

match_P: SSID=
441: 53 S
442: 53 S
443: 49 I
444: 44 D
445: 3D =
match_P: true

gets:
446: 41 A
447: 6E n
448: 64 d
449: 72 r
450: 6F o
451: 69 i
452: 64 d
453: 41 A
454: 50 P
455: 62 b
456: 6F o
457: 6E n
458: 66 f
459: D
460: A
getPrompt "<2.32> "

match: <2.32>
461: 43 C
462: 68 h
463: 61 a
464: 6E n
465: 3D =
466: 30 0
467: D
468: A
469: 45 E
470: 78 x
471: 74 t
472: 41 A
473: 6E n
474: 74 t
475: 3D =
476: 30 0
477: D
478: A
479: 4A J
480: 6F o
481: 69 i
482: 6E n
483: 3D =
484: 31 1
485: D
486: A
487: 41 A
488: 75 u
489: 74 t
490: 68 h
491: 3D =
492: 4F O
493: 50 P
494: 45 E
495: 4E N
496: D
497: A
498: 4D M
499: 61 a
500: 73 s
501: 6B k
502: 3D =
503: 30 0
504: 78 x
505: 31 1
506: 66 f
507: 66 f
508: 66 f
509: D
510: A
511: 52 R
512: 61 a
513: 74 t
514: 65 e
515: 3D =
516: 31 1
517: 32 2
518: 2C ,
519: 20
520: 32 2
521: 34 4
522: 20
523: 4D M
524: 69 i
525: 6D m
526: 30 0
527: 61 a
528: 70 p
529: 73 s
530: 2A *
531: 2A *
532: D
533: 50 P
534: 65 e
535: D
536: 2E .
537: 3E >
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

538: 45 E
539: 58 X
540: 49 I
541: 54 T
542: D
543: A
match_P: true

send_P: $$$
match_P: CMD

544: 43 C
545: 4D M
546: 44 D
547: D
548: A
match_P: true

send_P: join
send: AndroidAPbonf

send_P:

multiMatch_P: 0 FAILED
multiMatch_P: 1 Associated!
549: 44 D
550: 65 e
551: 41 A
552: 75 u
553: 74 t
554: 68 h
555: D
556: A
557: 41 A
558: 75 u
559: 74 t
560: 6F o
561: 2D -
562: 41 A
563: 73 s
564: 73 s
565: 6F o
566: 63 c
567: 20
568: 41 A
569: 6E n
570: 64 d
571: 72 r
572: 6F o
573: 69 i
574: 64 d
575: 41 A
576: 50 P
577: 62 b
578: 6F o
579: 6E n
580: 66 f
581: 20
582: 63 c
583: 68 h
584: 61 a
585: 6E n
586: 3D =
587: 39 9
588: 20
589: 6D m
590: 6F o
591: 64 d
592: 65 e
593: 3D =
594: 57 W
595: 50 P
596: 41 A
597: 32 2
598: 20
599: 53 S
600: 43 C
601: 41 A
602: 4E N
603: 20
604: 4F O
605: 4B K
606: D
607: A
608: 4A J
609: 6F o
610: 69 i
611: 6E n
612: 69 i
613: 6E n
614: 67 g
615: 20
616: 41 A
617: 6E n
618: 64 d
619: 72 r
620: 6F o
621: 69 i
622: 64 d
623: 41 A
624: 50 P
625: 62 b
626: 6F o
627: 6E n
628: 66 f
629: 20
630: 6E n
631: 6F o
632: 77 w
633: 2E .
634: 2E .
635: D
636: A
637: 3C <
638: 32 2
639: 2E .
640: 33 3
641: 32 2
642: 3E >
643: 20
644: D
645: A
646: 41 A
647: 73 s
648: 73 s
649: 6F o
650: 63 c
651: 69 i
652: 61 a
653: 74 t
654: 65 e
655: 64 d
656: 21 !
multiMatch_P: true
flush

657: D
658: A
659: 44 D
660: 48 H
661: 43 C
662: 50 P
663: 3A :
664: 20
665: 53 S
666: 74 t
667: 61 a
668: 72 r
669: 74 t
670: D
671: A
readTimeout - timed out
flushed

match_P: GW=
672: 44 D
673: 48 H
674: 43 C
675: 50 P
676: 20
677: 69 i
678: 6E n
679: 20
680: 32 2
681: 33 3
682: 38 8
683: 35 5
684: 6D m
685: 73 s
686: 2C ,
687: 20
688: 6C l
689: 65 e
690: 61 a
691: 73 s
692: 65 e
693: 3D =
694: 37 7
695: 32 2
696: 30 0
697: 30 0
698: 73 s
699: D
700: A
701: 49 I
702: 46 F
703: 3D =
704: 55 U
705: 50 P
706: D
707: A
708: 44 D
709: 48 H
710: 43 C
711: 50 P
712: 3D =
713: 4F O
714: 4E N
715: D
716: A
717: 49 I
718: 50 P
719: 3D =
720: 31 1
721: 39 9
722: 32 2
723: 2E .
724: 31 1
725: 36 6
726: 38 8
727: 2E .
728: 34 4
729: 33 3
730: 2E .
731: 32 2
732: 34 4
733: 35 5
734: 3A :
735: 32 2
736: 30 0
737: 30 0
738: 30 0
739: D
740: A
741: 4E N
742: 4D M
743: 3D =
744: 32 2
745: 35 5
746: 35 5
747: 2E .
748: 32 2
749: 35 5
750: 35 5
751: 2E .
752: 32 2
753: 35 5
754: 35 5
755: 2E .
756: 30 0
757: D
758: A
759: 47 G
760: 31 1
761: 2E .
762: 2E .
763: 2E .
764: A
readTimeout - timed out
match_P: false

flush

readTimeout - timed out
flushed

gets:
readTimeout - timed out
send_P: exit

match_P: EXIT

765: 45 E
766: 58 X
767: 49 I
768: 54 T
769: D
770: A
match_P: true

Joined wifi network
MAC: send_P: $$$
match_P: CMD

771: 43 C
772: 4D M
773: 44 D
774: D
775: A
match_P: true

send_P: get mac

match_P: Mac Addr=
776: 4D M
777: 61 a
778: 63 c
779: 20
780: 41 A
781: 64 d
782: 64 d
783: 72 r
784: 3D =
match_P: true

gets:
785: 30 0
786: 30 0
787: 3A :
788: 30 0
789: 36 6
790: 3A :
791: 36 6
792: 36 6
793: 3A :
794: 38 8
795: 30 0
796: 3A :
797: 33 3
798: 35 5
799: 3A :
800: 35 5
801: 30 0
802: D
803: A
getPrompt "<2.32> "

match: <2.32>
804: 3C <
805: 32 2
806: 2E .
807: 33 3
808: 32 2
809: 3E >
810: 20
match: true

send_P: exit

match_P: EXIT

811: D
812: A
813: 45 E
814: 58 X
815: 49 I
816: 54 T
817: D
818: A
match_P: true

00:06:66:80:35:50
IP: send_P: $$$
match_P: CMD

819: 43 C
820: 4D M
821: 44 D
822: D
823: A
match_P: true

send_P: get ip

match_P: IP=
824: 49 I
825: 46 F
826: 3D =
827: 55 U
828: 50 P
829: D
830: A
831: 44 D
832: 48 H
833: 43 C
834: 50 P
835: 3D =
836: 4F O
837: 4E N
838: D
839: A
840: 49 I
841: 50 P
842: 3D =
match_P: true

gets:
843: 31 1
844: 39 9
845: 32 2
846: 2E .
847: 31 1
848: 36 6
849: 38 8
850: 2E .
851: 34 4
852: 33 3
853: 2E .
854: 32 2
855: 34 4
856: 35 5
857: 3A :
858: 32 2
859: 30 0
860: 30 0
861: 30 0
862: D
863: A
getPrompt "<2.32> "

match: <2.32>
864: 4E N
865: 4D M
866: 3D =
867: 32 2
868: 35 5
869: 35 5
870: 2E .
871: 32 2
872: 35 5
873: 35 5
874: 2E .
875: 32 2
876: 35 5
877: 35 5
878: 2E .
879: 30 0
880: D
881: A
882: 47 G
883: 57 W
884: 3D =
885: 31 1
886: 39 9
887: 32 2
888: 2E .
889: 31 1
890: 36 6
891: 38 8
892: 2E .
893: 34 4
894: 33 3
895: 2E .
896: 31 1
897: D
898: A
899: 48 H
900: 4F O
901: 53 S
902: 54 T
903: 3D =
904: 30 0
905: 2E .
906: 30 0
907: 2E .
908: 30 0
909: 2E .
910: 30 0
911: 30 0
912: A
913: 54 T
914: 54 T
915: D
916: 55 U
917: 35 5
918: A
919: 47 G
920: 30 0
921: A
922: 4D M
923: 45 E
924: 30 0
925: 41 A
926: 4B K
927: 2E .
928: 20
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

929: 45 E
930: 58 X
931: 49 I
932: 54 T
933: D
934: A
match_P: true

192.168.43.245
Netmask: send_P: $$$
match_P: CMD

935: 43 C
936: 4D M
937: 44 D
938: D
939: A
match_P: true

send_P: get ip

match_P: NM=
940: 49 I
941: 46 F
942: 3D =
943: 55 U
944: 50 P
945: D
946: A
947: 44 D
948: 48 H
949: 43 C
950: 50 P
951: 3D =
952: 4F O
953: 4E N
954: D
955: A
956: 49 I
957: 50 P
958: 3D =
959: 31 1
960: 39 9
961: 32 2
962: 2E .
963: 31 1
964: 36 6
965: 38 8
966: 2E .
967: 34 4
968: 33 3
969: 2E .
970: 32 2
971: 34 4
972: 35 5
973: 3A :
974: 32 2
975: 30 0
976: 30 0
977: 30 0
978: D
979: A
980: 4E N
981: 4D M
982: 3D =
match_P: true

gets:
983: 32 2
984: 35 5
985: 35 5
986: 2E .
987: 32 2
988: 35 5
989: 35 5
990: 2E .
991: 32 2
992: 35 5
993: 35 5
994: 2E .
995: 30 0
996: D
997: A
getPrompt "<2.32> "

match: <2.32>
998: 47 G
999: 57 W
1000: 3D =
1001: 31 1
1002: 39 9
1003: 32 2
1004: 2E .
1005: 31 1
1006: 36 6
1007: 38 8
1008: 2E .
1009: 34 4
1010: 33 3
1011: 2E .
1012: 31 1
1013: D
1014: A
1015: 48 H
1016: 4F O
1017: 53 S
1018: 54 T
1019: 3D =
1020: 30 0
1021: 2E .
1022: 30 0
1023: 2E .
1024: 30 0
1025: 2E .
1026: 30 0
1027: 3A :
1028: 32 2
1029: 30 0
1030: 52 R
1031: 3D =
1032: 50 P
1033: 4D M
1034: 3D =
1035: 34 4
1036: 46 F
1037: 53 S
1038: 78 x
1039: 54 T
1040: 4D M
1041: 3D =
1042: 30 0
1043: 42 B
1044: 4B K
1045: 30 0
1046: 32 2
1047: 3E >
1048: A
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

1049: 45 E
1050: 58 X
1051: 49 I
1052: 54 T
1053: D
1054: A
match_P: true

255.255.255.0
Gateway: send_P: $$$
match_P: CMD

1055: 43 C
1056: 4D M
1057: 44 D
1058: D
1059: A
match_P: true

send_P: get ip

match_P: GW=
1060: 49 I
1061: 46 F
1062: 3D =
1063: 55 U
1064: 50 P
1065: D
1066: A
1067: 44 D
1068: 48 H
1069: 43 C
1070: 50 P
1071: 3D =
1072: 4F O
1073: 4E N
1074: D
1075: A
1076: 49 I
1077: 50 P
1078: 3D =
1079: 31 1
1080: 39 9
1081: 32 2
1082: 2E .
1083: 31 1
1084: 36 6
1085: 38 8
1086: 2E .
1087: 34 4
1088: 33 3
1089: 2E .
1090: 32 2
1091: 34 4
1092: 35 5
1093: 3A :
1094: 32 2
1095: 30 0
1096: 30 0
1097: 30 0
1098: D
1099: A
1100: 4E N
1101: 4D M
1102: 3D =
1103: 32 2
1104: 35 5
1105: 35 5
1106: 2E .
1107: 32 2
1108: 35 5
1109: 35 5
1110: 2E .
1111: 32 2
1112: 35 5
1113: 35 5
1114: 2E .
1115: 30 0
1116: D
1117: A
1118: 47 G
1119: 57 W
1120: 3D =
match_P: true

gets:
1121: 31 1
1122: 39 9
1123: 32 2
1124: 2E .
1125: 31 1
1126: 36 6
1127: 38 8
1128: 2E .
1129: 34 4
1130: 33 3
1131: 2E .
1132: 31 1
1133: D
1134: A
getPrompt "<2.32> "

match: <2.32>
1135: 48 H
1136: 4F O
1137: 53 S
1138: 54 T
1139: 3D =
1140: 30 0
1141: 2E .
1142: 30 0
1143: 2E .
1144: 30 0
1145: 32 2
1146: D
1147: 4F O
1148: 54 T
1149: D
1150: 55 U
1151: 32 2
1152: 46 F
1153: 53 S
1154: 37 7
1155: 43 C
1156: 44 D
1157: 78 x
1158: 42 B
1159: 55 U
1160: 2E .
1161: 2E .
1162: A
1163: 33 3
1164: D
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

1165: 45 E
1166: 58 X
1167: 49 I
1168: 54 T
1169: D
1170: A
match_P: true

192.168.43.1
send_P: $$$
match_P: CMD

1171: 43 C
1172: 4D M
1173: 44 D
1174: D
1175: A
match_P: true

send_P: set o d
send: Wifly-WebClient

getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

1176: 41 A
1177: 4F O
1178: 4B K
1179: D
1180: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
1181: 3C <
1182: 32 2
1183: 2E .
1184: 33 3
1185: 32 2
1186: 3E >
1187: 20
match: true

send_P: exit

match_P: EXIT

1188: D
1189: A
1190: 45 E
1191: 58 X
1192: 49 I
1193: 54 T
1194: D
1195: A
match_P: true

DeviceID: send_P: $$$
match_P: CMD

1196: 43 C
1197: 4D M
1198: 44 D
1199: D
1200: A
match_P: true

send_P: get opt

match_P: DeviceId=
1201: 4A J
1202: 6F o
1203: 69 i
1204: 6E n
1205: 54 T
1206: 6D m
1207: 72 r
1208: 3D =
1209: 31 1
1210: 30 0
1211: 30 0
1212: 30 0
1213: D
1214: A
1215: 52 R
1216: 65 e
1217: 70 p
1218: 6C l
1219: 61 a
1220: 63 c
1221: 65 e
1222: 3D =
1223: 30 0
1224: 78 x
1225: 32 2
1226: 34 4
1227: D
1228: A
1229: 44 D
1230: 65 e
1231: 76 v
1232: 69 i
1233: 63 c
1234: 65 e
1235: 49 I
1236: 64 d
1237: 3D =
match_P: true

gets:
1238: 57 W
1239: 69 i
1240: 66 f
1241: 6C l
1242: 79 y
1243: 2D -
1244: 57 W
1245: 65 e
1246: 62 b
1247: 43 C
1248: 6C l
1249: 69 i
1250: 65 e
1251: 6E n
1252: 74 t
1253: D
1254: A
getPrompt "<2.32> "

match: <2.32>
1255: 50 P
1256: 61 a
1257: 73 s
1258: 73 s
1259: 77 w
1260: 6F o
1261: 72 r
1262: 64 d
1263: 3D =
1264: D
1265: A
1266: 46 F
1267: 6F o
1268: 72 r
1269: 6D m
1270: 61 a
1271: 74 t
1272: 3D =
1273: 30 0
1274: 78 x
1275: 30 0
1276: D
1277: A
1278: 53 S
1279: 69 i
1280: 67 g
1281: 6E n
1282: 61 a
1283: 6C l
1284: 3D =
1285: 30 0
1286: 76 v
1287: 67 g
1288: D
1289: 2E .
1290: 20
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

1291: 45 E
1292: 58 X
1293: 49 I
1294: 54 T
1295: D
1296: A
match_P: true

Wifly-WebClient
send_P: $$$
match_P: CMD

1297: 43 C
1298: 4D M
1299: 44 D
1300: D
1301: A
match_P: true

open hunt.net.nz 80
send_P: open
send: hunt.net.nz

send:

send: 80

send_P:

getPrompt "<2.32> "

match: <2.32>
readTimeout - timed out
match: false

Failed to get prompt
WiFly has crashed and will reboot...

WiFly Board doesnt send UDP Packets when sending to Gateway

Hi I tried to send some UDP Data to my Router via the Example Code. When I send Data to my own PC in the Network, the Data gets sent, but when I set the IP to xxx.xxx.x.1 No Data is transmitted. Wireshark doesnt see any Packets either. When I send some Data from my PC to the Router it works, and i see the Packages with Wireshark. What am I doing wrong?

Trying to get httpclient working

I am working on getting the httpclient sketch working. I have also tried others, but figured I would concentrate on one. I am receiving a lot of time outs and errors. The code also states that the WiFly is associated with a network when it is not. This keeps the sketch from dropping into the join method.

I have factory reset the WiFly, reboot, and unplugged multiple times. I also have the latest firmware.

The funny thing is, when I program the WiFly through a com monitor with my network credentials everything seems to run fine. It is only when I try and let the sketch set up the WiFly that it has issues.

Any help with this would be greatly appreciated.

Here is the dbug serial monitor output:

Starting
Free memory: 1065
send_P: $$$
match_P: CMD

readTimeout - timed out
match_P: false

Check in command mode

setPrompt

0: 45 E
1: 52 R
2: 52 R
3: 3A :
4: 20
5: 3F ?
6: 2D -
7: 43 C
8: 6D m
9: 64 d
10: D
11: A
12: 3C <
13: 32 2
14: 2E .
15: 33 3
16: 32 2
17: 3E >
18: 20
setPrompt: <2.32>

gets:
19: D
20: A
Already in command mode

Already in command mode

send_P: set u m 1
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

21: 41 A
22: 4F O
23: 4B K
24: D
25: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
26: 3C <
27: 32 2
28: 2E .
29: 33 3
30: 32 2
31: 3E >
32: 20
match: true

send_P: exit

match_P: EXIT

33: D
34: A
35: 45 E
36: 58 X
37: 49 I
38: 54 T
39: D
40: A
match_P: true

send_P: $$$
match_P: CMD

41: 43 C
42: 4D M
43: 44 D
44: D
45: A
match_P: true

send_P: set sys printlvl 0
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

46: 41 A
47: 4F O
48: 4B K
49: D
50: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
51: 3C <
52: 32 2
53: 2E .
54: 33 3
55: 32 2
56: 3E >
57: 20
match: true

send_P: exit

match_P: EXIT

58: D
59: A
60: 45 E
61: 58 X
62: 49 I
63: 54 T
64: D
65: A
match_P: true

send_P: $$$
match_P: CMD

66: 43 C
67: 4D M
68: 44 D
69: D
70: A
match_P: true

send_P: set comm remote 0
getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

71: 41 A
72: 4F O
73: 4B K
74: D
75: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
76: 3C <
77: 32 2
78: 2E .
79: 33 3
80: 32 2
81: 3E >
82: 20
match: true

send_P: exit

match_P: EXIT

83: D
84: A
85: 45 E
86: 58 X
87: 49 I
88: 54 T
89: D
90: A
match_P: true

send_P: $$$
match_P: CMD

91: 43 C
92: 4D M
93: 44 D
94: D
95: A
match_P: true

getCon

show c

send_P: show c

gets:
96: 38 8
97: 36 6
98: 33 3
99: 33 3
100: D
101: A
getPrompt "<2.32> "

match: <2.32>
102: 3C <
103: 32 2
104: 2E .
105: 33 3
106: 32 2
107: 3E >
108: 20
match: true

send_P: exit

match_P: EXIT

109: D
110: A
111: 45 E
112: 58 X
113: 49 I
114: 54 T
115: D
116: A
match_P: true

getCon: TCP disconnected
tcp status: 3

assoc status: 1

authen status: 1

dns status: 0

dns found status: 0

channel status: 3

send_P: $$$
match_P: CMD

117: 43 C
118: 4D M
119: 44 D
120: D
121: A
match_P: true

send_P: get ip

match_P: DHCP=
122: 49 I
123: 46 F
124: 3D =
125: 55 U
126: 50 P
127: D
128: A
129: 44 D
130: 48 H
131: 43 C
132: 50 P
133: 3D =
match_P: true

gets:
134: 4F O
135: 4E N
136: D
137: A
getPrompt "<2.32> "

match: <2.32>
138: 49 I
139: 50 P
140: 3D =
141: 30 0
142: 2E .
143: 30 0
144: 2E .
145: 30 0
146: 2E .
147: 30 0
148: 3A :
149: 32 2
150: 30 0
151: 30 0
152: 30 0
153: D
154: A
155: 4E N
156: 4D M
157: 3D =
158: 30 0
159: 2E .
160: 30 0
161: 2E .
162: 30 0
163: 2E .
164: 30 0
165: D
166: A
167: 47 G
168: 57 W
169: 3D =
170: 30 0
171: 2E .
172: 30 0
173: 2E .
174: 30 0
175: 2E .
176: 30 0
177: D
178: A
179: 48 H
180: 4F O
181: 53 S
182: 54 T
183: 3D =
184: 30 0
185: 2E .
186: 30 0
187: 2E .
188: 30 0
189: 2E .
190: 30 0
191: 3A :
192: 32 2
193: 30 0
194: 30 0
195: 30 0
196: 4F O
197: 3D =
198: 46 F
199: 78 x
200: 50 P
201: 43 C
202: 30 0
203: 3C <
204: D
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

205: 45 E
206: 58 X
207: 49 I
208: 54 T
209: D
210: A
match_P: true

Already joined network
MAC: send_P: $$$
match_P: CMD

211: 43 C
212: 4D M
213: 44 D
214: D
215: A
match_P: true

send_P: get mac

match_P: Mac Addr=
216: 4D M
217: 61 a
218: 63 c
219: 20
220: 41 A
221: 64 d
222: 64 d
223: 72 r
224: 3D =
match_P: true

gets:
225: 30 0
226: 30 0
227: 3A :
228: 30 0
229: 36 6
230: 3A :
231: 36 6
232: 36 6
233: 3A :
234: 37 7
235: 31 1
236: 3A :
237: 65 e
238: 30 0
239: 3A :
240: 33 3
241: 31 1
242: D
243: A
getPrompt "<2.32> "

match: <2.32>
244: 3C <
245: 32 2
246: 2E .
247: 33 3
248: 32 2
249: 3E >
250: 20
match: true

send_P: exit

match_P: EXIT

251: D
252: A
253: 45 E
254: 58 X
255: 49 I
256: 54 T
257: D
258: A
match_P: true

00:06:66:71:e0:31
IP: send_P: $$$
match_P: CMD

259: 43 C
260: 4D M
261: 44 D
262: D
263: A
match_P: true

send_P: get ip

match_P: IP=
264: 49 I
265: 46 F
266: 3D =
267: 55 U
268: 50 P
269: D
270: A
271: 44 D
272: 48 H
273: 43 C
274: 50 P
275: 3D =
276: 4F O
277: 4E N
278: D
279: A
280: 49 I
281: 50 P
282: 3D =
match_P: true

gets:
283: 30 0
284: 2E .
285: 30 0
286: 2E .
287: 30 0
288: 2E .
289: 30 0
290: 3A :
291: 32 2
292: 30 0
293: 30 0
294: 30 0
295: D
296: A
getPrompt "<2.32> "

match: <2.32>
297: 4E N
298: 4D M
299: 3D =
300: 30 0
301: 2E .
302: 30 0
303: 2E .
304: 30 0
305: 2E .
306: 30 0
307: D
308: A
309: 47 G
310: 57 W
311: 3D =
312: 30 0
313: 2E .
314: 30 0
315: 2E .
316: 30 0
317: 2E .
318: 30 0
319: D
320: A
321: 48 H
322: 4F O
323: 53 S
324: 54 T
325: 3D =
326: 30 0
327: 2E .
328: 30 0
329: 2E .
330: 30 0
331: 2E .
332: 30 0
333: 3A :
334: 32 2
335: 30 0
336: 30 0
337: 30 0
338: 54 T
339: D
340: 35 5
341: 41 A
342: 37 7
343: 4D M
344: 30 0
345: 55 U
346: A
347: D
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

348: 45 E
349: 58 X
350: 49 I
351: 54 T
352: D
353: A
match_P: true

0.0.0.0
Netmask: send_P: $$$
match_P: CMD

354: 43 C
355: 4D M
356: 44 D
357: D
358: A
match_P: true

send_P: get ip

match_P: NM=
359: 49 I
360: 46 F
361: 3D =
362: 55 U
363: 50 P
364: D
365: A
366: 44 D
367: 48 H
368: 43 C
369: 50 P
370: 3D =
371: 4F O
372: 4E N
373: D
374: A
375: 49 I
376: 50 P
377: 3D =
378: 30 0
379: 2E .
380: 30 0
381: 2E .
382: 30 0
383: 2E .
384: 30 0
385: 3A :
386: 32 2
387: 30 0
388: 30 0
389: 30 0
390: D
391: A
392: 4E N
393: 4D M
394: 3D =
match_P: true

gets:
395: 30 0
396: 2E .
397: 30 0
398: 2E .
399: 30 0
400: 2E .
401: 30 0
402: D
403: A
getPrompt "<2.32> "

match: <2.32>
404: 47 G
405: 57 W
406: 3D =
407: 30 0
408: 2E .
409: 30 0
410: 2E .
411: 30 0
412: 2E .
413: 30 0
414: D
415: A
416: 48 H
417: 4F O
418: 53 S
419: 54 T
420: 3D =
421: 30 0
422: 2E .
423: 30 0
424: 2E .
425: 30 0
426: 2E .
427: 30 0
428: 3A :
429: 32 2
430: 30 0
431: 30 0
432: 30 0
433: 54 T
434: D
435: 35 5
436: 41 A
437: 37 7
438: 4D M
439: 30 0
440: 55 U
441: 30 0
442: 33 3
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

443: 45 E
444: 58 X
445: 49 I
446: 54 T
447: D
448: A
match_P: true

0.0.0.0
Gateway: send_P: $$$
match_P: CMD

449: 43 C
450: 4D M
451: 44 D
452: D
453: A
match_P: true

send_P: get ip

match_P: GW=
454: 49 I
455: 46 F
456: 3D =
457: 55 U
458: 50 P
459: D
460: A
461: 44 D
462: 48 H
463: 43 C
464: 50 P
465: 3D =
466: 4F O
467: 4E N
468: D
469: A
470: 49 I
471: 50 P
472: 3D =
473: 30 0
474: 2E .
475: 30 0
476: 2E .
477: 30 0
478: 2E .
479: 30 0
480: 3A :
481: 32 2
482: 30 0
483: 30 0
484: 30 0
485: D
486: A
487: 4E N
488: 4D M
489: 3D =
490: 30 0
491: 2E .
492: 30 0
493: 2E .
494: 30 0
495: 2E .
496: 30 0
497: D
498: A
499: 47 G
500: 57 W
501: 3D =
match_P: true

gets:
502: 30 0
503: 2E .
504: 30 0
505: 2E .
506: 30 0
507: 2E .
508: 30 0
509: D
510: A
getPrompt "<2.32> "

match: <2.32>
511: 48 H
512: 4F O
513: 53 S
514: 54 T
515: 3D =
516: 30 0
517: 2E .
518: 30 0
519: 2E .
520: 30 0
521: 2E .
522: 30 0
523: 3A :
524: 32 2
525: 30 0
526: 30 0
527: 30 0
528: 54 T
529: D
530: 35 5
531: 41 A
532: 37 7
533: 4D M
534: 30 0
535: 55 U
536: 30 0
537: 2E .
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

538: 45 E
539: 58 X
540: 49 I
541: 54 T
542: D
543: A
match_P: true

0.0.0.0
send_P: $$$
match_P: CMD

544: 43 C
545: 4D M
546: 44 D
547: D
548: A
match_P: true

send_P: set o d
send: Wifly-WebClient

getres
multiMatch_P: 0 ERR:
multiMatch_P: 1 AOK

549: 41 A
550: 4F O
551: 4B K
552: D
553: A
multiMatch_P: true
getPrompt "<2.32> "

match: <2.32>
554: 3C <
555: 32 2
556: 2E .
557: 33 3
558: 32 2
559: 3E >
560: 20
match: true

send_P: exit

match_P: EXIT

561: D
562: A
563: 45 E
564: 58 X
565: 49 I
566: 54 T
567: D
568: A
match_P: true

DeviceID: send_P: $$$
match_P: CMD

569: 43 C
570: 4D M
571: 44 D
572: D
573: A
match_P: true

send_P: get opt

match_P: DeviceId=
574: 4A J
575: 6F o
576: 69 i
577: 6E n
578: 54 T
579: 6D m
580: 72 r
581: 3D =
582: 31 1
583: 30 0
584: 30 0
585: 30 0
586: D
587: A
588: 52 R
589: 65 e
590: 70 p
591: 6C l
592: 61 a
593: 63 c
594: 65 e
595: 3D =
596: 30 0
597: 78 x
598: 32 2
599: 34 4
600: D
601: A
602: 44 D
603: 65 e
604: 76 v
605: 69 i
606: 63 c
607: 65 e
608: 49 I
609: 64 d
610: 3D =
match_P: true

gets:
611: 57 W
612: 69 i
613: 66 f
614: 6C l
615: 79 y
616: 2D -
617: 57 W
618: 65 e
619: 62 b
620: 43 C
621: 6C l
622: 69 i
623: 65 e
624: 6E n
625: 74 t
626: D
627: A
getPrompt "<2.32> "

match: <2.32>
628: 50 P
629: 61 a
630: 73 s
631: 73 s
632: 77 w
633: 6F o
634: 72 r
635: 64 d
636: 3D =
637: D
638: A
639: 46 F
640: 6F o
641: 72 r
642: 6D m
643: 61 a
644: 74 t
645: 3D =
646: 30 0
647: 30 0
648: 61 a
649: 76 v
650: 3D =
651: 32 2
readTimeout - timed out
match: false

send_P: exit

match_P: EXIT

652: 45 E
653: 58 X
654: 49 I
655: 54 T
656: D
657: A
match_P: true

Wifly-WebClient
send_P: $$$
match_P: CMD

658: 43 C
659: 4D M
660: 44 D
661: D
662: A
match_P: true

open hunt.net.nz 80
send_P: open
send: hunt.net.nz

send:

send: 80

send_P:

getPrompt "<2.32> "

match: <2.32>
readTimeout - timed out
match: false

Failed to get prompt
WiFly has crashed and will reboot...

Tosduino Fails

Has anyone tried this library with a Tosduino UNO R3?

Im working on it because it seems to fail to make the http request/post sometimes. Im still trying to track down why it fails to open a connection to a site.

ttfb is too high

i'm trying to make a server to read the analogs e digital ports of the arduino. it all ready works, but the ttfb is too high. i'm getting 1,4 seconds per request and I don't know what to do to make it goes faster. I need less than 1s this 400 ms is really boring me up.

here is the code

undef PROGMEM

define PROGMEM attribute(( section(".progmem.data") ))

undef PSTR

define PSTR(s) (extension({static prog_char __c[] PROGMEM = (s); &__c[0];}))

include <WiFlyHQ.h>

include <SoftwareSerial.h>

SoftwareSerial wifiSerial(4,5);

include <SPI.h> //essa

String httpRequest; //led pin

define ledPin 3 //led pin

WiFly wifly;

/* Change these to match your WiFi network */
//const char mySSID[] = "";
//const char myPassword[] = "";

const char mySSID[] = "";
const char myPassword[] = "";

void sendIndex();
void send404();
void mostra_valores();
char buf[1024];

boolean ledstatus = false;

void setup()
{

pinMode(3, OUTPUT); // DEFINICAO SAIDA PARA O LED
Serial.begin(115200);

// Serial.begin(9600);
Serial.println(F("Starting"));
Serial.print(F("Free memory: "));
Serial.println(wifly.getFreeMemory(),DEC);

wifiSerial.begin(9600);
if (!wifly.begin(&wifiSerial, &Serial)) {
    Serial.println(F("Failed to start wifly"));

wifly.terminal();
}

/* Join wifi network if not already associated */
if (!wifly.isAssociated()) {

/* Setup the WiFly to connect to a wifi network */
Serial.println(F("Joining network"));
wifly.setSSID(mySSID);
wifly.setPassphrase(myPassword);
wifly.enableDHCP();
wifly.save();

if (wifly.join()) {
Serial.println(F("Joined wifi network"));
} else {
Serial.println(F("Failed to join wifi network"));
wifly.terminal();
}
} else {
Serial.println(F("Already joined network"));
}

wifly.setBroadcastInterval(0);  // Turn off UPD broadcast

//wifly.terminal();

Serial.print(F("MAC: "));
Serial.println(wifly.getMAC(buf, sizeof(buf)));
Serial.print(F("IP: "));
Serial.println(wifly.getIP(buf, sizeof(buf)));

wifly.setDeviceID("Wifly-WebServer");

if (wifly.isConnected()) {
    Serial.println(F("Old connection active. Closing"));

wifly.close();
}

wifly.setProtocol(WIFLY_PROTOCOL_TCP);
if (wifly.getPort() != 80) {
    wifly.setPort(80);

/* local port does not take effect until the WiFly has rebooted (2.32) */
wifly.save();
Serial.println(F("Set port to 80, rebooting to make it work"));
wifly.reboot();
delay(3000);
}
Serial.println(F("Ready"));
}

void loop()
{
if (wifly.available() > 0)
{

    /* See if there is a request */

if (wifly.gets(buf, sizeof(buf)))
{ //se o wifly recebe alguma coisa
if (strncmp_P(buf, PSTR("GET / "), 6) == 0)
{ // if it`s a get do the next line
/* GET request /
Serial.println(F("Got GET request"));
while (wifly.gets(buf, sizeof(buf)) > 0)
{
/
Skip rest of request */
}
sendIndex(); //enviar a pagina principal
Serial.println(F("Sent index page"));

  } 
  else if (strncmp_P(buf, PSTR("GET /on"), 7) == 0) //testa e o buf é igual a get/on
  { //abre bloco liga led
              while (wifly.gets(buf, sizeof(buf)) > 0) 
              {

              }
              wifly.flushRx(); 
              mostra_valores();
              digitalWrite(3,HIGH);
             Serial.println(F("ligando led"));

  } //fecha bloco desliga led
  else if (strncmp_P(buf, PSTR("GET /off"), 8) == 0) //testa e o buf é igual a get/off
  { //abre bloco desliga led
             while (wifly.gets(buf, sizeof(buf)) > 0) 
              {

              }
             wifly.flushRx(); 
             mostra_valores();
             digitalWrite(3,LOW); // e buf for igual a get/off desliga o led
             Serial.println(F("desligando led"));
  } //fecha bloco desliga led */
  else if (strncmp_P(buf, PSTR("GET /ajax_swicht"), 16) == 0) //testa e o buf é igual a get/ajax_switch
  { //abre bloco ajax
             while (wifly.gets(buf, sizeof(buf)) > 0) 
              {

              }
             wifly.flushRx(); 
             mostra_valores(); //envia o valores

             Serial.println(F("enviando valores"));
  } //fecha bloco ajax       
   else { //abre else

            Serial.print(F("Unexpected: "));
            Serial.println(buf);
            wifly.flushRx();    // discard rest of input
            Serial.println(F("Sending 404"));
            send404();       
         } //fecha else

} //fecha o bloco de recebimento do wifly
}//fecha e o wifly eta disponivel
} //fecha o void loop

/** Send an index HTML page with an input box for a username /
void sendIndex()
{
/
Send the header direclty with print */
wifly.println(F("HTTP/1.1 200 OK"));
wifly.println(F("Content-Type: text/html"));
wifly.println(F("Transfer-Encoding: chunked"));
wifly.println(F("Connection: keep-alive"));
wifly.println("\r\n");
wifly.println();

/* Send the body using the chunked protocol so the client knows when

  • the message is finished.

  • Note: we're not simply doing a close() because in version 2.32

  • firmware the close() does not work for client TCP streams.
    */
    wifly.sendChunkln(F(""));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln(F("<title>engeBOT-WiFly HTTP Server Example</title>"));
    //começa script do ajax
    wifly.sendChunkln(F("<script>"));
    //funçao que manda os dado para o servidor web
    wifly.sendChunkln(F("function GetSwitchState(url)"));
    wifly.sendChunkln(F("{"));
    wifly.sendChunkln(F("nocache = "&nocache=" + Math.random() * 1000000;"));
    wifly.sendChunkln(F("var request = new XMLHttpRequest();"));
    wifly.sendChunkln(F("request.onreadystatechange = function()"));
    wifly.sendChunkln(F("{"));
    wifly.sendChunkln(F("if(this.readyState == 4) {"));
    wifly.sendChunkln(F("if(this.status == 200) {"));
    wifly.sendChunkln(F("if (this.responseText != null) {"));
    wifly.sendChunkln(F("document.getElementById("valores").innerHTML = this.responseText;"));
    wifly.sendChunkln(F("}"));
    wifly.sendChunkln(F("}"));
    wifly.sendChunkln(F("}"));
    wifly.sendChunkln(F("}"));
    wifly.sendChunkln(F("request.open("GET", url , false);"));
    // wifly.sendChunkln(F("request.open("GET", "ajax_swicht", false);"));
    wifly.sendChunkln(F("request.send(null);"));
    wifly.sendChunkln(F("setTimeout('GetSwitchState("ajax_swicht")', 1000);"));
    wifly.sendChunkln(F("}"));

    wifly.sendChunkln(F("</script>"));
    wifly.sendChunkln(F(""));

    wifly.sendChunkln(F("<body onload="GetSwitchState('ajax_swicht')">"));

    // wifly.sendChunkln (F("

    "));

    wifly.sendChunkln(F("

    "));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln(F("

    Inovacao Sustentavel e Inteligente.

    "));
    wifly.sendChunkln(F("

    "));
    wifly.sendChunkln (F("
    "));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln(F(" <button type="button" onclick="GetSwitchState('on')">on"));
    wifly.sendChunkln(F(" <button type="button" onclick="GetSwitchState('off')">off"));
    wifly.sendChunkln(F("<div id="valores">"));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln (F("
    "));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln(F("
    "));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln(F(""));
    wifly.sendChunkln();
    }

/** Send a 404 error */
void send404()
{
wifly.println(F("HTTP/1.1 404 Not Found"));
wifly.println(F("Content-Type: text/html"));
wifly.println(F("Transfer-Encoding: chunked"));
wifly.println();
wifly.sendChunkln(F(""));
wifly.sendChunkln(F("<title>404 nao encontrada !!!</title>"));
wifly.sendChunkln(F(""));
wifly.sendChunkln(F("

Not Found

"));
wifly.sendChunkln(F("
"));
wifly.sendChunkln(F(""));
wifly.sendChunkln();
}

//mostra valores
void mostra_valores()
{
wifly.println(F("HTTP/1.1 200 OK"));
wifly.println(F("Content-Type: text/html"));
wifly.println(F("Transfer-Encoding: chunked"));
wifly.println(F("Connection: keep-alive"));
wifly.println();

    snprintf_P(buf, sizeof(buf), PSTR("<center><p>VALOR DO POTENCIOMETRO DO PINO 5=%d</p></center>"), analogRead(A5));
    wifly.sendChunkln(buf);

    snprintf_P(buf, sizeof(buf), PSTR("<center><p>VALOR DO POTENCIOMETRO DO PINO 4=%d</p></center>"), analogRead(A4));
    wifly.sendChunkln(buf);

    snprintf_P(buf, sizeof(buf), PSTR("<center><p>VALOR DA TEMP PINO 3=%d</p></center>"), analogRead(A3));
    wifly.sendChunkln(buf);

    snprintf_P(buf, sizeof(buf), PSTR("<center><p>LUMINOSIDADE PINO 2=%d</center></p>"), analogRead(A2));
    wifly.sendChunkln(buf);

    if ( digitalRead(8))
    {
      wifly.sendChunk("BOTÃO 1= LIGADO<BR>");
    }
    else 
    {
      wifly.sendChunk("BOTÃO 1= DESLIGADO<BR>");
      Serial.print(F("75."));
    }
    if ( digitalRead(7)) 
    {
      wifly.sendChunk("BOTÃO 2= LIGADO<BR>");
      Serial.print(F("85."));
    }
    else 
    {
      wifly.sendChunk("BOTÃO 2= DESLIGADO<BR>");
    }

    wifly.sendChunkln(); // finaliza comunicação html

}

Not able to use Arduino + Wireless SD shield + RN XV

When I am connecting, I am always getting follow errors.

Starting
Free memory: 1250
setPrompt failed
Failed to enter command mode
Failed to start wifly
Terminal ready

Things I have tried are

  1. Bending Pin Number 0 and 1 on shield so that they do not connect to Arduino and the connecting Pin 0 to Pin 8 and Pin 1 to Pin 9 on shield
    2.Using wifly.begin(&wifiSerial, NULL) instead of wifly.begin(&wifiSerial, Serial).

Please let me know what wrong I am doing.

ping no longer works

somewhere along the way the RN firmware stopped replying with "64 bytes", but "reply from" is consistent. there's also multiple gets() calls that cause problems.

I have fixed in my branch, but a pull won't go unless the formatting pull is merged first.

Wireless Data Rate

I think it's important to be able to set the wireless speed.
I couldn't find a method to set it easily.

Lowering the speed should improve the signal quality. In most cases, high speeds are not required for our applications.

set wlan rate
sets the wireless data rate. Lowering the rate increases the effective range of the WiFly-GSX module.

XML parse class

Does it have an xml parse class or are you working on one or perhaps have heard of any that work with your library?

getConnection() problem/fix

I've got a problem with the getConnection function, it updates once or twice and then returns a 0 value. Because of these values the .isAssociated, .isConnected functions don't update correctly.

By changing

if (checkPrompt(buf)) {
/* Got prompt first */
len = gets(buf, sizeof(buf));
} else {
getPrompt();
}

To

if (checkPrompt(buf)) {
/* Got prompt first */
    len = gets(buf, sizeof(buf));
} else {
         if(!gotPrompt)
         {
       getPrompt();
         }
}

It updates correctly.

Ps. I don't know if this is the right place to post this.. Kind of a GitHub noob :) Great library btw!

Sleep feature requested!

is it possible to add the sleep feature into the library?
i tried to send the sleep command by myself ... (and had some problems)

the following commands are send by my arduino code:

wlan.println("sleep"); // this works! the module is into the sleep mode

the module is set on autowakeup (set sys wake ) // this works! the module wake up!

but sending new data is not possible, i get the following message:

Failed to turn off echo
Failed to turn off sys print
Failed to set comm remote
Failed to exit

Failed to exit command mode
Failed to start Wlan-Interface
Joining MYNETWORK

open 192.168.19.19 80
Failed to get prompt
WiFly has crashed and will reboot...

My Firmware Version is 2.32 and i use an Arduino Uno R3
Hope you can help me!

::open hangs sometimes

Sometimes, calls to open - like wifly.open("api.cosm.com", 80) - hang and never return.
I'll try using non-blocking and openComplete, but the blocking version could perhaps use a timeout?

compatibility with Xively

Is there a way to switch between the stream class and client class? I have been unable to get this to work with the library for the Xively IOT site. After reading up about it on the web, I found some posts that indicate the issue is that Xively is written as a client class, while wiflyhq is written as a stream class.

Web server with SD card problem, don't send index.htm correctly with <img> tag

Hi!
I'm trying to write a simple web server on which when the GET /index.htm request got, the index.htm file from SD card will be send.
index.htm containing tag <img src="pic.jpg" /> and is very simple
pic.jpg is also on the SD card.

<!DOCTYPE html>
<html>
    <head>
        <title>Arduino SD Card Web Page</title>
    </head>
    <body>
        <h1>Arduino SD Card Page with Image</h1>
        <img src="pic.jpg" />
    </body>
</html>

I took as a basis an example code from the library WifFyHQ - httpserver,
and added a few designs from the following example - http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-web-server-image/

for request "GET /index.htm" and sending index.htm:

else if (strncmp_P(buf, PSTR("GET /index.htm"), 14) {
    wifly.println("HTTP/1.1 200 OK");
    wifly.println("Content-Type: text/html");
    wifly.println("Connnection: close");
    wifly.println();
    webFile = SD.open("index.htm");        // open web page file
    if (webFile) {
        while(webFile.available()) {
        wifly.write(webFile.read());       // send web page to client
    }
    webFile.close();
    wifly.println();
}

and for next request "GET /pic.jpg" and sending pic.jpg:

else if (strncmp_P(buf, PSTR("GET /pic.jpg"), 12) {
    wifly.println("HTTP/1.1 200 OK");
    wifly.println();
    webFile = SD.open("pic.jpg");        // open web page file
    if (webFile) {
        while(webFile.available()) {
        wifly.write(webFile.read());     // send web page to client
    }
    webFile.close();
    wifly.println();
}

Unfortunately, after receiving index.htm browser does not send a "GET /pic.jpg" request to pic.jpg, and waiting for something..., and the picture on the page is not mapped.

However, if you add an <img src="pic.jpg" /> tag to the native code of the "httpserver" sample (third line from the bottom), where the body is sent as chunks, the browser receives the page correctly and then sends a request for a picture, the picture is unloaded and its perfectly mapped on a page:

    /* Send the header direclty with print */
    wifly.println(F("HTTP/1.1 200 OK"));
    wifly.println(F("Content-Type: text/html"));
    wifly.println(F("Transfer-Encoding: chunked"));
    wifly.println();
    /* Send the body using the chunked protocol so the client knows when
     * the message is finished.
    wifly.sendChunkln(F("<html>"));
    wifly.sendChunkln(F("<title>WiFly HTTP Server Example</title>"));
    wifly.sendChunkln(F("<h1>"));
    wifly.sendChunkln(F("<p>Hello</p>"));
    wifly.sendChunkln(F("</h1>"));
    wifly.sendChunkln(F("<form name=\"input\" action=\"/\" method=\"post\">"));
    wifly.sendChunkln(F("Username:"));
    wifly.sendChunkln(F("<input type=\"text\" name=\"user\" />"));
    wifly.sendChunkln(F("<input type=\"submit\" value=\"Submit\" />"));
    wifly.sendChunkln(F("</form>")); 
    wifly.sendChunkln(F("<img src='pic.jpg' />")); 
    wifly.sendChunkln(F("</html>"));
    wifly.sendChunkln();

Also separately works fine direct request for a picture "https://wiflyip/pic.jpg", it is unloaded and displayed in the browser well.

What am I doing wrong with the SD card, why wifly.write(webFile.read()) constraction do not works correctly with index.htm file on SD card and with WiFlyHQ?

problem sending post requests

when i send an POST request, the request header get cropped, if i inspect the request on the server i can see the following:

headers: { host: 'localhost:3000', 'content-type': 'application' },

with this setup;

void SendJasonPacket()
  {
    wifly.open(Server, ServerPort);
    wifly.println("POST / HTTP/1.1");
    wifly.println("Host: localhost:3000");
    wifly.println("Content-type: application/json");
    wifly.println("Accept: application/json");
    wifly.println("Content-Length: 93");
    wifly.println("User-Agent: easyPEP/0.0.1");
    wifly.println("{'checkin':{'device_token': '122','card_token': '12312', 'timestamp': '2012-10-29T14:31:03'}}");
    wifly.close();
  }

i tried a couple of different headers, that's what i got:

  headers: { 'user-agent': 'easyPEP/0.0.1', accept: 'application/j' },
  headers: { accept: 'application/json', 'user-agent': 'easyPEP/0' },
  headers: { host: 'localhost:3000', 'content-type': 'application' },

it seems, that it get cropped after a specific character count, not sure what i did wrong here....

NTP Issues

I am using this library with arduino and the wifly shield from sparkfun. I am using the SPIUart library to communicate with the wifly device over CS, MOSI, MISO, SCLK.

I am having trouble with ntp. Most of the time, the ntp returns fine. Certain hours of the day return hour digits that are around 250. The seconds and minutes show zero in this condition It will be this way for an hour (usually observed during 20:00) and then be back to normal for remaining hours. I am not certain that all hours are correct (or incorrect).

Using ntpzone 035. Is it possible that the SPIUart library is part of the problem? Anyone else seen things similar?

RN-XV 171 - Update Firmware Ver. 4.0

Dear harlequin-tech,

The Roving Networks has updated the firmware version of WiFly RN-XV to version 4.0 reportedly much has changed, so I wonder whether if I upgrade the firmware of my modules, will have some breaks in operation using your library?

Thank you!

Once 'Failed to exit', never able to get in commandMode again

I'm using the library for a temperature sensor of my solar boiler system, it works great, thanks for the good work!

When WiFly::exitCommandMode() does not get 'EXIT\r\n' from the wifly it raises an error (correct) and leaves the variable inCommandMode as it is (= true).
Most probably the wifly did not return 'EXIT\r\n' because it somehow already left command mode.

WiFly::startCommand() first checks 'inCommandmode == true', thinks the wifly is still in commandmode and does not execute a '$$$' command. Because WiFly will not get in command mode, WiFly::exitCommandMode() will never get an 'EXIT\r\n' and doesn't change anything. Even a WiFly::reboot() won't work (because it uses WiFly::startCommand()). The way it is working right now, to me it seems impossible to get out of this situation.

A solution for this might be to assume the wifly is not in command mode when WiFly::exitCommandMode() doesn't get an 'EXIT\r\n'. In that situation still raise an error, but set inCommandMode false anyway.

ERR 2few Args with sendto()

Hello, first a thanks for making this library,
When i tried to copy you udpclientexample with the sendto method instead of the print() in your example, i get the Message ERR 2few Args whenever the Wifly Board sends a Message. The UDP Packet still gets send and i can receive it, but it bugs me as to why this error should even occur. Here's the code im using:

uint32_t lastSend = 0;
uint32_t count=0;

void loop()
{
    if ((millis() - lastSend) > 1000) {
        count++;
    Serial.print("Sending message ");
    Serial.println(count);
        wifly.sendto("Hello", "192.168.1.112" , 1337);

    lastSend = millis();
    }
}

The setup() is the same as in the udpclient example
with the exception that i commented out the line:

wifly.setHost("192.168.1.112", 1337);   // Send UPD packets to this server and port

And this is the output i'm getting on my Serial Monitor:

Sending message 1
ERR: 2few Args
Sending message 2
ERR: 2few Args

So as i was saying the packets still get send but its bugging me as to what might cause this error message, which is one the WiflyBoard itself is sending if my research is correct

*CLOS* in the output

I try to make subsequent calls to retrieve multiple files from a server.

The flag "connected" is unreliable. In the first call, it's true. In the second, after "open" it's true, then suddenly it's false.

Because this flag is incorrect, when I download a file and save it on the SD card, it's 6 bytes longer because of the added "CLOS" phrase inside of the WiFly stream.

The main problem is in the function "available":

int WiFly::available()
{
int count;

count = serial->available();
if (count > 0) {
if (debugOn) {
    debug.print(F("available: peek = "));
    debug.println((char)serial->peek());
}
/* Check for TCP stream closure */
if (serial->peek() == '*') {
    if (connected) {
    if (checkClose(true)) {
        return -1;
    } else {
        return peekCount + serial->available();
    }
    } else {
    checkOpen(true);
    return peekCount + serial->available();
    }
}
}

return count+peekCount;

}

I modified it to always check for the "CLOS" statement, connected or not, and now files are correct.

int WiFly::available()
{
int count;

count = serial->available();
if (count > 0) {
if (debugOn) {
    debug.print(F("available: peek = "));
    debug.println((char)serial->peek());
}
/* Check for TCP stream closure */
if (serial->peek() == '*') {
    if (checkClose(true)) {
        return -1;
    } else {
        return peekCount + serial->available();
    }
    if (!connected) {
    checkOpen(true);
    return peekCount + serial->available();
    }
}
}

return count+peekCount;

}

Mega 2560 compatibility?

Trying to use this with an Xbee shield and RN-XV. RN-XV is updated to the latest firmware form Digi.
Works just fine on an UNO w/ the Xbee shield but the exact same code fails when the shield is put on a Mega 2560.

This is using the basic httpclient example sketch just modified to reflect pins 2,3 for Wifly serial comms as well as my SSID and passphrase for my wifi router.

RESTful POST

I am attempting to build a RESTful POST into my wifly. but having trouble getting anything past POST / HTTP/1.1.

Anyone have a clue on getting the Request body?

Problem posting to Ubidots

Hi Harlequin,
I am trying to post some data to Ubidots (ubidots.com) and to another sites like Thingspeak (thingspeak.com) and Plotly (plot.ly).
I am using both Arduino wifi shield and RN-XV shield.
I made it work with wifi shield but I am having problems with RN-XV.
I get this message: close: failed, no CLOS
Could you help me? Here is the code...
Thank you. Rodrigo

undef PROGMEM

define PROGMEM attribute(( section(".progmem.data") ))

undef PSTR

define PSTR(s) (extension({static prog_char __c[] PROGMEM = (s); &__c[0];}))

include <WiFlyHQ.h>

include <SoftwareSerial.h>

SoftwareSerial wifiSerial(8,9);

//#include <AltSoftSerial.h>
//AltSoftSerial wifiSerial(8,9);

WiFly wifly;

/* Change these to match your WiFi network */
const char mySSID[] = "MarconiLab";
const char myPassword[] = "marconi-lab";

//Dots configuration

define TOKEN "Df2PxNVLpOdn2phb7BriUTs0JwkVOvv6su2zBPh2QY1FbPYok5OMHQelKFNY" //Replace with your TOKEN

define VARIABLEID "538f3bc676254249aec757d9" //Variable ID

define VARIABLEID2 "5386d9c77625426be003b163" //second variable

//WiFiClient client;
char server[] = "things.ubidots.com";

void sendIndex();
void sendGreeting(char *name);
void send404();

int resetTimer = 0;
char buf[80];

const char site[] = "www.google.it";

void setup()
{
Serial.begin(115200);
Serial.println(F("Starting"));
Serial.print(F("Free memory: "));
Serial.println(wifly.getFreeMemory(),DEC);

wifiSerial.begin(9600);
if (!wifly.begin(&wifiSerial, &Serial)) {
    Serial.println(F("Failed to start wifly"));
wifly.terminal();
}

/* Join wifi network if not already associated */
if (!wifly.isAssociated()) {
/* Setup the WiFly to connect to a wifi network */
Serial.println(F("Joining network"));
wifly.setSSID(mySSID);
wifly.setPassphrase(myPassword);
wifly.enableDHCP();
wifly.save();

if (wifly.join()) {
    Serial.println(F("Joined wifi network"));
} else {
    Serial.println(F("Failed to join wifi network"));
    wifly.terminal();
}
} else {
    Serial.println(F("Already joined network"));
}

wifly.setBroadcastInterval(0);  // Turn off UPD broadcast

//wifly.terminal();

Serial.print(F("MAC: "));
Serial.println(wifly.getMAC(buf, sizeof(buf)));
Serial.print(F("IP: "));
Serial.println(wifly.getIP(buf, sizeof(buf)));
Serial.print("Netmask: ");
Serial.println(wifly.getNetmask(buf, sizeof(buf)));
Serial.print("Gateway: ");
Serial.println(wifly.getGateway(buf, sizeof(buf)));

wifly.setDeviceID("Wifly-WebServer");
Serial.print("DeviceID: ");
Serial.println(wifly.getDeviceID(buf, sizeof(buf)));

if (wifly.isConnected()) {
    Serial.println(F("Old connection active. Closing"));
wifly.close();
}

// wifly.setProtocol(WIFLY_PROTOCOL_TCP);
// if (wifly.getPort() != 80) {
// wifly.setPort(80);
// /* local port does not take effect until the WiFly has rebooted (2.32) /
// wifly.save();
// Serial.println(F("Set port to 80, rebooting to make it work"));
// wifly.reboot();
// delay(3000);
// }
//
if (wifly.open(server, 80)) {
Serial.print("Connected to ");
Serial.println(server);
//
/
Send the request */
wifly.println("GET / HTTP/1.0");
wifly.println();
} else {
Serial.println("Failed to connect");
}
//
Serial.println(F("Ready"));
}

void loop()
{
//Serial.println("Loop" );
if (wifly.available() > 0) {
Serial.println("Trying to send data:" );
writeUbidots(String (analogRead(0)), VARIABLEID ); //Send data in String format to the Ubidots function
}
}

void writeUbidots(String data, String VARID) {
String dataString = "{"value":"+ data + "}"; //Prepares the data in JSON format
Serial.println("ubi");

if (wifly.open(server, 80)) { //If connection is successful, then send this HTTP Request:
Serial.println("Connecting...");
wifly.println("POST /api/v1.6/variables/"); //Specify URL, including the VARIABLE ID
wifly.print(VARID);
wifly.println("/values HTTP/1.1");
wifly.println("Host: things.ubidots.com");
wifly.print("X-Auth-Token: "); //Specify Authentication Token in headers
wifly.println(TOKEN);
wifly.print("Content-Length: ");
wifly.println(dataString.length());
wifly.println("Content-Type: application/json");
wifly.println("Connection: close");
wifly.println(); //End of HTTP headers

wifly.println(dataString);                                   //This is the actual value to send

wifly.flushRx();
wifly.close();

// return 1;
}
else { // If the connection wasn't possible, then:
resetTimer += 1;
Serial.println("Connection failed");
Serial.println("Device will restart after 10 failed attempts, so far:"+String(resetTimer)+" attempts.");
Serial.println("Killing sockets and disconnecting...");
wifly.flushRx();
wifly.close();
// return 0;
}
}

Internal buffer overflow? (Flow Control?)

Hi,

I'm using this library for my thesis project.
I've added some functionality, for example, I can now do a scan by using this library.
However, every now and then it looks like a few bytes are being skipped.
Has someone implemented flow control in this library?
Cause I would love to have flow control to (hopefully) solve this problem.

Ciao,
Arno

WEP64 unsupported

I have one network with an old device that doesn't do WEP128, so I have to use WEP64. yeah, I know. whatever. the RN devices support it soo...

I have added a setAuth method and expanded the mode defines to allow making this work. a pull won't go unless the formatting pull is merged first.

incorrect line endings

several places in the code use /n/r instead of /r/n

I have fixed in my branch, but a pull won't go unless the formatting pull is merged first.

wifly.open to localhost ( or local ip )

Hi!

for some extrange reason when i tried to make a wifly.open( 'localhost' , 80) or wifly.open( '127.0.0.1' , 80) the serial monitor sends me a Failed to connect: Connect FAILED Failed to connect to host. but if i put any other ip/domain combination it works.
wifly1
wifly2
wifly3

i don't know if the reason is that my laptop and the wifly module are on the same network.

by the way on my laptop i have a express server ( with the musicparty-server app running ) and if i go direct to the endpoint that im traying to call with the arduino it works properly.

any idea?

Send the "time" request

Could you add the "time" request to the method setTimeAddress() after setting a new NTP server IP or create an additional method updateTime()?

When I change the NTP server and set enable to > 1, it doesn't connect to the NTP server immediately.

time Sets the Real time clock by synchronizing with the time server specified
with the time server parameters (see section 5.9) This command sends a
UDP time server request packet.

open() timeout is very long

when using the hardware watchdog in a sketch, a failing open triggers even an 8S watchdog.

I have added a timeout option in my branch, but a pull won't go unless the formatting pull is merged first.

Unable To Receive Multicast Packets/Join Multicast Group

I am unable to receive UDP packets sent on the default multicast address (224.0.0.1).
Using the sendto() command - though I receive the Err 2FewArgs error - I am able to send UDP packets to the multicast address and have them received by a Java based client.
The problem comes when receiving multicast packets on the Arduino/WiFly module.

I have looked through the provided doxygen and found no reference - maybe I am missing something - but I think there needs to be some way of joining the multicast group.

For clarity, my Arduino code:

#include <SoftwareSerial.h>
SoftwareSerial wifiSerial(8,9);//RX, TX    
#include <WiFlyHQ.h>

WiFly wifly;

const char   mySSID[]         = "SSID";
const char   myPassword[]     = "Pass";

void setup() 
{
    char buf[64];
    Serial.begin(115200);    
    Serial.println("Starting sketch Proc UDP");

    wifiSerial.begin(9600);
    if (!wifly.begin(&wifiSerial, &Serial))
    {
        Serial.println("Failed to start wifly");
    }

    Serial.println("Joining network");
    wifly.setSSID(mySSID);
    wifly.setPassphrase(myPassword);
    wifly.enableDHCP();

    if (wifly.join())
    {
        Serial.println("Joined wifi network");
    }
    else
    {
        Serial.println("Failed to join wifi network");
    }    

    Serial.println("WiFly ready");

    Serial.print("IP: ");
    Serial.println(wifly.getIP(buf, sizeof(buf)));
    Serial.print("Netmask: ");
    Serial.println(wifly.getNetmask(buf, sizeof(buf)));
    Serial.print("Gateway: ");
    Serial.println(wifly.getGateway(buf, sizeof(buf)));

    Serial.println("Set DeviceID");
    wifly.setDeviceID("Wifly-UDP-Rec");
    Serial.print("DeviceID: ");
    Serial.println(wifly.getDeviceID(buf, sizeof(buf)));

    wifly.setIpProtocol(WIFLY_PROTOCOL_UDP);
}   

int count = 0;
void loop()
{
    if(wifly.available() > 0)
    {
        int EoL = 0;
        String s;
        while(wifly.available() > 0) //EoL == 0)//while(wifly.available() > 0)
        {
          if(wifly.available() > 0)
          {
              char rec = wifly.read();
              if(rec != '\n')
                s += rec;
              else
                EoL = 1;
              }
        }
        EoL = 0;  
        Serial.println(s);
    }
    Serial.println(wifly.available());    
}

UDP packets sent on the local subnet broadcast (in my instance, 192.168.2.255) are received and displayed as exptected.
When sent to 224.0.0.1, however, wifly.available() only returns 0.

Other clients are able to receive the packets when sent on Multicast, so I know that they are being sent.

Cannot compile example httpserver.ino

I can not compile the example file httpserver.ino
Gives an error message:
...WiFlyHQ-master/WiFlyHQ.h:78:28: error: section attribute not allowed for 'prog_char'
typedef const char PROGMEM prog_char;

What could be the problem?
the author is silent... @chrwei please help!

WebSockets example might benefit from a corresponding server

I bring this up only because I've tried a few different strategies for getting a server to talk to the WiFly without success. Everything else works, but the WebSockets is very tricky to get right with (afaik) the usual tools for making a quick server: Python, Node, Ruby. I think it would make the library much better documented. Thanks!

debug statements

there seems to be several different kinds of debugging prints, in including some redundancies like

ifdef DEBUG

DPRINT(whatever);

endif

and

if (debugon) {
DPRINT(whatever);
}

if DEBUG isn't set the DPRINT gets optimized out anyway, no need for any form of if.

I have optimized it in my branch, but a pull won't go unless the formatting pull is merged first.

my changes save 1650 bytes of flash with debug off, and 70 bytes with debug on. the savings with debug on are due to removing the "if (debugon)" versions.

Problem pulling down webpage via GET

I'm able to make successfully a GET request with this code:

void HTTPrequestGET(){
  if (wifly.open(site, 80)){  
    wifly.println("GET http://example.com/something.php HTTP/1.0");
    // Some NECESSARY headers
    wifly.println("Host: example.com");
    wifly.println("User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0");
    wifly.println("Content-type: text/html");
    wifly.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    wifly.println("Accept-Language: es,en-us;q=0.8,en;q=0.6,eu;q=0.4,ca;q=0.2");
    wifly.println("Accept-Encoding: gzip, deflate");
    wifly.println("Connection: close");
    wifly.println();
  } else {
    scrollingText("FAILED TO CONNECT");
  } 
}

Im sure the request arrives to the server because I create a record on a certain database each time it happens. BUT after my request, I'm getting only 62 characters back!. Exactly I get this:

HTTP/1.1 200 Ok
Date: Wed, 03 Apr 2013 09:30:17 GMT
Server: A

While if I go to the same URL with my browser, it gives me the full headers and page.

HTTP/1.1 200 OK
Date: Wed, 03 Apr 2013 14:21:48 GMT
Server: Apache
X-Powered-By: PHP/5.2.17
Keep-Alive: timeout=2, max=200
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/xml
<something>hello</something>

My problem is that I don't really know where to look at to solve this. Could it be a memory issue (RN module?) Maybe the memory of the RN-XV is full? How can I check this?
I thought wifly.read() would make free the memory. Do I have to do flush() somewhere or it has nothing to do with this?

Any idea?
Thanks!

I'm taking the characters in my loop() function this way:

void loop() {
    if (wifly.available() > 0) {
      ch = wifly.read(); 

      charValue = ch;
      String stringTwo = "C:";
      stringTwo += charValue;
      char charBufferTwo[10];
      stringTwo.toCharArray(charBufferTwo, 10);
      printString(charBufferTwo); delay(300);
    }else{
      printString("NOTHING"); delay(1000);
      panel.clear();
    }
}

I tryed to debug and added this line in each loop:

bytesToRead = wifly.available();

This tells me that first time bytesToRead is 62 and then it goes decreasing in each loop (because I do wifly.read() ) and it finally arrives to 0.

close fails when the other side closes the connection

when calling close(), it flushes, then issues and checks for CLOS*. on connections where the server automatically closes, such as http 1.0, this causes the close the fail when it should be a success.

I have fixed in my branch, but a pull won't go unless the formatting pull is merged first.

Error in compile

Hello,

I am reproducing the project
http://www.mentalmunition.com/2013/10/measure-air-pollution-in-your-home-or.html

But I use other wi-fi shield, my shield is this
http://www.seeedstudio.com/depot/Wifi-Shield-p-1220.html?cPath=19_20
http://www.seeedstudio.com/wiki/Wifi_Shield_V1.1

I'm following in the footsteps of the link
http://www.mentalmunition.com/2013/06/step-by-step-guide-to-programming-rn-xv.html

but I I downloaded the code project, installed the lib and at the time I tried to run the example:
https://github.com/harlequin-tech/WiFlyHQ/tree/master/examples/tcpclient

But the compiller displays on error in archiev WiFlyHQ.h in line 78 of you lib.
"typedef const char PROGMEM prog_char;"

I commented this line and the code compiled correct, but I dont could connect in wi-fi.

Example: httpclient doesn't work with my virtual host

Hi there, thanks for the WiFlyHQ, it's just so cool!

I have a question for you. My host is a virtual host, and it doesn't have a dedicated IP address. Now I want to get the response of a page, (eg: www.example.com/mysite/echo_id.php?id=123), but the httpclient example doesn't work properly. I simply changed the site from "hunt.net.nz" to "www.example.com/mysite/echo_id.php?id=123", it's always time out and looks like it can't reach the page "echo_id.php".

I guess that's because WiFly can't get the real path of the page "echo_id.php" on a virtual host. So how can I fix this?

Thank you in advance!!

Can't get it works with Arduino Mega 2560

Hello,

I found your library which is the one that could works with my setup (Arduino Mega 2560 + Arduino Wireless Shield (official) + RN-XV module)

I read a lot of topics on various forums that said that I needed to wire correctly the board to get it works (pins 10, 11, 12, 13 of the shield with 50, 51, 52, 53) however I can't get the WiFly to connect to my network... always the same error message in the Arduino IDE's serial monitor :

Starting
Free memory: 6943
setPrompt failed
Failed to enter command mode
Failed to start wifly
Terminal ready

I tried to unplug the pins D0, D1 of the shield and route them to Serial1 of the board (pins 18, 19) which was unsuccessfull... I'm a little bit disappointed that I can't get it works.

It would be great if you could help me !

Thanks for taking the time to read me and please forgive my english,
Thomas

failed to get prompt

I'm using RN-XV (Rev 3) with Arduino Uno (R3). Everytime I want to connect to any website I get this message "Failed to get prompt". Any help would be appreciated.

ip flags vs ip protocol

I'm not sure if this is a change in more recent versions of the WiFly firmware, or just a typo (looks like a copy paste issue), but the setIpFlags method calls "set ip protocol" instead of "set ip flags". It should look like this (sorry, I haven't checked out the repo or I'd send a pull request):

boolean WiFly::setIpFlags(const uint8_t flags)
{
return setopt(PSTR("set ip flags"), flags, HEX);
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.