鸿蒙Hi3861学习十四-Huawei LiteOS-M(AP模式)

news2025/1/19 3:14:39

一、简介

        参看上一章:鸿蒙Hi3861学习十四-Huawei LiteOS-M(STA模式)_t_guest的博客-CSDN博客

二、API介绍

      RegisterWifiEvent

        函数功能:

        为指定的WIFI事件注册回调函数。当WIFIEVENT中定义的WIFI事件发生时,将调用已注册的回调函数。

        函数原型:

WifiErrorCode RegisterWifiEvent(WifiEvent* event)

        参数:

        event:相关事件,结构体为WifiEvent。

typedef struct {
    /** Connection state change */
    void (*OnWifiConnectionChanged)(int state, WifiLinkedInfo* info);
    /** Scan state change */
    void (*OnWifiScanStateChanged)(int state, int size);
    /** Hotspot state change */
    void (*OnHotspotStateChanged)(int state);
    /** Station connected */
    void (*OnHotspotStaJoin)(StationInfo* info);
    /** Station disconnected */
    void (*OnHotspotStaLeave)(StationInfo* info);
} WifiEvent;

         OnWifiConnectionChanged:网络连接状态改变回调。与STA有关。具体含义见上一章。

        OnWifiScanStateChanged:扫描结果回调。与STA有关。具体含义见上一章。

        OnHotspotStateChanged:热点状态改变回调,即热点创建时的回调与AP有关。state热点状态。WIFI_HOTSPOT_ACTIVE(1)热点已创建成功。WIFI_HOTSPOT_NOT_ACTIVE(0)热点已关闭。

        OnHotspotStaJoin有STA连接回调与AP有关。info为连接上的STA相关信息。

typedef struct {
    /** MAC address. For its length, see {@link WIFI_MAC_LEN}. */
    unsigned char macAddress[WIFI_MAC_LEN];
    unsigned short disconnectedReason;
} StationInfo;

         macAddress:MAC地址

        disconnectedReason:断连原因

        OnHotspotStaLeaveSTA断开连接的回调,与AP有关。indo为连接上的STA相关信息。

        返回值:

        WIFI_SUCCESS:成功

        其他值:失败

        实例:

    WifiEvent g_wifiEventHandler = {0};

    //注册wifi事件的回调函数
    g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;  //STA连接的回调
    g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;    //STA断开连接的回调
    g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;    //热点状态改变的回调
    error = RegisterWifiEvent(&g_wifiEventHandler); //注册任务

     SetHotspotConfig

        函数功能:

        设置指定的热点配置

        函数原型:

WifiErrorCode SetHotspotConfig(const HotspotConfig* config)

        参数:

        config:热点配置参数。结构体类型为:HotspotConfig

typedef struct {
    /** Service set ID (SSID). For its length, see {@link WIFI_MAX_SSID_LEN}. */
    char ssid[WIFI_MAX_SSID_LEN];
    /** Security type */
    int securityType;
    /** Frequency band */
    int band;
    /** Channel number */
    int channelNum;
    /** Key. For its length, see {@link WIFI_MAX_SSID_LEN}. */
    char preSharedKey[WIFI_MAX_KEY_LEN];
} HotspotConfig;

         ssid:热点名

        securityType:加密类型,具体如下:

typedef enum {
    /** Invalid security type */
    WIFI_SEC_TYPE_INVALID = -1,
    /** Open */
    WIFI_SEC_TYPE_OPEN,
    /** Wired Equivalent Privacy (WEP) */
    WIFI_SEC_TYPE_WEP,
    /** Pre-shared key (PSK) */
    WIFI_SEC_TYPE_PSK,
    /** Simultaneous Authentication of Equals (SAE) */
    WIFI_SEC_TYPE_SAE,
} WifiSecurityType;

         band:带宽。2.4G还是5G

        channelNum:通道号

        preSharedKey:加密密钥。可不填。

        返回值:

        WIFI_SUCCESS:成功

        其他值:失败

        实例:

    WifiErrorCode error;
    HotspotConfig config = {0};

    strcpy(config.ssid, "Harmony_test_ap");   //设置SSID
    strcpy(config.preSharedKey, "0987654321");    //设置密码
    config.securityType = WIFI_SEC_TYPE_PSK;    //加密类型
    config.band = HOTSPOT_BAND_TYPE_2G; //频率类型
    config.channelNum = 7;  //信道

    error = SetHotspotConfig(&config);  //配置热点

      EnableHotspot

        函数功能:

        启用WIFI热点模式

        函数原型:

