1. FreeCoAP
- FreeCoAP
- Lenguaje de desarrollo: C
- Función: Cliente + Servidor + Proxy HTTP / CoAP
- 模块 : Transferencias centrales, DTLS, Blockwise
- Acuerdo de código abierto: BSD
- Enlace de descarga: https://github.com/keith-cullen/FreeCoAP ] ( https://github.com/keith-cullen/FreeCoAP )
- Plataforma de soporte: Linux (gnulinux)
2. Directorio de código fuente
├── build-aux
├── certs
├── docs
├── lib
│ ├── include
│ └── src
├── proxy
│ ├── common
│ │ ├── include
│ │ └── src
│ └── http_coap
│ ├── include
│ └── src
├── sample
│ ├── reg_client
│ ├── reg_server
│ ├── time_client
│ └── time_server
└── test
├── test_coap_client
├── test_coap_mem
├── test_coap_msg
├── test_coap_server
├── test_config
├── test_cross
├── test_data_buf
├── test_http_client
├── test_http_msg
├── test_lock
├── test_proxy_http_coap
├── test_thread
├── test_tls_client
├── test_tls_server
└── test_uri
3. Compilar
-
Crear script de instalación
cd /home/xxx/work/coap/FreeCoAP-master autoreconf --install
-
Compilar
-
Instalar gnutls en CentOs7
yum install gnutls* # 注意: 编译时,源代码中有include <gnutls/x509.h>,因此,还需要安装gnutls-develop # 或安装 yum install gnutls-develop # 查看头文件 ls /usr/include/gnutls/x509.h /usr/include/gnutls/x509.h # 创建libgnutls.so的软链接 cd /lib ln -s /usr/lib64/libgnutls.so.28.43.3 libgnutls.so
-
cd /home/xxx/work/coap/FreeCoAP-master mkdir bin ./configure --prefix=/home/xxx/work/coap/FreeCoAP-master/bin make make install # 查看输出 ll /home/xxx/work/coap/FreeCoAP-master/bin/lib/ -rw-r--r--. 1 root root 268930 4月 22 11:52 libfreecoap.a -rwxr-xr-x. 1 root root 988 4月 22 11:52 libfreecoap.la lrwxrwxrwx. 1 root root 20 4月 22 11:52 libfreecoap.so -> libfreecoap.so.0.0.5 lrwxrwxrwx. 1 root root 20 4月 22 11:52 libfreecoap.so.0 -> libfreecoap.so.0.0.5 -rwxr-xr-x. 1 root root 181304 4月 22 11:52 libfreecoap.so.0.0.5
Nota:
The FreeCoAP library built using this process requires GnuTLS and cannot be used without DTLS (编译依赖需要gnutls库,生成的freecoap库没有dtls不能使用)
-
-
Rutina
- Servidor de tiempo y cliente basado en CoAP / IPv4
$ cd FreeCoAP/sample/time_server $ make dtls=n $ ./time_server 0.0.0.0 10000 (In a different terminal) $ cd FreeCoAP/sample/time_client $ make dtls=n $ ./time_client 127.0.0.1 10000
- Servidor de tiempo y cliente basado en CoAP / DTLS / IPv4
$ cd FreeCoAP/sample/time_server $ make $ ./time_server 0.0.0.0 10000 (In a different terminal) $ cd FreeCoAP/sample/time_client $ make $ ./time_client 127.0.0.1 10000
- Servidor de tiempo y cliente basado en CoAP / IPv4
4. Prueba (servidor / cliente de hora)
-
Tasa de rendimiento del servidor y el cliente
Entorno: CentOS 7 64bit, PC, CPU Intel® Core ™ i3-6100 @ 3.70GHz
- 100,000 solicitudes consecutivas, 41254.12 veces / s
- 500.000 solicitudes consecutivas, 36922,16 veces / s
-
Problemas encontrados en la prueba
-
Comenta en main.c de time_client
ret = time_client_get_time(&client, buf, sizeof(buf)); if (ret < 0) { ... } /* sleep(1); */
La comunicación se interrumpe y se informa de un error "Mensaje incorrecto". Debug, la fuente del informe de error está en la función coap_client_exchange_con de coap_client.c
static int coap_client_exchange_con(coap_client_t *client, coap_msg_t *req, coap_msg_t *resp) { ssize_t num = 0; int ret = 0; /* wait for piggy-backed response in ack message * or ack message and separate response message */ coap_log_info("Expecting acknowledgement from host %s and port %s", client->server_host, client->server_port); coap_client_start_ack_timer(client); while (1) { ret = coap_client_listen_ack(client, req); ... if (coap_msg_get_msg_id(resp) == coap_msg_get_msg_id(req)) { if (coap_msg_get_type(resp) == COAP_MSG_ACK) { if (coap_msg_is_empty(resp)) { /* received ack message, wait for separate response message */ coap_log_info("Received acknowledgement from host %s and port %s", client->server_host, client->server_port); return coap_client_exchange_sep(client, req, resp); } else if (coap_client_match_token(req, resp)) /* 错误发生地: token不等 */ { return coap_client_handle_piggybacked_response(client, resp); } } else if (coap_msg_get_type(resp) == COAP_MSG_RST) { return -ECONNRESET; } coap_client_reject(client, resp); /* 错误报告地: Bad message */ return -EBADMSG; } else if (coap_client_match_token(req, resp))
Como se mencionó anteriormente, la causa raíz debe ser causada por no actualizar el token cuando el servidor responde a un ack, y está en proceso de depuración ...
-