GHOST系统之家 - Windows系统光盘下载网站!
当前位置:GHOST系统之家>系统教程 > 学习设备开发之Hi3861-TCPclient-开关灯-开关灯程序

学习设备开发之Hi3861-TCPclient-开关灯-开关灯程序

来源:Ghost系统之家浏览:时间:2023-08-25 08:58:27

学习设备开发之Hi3861-TCPclient-开关灯

作者:Z·y 2022-11-24 14:44:33系统 OpenHarmony 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 79 定义。

​​想了解更多关于开源的内容,请访问:​​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​

一、前言

学习OpenHarmony南向设备开发中的网络通信,它可以将底层开发板获得的数据传输到上层的服务器,服务器亦可通过网络通信控制底层开发板。

二、TCP简介

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 79 定义。TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

网络编程开发绕不开socket(套接字)的使用,socket就是整合好TCP/IP协议的一个工具。让我们无需过度关注于底层协议的实现,直接用封装好的socket就行了.

TCP服务器端与TCP客户端进行通信的流程????

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

三、分析代码

本次实验使用的是OpenHarmony1.0.0的源码:​​源码压缩包地址​​参考HiSpark WiFi-IoT 鸿蒙套件样例开发–网络编程(tcpclient)

1.导入样例

将润和提供的21_tcpclient开发样例文件夹复制到源码applications/sample/wifi-iot/app路径下:

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

在app路径下的BUILD.gn添加需要编译的静态库名称:tcpclient:net_demo。

import("//build/lite/config/component/lite_component.gni")lite_component("app") {features = ["startup","tcpclient:net_demo",]}

静态库名称可在21_tcpclient文件夹下的BUILD.gn里查看。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

踩坑:一开始直接写静态库名net_demo是会报错的!

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

报错内容????一般都是BUILD.gn文件出现问题:

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

2、分析代码

demo_entry_cmsis.c : 鸿蒙liteos-m程序入口,支持Hi3861。demo_entry_posix.c :鸿蒙liteos-a和Unix系统程序入口,Hi3516、Hi3518、PC。net_common.h :系统网络接口头文件。net_demo.h :demo脚手架头文件。net_params.h :网络参数,包括WiFi热点信息,服务器IP、端口信息。tcp_client_test.c :TCP客户端。wifi_connecter.c :鸿蒙WiFi STA模式API的封装实现文件,比鸿蒙原始接口更容易使用。wifi_connecter.h :鸿蒙WiFi STA模式API的封装头文件,比鸿蒙原始接口更容易使用。

事先在net_params.h文件里修改WiFi的配置。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

程序入口:demo_entry_cmsis.c文件。

#include#include#include#include "iot_gpio.h"#include "ohos_init.h"#include "cmsis_os2.h"#include "net_demo.h"#include "net_params.h"#include "wifi_connecter.h"#define LED_TASK_GPIO 9static void NetDemoTask(void *arg) //一开始线程入口函数{(void)arg;WifiDeviceConfig config = {0};//表示用于连接到指定 Wi-Fi 设备的 Wi-Fi 站配置。IoTGpioInit(LED_TASK_GPIO); //初始化IO口,为后文点灯做准备IoTGpioSetDir(LED_TASK_GPIO, IOT_GPIO_DIR_OUT); //设置GPIO为输出模式// 准备AP的配置参数strcpy(config.ssid, PARAM_HOTSPOT_SSID); //从net_params.h拷贝WiFi的参数strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK);config.securityType = PARAM_HOTSPOT_TYPE; //配置WiFi的安全模式osDelay(10);int netId = ConnectToHotspot(&config); //连接热点int timeout = 10;while (timeout--) //等待10秒后开始执行NetDemoTest{printf("After %d seconds, I will start %s test!\r\n", timeout, GetNetDemoName());osDelay(100);}while (1){NetDemoTest(PARAM_SERVER_PORT, PARAM_SERVER_ADDR); //开始TCP连接,输入端口号,ip地址}printf("disconnect to AP ...\r\n");// DisconnectWithHotspot(netId);printf("disconnect to AP done!\r\n");}static void NetDemoEntry(void){osThreadAttr_t attr;attr.name = "NetDemoTask";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(NetDemoTask, NULL, &attr) == NULL){printf("[NetDemoEntry] Falied to create NetDemoTask!\n");}}SYS_RUN(NetDemoEntry);