WifiErrorCode EnableHotspot(void)

        参数:

        无

        返回值:

        WIFI_SUCCESS:成功

        其他值:失败

        实例:

WifiErrorCode error;
error = EnableHotspot();    //使能热点

      IsHotspotActive

        函数功能:

        检查AP热点模式是否启用

        函数原型:

int IsHotspotActive(void)

        参数:

        无

        返回值:

#define WIFI_HOTSPOT_NOT_ACTIVE 0
#define WIFI_HOTSPOT_ACTIVE 1

        其他值:失败

        实例:

 if (IsHotspotActive() == WIFI_HOTSPOT_NOT_ACTIVE)
{}

      netifapi_netif_find

        函数功能:

        获取网络接口用于IP操作

        函数原型:

struct netif *netifapi_netif_find(const char *name);

        参数:

        name:网络接口名称。STA为“wlan0”AP为“ap0”。为什么是这俩,还没搞清楚。搞清楚后会回来补充。

        返回值:

        NULL:失败

        其他值:网络接口值。netif:LwIP网络接口

        实例:

struct netif *g_lwip_netif = NULL;
g_lwip_netif = netifapi_netif_find("ap0");  //获取网络借口,用于IP操作

      netifapi_netif_set_addr

        函数功能:

        设置SoftAp的DHCP服务器IP地址子网掩码网关参数

        函数原型:

err_t netifapi_netif_set_addr(struct netif *netif,
                        const ip4_addr_t *ipaddr,
                        const ip4_addr_t *netmask,
                        const ip4_addr_t *gw)

        参数:

        netif:网络接口。netifapi_netif_find获得。

        ipaddr:自身IP地址

        netmask:子网掩码

        gw:网关IP

        返回值:

        ERR_OK:成功

        其他值:失败

        实例:

struct netif *g_lwip_netif = NULL;
ip4_addr_t bp_gw;
ip4_addr_t bp_ipaddr;
ip4_addr_t bp_netmask;

IP4_ADDR(&bp_gw, 192, 168, 1, 1);           /* input your gateway for example: 192.168.1.1 */
IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1);       /* input your IP for example: 192.168.1.1 */
IP4_ADDR(&bp_netmask, 255, 255, 255, 0);    /* input your netmask for example: 255.255.255.0 */

err_t ret = netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw); //设置IP

      netifapi_dhcps_start

        函数功能:

        启动SoftAp的DHCP服务器

        函数原型:

err_t netifapi_dhcps_start(struct netif *netif, char *start_ip, u16_t ip_num)

        参数:

        netif:网络接口。netifapi_netif_find获得。

        start_ip:DHCP起始地址,默认0,自动分配

        ip_num:IP池数量,默认0,自动分配

        返回值:

        ERR_OK:成功

        其他值:失败

        实例:


struct netif *g_lwip_netif = NULL;
err_t ret = netifapi_dhcps_start(g_lwip_netif, 0, 0); //启动DHCP

      GetStationList

        函数功能:

        获取连接到该热点的一系列STA信息。注:该函数不能在OnHotspotStaJoin回调中使用

        函数原型:

WifiErrorCode GetStationList(StationInfo* result, unsigned int* size)

        参数:

        result:输出值,STA信息列表。

        size:输出值,列表中STA的数量

        返回值:

        WIFI_SUCCESS:成功

        其他值:失败

        实例:

