查看: 3527|回复: 4

[EVAL-WSN]6LowPan——UDP Server

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-8 16:17
  • 签到天数: 971 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-1-30 17:02:20 | 显示全部楼层 |阅读模式
    分享到:
    上期说了边界路由

    [EVAL-WSN]6LowPan——初步体验edge router(边界路由)
    https://www.cirmall.com/bbs/foru ... 2&fromuid=23447
    但没有体现其好处,在应用上,有 TCP客户端程序、TCP服务端程序、UDP客户端程序、UDP服务端程序四种类型

    Contiki 使用 TCP/IP 协议来收发网络数据,具体来说就是 uip 协议栈,实现TCP/UDP

    UDP 服务端程序

    UIP并没有专门的UDP服务函数,为了实现UDP服务的功能,UIP首先进行一次UDP连接,然后再进行服务监听处理,其函数如下,本质上就是一个宏定义,展开如下:
    #define udp_bind(conn, port) uip_udp_bind(conn, port)
    #define uip_udp_bind(conn, port) (conn)->lport = port

    传入参数是已经建立好的UDP连接和服务器端口,具体使用方法如下:
    server_conn = udp_new(NULL, UIP_HTONS(3001), NULL); /*远程端口*/
    udp_bind(server_conn, UIP_HTONS(3000));/*本节点服务器端口*/

    实现结果
    1.jpg

    Wireshark 对边界路由进行抓取(设置方法如下 http://blog.sina.com.cn/s/blog_7e7fa4c80102w93q.html


    2.jpg


    3.png
    1. #include "contiki.h"
    2. #include "contiki-lib.h"
    3. #include "contiki-net.h"

    4. #include <string.h>

    5. #define DEBUG DEBUG_PRINT
    6. #include "net/ip/uip-debug.h"

    7. #define UIP_IP_BUF   ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])

    8. #define MAX_PAYLOAD_LEN 120

    9. static struct uip_udp_conn *server_conn;

    10. PROCESS(udp_server_process, "UDP server process");
    11. AUTOSTART_PROCESSES(&resolv_process,&udp_server_process);
    12. /*---------------------------------------------------------------------------*/
    13. static void
    14. tcpip_handler(void)
    15. {
    16.   static int seq_id;
    17.   char buf[MAX_PAYLOAD_LEN];

    18.   if(uip_newdata()) {
    19.     ((char *)uip_appdata)[uip_datalen()] = 0;
    20.     PRINTF("Server received: '%s' from ", (char *)uip_appdata);
    21.     PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
    22.     PRINTF("\n");

    23.     uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr);
    24.     PRINTF("Responding with message: ");
    25.     sprintf(buf, "Hello from the server! (%d)", ++seq_id);
    26.     PRINTF("%s\n", buf);

    27.     uip_udp_packet_send(server_conn, buf, strlen(buf));
    28.     /* Restore server connection to allow data from any node */
    29.     memset(&server_conn->ripaddr, 0, sizeof(server_conn->ripaddr));
    30.   }
    31. }
    32. /*---------------------------------------------------------------------------*/
    33. static void
    34. print_local_addresses(void)
    35. {
    36.   int i;
    37.   uint8_t state;

    38.   PRINTF("Server IPv6 addresses: ");
    39.   for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
    40.     state = uip_ds6_if.addr_list[i].state;
    41.     if(uip_ds6_if.addr_list[i].isused &&
    42.        (state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
    43.       PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
    44.       PRINTF("\n");
    45.     }
    46.   }
    47. }
    48. /*---------------------------------------------------------------------------*/
    49. PROCESS_THREAD(udp_server_process, ev, data)
    50. {
    51. #if UIP_CONF_ROUTER
    52.   uip_ipaddr_t ipaddr;
    53. #endif /* UIP_CONF_ROUTER */

    54.   PROCESS_BEGIN();
    55.   PRINTF("UDP server started\n");

    56. #if RESOLV_CONF_SUPPORTS_MDNS
    57.   resolv_set_hostname("contiki-udp-server");
    58. #endif

    59. #if UIP_CONF_ROUTER
    60.   uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
    61.   uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
    62.   uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
    63. #endif /* UIP_CONF_ROUTER */

    64.   print_local_addresses();

    65.   server_conn = udp_new(NULL, UIP_HTONS(3001), NULL); /*远程端口*/
    66.   udp_bind(server_conn, UIP_HTONS(3000));/*本节点端口*/

    67.   while(1) {
    68.     PROCESS_YIELD();
    69.     if(ev == tcpip_event) {
    70.       tcpip_handler();
    71.     }
    72.   }

    73.   PROCESS_END();
    74. }
    75. /*---------------------------------------------------------------------------*/
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-7-14 09:10
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-2-1 08:50:36 | 显示全部楼层
    向大牛学习!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-2-1 08:57:39 | 显示全部楼层
    亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-7-8 16:17
  • 签到天数: 971 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2016-2-1 09:19:57 | 显示全部楼层
    糖悦之果飞 发表于 2016-2-1 08:57
    亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/ ...

    两边都要发?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-19 16:39
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2016-2-1 10:22:08 | 显示全部楼层
    dvd1478 发表于 2016-2-1 09:19
    两边都要发?

    都可以发的哈,经验频道一般是比较好的文章哈
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 18:08 , Processed in 0.134074 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.