①成功连接wifi后,接下来就是创建socket套接字准备进行TCP连接。

int sockfd = socket(AF_INET, SOCK_STREAM, 0); // AF_INET:IP 协议系列。SOCK_STREAM=1:TCP协议

跳转到socket的定义。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

domain:协议族(family),常用的协议族有 AFL INET(ipv4 )、AF INET6、AF LOCAL(或称AF UNIX, Unix成socket) AF ROUTE 等。协议族决定了 socket 的地址类型,在通信中必须采用对应的地址。type:指定 Socket 类型。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

流式 socket (SOCK STREAM)是一种面向连接的 Socket, 针对于面向连接的 TCP 服务应用。数据报式 socket(SOCK DGRAM) 是一种无连接的 Socket,对应于 无连接的 UDP 服务应用。protocol: 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。protocol 的值设为 0,系统会自动推演出应该使用什么协议。②配置struct sockaddr_in serverAddr = {0}; //描述互联网套接字地址的结构体serverAddr.sin_family = AF_INET; // AF_INET表示IPv4协议serverAddr.sin_port = htons(port); // 端口号,从主机字节序转为网络字节序if (inet_pton(AF_INET, host, &serverAddr.sin_addr) <= 0){ // 将主机IP地址从“点分十进制”字符串 转化为 标准格式(32位整数)printf("inet_pton failed!\r\n");goto do_cleanup;}

③与主机连接。

// 尝试和目标主机建立连接,连接成功会返回0 ,失败返回 -1if (connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){printf("connect failed!\r\n");goto do_cleanup;}printf("connect to server %s success!\r\n", host);

④连接成功后,发送数据给目标主机测试是否发送成功。

// 建立连接成功之后,这个TCP socket描述符 —— sockfd 就具有了 “连接状态”,发送、接收 对端都是 connect 参数指定的目标主机和端口retval = send(sockfd, request, sizeof(request), 0); //发送request给目标主机,成功会返回字符串长度 ,失败返回 -1if (retval < 0){printf("send request failed!\r\n");goto do_cleanup;}printf("send request{%s} %ld to server done!\r\n", request, retval);

⑤接收服务器发送过来的数据。

retval = recv(sockfd, &response, sizeof(response), 0);//接收目标主机的消息存入response,成功会返回字符串长度 ,失败返回 -1if (retval <= 0) {printf("send response from server failed or done, %ld!\r\n", retval);goto do_cleanup;}response[retval] = '\0';printf("recv response{%s} %ld from server done!\r\n", response, retval);

3、修改代码,实现开关灯操作

①在入口demo_entry_cmsis.c 文件中初始化LED灯的io口。代码在上文已贴出②tcp_client_test.c文件。由上文分析原始的代码可知:开发板(客户端)与主机(服务器)完成一次消息交互后就会关闭socket套接字,再关闭WiFi。所以可以把关闭套接字的函数(close(sockfd))注释掉,再加个while死循环即可。