StationInfo stainfo[WIFI_MAX_STA_NUM] = {0};
unsigned int size = 0;

error = GetStationList(stainfo, &size);

三、实例

        这里创建一个名为“Harmony_test_ap”的热点,供STA连接。

        在BUILD.gn中添加如下代码:

include_dirs = [
        "//utild/native/lite/include",
        "//base/iot_hardware/interfaces/kits/wifiiot_lite",
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//foundation/communication/interfaces/kits/wifi_lite/wifiservice",
        "//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include/",
        "src",
    ]
#include <stdio.h>
#include <string.h>
#include <unistd.h>

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

#include "wifi_device.h"
#include "wifi_hotspot.h"
#include "wifi_error_code.h"
#include "lwip/netifapi.h"

#define LOG_I(fmt, args...)   printf("<%8ld> - [AP]:"fmt"\r\n",osKernelGetTickCount(),##args);
#define LOG_E(fmt, args...)   printf("<%8ld>-[AP_ERR]>>>>>>>>>>>>:"fmt"\r\n",osKernelGetTickCount(), ##args);

#define AP_SSID "Harmony_test_ap"
#define AP_PSK  "123123123"

#define ONE_SECOND 1
#define DEF_TIMEOUT 15

static void OnHotspotStaJoinHandler(StationInfo *info);
static void OnHotspotStateChangedHandler(int state);
static void OnHotspotStaLeaveHandler(StationInfo *info);

static struct netif *g_lwip_netif = NULL;
WifiEvent g_wifiEventHandler = {0};
WifiErrorCode error;

/*STA加入的任务*/
static void HotspotStaJoinTask(void)
{
    static char macAddress[32] = {0};
    StationInfo stainfo[WIFI_MAX_STA_NUM] = {0};
    StationInfo *sta_list_node = NULL;
    unsigned int size = WIFI_MAX_STA_NUM;

    error = GetStationList(stainfo, &size);
    if (error != WIFI_SUCCESS)
    {
        LOG_E("HotspotStaJoin:get list fail, error is %d.\r\n", error);
        return;
    }
    sta_list_node = stainfo;
    for (uint32_t i = 0; i < size; i++, sta_list_node++)
    {
        unsigned char *mac = sta_list_node->macAddress;
        snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
        LOG_I("HotspotSta[%d]: macAddress=%s.\r\n", i, macAddress);
    }
}

/*STA连接的回调*/
static void OnHotspotStaJoinHandler(StationInfo *info)
{
    if (info == NULL)
    {
        LOG_E("HotspotStaJoin:info is null.\r\n");
    }
    else
    {
        LOG_I("New Sta Join\n");
        
        osThreadAttr_t attr;
        attr.name = "HotspotStaJoinTask";
        attr.attr_bits = 0U;
        attr.cb_mem = NULL;
        attr.cb_size = 0U;
        attr.stack_mem = NULL;
        attr.stack_size = 2048;
        attr.priority = 24;
        if (osThreadNew((osThreadFunc_t)HotspotStaJoinTask, NULL, &attr) == NULL)
        {
            LOG_E("HotspotStaJoin:create task fail!\r\n");
        }
    }
    return;
}

/*STA断开连接的回调*/
static void OnHotspotStaLeaveHandler(StationInfo *info)
{
    if (info == NULL) {
        LOG_E("HotspotStaLeave:info is null.\r\n");
    } 
    else {
        static char macAddress[32] = {0};
        unsigned char* mac = info->macAddress;
        snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
        LOG_I("HotspotStaLeave: macAddress=%s, reason=%d.\r\n", macAddress, info->disconnectedReason);
    }
    return;
}

/*热点状态改变的回调*/
static void OnHotspotStateChangedHandler(int state)
{
    LOG_I("HotspotStateChanged:state is %d.\r\n", state);
    if (state == WIFI_HOTSPOT_ACTIVE) {
        LOG_I("wifi hotspot active.\r\n");
    } else {
        LOG_I("wifi hotspot noactive.\r\n");
    }
}

