#盲盒+码#【FFH】学习设备开发之Hi3861-TCPclient-开关灯 原创 精华
目录
【本文正在参加「盲盒」+码有奖征文活动】:https://ost.51cto.com/posts/19288
一、前言
学习OpenHarmony南向设备开发中的网络通信,它可以将底层开发板获得的数据传输到上层的服务器,服务器亦可通过网络通信控制底层开发板。
二、TCP简介
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 79 定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
网络编程开发绕不开socket(套接字)的使用,socket就是整合好TCP/IP协议的一个工具。让我们无需过度关注于底层协议的实现,直接用封装好的socket就行了
TCP服务器端与TCP客户端进行通信的流程👇
三、分析代码
本次实验使用的是OpenHarmony1.0.0的源码:源码压缩包地址
参考HiSpark WiFi-IoT OpenHarmony套件样例开发–网络编程(tcpclient)
1.导入样例
将润和提供的21_tcpclient开发样例文件夹复制到源码applications/sample/wifi-iot/app路径下
在app路径下的BUILD.gn添加需要编译的静态库名称:tcpclient:net_demo
静态库名称可在21_tcpclient文件夹下的BUILD.gn里查看
!!!踩坑:一开始直接写静态库名net_demo是会报错的!!!
报错内容👇一般都是BUILD.gn文件出现问题:
2.分析代码
- demo_entry_cmsis.c : OpenHarmonyliteos-m程序入口,支持Hi3861
- demo_entry_posix.c :OpenHarmonyliteos-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 :OpenHarmonyWiFi STA模式API的封装实现文件,比OpenHarmony原始接口更容易使用
- wifi_connecter.h :OpenHarmonyWiFi STA模式API的封装头文件,比OpenHarmony原始接口更容易使用
事先在net_params.h文件里修改WiFi的配置
程序入口:demo_entry_cmsis.c文件👇
①成功连接wifi后,接下来就是创建socket套接字准备进行TCP连接
跳转到socket的定义
- domain:协议族(family),常用的协议族有 AFL INET(ipv4 )、AF INET6、AF LOCAL(或称AF UNIX, Unix成socket) AF ROUTE 等。协议族决定了 socket 的地址类型,在通信中必须采用对应的地址。
- type:指定 Socket 类型。
流式 socket (SOCK STREAM)是一种面向连接的 Socket, 针对于面向连接的 TCP 服务应用。数据报式 socket(SOCK DGRAM) 是一种无连接的 Socket,对应于 无连接的 UDP 服务应用。 - protocol: 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。protocol 的值设为 0,系统会自动推演出应该使用什么协议
②配置
③与主机连接
④连接成功后,发送数据给目标主机测试是否发送成功
⑤接收服务器发送过来的数据
3.修改代码,实现开关灯操作
①在入口demo_entry_cmsis.c 文件中初始化LED灯的io口
代码在上文已贴出
②tcp_client_test.c文件
由上文分析原始的代码可知:开发板(客户端)与主机(服务器)完成一次消息交互后就会关闭socket套接字,再关闭WiFi。
所以可以把关闭套接字的函数(close(sockfd))注释掉,再加个while死循环即可
四、测试
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"
开发板👇一开始灯是亮的状态
PC服务端👇
服务端输入"off",可让开发板关灯,完成交互。
继续开灯
五、总结
这次实践中还有一些地方不能完全理解,在net_demo.h文件中
为什么有这么多斜杠?
testFun是什么?它又是怎样跳转到tcp_client_test.c文件执行TcpClientTest()函数的呢?
同好奇,有大佬能说下为啥文件会有这么多斜杠吗
这个点灯很牛
直接用封装好的确实方便,造轮子太痛苦了