#include#include#include#include "net_demo.h"#include "net_common.h"#define LED_TASK_GPIO 9static char request[] = "Hello";static char response[128] = "";void TcpClientTest(const char *host, unsigned short port){ssize_t retval = 0;int sockfd = socket(AF_INET, SOCK_STREAM, 0); // AF_INET:IP 协议系列。SOCK_STREAM=1:TCP协议struct sockaddr_in serverAddr = {0}; //描述互联网套接字地址的结构体serverAddr.sin_family = AF_INET; // AF_INET表示IPv4协议serverAddr.sin_port = htons(port); // 端口号,从主机字节序转为网络字节序if (inet_pton(AF_INET, host, &serverAddr.sin_addr) <= 0){ // 将主机IP地址从“点分十进制”字符串 转化为 标准格式(32位整数)printf("inet_pton failed!\r\n");goto do_cleanup;}// 尝试和目标主机建立连接,连接成功会返回0 ,失败返回 -1if (connect(sockfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){printf("connect failed!\r\n");goto do_cleanup;}printf("connect to server %s success!\r\n", host);// 建立连接成功之后,这个TCP socket描述符 —— sockfd 就具有了 “连接状态”,发送、接收 对端都是 connect 参数指定的目标主机和端口retval = send(sockfd, request, sizeof(request), 0); //发送request给目标主机,成功会返回字符串长度 ,失败返回 -1if (retval < 0){printf("send request failed!\r\n");goto do_cleanup;}printf("send request{%s} %ld to server done!\r\n", request, retval);while (1){retval = recv(sockfd, &response, sizeof(response), 0); //接收目标主机的消息存入response,成功会返回字符串长度 ,失败返回 -1if (retval <= 0){printf("send response from server failed or done, %ld!\r\n", retval);goto do_cleanup;}response[retval] = '\0';printf("recv response{%s} %ld from server done!\r\n", response, retval);if (response[0] == 'o' && response[1] == 'n'){IoTGpioSetOutputVal(LED_TASK_GPIO, 0); //开灯printf("The led is on\n");}if (response[0] == 'o' && response[1] == 'f' && response[2] == 'f'){IoTGpioSetOutputVal(LED_TASK_GPIO, 1); //关灯printf("The led is off\n");}}do_cleanup:printf("do_cleanup...\r\n");// close(sockfd);//关闭套接字}CLIENT_TEST_DEMO(TcpClientTest);

四、测试

1.安装netcat(一个非常强大的网络实用工具,可以用它来调试TCP/UDP应用程序)二选一:

Linux上:sudo apt-get install netcat。Windows上:Windows版netcat。

将解压出来的文件全部复制到C:\Windows\System32的文件夹下。

Windows+R cmd 打开命令行。输入nc 命令即可。

2.开始测试

先是PC机开启TCP服务端监听(我选择的是Windows启动netcat)。

-l: 开始监听。

-p:指定端口 (端口号必须保持一致,可在net_params.h文件配置)。

开发板烧录新的固件后rest启动后可观察到服务端接收到了客户端传输过来的数据"hello"。

开发板????一开始灯是亮的状态。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

PC服务端。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

服务端输入"off",可让开发板关灯,完成交互。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

继续开灯。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

五、总结

这次实践中还有一些地方不能完全理解,在net_demo.h文件中。

#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯-开源基础软件社区

为什么有这么多斜杠?

testFun是什么?它又是怎样跳转到tcp_client_test.c文件执行TcpClientTest()函数的呢?

​​想了解更多关于开源的内容,请访问:​​​

​​51CTO开源基础软件社区​​

​​https://ost.51cto.com​​。

责任编辑:jianghua 来源:51CTO开源基础软件社区 传输控制协议设备开发

推荐系统

  • 电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载

    电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载

    语言:中文版系统大小:2.98GB系统类型:Win8

    电脑公司Ghost Win8.1x32位纯净版V2022年7月版本集成了自2022流行的各种硬件驱动,首次进入系统即全部硬件已安装完毕。电脑公司Ghost Win8.1x32位纯净版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,精心挑选的系统维护工具,加上绿茶独有

  • 微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载

    语言:中文版系统大小:5.13GB系统类型:Win11

    微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化  1、保留 Edge浏览器。  2、隐藏“操作中心”托盘图标。  3、保留常用组件(微软商店,计算器,图片查看器等)。  5、关闭天气资讯。 

  • Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载

    语言:中文版系统大小:4.75GB系统类型:Win11

    Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件

  • windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化

  • 微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载

    语言:中文版系统大小:5.31GB系统类型:Win11

    微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载

  • 微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件

    语言:中文版系统大小:0MB系统类型:Win11

    微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为

  • 雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载

    语言:中文版系统大小:4.75GB系统类型:

    雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统

  • 雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO

    语言:中文版系统大小:5.91GB系统类型:Win7

    雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户