file-type

JupyterNotebook环境下的DS_HW数据分析

ZIP文件

下载需积分: 6 | 3.11MB | 更新于2025-01-08 | 165 浏览量 | 0 下载量 举报 收藏
download 立即下载
指向的是与数据科学或机器学习相关的家庭作业(Homework)任务。具体而言,该作业很可能是Jupyter Notebook格式,这是一种开放源代码的Web应用程序,允许用户创建和共享包含代码、方程、可视化和文本的文档。在数据科学领域,Jupyter Notebook因其交互性和可执行性,成为了进行数据分析、可视化、机器学习原型设计和教学的流行工具。 由于没有提供具体的描述内容,以下是对一般数据科学作业可能包含的知识点进行的概述。 ### 数据科学(Data Science)基础 数据科学是一门涉及多个学科领域的交叉学科,其中包括统计学、数学、计算机科学、信息科学、管理学等。数据科学家需要具备以下核心能力: - 数据采集:能够从各种来源收集数据,如数据库、文件、API或网络爬虫。 - 数据清洗:清洗数据以去除错误和不一致的部分,通常涉及数据预处理、数据标准化和归一化。 - 数据探索:分析数据集的基本特性,包括分布、相关性、缺失值等。 - 数据建模:应用统计学和机器学习技术对数据进行分析和构建模型。 - 数据可视化:利用图形和图表将数据的洞察转化为易于理解的格式。 ### Jupyter Notebook(朱庇特笔记本) Jupyter Notebook是一个开源Web应用程序,允许用户创建和共享包含代码、方程、可视化和说明性文本的文档,这些文档被称为“笔记本”。这些笔记本支持多种编程语言,并且可以实现以下功能: - 交互式编码:用户可以逐段执行代码,并实时查看输出结果。 - 即时反馈:在编写和运行代码的过程中,可以直接观察到代码产生的效果和结果。 - 文档和代码的结合:使得技术文档的撰写和代码的演示可以同时进行,非常适合教育和研究目的。 - 易于分享:笔记本文件可以被导出为HTML、PDF或其他格式,并通过邮件、版本控制系统等方式分享。 ### 作业(Homework)内容分析 尽管我们无法确切知道"DS_HW"作业的具体内容,但可以推测这可能包含以下几个方面的数据科学练习: - 编程练习:使用Python或R等编程语言进行数据处理和分析。 - 数据集分析:对提供的数据集进行探索性数据分析和可视化。 - 统计测试:执行统计检验,例如假设检验、回归分析等。 - 机器学习:训练简单的机器学习模型,如线性回归、决策树、K-近邻等,以及模型的评估和参数调优。 - 问题解决:根据实际问题设计和实现数据解决方案。 ### 知识点总结 - 数据采集与预处理技术,如Pandas库在Python中的应用。 - 数据可视化技能,例如使用Matplotlib或Seaborn库创建图表。 - 统计学基础,包括概率论、推断统计学和描述统计学。 - 机器学习算法的理解和实现,熟悉scikit-learn库是基础。 - 数据分析的思维和逻辑,能够根据业务问题设计分析策略。 - 报告和呈现技巧,通过Jupyter Notebook有效展示分析过程和结果。 Jupyter Notebook作为一种强大的工具,让数据科学的学习和实践更加直观和方便。对于想要深入理解数据科学概念和方法的学习者来说,通过完成作业(如"DS_HW")来应用所学知识是十分重要的实践过程。通过这些实践,学习者可以将理论知识转化为实际操作能力,为将来的数据科学工作打下坚实的基础。

相关推荐

filetype

import xarray as xr import numpy as np import os from tqdm import tqdm # -------------------------- # 配置参数 # -------------------------- PATHS = { 'heat': r"D:\heatwave\data\t\tmax\daily_HWD_events.nc", 'drought': r"D:\heatwave\data\precip\daily_drought_events.nc", 'output_dir': r"D:\heatwave\data\CHD", 'start_year': 1979, 'end_year': 2022 } # -------------------------- # 核心功能函数 # -------------------------- def load_and_align_data(): """加载并对齐数据""" print("\n正在加载数据...") # 分块加载数据 ds_heat = xr.open_dataset(PATHS['heat'], chunks={'time': 1000}) ds_drought = xr.open_dataset(PATHS['drought'], chunks={'time': 1000}).drought_flag # 坐标对齐检查 if not ds_heat.time.equals(ds_drought.time): print("警告:时间坐标不完全一致,将自动对齐") ds_drought = ds_drought.reindex_like(ds_heat, method='nearest') if not (ds_heat.lon.equals(ds_drought.lon) and ds_heat.lat.equals(ds_drought.lat)): raise ValueError("空间坐标不匹配,请检查输入数据") return ds_heat, ds_drought def calculate_composite_events(ds_heat, ds_drought): """计算复合事件""" print("\n计算逐日复合事件...") # 逻辑与运算 chd_daily = (ds_heat & ds_drought).astype(np.int8) chd_daily.name = "CHD_daily" # 添加元数据 chd_daily.attrs = { 'long_name': 'Compound Hot-Dry Events', 'description': '1表示当日同时发生极端高温和干旱事件', 'units': '0/1' } return chd_daily.to_dataset() def calculate_yearly_counts(chd_daily): """计算逐年事件频次""" print("\n统计逐年事件频次...") # 按年分组求和 years = range(PATHS['start_year'], PATHS['end_year']+1) yearly_counts = [] for year in tqdm(years, desc="处理年份"): try: year_data = chd_daily.sel(time=f"{year}-09").sum(dim='time') yearly_counts.append(year_data.expand_dims(year=[year])) except KeyError: print(f"警告:{year}年数据不完整,已跳过") continue return xr.concat(yearly_counts, dim='year') # -------------------------- # 主程序流程 # -------------------------- def main(): # 创建输出目录 os.makedirs(PATHS['output_dir'], exist_ok=True) # 步骤1:数据加载 ds_heat, ds_drought = load_and_align_data() # 步骤2:计算逐日复合事件 chd_daily = calculate_composite_events(ds_heat, ds_drought) daily_path = os.path.join(PATHS['output_dir'], "CHD_daily_events.nc") chd_daily.to_netcdf(daily_path) print(f"\n已保存逐日事件文件:{daily_path}") # 步骤3:计算逐年统计 chd_yearly = calculate_yearly_counts(chd_daily.CHD_daily) yearly_path = os.path.join(PATHS['output_dir'], "CHD_yearly_counts.nc") chd_yearly.to_netcdf(yearly_path) print(f"已保存逐年统计文件:{yearly_path}") # 步骤4:计算总频次 chd_total = chd_yearly.sum(dim='year') chd_total.name = "CHD_total" total_path = os.path.join(PATHS['output_dir'], "CHD_total_counts.nc") chd_total.to_netcdf(total_path) print(f"已保存总频次文件:{total_path}") # 结果验证 print("\n数据验证:") print("逐日事件数据结构:") print(chd_daily) print("\n逐年统计示例(2020年):") print(chd_yearly.sel(year=2020).CHD_daily) if __name__ == "__main__": main()报错AttributeError: cannot set attribute 'name' on a 'Dataset' object. Use __setitem__ styleassignment (e.g., `ds['name'] = ...`) instead of assigning variables.,帮我解决并输出完整代码

