Hi3861本就是颗带2.4G WiFi SoC芯片,所以WiFi功能是必须要测试的。
例程中最少有4个是带WiFi功能的,这次测试选择了D4 TCP服务器这个例程,进入D4_iot_tcp_server目录,打开主程序tcp_server_demo.c:
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "lwip/sockets.h"
#include "wifi_connect.h"
#define _PROT_ 8888
#define TCP_BACKLOG 10
//在sock_fd 进行监听,在 new_fd 接收新的链接
int sock_fd, new_fd;
char recvbuf[512];
char *buf = "Hello! I'm BearPi-HM_Nano TCP Server!";
static void TCPServerTask(void)
{
//服务端地址信息
struct sockaddr_in server_sock;
//客户端地址信息
struct sockaddr_in client_sock;
int sin_size;
struct sockaddr_in *cli_addr;
//连接Wifi
WifiConnect("Yaoyao", "88888888");
//创建socket
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket is error\r\n");
exit(1);
}
bzero(&server_sock, sizeof(server_sock));
server_sock.sin_family = AF_INET;
server_sock.sin_addr.s_addr = htonl(INADDR_ANY);
server_sock.sin_port = htons(_PROT_);
//调用bind函数绑定socket和地址
if (bind(sock_fd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr)) == -1)
{
perror("bind is error\r\n");
exit(1);
}
//调用listen函数监听(指定port监听)
if (listen(sock_fd, TCP_BACKLOG) == -1)
{
perror("listen is error\r\n");
exit(1);
}
printf("start accept\n");
//调用accept函数从队列中
while (1)
{
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sock_fd, (struct sockaddr *)&client_sock, (socklen_t *)&sin_size)) == -1)
{
perror("accept");
continue;
}
cli_addr = malloc(sizeof(struct sockaddr));
printf("accept addr\r\n");
if (cli_addr != NULL)
{
memcpy(cli_addr, &client_sock, sizeof(struct sockaddr));
}
//处理目标
ssize_t ret;
while (1)
{
if ((ret = recv(new_fd, recvbuf, sizeof(recvbuf), 0)) == -1)
{
printf("recv error \r\n");
}
printf("recv :%s\r\n", recvbuf);
sleep(2);
if ((ret = send(new_fd, buf, strlen(buf) + 1, 0)) == -1)
{
perror("send : ");
}
sleep(2);
}
close(new_fd);
}
}
从程序的定义部分可以看出来,使用的TCP端口号是8888,每次接收到客户端发送的数据后自动向客户端回送字符串“Hello! I'm BearPi-HM_Nano TCP Server!”。
主程序的流程是:首先通过WiFi获得IP地址(DHCP),然后创建Socket连接,进入循环等待客户端发起TCP连接请求,收到连接请求后,进入内循环接收数据,并向客户端发送数据。
将 sample目录下的build.gn文件做如下修改:
#"D1_iot_wifi_ap:wifi_ap",
#"D2_iot_wifi_sta_connect:wifi_sta_connect",
#"D3_iot_udp_client:udp_client",
"D4_iot_tcp_server:tcp_server",
#"D5_iot_mqtt:iot_mqtt",
#"D6_iot_cloud_oc:oc_mqtt",
#"D7_iot_cloud_onenet:onenet_mqtt",
#"D8_iot_cloud_oc_smoke:cloud_oc_smoke",
#"D9_iot_cloud_oc_light:cloud_oc_light",
#"D10_iot_cloud_oc_manhole_cover:cloud_oc_manhole_cover",
#"D11_iot_cloud_oc_infrared:cloud_oc_infrared",
#"D12_iot_cloud_oc_agriculture:cloud_oc_agriculture",
#"D13_iot_cloud_oc_gps:cloud_oc_gps",
也即注释掉其它例子程序,去掉D4的注释。
编译、烧写过程同前几篇。
打开串口终端,程序运行过程如下图所示:
连接指定的接入点,通过DHCP得到IP地址。
等待客户端发起TCP连接请求。
打开TCP UDP Socket调试工具,选择TCP Clent,点创建按钮,填写服务器的IP地址和端口号。
点连接按钮,很快显示连接成功。
此时串口终端也显示收到连接请求并成功建立了TCP连接。
在调试工具的数据发送编辑框输入要发送的数据,然后点“发送数据”按钮,提示窗口会提示已经发送的数据以及接收到的数据。
同时串口终端也会显示接收到的数据。