/*WIFI AP 任务*/
static BOOL WifiAPTask(void)
{
    //延时2S便于查看日志
    osDelay(200);

    //注册wifi事件的回调函数
    g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;  //STA连接的回调
    g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;    //STA断开连接的回调
    g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;    //热点状态改变的回调
    error = RegisterWifiEvent(&g_wifiEventHandler); //注册任务
    if (error != WIFI_SUCCESS)
    {
        LOG_E("RegisterWifiEvent failed, error = %d.\r\n",error);
        return -1;
    }
    LOG_I("RegisterWifiEvent succeed!\r\n");
    //设置指定的热点配置
    HotspotConfig config = {0};

    strcpy(config.ssid, AP_SSID);   //设置SSID
    strcpy(config.preSharedKey, AP_PSK);    //设置密码
    config.securityType = WIFI_SEC_TYPE_PSK;    //加密类型
    config.band = HOTSPOT_BAND_TYPE_2G; //频率类型
    config.channelNum = 7;  //信道

    error = SetHotspotConfig(&config);  //配置热点
    if (error != WIFI_SUCCESS)
    {
        LOG_E("SetHotspotConfig failed, error = %d.\r\n", error);
        return -1;
    }
    LOG_I("SetHotspotConfig succeed!\r\n");

    //启动wifi热点模式
    error = EnableHotspot();    //使能热点
    if (error != WIFI_SUCCESS)
    {
        LOG_E("EnableHotspot failed, error = %d.\r\n", error);
        return -1;
    }
    LOG_I("EnableHotspot succeed!\r\n");

    //检查热点模式是否使能
    if (IsHotspotActive() == WIFI_HOTSPOT_NOT_ACTIVE)
    {
        LOG_E("Wifi station is not actived.\r\n");
        return -1;
    }
    LOG_I("Wifi station is actived!\r\n");

    //启动dhcp
    g_lwip_netif = netifapi_netif_find("ap0");  //获取网络借口,用于IP操作
    if (g_lwip_netif) 
    {
        ip4_addr_t bp_gw;
        ip4_addr_t bp_ipaddr;
        ip4_addr_t bp_netmask;

        IP4_ADDR(&bp_gw, 192, 168, 1, 1);           /* input your gateway for example: 192.168.1.1 */
        IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1);       /* input your IP for example: 192.168.1.1 */
        IP4_ADDR(&bp_netmask, 255, 255, 255, 0);    /* input your netmask for example: 255.255.255.0 */

        err_t ret = netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw); //设置IP
        if(ret != ERR_OK)
        {
            LOG_E("netifapi_netif_set_addr failed, error = %d.\r\n", ret);
            return -1;
        }
        LOG_I("netifapi_netif_set_addr succeed!\r\n");

        ret = netifapi_dhcps_start(g_lwip_netif, 0, 0); //启动DHCP
        if(ret != ERR_OK)
        { 
            LOG_E("netifapi_dhcp_start failed, error = %d.\r\n", ret);
            return -1;
        }
        LOG_I("netifapi_dhcps_start succeed!\r\n");

    }

    while(1)
    {
        osDelay(100);
    }
    return 0;
}

/*AP任务创建*/
void drv_ap_task_init(void)
{
    osThreadAttr_t attr;

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

    if (osThreadNew((osThreadFunc_t)WifiAPTask, NULL, &attr) == NULL)
    {
        LOG_E("Falied to create WifiAPTask!\r\n");
    }
}

        看结果:

         这里是用手机连接的,看一下手机界面的相关属性。

         可以看到,IP地址、MAC地址、加密类型、频率都与在程序里设置的相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL体系架构

一、 MySQL体系架构 MySQL体系架构可分为物理架构和逻辑架构。 1、MySQL物理体系架构 1.1 配置文件 auto.cnf: 配置了MySQL Server的UUIDmy.cnf: MySQL的配置文件 1.2 其他重要文件 -basedirdir_name: MySQL安装的二进制文件目录-datadirdir_name: MySQL的数据目录和-pid-…

