梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发

鹴绛_Amon
发布于 2022-8-10 01:39
浏览
0收藏

第六章 网络应用开发

一、UDP客户端

1. UDP协议相关API介绍

socket.h接口简介:

这个socket.h中包含声明UDP协议相关接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

2. UDP客户端创建流程介绍

梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

3. 实现UDP客户端

打开“D3_iot_udp_client”工程的udp_client_demo.c文件, 可在代码中查看实现UDP客户端的代码
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

static void UDPClientTask(void)
{
	//服务器的地址信息
	struct sockaddr_in send_addr;
	socklen_t addr_length = sizeof(send_addr);
	char recvBuf[512];
	//连接Wifi
	WifiConnect("Hold", "0987654321");
	//创建socket
	if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 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.0.175");
	addr_length = sizeof(send_addr);
	while (1)
	{
		bzero(recvBuf, sizeof(recvBuf));
		//发送数据到服务远端
		sendto(sock_fd, send_data, strlen(send_data), 0, (struct sockaddr *)&send_addr, addr_length);
		//线程休眠一段时间
		sleep(10);
		//接收服务端返回的字符串
		recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr *)&send_addr, &addr_length);
		printf("%s:%d=>%s\n", inet_ntoa(send_addr.sin_addr), ntohs(send_addr.sin_port), recvBuf);
	}
	//关闭这个 socket
	close(sock_fd);
}

4. 测试UDP客户端

使用 Sockettool 创建UDP服务端用于测试
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区
工具下载地址:https://pan.baidu.com/s/13YlqQVzEa5ygcQeTSGQ_JA 提取码:1234

二、TCP服务端

1. TCP协议相关API介绍

socket.h接口简介:

这个socket.h中包含声明TCP协议相关接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

2. TCP服务端创建流程介绍

梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

3. 实现TCP服务端

打开“D4_iot_tcp_server”工程的tcp_server_demo.c文件 ,可以查看实现TCP服务的代码。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

//创建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");

4. 测试TCP服务端

使用 Sockettool 创建TCP客户端用于测试
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区
工具下载地址:https://pan.baidu.com/s/13YlqQVzEa5ygcQeTSGQ_JA 提取码:1234

三、TCP客户端

1. TCP协议相关API介绍

socket.h接口简介:

这个socket.h中包含声明TCP协议相关接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

2. TCP客户端创建流程介绍

梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

3. 实现TCP客户端

打开“D3_iot_udp_client”工程的udp_client_demo.c文件,修改部分代码即可实现TCP客户端。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

static void TCPClientTask(void)
{
	//服务器的地址信息
	struct sockaddr_in send_addr;
	socklen_t addr_length = sizeof(send_addr);
	char recvBuf[512];
	//连接Wifi
	WifiConnect("Hold", "0987654321");
	//创建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.0.175");
	addr_length = sizeof(send_addr);
	connect(sock_fd, (struct sockaddr *)&send_addr, addr_length);
	while (1)
	{
		bzero(recvBuf, sizeof(recvBuf));
		// send(sock_fd,);
		if ((ret = send(sock_fd, send_data, strlen(send_data), 0)) == -1)
		{
			perror("send : ");
		}
		if ((ret = recv(sock_fd, recvBuf, sizeof(recvBuf), 0)) == -1)
		{
			printf("recv error \r\n");
		}
		printf("recv :%s\r\n", recvBuf);
	}
	//关闭这个 socket
	close(sock_fd);
}

四、UDP服务端

1. UDP协议相关API介绍

socket.h接口简介:

这个socket.h中包含声明UDP协议相关接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

2. UDP服务端创建流程介绍

梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

3. 实现UDP服务端

打开“D4_iot_tcp_server”工程的tcp_server_demo.c文件,修改部分代码即可实现UDP服务端。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

static void UDPServerTask(void)
{
	//服务端地址信息
	struct sockaddr_in server_sock;
	//客户端地址信息
	struct sockaddr_in client_sock;
	socklen_t sin_size;
	//连接Wifi
	WifiConnect("Hold", "0987654321");
	//创建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(server_sock)) == -1)
	{
		perror("bind is error\r\n");
		exit(1);
	}
	//处理目标
	ssize_t ret;
	while (1)
	{
		sin_size = sizeof(struct sockaddr_in);
		bzero(recvbuf, sizeof(recvbuf));
		if ((ret = recvfrom(sock_fd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&client_sock, &sin_size)) == -1)
		{
			printf("recv error \r\n");
		}
		printf("recv :%s\r\n", recvbuf);
		if ((ret = sendto(sock_fd, buf, strlen(buf), 0, (struct sockaddr *)&client_sock, sizeof(client_sock))) == -1)
		{
			perror("send : ");
		}
	}
}

五、MQTT客户端

1. MQTT介绍

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区
Paho是IBM在2011年建立的Eclipse开源项目,该项目包含以C、Java、Python、Javascript等语言编写的可用客户端。
嵌入式C语言客户端开源地址:https://github.com/eclipse/paho.mqtt.embedded-c

2. Paho MQTT 文件目录介绍

梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

  • MQTTClient:封装MQTTPacket生成的高级别C++客户端程序。
  • MQTTClient-C:封装MQTTPacket生成的高级别C客户端程序
    • samples目录提供FreeRTOS和linux两个例程,分别支持FreeRTOS和Linux系统。
    • src目录提供MQTTClient的代码实现能力,以及用于移植到对应平台的网络驱动
  • MQTTPacket:提供MQTT数据包的序列化与反序列化,以及部分
    辅助函数。

3. 如何使用Paho MQTT

在MQTTClient.h中包含声明Paho MQTT相关接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

4. 实现MQTT客户端

打开“D5_iot_mqtt”工程的iot_mqtt.c文件,查看实现MQTT客户端的代码。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第六章 网络应用开发-鸿蒙开发者社区

NetworkConnect(&network, "192.168.0.175", 1883);
printf("MQTTClientInit ...\n");
MQTTClientInit(&client, &network, 2000, sendBuf, sizeof(sendBuf), readBuf, sizeof(readBuf));
MQTTString clientId = MQTTString_initializer;
clientId.cstring = "bearpi";
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.clientID = clientId;
data.willFlag = 0;
data.MQTTVersion = 3;
data.keepAliveInterval = 0;
data.cleansession = 1;
printf("MQTTConnect ...\n");
rc = MQTTConnect(&client, &data);
if (rc != 0) {
	printf("MQTTConnect: %d\n", rc);
	NetworkDisconnect(&network);
	MQTTDisconnect(&client);
	osDelay(200);
	goto begin;
}
printf("MQTTSubscribe ...\n");
rc = MQTTSubscribe(&client, "test", 2, messageArrived);
if (rc != 0) {
	printf("MQTTSubscribe: %d\n", rc);
	osDelay(200);
	goto begin;
}
while (++count)
{
	MQTTMessage message;
	char payload[30];
	message.qos = 2;
	message.retained = 0;
	message.payload = payload;
	sprintf(payload, "message number %d", count);
	message.payloadlen = strlen(payload);
	if ((rc = MQTTPublish(&client, "pubtopic", &message)) != 0)
	{
		printf("Return code from MQTT publish is %d\n", rc);
		NetworkDisconnect(&network);
		MQTTDisconnect(&client);
		goto begin;
	}
	osDelay(50);
}

收藏
回复
举报
回复
    相关推荐