contiki udp 使用

1、用到的函数。服务器

  1.   获取链接函数     app

    struct uip_udp_conn * udp_new(const uip_ipaddr_t *ripaddr, uint16_t port, void *appstate) tcp

    参数: ripaddr -- 远端 ip函数

            port -- 远端端口ui

            appstate -- 链接过程当中须要用到的数据,该数据会以event中的data传递。spa

    返回值: uip_udp_conn -- udp的链接,但系统没有空闲的链接的时候,则返回NULL。code

  2. 端口绑定宏orm

    #define udp_bind(conn, port) uip_udp_bind(conn, port)server

    展开以下:进程

    #define uip_udp_bind(conn, port) (conn)->lport = port

  做用是绑定链接的本地端口。

   3.  数据发送函数

        void uip_udp_packet_send(struct uip_udp_conn *c, const void *data, int len)

        参数: c -- 使用udp_new分配的链接。

                data -- 须要发送的数据。

                len -- 须要发送的数据的长度。

        返回值:  void

2、udp server

#include "contiki.h"
#include "contiki-net.h"

struct uip_udp_conn *server_conn = NULL;
uint8_t buf[32];

#define UIP_IP_BUF   ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
#define UIP_UDP_BUF  ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len])

PROCESS(udp_server, "udp server");

PROCESS_THREAD(udp_server, ev, data)
{
    int len;
    PROCESS_BEGIN();
    
    // 分配链接
    // 分配链接的时候 server_conn 会记录当前的进程,以便有事件产生的时候调用该进程。
    // 若是下面的第二个参数不为0 (UIP_HTONS(0)),则该服务端只能接受到客户端的端口为该参数的数据。
    server_conn = udp_new(NULL, UIP_HTONS(0), NULL);
    
    // 设置监听端口
    udp_bind(server_conn, UIP_HTONS(3030));
    // 接收到数据
    while (1) {
        if (ev == tcpip_event) {
            // udp_new 函数中的 appstate 会跟 ev 一块儿传进来
            // 当接收到数据的时候 uip_newdata() > 0
    	    if (uip_newdata()) {
    	        // 收到的数据长度
    	        len = uip_datalen();
    	        if (len > 32)
    		    len = 32;
    	        // 获取客户端发送的数据
    	        memcpy(buf, uip_appdata, len);
    	    
    	        // 获取客户端的端口和 IP
    	        server_conn->rport = UIP_UDP_BUF->srcport;
    	        uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr);
    	    
    	        uip_udp_packet_send(server_conn, buf, len);
    	    
    	        // 发送数据后,若是不须要该客户端了,则须要释放该远程端口,否则会别的客户端不能链接上来
    	        uip_create_unspecified(&server_conn->ripaddr);
    	        server_conn->rport = 0;
    	    }
        }
    }
    PROCESS_END();
}


3、udp client

#include "contiki.h"
#include "contiki-net.h"

struct uip_udp_conn *client_conn = NULL;
uint8_t buf[32];

#define UIP_IP_BUF   ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
#define UIP_UDP_BUF  ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len])

PROCESS(udp_client, "udp client");

PROCESS_THREAD(udp_client, ev, data)
{
    static uip_ipaddr_t ipaddr;      // 服务器地址
    PROCESS_BEGIN();
    
    uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 1);
    // 分配链接
    // 设置服务器地址以及端口
    client_conn = udp_new(&ipaddr, UIP_HTONS(3030), NULL);
    
    // 若是server指定了客户端的端口,则须要调用下面函数
    // udp_bind(client_conn, UIP_HTONS(3031));
    
    buf[0] = 0x01
    uip_udp_packet_send(client_conn, buf, 1);
    
    // 当使用完该链接以后,则须要释放该链接,不然会致使conn分配完毕,不能再次分配
    uip_udp_remove(client_conn);
    PROCESS_END();
}
相关文章
相关标签/搜索