梅科尔工作室-看鸿蒙设备开发实战14天笔记(五) 原创

发布于 2022-8-1 22:27
浏览
0收藏

小熊派HarmonyOS学习笔记(五)


WIFI AP热点

AP热点API

wifi_hotspot.h接口

接口名 功能描述
EnableHotspot 启用AP热点模式
DisableHotspot 禁用AP热点模式
SetHotspotConfig 设置指定的热点配置
GetHotspotConfig 获取指定的热点配置
IsHotspotActive 检查AP热点模式是否启用
GetStationList 获取连接到该热点的一系列STA
GetSignalLevel 获取接收信号强度和频率

WIFI STA联网

STA 联网API

接口名 功能描述
EnableWifi 启用Wifi STA 模式
DisableWifi 禁用Wifi STA 模式
IsWifiActive 检查Wifi STA模式是否启用
Scan 扫描热点信息
GetScanInfoList 获取所有扫描到的热点列表
AddDeviceConfig 配置连接到热点信息
GetDeviceConfigs 获取配置连接到热点信息
RemoveDevice 删除指定的热点配置信息
ConnectTo 接到指定的热点
Disconnect 断开Wifi连接
GetLinkedInfo 获取热点连接信息
GetDeviceMacAddress 获取设备的MAC地址

UDP客户端

UDP协议相关API

socket.h接口

接口名 功能
socket 创建套接字
sendto 将数据由指定的socket发送到远端主机
recvfrom 从远端主机接收UDP数据
close 关闭套接字

UDP客户端创建流程

梅科尔工作室-看鸿蒙设备开发实战14天笔记(五)-开源基础软件社区

测试UDP客户端

  1. 使用Socket tool创建UDP客户端
  2. 点击创建,选择UDP Server,输入8888端口号
  3. 接下来就可以在数据发送窗口输入数据

编译文件

使用以下指令编译文件

python build.py BearPi-HM_Nano

TCP服务端

TCP相关API

接口名 功能描述
socket 创建套接字
bind 为套接字关联了一个相应的地址与端口号
listen 将套接字设置为监听模式
accept 接受套接字上新的连接
recv 接收数据
send 发送数据
close 关闭套接字

TCP服务端创建流程

梅科尔工作室-看鸿蒙设备开发实战14天笔记(五)-开源基础软件社区

测试TCP服务端

  1. 使用Socket tool创建TCP客户端
  2. 选择TCP Client点击创建,烧录到板子后得到的ip地址填入对方IP的文本框,端口号填8888
  3. 点击连接,接下来就可以在数据发送文本框中输入信息

TCP客户端

TCP相关API

接口名 功能描述
socket 创建套接字
connect 连接到指定的主机
send 发送数据
recv 接收数据
close 接收关闭套接字

TCP客户端创建流程

梅科尔工作室-看鸿蒙设备开发实战14天笔记(五)-开源基础软件社区

代码

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"

#include "wifi_device.h"
#include "lwip/netifapi.h"
#include "lwip/api_shell.h"
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include "lwip/sockets.h"
#include "wifi_connect.h"

#define _PROT_ 8888

//在sock_fd 进行监听,在 new_fd 接收新的链接
int sock_fd;

int addr_length;
static const char *send_data = "Hello! I'm BearPi-HM_Nano TCP Client!\r\n";

static void TCPClientTask(void)
{
    //服务器的地址信息
    struct sockaddr_in send_addr;
    socklen_t addr_length = sizeof(send_addr);
    char recvBuf[512];
    //连接Wifi
    WifiConnect("CMCC-Qi4J", "123456789");
    //创建socket
    if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("create socket failed!\r\n");
        exit(1);
    }
    //初始化预连接的服务端地址
    send_addr.sin_family = AF_INET;
    send_addr.sin_port = htons(_PROT_);
    send_addr.sin_addr.s_addr = inet_addr("192.168.1.3");
    addr_length = sizeof(send_addr);
    connect(sock_fd, (struct sockaddr *)&send_addr, addr_length);

    while (1)
    {
        bzero(recvBuf, sizeof(recvBuf));
        send(sock_fd,send_data,strlen(send_data),0);
        recv(sock_fd,recvBuf,sizeof(recvBuf),0);
        printf("%s:%d=>%s\n",inet_ntoa(send_addr.sin_addr),ntohs(send_addr.sin_port),recvBuf);

    //关闭这个 socket
    closesocket(sock_fd);
    }
}
static void TCPClientDemo(void)
{
    osThreadAttr_t attr;

    attr.name = "TCPClientTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 10240;
    attr.priority = osPriorityNormal;

    if (osThreadNew((osThreadFunc_t)TCPClientTask, NULL, &attr) == NULL)
    {
        printf("[TCPClientDemo] Falied to create TCPClientTask!\n");
    }
}

APP_FEATURE_INIT(TCPClientDemo);

测试TCP客户端

  1. 使用Socket tool创建UDP客户端
  2. 点击创建,选择TCPServer,输入8888端口号
  3. 接下来就可以在数据发送窗口输入数据

UDP服务端

UDP协议API

接口名 功能描述
socket 创建套接字
bind 将ip和端口绑定到嵌套字
sendto 将数据由指定的socket发送对方主机
recvfrom 从指定主机接收UDP数据
close 关闭套接字

UDP服务端创建流程

梅科尔工作室-看鸿蒙设备开发实战14天笔记(五)-开源基础软件社区

代码

#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 UDP Server!";

static void UDPServerTask(void)
{
	//服务端地址信息
	struct sockaddr_in server_sock;

	//客户端地址信息
	struct sockaddr_in client_sock;
	int sin_size;

	struct sockaddr_in *cli_addr;

	//连接Wifi
	WifiConnect("CMCC-Qi4J", "123456789");

	//创建socket
	if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 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 = recvfrom(sock_fd, recvbuf, sizeof(recvbuf), 0,(struct sockaddr *)&client_sock, (socklen_t *)&sin_size)) == -1)
			{
				printf("recv error \r\n");
			}
			printf("recv :%s\r\n", recvbuf);
			// sleep(2);
			if ((ret = sendto(sock_fd, buf, strlen(buf) + 1, 0,(struct sockaddr *)&client_sock,sizeof(client_sock))) == -1)
			{
				perror("send : ");
			}

			// sleep(2);
		}

		close(new_fd);
	}
}

static void UDPServerDemo(void)
{
	osThreadAttr_t attr;

	attr.name = "UDPServerTask";
	attr.attr_bits = 0U;
	attr.cb_mem = NULL;
	attr.cb_size = 0U;
	attr.stack_mem = NULL;
	attr.stack_size = 10240;
	attr.priority = osPriorityNormal;

	if (osThreadNew((osThreadFunc_t)UDPServerTask, NULL, &attr) == NULL)
	{
		printf("[TCPServerDemo] Falied to create TCPServerTask!\n");
	}
}

APP_FEATURE_INIT(UDPServerDemo);

测试UDP服务端

  1. 使用Socket tool创建TCP客户端
  2. 选择UDPClient点击创建,烧录到板子后得到的ip地址填入对方IP的文本框,端口号填8888
  3. 点击连接,接下来就可以在数据发送文本框中输入信息

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2022-8-1 22:28:08修改
收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