harmonyos网络编程 -凯发k8官方旗舰厅

参考网上连老师的tcp自己整理一套tcp服务端的开发,整体思路大概如下:1、tcp服务首先需要连接wifi,采用的是sta模式,在学习tcp之前已经对wifi的功能学习过了,代码也编写好了,所以直接封装一下拿来使用就ok!…

大家好,我是你的好朋友思创斯。网站凯发k8官方旗舰厅首页:https://ispacesoft.com

参考网上连老师的tcp自己整理一套tcp服务端的开发,整体思路大概如下:
1、tcp服务首先需要连接wifi,采用的是sta模式,在编写tcp服务端代码之前已经对wifi功能进行了学习,代码也编写好了,所以直接封装一下拿来使用就ok!!代码如下,在applications/sample/wifi-iot/app/下新建wifi_demo文件夹,然后新建wifi_sta_connect.h文件和wifi_sta_connect.c文件:

wifi_sta_connect.h

#ifndef _wifi_sta_connect_h
#define _wifi_sta_connect_h
        
extern int g_connected;
//wifi sta模式相关功能函数
void printlinkedinfo(wifilinkedinfo* info);
void onwificonnectionchanged(int state, wifilinkedinfo* info);
void onwifiscanstatechanged(int state, int size);
#endif

wifi_sta_connect.c