使用 Conv1D-LSTM 进行时间序列预测:预测多个未来时间步【优化】

未优化之前的版本见下&#xff0c;作者当时主要是为Mark这个项目&#xff0c;未进行深入分析。 使用 Conv1D-LSTM 进行时间序列预测&#xff1a;预测多个未来时间步 Introduction 通常有许多时间序列预测方法&#xff0c;例如 ARIMA、SARIMA 和 Holtz-winters&#xff0c;但是…

计算机网络基础(子网划分)

文章目录 一、网络设备二、IP地址分类A类地址B类地址C类地址特殊IP地址 三、划分子网根据子网掩码判断主机数根据子网和主机判断子网掩码根据IP和子网掩码判断子网数 四、场景运用 一、网络设备 1.集线器&#xff08;hub&#xff09;&#xff1a;不可以隔离冲突域&#xff0c;…

Redis内存优化——ZSet类型介绍及底层原理详解

系列文章目录 Redis内存优化——String类型介绍及底层原理详解 Redis内存优化——Hash类型介绍及底层原理详解 Redis内存优化——List类型介绍及底层原理详解 Redis内存优化——Set类型介绍及底层原理详解 Redis内存优化——ZSet类型介绍及底层原理详解 文章目录 系列文章目录…

Ingress:k8s集群进出流量的总管

Ingress&#xff1a;k8s集群进出流量的总管 Service 对象&#xff0c;它是 Kubernetes 内置的负载均衡机制&#xff0c;使用静态 IP 地址代理动态变化的 Pod&#xff0c;支持域名访问和服务发现&#xff0c;是微服务架构必需的基础设施。 Service 很有用&#xff0c;但也只能说…

分享一个国内可用的ChatGPT网站,免费无限制,支持AI绘画 - AI 百晓生

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个AI爱好者&#xff0c;翻遍了各大基于ChatGPT的网站&#xff0c;终于找到一个免费&#xff01;免登陆&#xff01;手机电脑通用&#xff01;国内可直接对话的C…

使用apisix代理静态文件

前言 最近公司考虑用apisix作为公司网关并且部署到k8s上&#xff0c;我这边收到一个小任务&#xff1a;使用apisix代理静态文件 通过apisix官网了解到它构建于 NGINX ngx_lua 的技术基础之上&#xff0c;所以按理应该和nginx代理静态资源是一样的。因为是通过docker容器部署…

STM32-内部温度传感器实验

STM32内部是有温度传感器的&#xff0c;以F1为例&#xff0c;它的温度采集范围是-40度到125度&#xff0c;精度为正负2度&#xff0c;采样通道为ADC1_INI6&#xff0c;上电控制位为TSVREFE位。 温度计算方式为&#xff1a;T(摄氏度) (V25 - Vsense) / Avg_Slope 25&#xff…

数据库管理-第七十六期 如何升级19c RAC(20230516)

数据库管理 2023-05-16 第七十六期 如何升级19c RAC1 回头处理2 升级AHF3 升级GI及DB3.1 拷贝所需文件3.2 升级OPatch3.3 升级GI与DB3.4 应用SQL变更 4 升级OJVM4.1 解压补丁4.2执行补丁冲突检查&#xff1a;4.3 升级OJVM4.4 应用SQL变更 5 最终验证总结 第七十六期 如何升级19…

NC 人力薪酬管理怎么结账?

NC 人力薪酬管理结账流程 1、先在【薪资发放】节点选择相应的薪资方案进行查询操作&#xff0c;然后进行计算操作&#xff1b; 2、计算操作完后&#xff0c;再进行审核操作&#xff1b; 3、如果薪资方案勾选了“发放数据需要审批”属性&#xff0c;则需要在【发放申请】节点…

【NB 2023】从一般蛋白质语言模型中高效进化人类抗体

