TA的每日心情 | 奋斗 2023-7-8 16:17 |
---|
签到天数: 971 天 连续签到: 1 天 [LV.10]以坛为家III
|
上期说了边界路由
[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));/*本节点服务器端口*/
实现结果
Wireshark 对边界路由进行抓取(设置方法如下 http://blog.sina.com.cn/s/blog_7e7fa4c80102w93q.html)
- #include "contiki.h"
- #include "contiki-lib.h"
- #include "contiki-net.h"
- #include <string.h>
- #define DEBUG DEBUG_PRINT
- #include "net/ip/uip-debug.h"
- #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
- #define MAX_PAYLOAD_LEN 120
- static struct uip_udp_conn *server_conn;
- PROCESS(udp_server_process, "UDP server process");
- AUTOSTART_PROCESSES(&resolv_process,&udp_server_process);
- /*---------------------------------------------------------------------------*/
- static void
- tcpip_handler(void)
- {
- static int seq_id;
- char buf[MAX_PAYLOAD_LEN];
- if(uip_newdata()) {
- ((char *)uip_appdata)[uip_datalen()] = 0;
- PRINTF("Server received: '%s' from ", (char *)uip_appdata);
- PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
- PRINTF("\n");
- uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr);
- PRINTF("Responding with message: ");
- sprintf(buf, "Hello from the server! (%d)", ++seq_id);
- PRINTF("%s\n", buf);
- uip_udp_packet_send(server_conn, buf, strlen(buf));
- /* Restore server connection to allow data from any node */
- memset(&server_conn->ripaddr, 0, sizeof(server_conn->ripaddr));
- }
- }
- /*---------------------------------------------------------------------------*/
- static void
- print_local_addresses(void)
- {
- int i;
- uint8_t state;
- PRINTF("Server IPv6 addresses: ");
- for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
- state = uip_ds6_if.addr_list[i].state;
- if(uip_ds6_if.addr_list[i].isused &&
- (state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
- PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
- PRINTF("\n");
- }
- }
- }
- /*---------------------------------------------------------------------------*/
- PROCESS_THREAD(udp_server_process, ev, data)
- {
- #if UIP_CONF_ROUTER
- uip_ipaddr_t ipaddr;
- #endif /* UIP_CONF_ROUTER */
- PROCESS_BEGIN();
- PRINTF("UDP server started\n");
- #if RESOLV_CONF_SUPPORTS_MDNS
- resolv_set_hostname("contiki-udp-server");
- #endif
- #if UIP_CONF_ROUTER
- uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
- uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
- uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
- #endif /* UIP_CONF_ROUTER */
- print_local_addresses();
- server_conn = udp_new(NULL, UIP_HTONS(3001), NULL); /*远程端口*/
- udp_bind(server_conn, UIP_HTONS(3000));/*本节点端口*/
- while(1) {
- PROCESS_YIELD();
- if(ev == tcpip_event) {
- tcpip_handler();
- }
- }
- PROCESS_END();
- }
- /*---------------------------------------------------------------------------*/
复制代码 |
|