filetype

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <net/if.h> #include <arpa/inet.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <linux/if_arp.h> #include <sys/time.h> #include <errno.h> #define PROTO_ARP (0x0806) #define ETH2_HEADER_LEN (14) #define HW_TYPE (1) #define MAC_LENGTH (6) #define IPV4_LENGTH (4) #define ARP_REQUEST (0x01) #define ARP_REPLY (0x02) #define BUF_SIZE (60) #define MAX_IFNAME_LEN (16) #define MAX_IP_RANGE (256) #define ARP_PACKET_SIZE (1024) #define ARP_PATH (“arpsd/arp_config”) /* ARP头部结构 */ struct arp_header { unsigned short hardware_type; unsigned short protocol_type; unsigned char hardware_len; unsigned char protocol_len; unsigned short opcode; unsigned char sender_mac[MAC_LENGTH]; unsigned char sender_ip[IPV4_LENGTH]; unsigned char target_mac[MAC_LENGTH]; unsigned char target_ip[IPV4_LENGTH]; }; /* 扫描结果结构 / typedef struct arp_entry { char ip[16]; / IP地址 / char mac[18]; / MAC地址 / time_t timestamp; / 发现时间 */ } arp_result_t; /* 扫描配置参数 / typedef struct { U32 enable; / 功能开关 / U32 scan_cycle; / 扫描周期(秒) / U32 valid_time; / 有效期(秒) / U32 packet_interval; / 发包间隔(毫秒) / char start_ip[12]; / 起始IP / char end_ip[12]; / 结束IP / char ifname[MAX_IFNAME_LEN]; / 网络接口名 */ } arp_config_t; /* 扫描状态 / typedef enum { SCAN_IDLE, / 未运行 / SCAN_RUNNING, / 运行中 / SCAN_STOPPING / 停止中 */ } scan_status_t; LOCAL arp_config_t g_config = {0}; static scan_status_t g_scan_status = SCAN_IDLE; static pthread_t g_scan_thread; static arp_result_t g_results[MAX_IP_RANGE]; static int g_result_count = 0; static int g_scan_fd = -1; static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; /* 设置配置参数 */ LOCAL S32 set_arp_config_ubus(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { jso_obj_get_int(req_obj,“enable”,&g_config.enable); jso_obj_get_int(req_obj,“scan_cycle”,&g_config.scan_cycle); jso_obj_get_int(req_obj,“valid_time”,&g_config.valid_time); jso_obj_get_int(req_obj,“packet_interval”,&g_config.packet_interval); memcpy(g_config.start_ip, jso_obj_get_string_origin(req_obj, “start_ip”), INET_ADDRSTRLEN); memcpy(g_config.end_ip, jso_obj_get_string_origin(req_obj, “end_ip”), INET_ADDRSTRLEN); memcpy(g_config.ifname, jso_obj_get_string_origin(req_obj, “ifname”), INET_ADDRSTRLEN); ds_advanced_write(ARP_PATH, &g_config, sizeof(arp_config_t), DS_FLAG_NOTIFY); return OK; } /* 获取配置参数 */ LOCAL S32 get_arp_config_ubus(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { JSON_OBJPTR rsp_obj = NULL; if (NULL == (rsp_obj = jso_new_obj())) { return -1; } jso_add_int(rsp_obj, “enable”, g_config.enable); jso_add_int(rsp_obj, “scan_cycle”, g_config.scan_cycle); jso_add_int(rsp_obj, “valid_time”, g_config.valid_time); jso_add_int(rsp_obj, “packet_interval”, g_config.packet_interval); jso_add_string(rsp_obj, “start_ip”, g_config.start_ip); jso_add_string(rsp_obj, “end_ip”, g_config.end_ip); jso_add_string(rsp_obj, “start_ip”, g_config.start_ip); jso_add_string(rsp_obj, “ifname”, g_config.ifname); *rply_obj = rsp_obj; return OK; } LOCAL S32 start_scan_ubus(JSON_OBJPTR req_obj, JSON_OBJPTR rply_obj) { / 检查是否已在扫描 */ if (g_scan_status != SCAN_IDLE) { return -1; } /* 检查功能是否启用 */ if (!g_config.enable) { return -1; } /* 创建扫描线程 */ g_scan_status = SCAN_RUNNING; if (pthread_create(&g_scan_thread, NULL, scan_thread, NULL) != 0) { g_scan_status = SCAN_IDLE; pthread_mutex_unlock(&g_mutex); return -1; } return OK; } LOCAL S32 stop_scan_ubus(JSON_OBJPTR req_obj, JSON_OBJPTR rply_obj) { / 检查是否有扫描在运行 */ if (g_scan_status != SCAN_RUNNING) { return -1; } /* 设置停止标志 */ g_scan_status = SCAN_STOPPING; g_config.enable = 0; /* 等待线程结束 */ pthread_join(g_scan_thread, NULL); return OK; } LOCAL S32 get_scan_status_ubus(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { JSON_OBJPTR rsp_obj = NULL; if (NULL == (rsp_obj = jso_new_obj())) { return -1; } jso_add_int(rsp_obj, “scan_status”, g_scan_status); *rply_obj = rsp_obj; return OK; } LOCAL S32 get_scan_result_ubus(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { arp_result_t arp_result[MAX_IP_RANGE]; S32 index = 0; if (0 != g_result_count) { for (index = 0; index < g_result_count; index++) { JSON_OBJPTR rsp_obj = NULL; if (NULL == (rsp_obj = jso_new_obj())) { return -1; } inet_ntop(AF_INET, g_results[index].ip, arp_result[index].ip, sizeof(arp_result[index].ip)); sprintf(arp_result[index].mac, 18, “%02X:%02X:%02X:%02X:%02X:%02X”, g_results[index].mac[0], g_results[index].mac[1], g_results[index].mac[2], g_results[index].mac[3], g_results[index].mac[4], g_results[index].mac[5]); jso_add_string(rsp_obj, “IP”, arp_result[index].ip); jso_add_string(rsp_obj, “MAC”, arp_result[index].mac); *rply_obj = rsp_obj; } } else { return -1; } return OK; } int clear_result_ubus(JSON_OBJPTR req_obj, JSON_OBJPTR *rply_obj) { g_result_count = 0; return OK; } LOCAL DMS_CMD_METHOD arpsd_method[] = { DMS_CMD_METHOD_DESC(“set_arp_config”, set_arp_config_ubus), DMS_CMD_METHOD_DESC(“get_arp_config”, get_arp_config_ubus), DMS_CMD_METHOD_DESC(“start_scan”, start_scan_ubus), DMS_CMD_METHOD_DESC(“stop_scan”, stop_scan_ubus), DMS_CMD_METHOD_DESC(“get_scan_status”, get_scan_status_ubus), DMS_CMD_METHOD_DESC(“get_scan_result”, get_scan_result_ubus), DMS_CMD_METHOD_DESC(“clear_result”, clear_result_ubus), }; LOCAL DMS_CMD_OBJ_CMD arpsd_cmd[] = { DMS_CMD_OBJ_CMD_DESC(“arpsd”, arpsd_method), }; /* 注册ubus模块 */ LOCAL DMS_CMD_OBJ arpsd_call_obj = DMS_CMD_OBJ_DESC(“arpsd”, arpsd_cmd); LOCAL int arpsd_cmd_call_handle(dms_handler_t *handler, U8 *mbuf, U32 mlen, U32 sender_dms_id) { return dms_cmd_msg_parse(handler, mbuf, mlen, sender_dms_id, &arpsd_call_obj); } LOCAL int get_if_info(const char *ifname, uint32_t *ip, unsigned char *mac, int *ifindex) { struct ifreq ifr; int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { return -1; } /* 获取接口索引 */ strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1); if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) { close(sock); return -1; } *ifindex = ifr.ifr_ifindex; /* 获取MAC地址 */ if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0) { close(sock); return -1; } memcpy(mac, ifr.ifr_hwaddr.sa_data, 6); /* 获取IP地址 */ if (ioctl(sock, SIOCGIFADDR, &ifr) < 0) { close(sock); return -1; } struct sockaddr_in *ipaddr = (struct sockaddr_in *)&ifr.ifr_addr; *ip = ipaddr->sin_addr.s_addr; close(sock); return 0; } LOCAL int send_arp_request(int fd, int ifindex, const unsigned char *src_mac, uint32_t src_ip, uint32_t dst_ip) { int err = -1; unsigned char buffer[BUF_SIZE]; memset(buffer, 0, sizeof(buffer)); struct sockaddr_ll socket_address; socket_address.sll_family = AF_PACKET; socket_address.sll_protocol = htons(ETH_P_ARP); socket_address.sll_ifindex = ifindex; socket_address.sll_hatype = htons(ARPHRD_ETHER); socket_address.sll_pkttype = (PACKET_BROADCAST); socket_address.sll_halen = MAC_LENGTH; socket_address.sll_addr[6] = 0x00; socket_address.sll_addr[7] = 0x00; struct ethhdr *send_req = (struct ethhdr *) buffer; struct arp_header *arp_req = (struct arp_header *) (buffer + ETH2_HEADER_LEN); int index; ssize_t ret, length = 0; /* 广播 */ memset(send_req->h_dest, 0xff, MAC_LENGTH); memset(arp_req->target_mac, 0x00, MAC_LENGTH); /* 设置源地址 */ memcpy(send_req->h_source, src_mac, MAC_LENGTH); memcpy(arp_req->sender_mac, src_mac, MAC_LENGTH); memcpy(socket_address.sll_addr, src_mac, MAC_LENGTH); send_req->h_proto = htons(ETH_P_ARP); /* 建立ARP请求 */ arp_req->hardware_type = htons(HW_TYPE); arp_req->protocol_type = htons(ETH_P_IP); arp_req->hardware_len = MAC_LENGTH; arp_req->protocol_len = IPV4_LENGTH; arp_req->opcode = htons(ARP_REQUEST); memcpy(arp_req->sender_ip, &src_ip, sizeof(uint32_t)); memcpy(arp_req->target_ip, &dst_ip, sizeof(uint32_t)); ret = sendto(fd, buffer, 42, 0, (struct sockaddr *) &socket_address, sizeof(socket_address)); if (ret == -1) { perror("sendto():"); goto out; } err = 0; out: return err; } /* 接收ARP响应 */ LOCAL int recv_arp_response(int fd, const char *expected_ip, char *mac_buf, int timeout_s) { unsigned char buffer[ARP_PACKET_SIZE]; struct timeval tv = { .tv_sec = timeout_s, .tv_usec = (timeout_s - 1) * 1000 }; setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); ssize_t len = recv(fd, buffer, sizeof(buffer), 0); if (len < (ssize_t)(ETH2_HEADER_LEN + sizeof(struct arp_header))) { return -1; /* 超时或错误 */ } /* 解析ARP响应 */ struct arp_header *arp = (struct arp_header *)(buffer + ETH2_HEADER_LEN); if (ntohs(arp->opcode) != ARPOP_REPLY) { return -1; /* 不是ARP响应 */ } /* 检查IP是否匹配 */ struct in_addr expected_addr, sender_addr; inet_aton(expected_ip, &expected_addr); memcpy(&sender_addr, arp->sender_ip, 4); if (sender_addr.s_addr != expected_addr.s_addr) { return -1; /* IP不匹配 */ } /* 格式化MAC地址 */ snprintf(mac_buf, 18, "%02x:%02x:%02x:%02x:%02x:%02x", arp->sender_mac[0], arp->sender_mac[1], arp->sender_mac[2], arp->sender_mac[3], arp->sender_mac[4], arp->sender_mac[5]); return 0; } LOCAL void *scan_thread(void *arg) { unsigned char local_mac[6]; uint32_t local_ip; int ifindex; /* 获取接口信息 */ if (get_if_info(g_config.ifname, &local_ip, local_mac, &ifindex) != 0) { pthread_mutex_lock(&g_mutex); g_scan_status = SCAN_IDLE; pthread_mutex_unlock(&g_mutex); return NULL; } /* 创建原始套接字 */ g_scan_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)); if (g_scan_fd < 0) { pthread_mutex_lock(&g_mutex); g_scan_status = SCAN_IDLE; pthread_mutex_unlock(&g_mutex); return NULL; } /* 绑定到接口 */ struct sockaddr_ll sll = { .sll_family = AF_PACKET, .sll_protocol = htons(ETH_P_ARP), .sll_ifindex = ifindex }; if (bind(g_scan_fd, (struct sockaddr *)&sll, sizeof(sll)) < 0) { close(g_scan_fd); pthread_mutex_lock(&g_mutex); g_scan_status = SCAN_IDLE; pthread_mutex_unlock(&g_mutex); return NULL; } /* 解析IP范围 */ struct in_addr start_addr, end_addr; inet_aton(g_config.start_ip, &start_addr); inet_aton(g_config.end_ip, &end_addr); uint32_t start_ip = ntohl(start_addr.s_addr); uint32_t end_ip = ntohl(end_addr.s_addr); /* 主扫描循环 */ while (1) { pthread_mutex_lock(&g_mutex); if (g_scan_status == SCAN_STOPPING) { g_scan_status = SCAN_IDLE; pthread_mutex_unlock(&g_mutex); break; } g_result_count = 0; /* 重置结果计数 */ pthread_mutex_unlock(&g_mutex); time_t scan_start = time(NULL); /* 遍历IP范围 */ for (uint32_t ip = start_ip; ip <= end_ip; ip++) { pthread_mutex_lock(&g_mutex); if (g_scan_status == SCAN_STOPPING) { g_scan_status = SCAN_IDLE; pthread_mutex_unlock(&g_mutex); goto cleanup; } pthread_mutex_unlock(&g_mutex); /* 转换IP为字符串 */ struct in_addr target_addr = {.s_addr = htonl(ip)}; char ip_str[16]; strcpy(ip_str, inet_ntoa(target_addr)); /* 发送ARP请求 */ if (send_arp_request(g_scan_fd, ifindex, local_mac, local_ip, target_addr.s_addr) != 0) { continue; } /* 接收响应 */ char mac[18]; if (recv_arp_response(g_scan_fd, ip_str, mac, g_config.valid_time) == 0) { pthread_mutex_lock(&g_mutex); if (g_result_count < MAX_IP_RANGE) { strncpy(g_results[g_result_count].ip, ip_str, 16); strncpy(g_results[g_result_count].mac, mac, 18); g_results[g_result_count].timestamp = time(NULL); g_result_count++; } pthread_mutex_unlock(&g_mutex); } /* 等待发包间隔 */ usleep(g_config.packet_interval * 1000); } /* 计算并等待扫描周期 */ time_t elapsed = time(NULL) - scan_start; int sleep_time = g_config.scan_cycle - elapsed; if (sleep_time > 0) { while (sleep_time > 0) { pthread_mutex_lock(&g_mutex); if (g_scan_status == SCAN_STOPPING) { g_scan_status = SCAN_IDLE; pthread_mutex_unlock(&g_mutex); goto cleanup; } pthread_mutex_unlock(&g_mutex); sleep(1); sleep_time--; } } } cleanup: close(g_scan_fd); g_scan_fd = -1; return NULL; } LOCAL S32 arp_start_callback(DS_HANDLE_CONTEXT context, JSON_OBJPTR param) { / 检查是否已在扫描 */ if (g_scan_status != SCAN_IDLE) { return -1; } /* 检查功能是否启用 */ if (!g_config.enable) { return -1; } /* 创建扫描线程 */ g_scan_status = SCAN_RUNNING; if (pthread_create(&g_scan_thread, NULL, scan_thread, NULL) != 0) { g_scan_status = SCAN_IDLE; return -1; } return OK; } LOCAL S32 arp_stop_callback(DS_HANDLE_CONTEXT context, JSON_OBJPTR param) { / 检查是否有扫描在运行 */ if (g_scan_status != SCAN_RUNNING) { return -1; } /* 设置停止标志 */ g_scan_status = SCAN_STOPPING; g_config.enable = 0; /* 等待线程结束 */ pthread_join(g_scan_thread, NULL); return OK; } LOCAL S32 arp_clear_callback(DS_HANDLE_CONTEXT *context, JSON_OBJPTR param) { g_result_count = 0; return OK; } LOCAL S32 arpsd_unregister(void) { ds_unregister_action(“arpsd”, “start”, arp_start_callback); ds_unregister_action(“arpsd”, “stop”, arp_stop_callback); ds_unregister_action(“arpsd”, “clear”, arp_clear_callback); return OK; } LOCAL S32 arpsd_stop() { arpsd_unregister(); /* 取消注册的dms ubus调试方法 */ msg_detach_handler(MSGID_DMS_CMD, arpsd_cmd_call_handle); return OK; } LOCAL S32 arpsd_start() { /* 把配置文件读到本地 / if (0 == ds_read(ARP_PATH, (void)(&g_config), sizeof(arp_config_t))) { return -1; } return 0; } LOCAL S32 arpsd_register(void) { ds_register_action(“arpsd”, “start”, arp_start_callback); ds_register_action(“arpsd”, “stop”, arp_stop_callback); ds_register_action(“arpsd”, “clear”, arp_clear_callback); return OK; } LOCAL S32 arpsd_init() { arpsd_register(); /* 注册ubus call调试方法 */ msg_attach_handler(MSGID_DMS_CMD, arpsd_cmd_call_handle); return OK; } LOCAL void arpsd_main() { DS_MOD_DESC arpsd_module = DS_STRUCT_MOD(“arpsd”, arpsd_init, NULL, NULL, arpsd_start, arpsd_stop, NULL, NULL); /* 向ds注册模块 */ MODULE *module_node = ds_register_module("arpsd", &arpsd_module); NSD_ASSERT(NULL != module_node); } NSD_INIT(arpsd_main); LOCAL void arpsd_data_model() { /* 按层级声明模块配置参数 */ DS_ARR_DESC(start_ip_array, OPT_TYPE_STRING, arp_config_t, start_ip); DS_ARR_DESC(end_ip_array, OPT_TYPE_STRING, arp_config_t, end_ip); DS_ARR_DESC(ifname_array, OPT_TYPE_STRING, arp_config_t, start_ip); DS_OPT_DESC arpsd_options[] = { DS_U32_OPT(arp_config_t, enable, OPT_FLAG_NORM), DS_U32_OPT(arp_config_t, scan_cycle, OPT_FLAG_NORM), DS_U32_OPT(arp_config_t, valid_time, OPT_FLAG_NORM), DS_U32_OPT(arp_config_t, packet_interval, OPT_FLAG_NORM), DS_ARR_OPT(arp_config_t, start_ip, OPT_FLAG_NORM, &start_ip_array), DS_ARR_OPT(arp_config_t, end_ip, OPT_FLAG_NORM, &end_ip_array), DS_ARR_OPT(arp_config_t, ifname, OPT_FLAG_NORM, &ifname_array), }; DS_SEG_DESC arpsd_segments[] = { DS_STRUCT_SEG("arp_config", SEG_LIM_RW, SEG_GROUP_GUEST, scan_status_t, arpsd_options), }; DS_SECT_DESC arpsd_sections[] = { DS_STRUCT_SECT("arp_config", arpsd_segments), }; DS_TBL_DESC arpsd_tables[] = { DS_STRUCT_TBL("arp_config", TBL_ATTR_CFG, arpsd_sections), }; /* 向ds注册模块配置信息 */ DS_MOD_DESC arpsd_module = DS_STRUCT_MOD("arpsd", NULL, NULL, NULL, NULL, NULL, arpsd_tables, NULL); MODULE *module_node = ds_register_module("arpsd", &arpsd_module); NSD_ASSERT(NULL != module_node); } NSD_INIT(arpsd_data_model); 给出这个项目的完整设计文档,要详细具体完整