Efficient evolution of human antibodies from general protein language models 哈佛大学化学与化学生物学系和圣路易斯华盛顿大学的研究人员共同完成的一篇论文&#xff0c;发表在Nature Biotechnology上。 抗体是一种大分子&#xff0c;属于免疫球蛋白家族&#xff0c;它…

springboot 启动后,调用接口时报错404问题汇总(层层推进、超全面)

线上环境 确保项目启动成功 看到这条日志才能判定项目是启动成功的 确保controller类被成功注册到了springboot容器中 首先&#xff0c;按springboot的类扫描规则来说&#xff0c;启动类和被扫描的组件类应该要在同一包下的 验证策略 从springboot容器中尝试去获取到contro…

【Springboot】yaml配置文件多环境切换

关于配置文件的详细说明可以看官方文档&#xff1a; 24. Externalized Configuration 以下是个人学习过程中的笔记&#xff0c;如有错误&#xff0c;请多指教&#xff01; 目录 &#xff08;一&#xff09;配置文件 &#xff08;二&#xff09;yaml的概述及基本使用 yaml基本…

TCP与UDP相关知识(详细)

目录 一、UDP 和 TCP 的特点与区别 二、UDP 与TCP 首部格式 三、TCP 的三次握手和四次挥手 四、TCP 短连接和长连接的区别 五、TCP粘包、拆包及解决办法 六、TCP 可靠传输 七、TCP 滑动窗口 八、TCP 流量控制 九、TCP 拥塞控制 十、提供网络利用率 一、UDP 和 TCP 的特…

yolov8 pycharm运行(predict,不用command line)

yolov8就不介绍了&#xff0c;见主页 这里说下用pycharm运行。 代码参考segment页 from ultralytics import YOLO# Load a model model YOLO(yolov8n-seg.pt) # load an official model# Predict with the model results model(test_img.jpg) # predict on an image不通过…

Cube Map 系列之:手把手教你 实现 环境光贴图

什么是环境光贴图 下面先看两个例子&#xff1a; 使用左侧的纹理 渲染茶壶&#xff0c;得到茶壶对真实空间的反射效果 同样使用左侧的纹理&#xff0c;得到中心的球对四周物体的反射效果 所以&#xff0c;环境光贴图指的是通过构建物体周围世界的纹理&#xff0c;使用纹理贴…

25的大学生转行学云计算,能拿到10k+的月薪,是真的吗?

25的大学生转行学云计算&#xff0c;能拿到10k的月薪&#xff0c;是真的吗&#xff1f; 对于IT行业来说&#xff0c;月薪上万并不少见&#xff0c;毕竟互联网常年占据行业薪资排行榜首。作为技术行业&#xff0c;由于其发展的前沿性&#xff0c;引导性&#xff0c;也是作为其他…

26-2 vue-router

原始的方式好多东西需要我们自己去写&#xff0c;vue-router是一个集成好了的路由包&#xff0c;vue-router 官网 Vue Router | Vue.js 的官方路由 并非原始的东西就不好&#xff0c;只要是包就可能存在版本兼容问题&#xff0c;如果是简单的需求就建议用原始的方法 目录 1 …

如何进行远程控制电脑

电脑在我们日常生活中的作用是非常大的&#xff0c;尤其是在信息时代地位非常高。 其中&#xff0c;最常见、最具代表性的功能是实现远程控制功能。它可以直接解决一些问题&#xff0c;而不需要去现场&#xff0c;在一定程度上提高了工作效率。但是有很多朋友不知道如何实现远…

边缘计算盒子有哪些?边缘计算应用场景

边缘计算&#xff08;Edge Computing&#xff09;是一种分布式计算模型&#xff0c;旨在将数据处理和计算功能从中心数据中心移到数据源附近的边缘设备上。它的目标是在接近数据生成的地方进行实时数据处理和分析&#xff0c;减少数据传输延迟和网络拥塞&#xff0c;提高应用程…