Example program with HTTPServer and sensor data streaming over TCPSockets, using Donatien Garnier's Net APIs and services code on top of LWIP. Files StreamServer.h and .cpp encapsulate streaming over TCPSockets. Broadcast is done by sendToAll(), and all incoming data is echoed back to the client. Echo code can be replaced with some remote control of the streaming interface. See main() that shows how to periodically send some data to all subscribed clients. To subscribe, a client should open a socket at <mbed_ip> port 123. I used few lines in TCL code to set up a quick sink for the data. HTTP files are served on port 80 concurrently to the streaming.

Dependencies:   mbed

Committer:
iva2k
Date:
Sat Jun 12 06:01:50 2010 +0000
Revision:
0:e614f7875b60

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iva2k 0:e614f7875b60 1 /*
iva2k 0:e614f7875b60 2 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
iva2k 0:e614f7875b60 3 * All rights reserved.
iva2k 0:e614f7875b60 4 *
iva2k 0:e614f7875b60 5 * Redistribution and use in source and binary forms, with or without modification,
iva2k 0:e614f7875b60 6 * are permitted provided that the following conditions are met:
iva2k 0:e614f7875b60 7 *
iva2k 0:e614f7875b60 8 * 1. Redistributions of source code must retain the above copyright notice,
iva2k 0:e614f7875b60 9 * this list of conditions and the following disclaimer.
iva2k 0:e614f7875b60 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
iva2k 0:e614f7875b60 11 * this list of conditions and the following disclaimer in the documentation
iva2k 0:e614f7875b60 12 * and/or other materials provided with the distribution.
iva2k 0:e614f7875b60 13 * 3. The name of the author may not be used to endorse or promote products
iva2k 0:e614f7875b60 14 * derived from this software without specific prior written permission.
iva2k 0:e614f7875b60 15 *
iva2k 0:e614f7875b60 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
iva2k 0:e614f7875b60 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
iva2k 0:e614f7875b60 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
iva2k 0:e614f7875b60 19 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
iva2k 0:e614f7875b60 20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
iva2k 0:e614f7875b60 21 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
iva2k 0:e614f7875b60 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
iva2k 0:e614f7875b60 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
iva2k 0:e614f7875b60 24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
iva2k 0:e614f7875b60 25 * OF SUCH DAMAGE.
iva2k 0:e614f7875b60 26 *
iva2k 0:e614f7875b60 27 * This file is part of the lwIP TCP/IP stack.
iva2k 0:e614f7875b60 28 *
iva2k 0:e614f7875b60 29 * Author: Adam Dunkels <adam@sics.se>
iva2k 0:e614f7875b60 30 *
iva2k 0:e614f7875b60 31 */
iva2k 0:e614f7875b60 32
iva2k 0:e614f7875b60 33 #ifndef __LWIP_PBUF_H__
iva2k 0:e614f7875b60 34 #define __LWIP_PBUF_H__
iva2k 0:e614f7875b60 35
iva2k 0:e614f7875b60 36 #include "lwip/opt.h"
iva2k 0:e614f7875b60 37 #include "lwip/err.h"
iva2k 0:e614f7875b60 38
iva2k 0:e614f7875b60 39 #ifdef __cplusplus
iva2k 0:e614f7875b60 40 extern "C" {
iva2k 0:e614f7875b60 41 #endif
iva2k 0:e614f7875b60 42
iva2k 0:e614f7875b60 43 #define PBUF_TRANSPORT_HLEN 20
iva2k 0:e614f7875b60 44 #define PBUF_IP_HLEN 20
iva2k 0:e614f7875b60 45
iva2k 0:e614f7875b60 46 typedef enum {
iva2k 0:e614f7875b60 47 PBUF_TRANSPORT,
iva2k 0:e614f7875b60 48 PBUF_IP,
iva2k 0:e614f7875b60 49 PBUF_LINK,
iva2k 0:e614f7875b60 50 PBUF_RAW
iva2k 0:e614f7875b60 51 } pbuf_layer;
iva2k 0:e614f7875b60 52
iva2k 0:e614f7875b60 53 typedef enum {
iva2k 0:e614f7875b60 54 PBUF_RAM, /* pbuf data is stored in RAM */
iva2k 0:e614f7875b60 55 PBUF_ROM, /* pbuf data is stored in ROM */
iva2k 0:e614f7875b60 56 PBUF_REF, /* pbuf comes from the pbuf pool */
iva2k 0:e614f7875b60 57 PBUF_POOL /* pbuf payload refers to RAM */
iva2k 0:e614f7875b60 58 } pbuf_type;
iva2k 0:e614f7875b60 59
iva2k 0:e614f7875b60 60
iva2k 0:e614f7875b60 61 /** indicates this packet's data should be immediately passed to the application */
iva2k 0:e614f7875b60 62 #define PBUF_FLAG_PUSH 0x01U
iva2k 0:e614f7875b60 63
iva2k 0:e614f7875b60 64 struct pbuf {
iva2k 0:e614f7875b60 65 /** next pbuf in singly linked pbuf chain */
iva2k 0:e614f7875b60 66 struct pbuf *next;
iva2k 0:e614f7875b60 67
iva2k 0:e614f7875b60 68 /** pointer to the actual data in the buffer */
iva2k 0:e614f7875b60 69 void *payload;
iva2k 0:e614f7875b60 70
iva2k 0:e614f7875b60 71 /**
iva2k 0:e614f7875b60 72 * total length of this buffer and all next buffers in chain
iva2k 0:e614f7875b60 73 * belonging to the same packet.
iva2k 0:e614f7875b60 74 *
iva2k 0:e614f7875b60 75 * For non-queue packet chains this is the invariant:
iva2k 0:e614f7875b60 76 * p->tot_len == p->len + (p->next? p->next->tot_len: 0)
iva2k 0:e614f7875b60 77 */
iva2k 0:e614f7875b60 78 u16_t tot_len;
iva2k 0:e614f7875b60 79
iva2k 0:e614f7875b60 80 /** length of this buffer */
iva2k 0:e614f7875b60 81 u16_t len;
iva2k 0:e614f7875b60 82
iva2k 0:e614f7875b60 83 /** pbuf_type as u8_t instead of enum to save space */
iva2k 0:e614f7875b60 84 u8_t /*pbuf_type*/ type;
iva2k 0:e614f7875b60 85
iva2k 0:e614f7875b60 86 /** misc flags */
iva2k 0:e614f7875b60 87 u8_t flags;
iva2k 0:e614f7875b60 88
iva2k 0:e614f7875b60 89 /**
iva2k 0:e614f7875b60 90 * the reference count always equals the number of pointers
iva2k 0:e614f7875b60 91 * that refer to this pbuf. This can be pointers from an application,
iva2k 0:e614f7875b60 92 * the stack itself, or pbuf->next pointers from a chain.
iva2k 0:e614f7875b60 93 */
iva2k 0:e614f7875b60 94 u16_t ref;
iva2k 0:e614f7875b60 95
iva2k 0:e614f7875b60 96 };
iva2k 0:e614f7875b60 97
iva2k 0:e614f7875b60 98 /* Initializes the pbuf module. This call is empty for now, but may not be in future. */
iva2k 0:e614f7875b60 99 #define pbuf_init()
iva2k 0:e614f7875b60 100
iva2k 0:e614f7875b60 101 struct pbuf *pbuf_alloc(pbuf_layer l, u16_t size, pbuf_type type);
iva2k 0:e614f7875b60 102 void pbuf_realloc(struct pbuf *p, u16_t size);
iva2k 0:e614f7875b60 103 u8_t pbuf_header(struct pbuf *p, s16_t header_size);
iva2k 0:e614f7875b60 104 void pbuf_ref(struct pbuf *p);
iva2k 0:e614f7875b60 105 void pbuf_ref_chain(struct pbuf *p);
iva2k 0:e614f7875b60 106 u8_t pbuf_free(struct pbuf *p);
iva2k 0:e614f7875b60 107 u8_t pbuf_clen(struct pbuf *p);
iva2k 0:e614f7875b60 108 void pbuf_cat(struct pbuf *head, struct pbuf *tail);
iva2k 0:e614f7875b60 109 void pbuf_chain(struct pbuf *head, struct pbuf *tail);
iva2k 0:e614f7875b60 110 struct pbuf *pbuf_dechain(struct pbuf *p);
iva2k 0:e614f7875b60 111 err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from);
iva2k 0:e614f7875b60 112 u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset);
iva2k 0:e614f7875b60 113 err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len);
iva2k 0:e614f7875b60 114 struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer);
iva2k 0:e614f7875b60 115
iva2k 0:e614f7875b60 116 #ifdef __cplusplus
iva2k 0:e614f7875b60 117 }
iva2k 0:e614f7875b60 118 #endif
iva2k 0:e614f7875b60 119
iva2k 0:e614f7875b60 120 #endif /* __LWIP_PBUF_H__ */