filetype

#ifdef __cplusplus extern "C" { #endif /** * @defgroup gpio_apis GPIO API * @ingroup driver_apis * @{ */ /** * @brief GPIO Examples * * If GPIO PIN number > 32, the binding device name is CONFIG_GPIO_A_NAME. * If GPIO PIN number > 32 and < 64, the binding device name is CONFIG_GPIO_B_NAME. * If GPIO PIN number >64 and < GPIO_MAX_PIN_NUM, the binding device name is CONFIG_GPIO_C_NAME. * * @code * * #include <drivers/gpio.h> * * // 1. GPIO output function example * uint8_t gpio_out_pin = 6, gpio_out_level = 1; * const char *gpio_dev_name = CONFIG_GPIO_A_NAME; * int ret; * * // If gpio_flags_t masks with GPIO_PULL_UP/GPIO_PULL_DOWN, the GPIO pin state will be pulled up/down. * // If gpio_flags_t masks with GPIO_INT_DEBOUNCE, the GPIO pin will enable schmitt function. * // If gpio_flags_t masks with GPIO_OUTPUT | (GPIO_OUTPUT_INIT_HIGH/GPIO_OUTPUT_INIT_LOW), the GPIO pin will output * // high/low state at initialization. * gpio_flags_t = GPIO_OUTPUT; * * const struct device *gpio_dev = device_get_binding(gpio_dev_name); * if (!gpio_dev) { * printk("failed to bind device %s\n", gpio_dev_name); * return -ENODEV; * } * * ret = gpio_pin_configure(gpio_dev, gpio_out_pin, GPIO_OUTPUT); * if (ret) { * printk("failed to configure gpio:%d output\n", gpio_out_pin); * return ret; * } * * // If gpio_out_level = 1 GPIO will output high level, and when gpio_out_level = 0 will output low level. * gpio_pin_set(gpio_dev, gpio_out_pin, gpio_out_level); * * // 2. GPIO input function example * uint8_t gpio_in_pin = 6; * const char *gpio_dev_name = CONFIG_GPIO_A_NAME; * gpio_pin_t gpio_in_level; * * const struct device *gpio_dev = device_get_binding(gpio_dev_name); * if (!gpio_dev) { * printk("failed to bind device %s\n", gpio_dev_name); * return -ENODEV; * } * * ret = gpio_pin_configure(gpio_dev, gpio_in_pin, GPIO_INPUT); * if (ret) { * printk("failed to configure gpio:%d input\n", gpio_in_pin); * return ret; * } * * // Get GPIO input voltage level. * gpio_pin_get(gpio_dev, gpio_in_pin, &gpio_in_level); * * // 3. GPIO interrupt function example * uint8_t gpio_irq_pin = 6; * const char *gpio_dev_name = CONFIG_GPIO_A_NAME; * struct gpio_callback gpio_irq_cb; * * static void gpio_irq_callback(const struct device *port, * struct gpio_callback *cb, * uint32_t pins) { * printk("GPIO IRQ callback\n"); * } * * const struct device *gpio_dev = device_get_binding(gpio_dev_name); * if (!gpio_dev) { * printk("failed to bind device %s\n", gpio_dev_name); * return -ENODEV; * } * * gpio_pin_configure(gpio_dev, gpio_irq_pin, * GPIO_INPUT | GPIO_INT_EDGE_TO_INACTIVE | GPIO_ACTIVE_HIGH); * * gpio_init_callback(&gpio_irq_cb, gpio_irq_callback, BIT(gpio_irq_pin)); * * gpio_add_callback(gpio_dev, &gpio_irq_cb); * * @endcode */ /** * @} end defgroup gpio_apis */ /** * @brief GPIO Driver APIs * @defgroup gpio_interface GPIO Driver APIs * @ingroup io_interfaces * @{ */ /** * @name GPIO input/output configuration flags * @{ */ /** Enables pin as input. */ #define GPIO_INPUT (1U << 8) /** Enables pin as output, no change to the output state. */ #define GPIO_OUTPUT (1U << 9) /** Disables pin for both input and output. */ #define GPIO_DISCONNECTED 0 /** @cond INTERNAL_HIDDEN */ /* Initializes output to a low state. */ #define GPIO_OUTPUT_INIT_LOW (1U << 10) /* Initializes output to a high state. */ #define GPIO_OUTPUT_INIT_HIGH (1U << 11) /* Initializes output based on logic level */ #define GPIO_OUTPUT_INIT_LOGICAL (1U << 12) /** @endcond */ /** Configures GPIO pin as output and initializes it to a low state. */ #define GPIO_OUTPUT_LOW (GPIO_OUTPUT | GPIO_OUTPUT_INIT_LOW) /** Configures GPIO pin as output and initializes it to a high state. */ #define GPIO_OUTPUT_HIGH (GPIO_OUTPUT | GPIO_OUTPUT_INIT_HIGH) /** Configures GPIO pin as output and initializes it to a logic 0. */ #define GPIO_OUTPUT_INACTIVE (GPIO_OUTPUT | \ GPIO_OUTPUT_INIT_LOW | \ GPIO_OUTPUT_INIT_LOGICAL) /** Configures GPIO pin as output and initializes it to a logic 1. */ #define GPIO_OUTPUT_ACTIVE (GPIO_OUTPUT | \ GPIO_OUTPUT_INIT_HIGH | \ GPIO_OUTPUT_INIT_LOGICAL) /** GPIO pin is active (has logical value '1') in low state. */ #define GPIO_ACTIVE_LOW (1 << 0) /** GPIO pin is active (has logical value '1') in high state. */ #define GPIO_ACTIVE_HIGH (0 << 0) /* Configures GPIO output in single-ended mode (open drain or open source). */ #define GPIO_SINGLE_ENDED (1 << 1) /* Configures GPIO output in push-pull mode */ #define GPIO_PUSH_PULL (0 << 1) /* Indicates single ended open drain mode (wired AND). */ #define GPIO_LINE_OPEN_DRAIN (1 << 2) /* Indicates single ended open source mode (wired OR). */ #define GPIO_LINE_OPEN_SOURCE (0 << 2) /** @endcond */ /** Configures GPIO output in open drain mode (wired AND). * * @note 'Open Drain' mode also known as 'Open Collector' is an output * configuration which behaves like a switch that is either connected to ground * or disconnected. */ #define GPIO_OPEN_DRAIN (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_DRAIN) /** Configures GPIO output in open source mode (wired OR). * * @note 'Open Source' is a term used by software engineers to describe output * mode opposite to 'Open Drain'. It behaves like a switch that is either * connected to power supply or disconnected. There exist no corresponding * hardware schematic and the term is generally unknown to hardware engineers. */ #define GPIO_OPEN_SOURCE (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_SOURCE) /** Enables GPIO pin pull-up. */ #define GPIO_PULL_UP (1 << 4) /** Enable GPIO pin pull-down. */ #define GPIO_PULL_DOWN (1 << 5) /** @} */ /** * @name GPIO interrupt configuration flags * The `GPIO_INT_*` flags are used to specify how input GPIO pins will trigger * interrupts. The interrupts can be sensitive to pin physical or logical level. * Interrupts sensitive to pin logical level take into account GPIO_ACTIVE_LOW * flag. If a pin was configured as Active Low, physical level low will be * considered as logical level 1 (an active state), physical level high will * be considered as logical level 0 (an inactive state). * @{ */ /** Disables GPIO pin interrupt. */ #define GPIO_INT_DISABLE (1U << 13) /** @cond INTERNAL_HIDDEN */ /* Enables GPIO pin interrupt. */ #define GPIO_INT_ENABLE (1U << 14) /* GPIO interrupt is sensitive to logical levels. * * This is a component flag that should be combined with other * `GPIO_INT_*` flags to produce a meaningful configuration. */ #define GPIO_INT_LEVELS_LOGICAL (1U << 15) /* GPIO interrupt is edge sensitive. * * Note: by default interrupts are level sensitive. * * This is a component flag that should be combined with other * `GPIO_INT_*` flags to produce a meaningful configuration. */ #define GPIO_INT_EDGE (1U << 16) /* Trigger detection when input state is (or transitions to) physical low or * logical 0 level. * * This is a component flag that should be combined with other * `GPIO_INT_*` flags to produce a meaningful configuration. */ #define GPIO_INT_LOW_0 (1U << 17) /* Trigger detection on input state is (or transitions to) physical high or * logical 1 level. * * This is a component flag that should be combined with other * `GPIO_INT_*` flags to produce a meaningful configuration. */ #define GPIO_INT_HIGH_1 (1U << 18) /** @endcond */ /** Configures GPIO interrupt to be triggered on pin rising edge and enables it. */ #define GPIO_INT_EDGE_RISING (GPIO_INT_ENABLE | \ GPIO_INT_EDGE | \ GPIO_INT_HIGH_1) /** Configures GPIO interrupt to be triggered on pin falling edge and enables * it. */ #define GPIO_INT_EDGE_FALLING (GPIO_INT_ENABLE | \ GPIO_INT_EDGE | \ GPIO_INT_LOW_0) /** Configures GPIO interrupt to be triggered on pin rising or falling edge and * enables it. */ #define GPIO_INT_EDGE_BOTH (GPIO_INT_ENABLE | \ GPIO_INT_EDGE | \ GPIO_INT_LOW_0 | \ GPIO_INT_HIGH_1) /** Configures GPIO interrupt to be triggered on pin physical level low and * enables it. */ #define GPIO_INT_LEVEL_LOW (GPIO_INT_ENABLE | \ GPIO_INT_LOW_0) /** Configures GPIO interrupt to be triggered on pin physical level high and * enables it. */ #define GPIO_INT_LEVEL_HIGH (GPIO_INT_ENABLE | \ GPIO_INT_HIGH_1) /** Configures GPIO interrupt to be triggered on pin state change to logical * level 0 and enables it. */ #define GPIO_INT_EDGE_TO_INACTIVE (GPIO_INT_ENABLE | \ GPIO_INT_LEVELS_LOGICAL | \ GPIO_INT_EDGE | \ GPIO_INT_LOW_0) /** Configures GPIO interrupt to be triggered on pin state change to logical * level 1 and enables it. */ #define GPIO_INT_EDGE_TO_ACTIVE (GPIO_INT_ENABLE | \ GPIO_INT_LEVELS_LOGICAL | \ GPIO_INT_EDGE | \ GPIO_INT_HIGH_1) /** Configures GPIO interrupt to be triggered on pin logical level 0 and enables * it. */ #define GPIO_INT_LEVEL_INACTIVE (GPIO_INT_ENABLE | \ GPIO_INT_LEVELS_LOGICAL | \ GPIO_INT_LOW_0) /** Configures GPIO interrupt to be triggered on pin logical level 1 and enables * it. */ #define GPIO_INT_LEVEL_ACTIVE (GPIO_INT_ENABLE | \ GPIO_INT_LEVELS_LOGICAL | \ GPIO_INT_HIGH_1) /** @} */ /** Enable GPIO pin debounce. * * @note Drivers that do not support a debounce feature should ignore * this flag rather than rejecting the configuration with -ENOTSUP. */ #define GPIO_INT_DEBOUNCE (1U << 19) /** * @name GPIO drive strength flags * The `GPIO_DS_*` flags are used with `gpio_pin_configure` to specify the drive * strength configuration of a GPIO pin. * * The drive strength of individual pins can be configured * independently for when the pin output is low and high. * * The `GPIO_DS_*_LOW` enumerations define the drive strength of a pin * when output is low. * The `GPIO_DS_*_HIGH` enumerations define the drive strength of a pin * when output is high. * * The interface supports two different drive strengths: * `DFLT` - The lowest drive strength supported by the HW * `ALT` - The highest drive strength supported by the HW * * On hardware that supports only one standard drive strength, both * `DFLT` and `ALT` have the same behavior. * @{ */ /** @cond INTERNAL_HIDDEN */ #define GPIO_DS_LOW_POS 20 #define GPIO_DS_LOW_MASK (0x3U << GPIO_DS_LOW_POS) /** @endcond */ /** Default drive strength standard when GPIO pin output is low. */ #define GPIO_DS_DFLT_LOW (0x0U << GPIO_DS_LOW_POS) /** Alternative drive strength when GPIO pin output is low. * For hardware that does not support configurable drive strength * use the default drive strength. */ #define GPIO_DS_ALT_LOW (0x1U << GPIO_DS_LOW_POS) /** @cond INTERNAL_HIDDEN */ #define GPIO_DS_HIGH_POS 22 #define GPIO_DS_HIGH_MASK (0x3U << GPIO_DS_HIGH_POS) /** @endcond */ /** Default drive strength when GPIO pin output is high. */ #define GPIO_DS_DFLT_HIGH (0x0U << GPIO_DS_HIGH_POS) /** Alternative drive strength when GPIO pin output is high. * For hardware that does not support configurable drive strengths * use the default drive strength. */ #define GPIO_DS_ALT_HIGH (0x1U << GPIO_DS_HIGH_POS) /** @} */ /** @cond INTERNAL_HIDDEN */ #define GPIO_DIR_MASK (GPIO_INPUT | GPIO_OUTPUT) /** @endcond */