#include 
#include 
#include 
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifi_device.h"
#include "lwip/netifapi.h"
#include "lwip/api_shell.h"
#include "wifi_sta_connect.h"
void printlinkedinfo(wifilinkedinfo* info)
{ 
   
    if (!info) return;
    static char macaddress[32] = { 
   0};
    unsigned char* mac = info->bssid;
    snprintf(macaddress, sizeof(macaddress), "x:x:x:x:x:x",
        mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    printf("bssid: %s, rssi: %d, connstate: %d, reason: %d, ssid: %s\r\n",
        macaddress, info->rssi, info->connstate, info->disconnectedreason, info->ssid);
}
int g_connected = 0;
void onwificonnectionchanged(int state, wifilinkedinfo* info)
{ 
   
    if (!info) return;
    printf("%s %d, state = %d, info = \r\n", __function__, __line__, state);
    printlinkedinfo(info);
    if (state == wifi_state_avaliable) { 
   
        g_connected = 1;
    } else { 
   
        g_connected = 0;
    }
}
void onwifiscanstatechanged(int state, int size)
{ 
   
    printf("%s %d, state = %x, size = %d\r\n", __function__, __line__, state, size);
}

2、wifi功能模块封装的相对简单,后期如果需要更多的功能,在模块中添加即可,接下来就是tcp服务端代码的编写,其中需要调用wifi功能。
在applications/sample/wifi-iot/app下新建socket_demo文件夹,然后添加tcp_server_test.c文件
tcp_server_test.c

#include 
#include 
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifi_device.h"
#include "lwip/api_shell.h"
#include "hi_wifi_api.h"
#include "lwip/ip_addr.h"
#include "lwip/netifapi.h"
#include "lwip/sockets.h"
#include "wifi_sta_connect.h"
#define server_port_tcp 6666
#define tcp_backlog 10
/* 在sock_fd 进行监听,在 new_fd 接收新的链接 */
int sock_fd, new_fd;
char recvbuf[512];
char *buf = "hello! i'm server!";
int tcp_server_demo(void){ 

/* 自己的地址信息 */
struct sockaddr_in my_addr;
/* 连接者的地址信息*/
struct sockaddr_in their_addr;
int sin_size;
struct sockaddr_in *cli_addr;
printf("%s %d \r\n", __file__, __line__);
/* 1 、创建socket */
if((sock_fd = socket(af_inet, sock_stream, 0)) == -1)
{ 

printf("%s %d \r\n", __file__, __line__);
perror("socket is error\r\n");
exit(1);
}
/* 主机字节顺序 */
/* 协议 */
my_addr.sin_family = af_inet;
my_addr.sin_port = htons(6666);//设置你的端口号
/* 当前ip 地址写入 */
my_addr.sin_addr.s_addr = inaddr_any;
/* 将结构体其余的都清零 */
bzero(&(my_addr.sin_zero), 8);
printf("%s %d \r\n", __file__, __line__);
/* bind 绑定*/
if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{ 

printf("%s %d \r\n", __file__, __line__);
perror("bind is error\r\n");
exit(1);
}
printf("%s %d \r\n", __file__, __line__);
/* 开始监听 */
if(listen(sock_fd, tcp_backlog) == -1)
{ 

perror("listen is error\r\n");
exit(1);
}
printf("%s %d \r\n", __file__, __line__);
printf("start accept\n");
/* accept() 循环 */
while(1)
{ 

sin_size = sizeof(struct sockaddr_in);
printf("%s %d \r\n", __file__, __line__);
if((new_fd = accept(sock_fd, (struct sockaddr *)&their_addr, (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, &their_addr, sizeof(struct sockaddr));
}
//处理目标
ssize_t ret;
while(1)
{ 

printf("%s %d \r\n", __file__, __line__);
if((ret = recv(new_fd, recvbuf, sizeof(recvbuf), 0)) == -1){ 

printf("recv error \r\n");
return -1;
}
printf("recv :\r\n");
printf("%s", recvbuf);
printf("\r\n");
sleep(2);
if((ret = send(new_fd, buf, strlen(buf)  1, 0)) == -1)
{ 

perror("send : ");
}
sleep(2);
}
close(new_fd);
return 0;
}
}
void start_sta_mode(void){ 
 
wifierrorcode errcode;
wifievent eventlistener = { 

.onwificonnectionchanged = onwificonnectionchanged,  //连接状态改变
.onwifiscanstatechanged = onwifiscanstatechanged     //扫描状态变化
};
wifideviceconfig apconfig = { 
};
int netid = -1;
osdelay(10);
errcode = registerwifievent(&eventlistener); //注册wifi事件的回调函数
printf("registerwifievent: %d\r\n", errcode);
// setup your ap params
strcpy(apconfig.ssid, "*******");  //设置你的wifi名称
strcpy(apconfig.presharedkey, "*******");  //设置你的wifi密码
apconfig.securitytype = wifi_sec_type_psk;
while (1) { 

errcode = enablewifi();  //打开wifi设备的sta模式,使其可以扫描
printf("enablewifi: %d\r\n", errcode);
osdelay(10);
errcode = adddeviceconfig(&apconfig, &netid);  //增加wifi设备的配置,分配得到一个net id保存在netid中
printf("adddeviceconfig: %d\r\n", errcode);
g_connected = 0;
errcode = connectto(netid);
printf("connectto(%d): %d\r\n", netid, errcode);
while (!g_connected) { 

osdelay(10);
}
printf("g_connected: %d\r\n", g_connected);
osdelay(50);
// 联网业务开始
struct netif* iface = netifapi_netif_find("wlan0");
if (iface) { 

err_t ret = netifapi_dhcp_start(iface);
printf("netifapi_dhcp_start: %d\r\n", ret);
osdelay(200); // wait dhcp server give me ip
ret = netifapi_netif_common(iface, dhcp_clients_info_show, null);
printf("netifapi_netif_common: %d\r\n", ret);
}
// 模拟一段时间的联网业务
// int timeout = 60;
while (1) { 

// osdelay(100);
// printf("after %d seconds, i'll disconnect wifi!\n", timeout);
printf("ongoing iot business\n");
uint32_t result = tcp_server_demo();
if (result==0)
{ 

/* code */
printf("i'll disconnect wifi!\n");
break;
}
}
// 联网业务结束
err_t ret = netifapi_dhcp_stop(iface);
printf("netifapi_dhcp_stop: %d\r\n", ret);
disconnect(); // disconnect with your ap
removedevice(netid); // remove ap config
errcode = disablewifi();
printf("disablewifi: %d\r\n", errcode);
osdelay(200);
}
}
void tcpservertask(void* arg){ 

(void) arg;
start_sta_mode();
// tcp_server_demo();
}
void tcpserverentry(void){ 

osthreadattr_t attr;
attr.name = "tcpservertask";
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(tcpservertask, null, &attr) == null) { 

printf("[wificonnectdemo] falied to create tcpservertask!\n");
}
}
sys_run(tcpserverentry);

在applications/sample/wifi-iot/app下新建socket_demo文件夹,然后添加build.gn文件,这里需要把封装wifi功能模块的文件包含进去:
build.gn

static_library("socket_demo") { 

sources = [
"tcp_server_test.c",
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/interfaces/kits/wifiiot_lite",
"//foundation/communication/interfaces/kits/wifi_lite/wifiservice",
"//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include/",
"//foundation/communication/wifi_lite/interfaces/wifiservice",
"//applications/sample/wifi-iot/app/wifi_demo",
]
}

3、最后修改applications/sample/wifi-iot/app/build.gn文件:

import("//build/lite/config/component/lite_component.gni")
lite_component("app") { 

features = [
"wifi_demo",
"socket_demo",
]
}

4、最后编译烧录即可,自己可以编写一个tcp客户端去连接服务端进行测试,作为学习harmonyos的新手,还有许多不足,欢迎大家留言补充,共同学习成长!

凯发k8官方旗舰厅的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由思创斯整理,转载请注明出处:https://ispacesoft.com/4661.html

(0)

相关推荐

  • 零基础学鸿蒙编程-ui控件_roundprogressbar

    什么是roundprogressbarroundprogressbar是用于展示进度的圆形ui控件.1.基本用法效果图代码2.设置进度条颜色和粗细效果图代码

  • 怎样进行鸿蒙编程,在鸿蒙系统上使用mqtt编程[通俗易懂]

    我们使用的是pahomqtt软件包,这里介绍一下怎么使用mqtt协议编程。关于鸿蒙系统的mqtt移植好的软件包,相关github链接如下:https://gitee.com/qidiyun/harmony_mqtt这里提供一个简单的编程示例:这里我们使用mqttclient编程模型,他支持多任务多线程,非常适合用在鸿蒙系统上。1.网络初始化这里定义一个network结构体,然后指定我们的m…

  • harmonyos(鸿蒙)开发一文入门

    前言通过创建一个helloworld项目,运行起来之后,再来分析入门鸿蒙开发需要掌握的一些知识点。如您想直接通过凯发k8官方旗舰厅官网学习,我这里给您贴出凯发k8官方旗舰厅官网地址,或者你也可以先根据我的文章内容,看看是否对鸿蒙开发感兴趣再去凯发k8官方旗舰厅官网认真学习!知识凯发k8官方旗舰厅官网地址:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-00000010535823871创建项目打开开发工具devecostudio,选择file

  • 别找了,这可能是全网最全的鸿蒙(harmonyos)刷机指南!

    本文的目的是将鸿蒙2.0刷到润和hi3861、hi3516和hi3518开发板上。目前网上已经有很多关于刷鸿蒙2.0的文章,我整理了一下,并结合自己的经验,在本文中阐述了从配置环境,到编译…

  • 手把手教你写出第一个鸿蒙(harmonyos)程序

    运行完第一个app,真的有点鸿蒙(好懵)的感觉??就这??鸿蒙的开源地址:鸿蒙开源地址一、打开凯发k8官方旗舰厅官网harmonyos,源码编译请下载:源码编译器,开发应用请下载:huaweidevecostudio,开发环境需要配置好jdk、node.js,这个百度自己找!二、安装完成后,需要设置下sdk的安装位置。地址是可以修改成自己的路径,platforms和tools的勾全部打上!!!然后点击确定。三、创建第一个项目步骤如下图:它有支持三种类型的应用:tv设备应用、wearable

  • 太强了!华为自研鸿蒙编程语言,行业大佬都已经偷偷学起来了

    华为开发者大会2021(together)上,harmonyos3开发者预览版正式发布,华为鸿蒙又是一个历史性的进步啊,而且,华为还表示,将发布自研鸿蒙编程语言!!!编程语言是什么?这其实是一个离消费者更加遥远的话题,很容易让人忽略它的重要性。编程语言呢是一种计算机和人都能识别的语言,能够让程序员准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。编程语言是计算机科学与应用中一个基础的工具,但截至目前市面上尚无中国企业主导开发的主流编程语言,在其他底层

  • 零基础学鸿蒙编程-ui控件_dependentlayout

    什么是dependentlayoutdependentlayout又称依赖布局,是鸿蒙开发中几个常用的布局之一,使用频率最高.支持相对于父控件或同级兄弟控件进行定位.基础样例1.相对父控件定位效果图代码

  • 零基础学鸿蒙编程-关系数据库[通俗易懂]

    什么是关系数据库鸿蒙关系数据库是适合在移动设备上使用的轻量型关系型数据库,速度快,占用空间小.与轻量数据库适合存储少量简单类型数据相反,关系数据库适合存储大量复杂类型的数据.基础样例拷贝数据库相关依赖jar到工程目录下文件:orm_annotations_java.jar和orm_annotations_processor_java.jar存放目录样例:d:\programfiles\huawei\sdk\java\3.0.0.0\build-tools\lib拷贝到工程entry目

发表回复

您的电子邮箱地址不会被公开。

联系凯发k8官方旗舰厅

关注“java架构师必看”公众号

回复4,添加站长微信。

附言:ispacesoft.com网而来。

关注微信
网站地图