filetype

S32 origin_info_init(ORIGIN_FW_INFO *origin_info) { TP_HEAD_INFO origin_tp_head; FACTORY_INFO_DATA fac_info; U32 size; S32 ret; #ifdef CONFIG_LTE_MODULE_IN_UP_BIN MODULE_SPEC module_spec; LTE_PARAM_MODULE_INFO lte_module_info; #endif if (NULL == origin_info) { goto INIT_ERROR; } memset(origin_info, 0, sizeof(ORIGIN_FW_INFO)); memset(&origin_tp_head, 0, sizeof(TP_HEAD_INFO)); memset(&fac_info, 0, sizeof(FACTORY_INFO_DATA)); #ifdef CONFIG_LTE_MODULE_IN_UP_BIN memset(&module_spec, 0, sizeof(MODULE_SPEC)); memset(<e_module_info, 0, sizeof(LTE_PARAM_MODULE_INFO)); #endif /* 读取 TP HEAD */ size = ds_read(TP_HEADER_PATH, &origin_tp_head, sizeof(TP_HEAD_INFO)); if (size < sizeof(TP_HEAD_INFO)) { UPGRADE_ERROR("Reading TP_HEAD failed."); goto INIT_ERROR; } /* 读取 fac_info */ size = ds_read(FACTORY_INFO_DATA_PATH, &fac_info, sizeof(FACTORY_INFO_DATA)); if (size < sizeof(FACTORY_INFO_DATA)) { UPGRADE_ERROR("Reading FACTORY_INFO_DATA failed."); goto INIT_ERROR; } /* init local partition offsets and lens */ origin_info->tphead_len = ntohl(origin_tp_head.tphead_len); #ifdef FDT_UPGRADE_SUPPORT origin_info->fdt_offset = ntohl(origin_tp_head.fdt_offset); //fdt origin_info->fdt_len = ntohl(origin_tp_head.fdt_len); #else origin_info->fdt_offset = 0; //fdt origin_info->fdt_len = 0; #endif origin_info->uboot_offset = ntohl(origin_tp_head.uboot_offset); origin_info->uboot_len = ntohl(origin_tp_head.uboot_len); origin_info->tphead_offset = ntohl(origin_tp_head.tphead_offset); origin_info->kernel_offset = ntohl(origin_tp_head.kernel_offset); origin_info->vendor_id = ntohs(origin_tp_head.vendor_id); origin_info->zone_code = ntohs(origin_tp_head.zone_code); /* init local partition CRCs */ #ifdef FDT_UPGRADE_SUPPORT memcpy(origin_info->fdt_crc, origin_tp_head.fdt_crc, CRC_LEN); //fdt #endif memcpy(origin_info->factory_info_crc, origin_tp_head.factory_info_crc, CRC_LEN); memcpy(origin_info->radio_crc, origin_tp_head.radio_crc, CRC_LEN); memcpy(origin_info->bootloader_crc, origin_tp_head.uboot_crc, CRC_LEN); memcpy(origin_info->kernel_and_romfs_crc, origin_tp_head.firmware_crc, CRC_LEN); memcpy(origin_info->fw_id, origin_tp_head.fw_id, FW_ID_LEN); /* get BL FwID number and init BL */ origin_info->bl_num = ntohl(origin_tp_head.fw_id_bl_num); memcpy(origin_info->bl_id, origin_tp_head.fw_id_bl, FW_ID_LEN * origin_info->bl_num); /* init hwid */ ret = hex_str_to_bytes(origin_info->hw_id, (char*)fac_info.hw_id, HW_ID_LEN); if (0 != ret) { goto INIT_ERROR; } /* init mac */ memcpy(origin_info->mac, fac_info.mac, MAC_ADDR_SIZE); /* init extFw dev_name: dev_name + _ + hw_ver */ strcpy((char*)origin_info->dev_name, (char*)fac_info.dev_name); size = strlen(fac_info.dev_name); *(origin_info->dev_name + size) = '_'; strcpy((char*)origin_info->dev_name + size + 1, (char*)fac_info.hw_ver); #ifdef CONFIG_LTE_MODULE_IN_UP_BIN /* init lte info */ size = ds_read(MODULE_SPEC_PATH, &module_spec, sizeof(MODULE_SPEC)); if (size < sizeof(MODULE_SPEC)) { UPGRADE_ERROR("Reading module_spec failed."); goto INIT_ERROR; } origin_info->lte_supported = atoi(module_spec.lte); if (origin_info->lte_supported) { size = ds_read(LTE_MODULE_INFO_PATH, <e_module_info, sizeof(LTE_PARAM_MODULE_INFO)); if (size < sizeof(LTE_PARAM_MODULE_INFO)) { UPGRADE_ERROR("Reading lte module info failed."); goto INIT_ERROR; } strncpy((char *)origin_info->lte_vender, (const char *)lte_module_info.vender, sizeof(origin_info->lte_vender)); strncpy((char *)origin_info->lte_product, (const char *)lte_module_info.product, sizeof(origin_info->lte_product)); origin_info->lte_version = atoi(lte_module_info.version); } #endif return SLP_ENONE; INIT_ERROR: return SLP_ESYSTEM; }

凯然
  • 粉丝: 36
上传资源 快速赚钱