tag 标签: linux

相关帖子
相关博文
  • 热度 3
    2025-1-24 11:21
    418 次阅读|
    0 个评论
    飞凌嵌入式基于瑞芯微RK3562系列处理器打造的FET3562J-C全国产核心板,是一款专为工业自动化及消费类电子设备设计的产品,凭借其强大的功能和灵活性,自上市以来得到了各行业客户的广泛关注。本文将详细介绍如何启动并测试RK3562J处理器的MCU,通过实际操作步骤,帮助各位工程师朋友更好地了解这款芯片。 1、RK3562J处理器概述 RK3562J处理器采用了4*Cortex-A53@1.8GHz+Cortex-M0@200MHz架构。其中,4个Cortex-A53核心作为主要核心,负责处理复杂的操作系统任务和应用程序;Cortex-M0核则作为辅助核心,运行裸核系统,能够快速响应和控制,实现实时性要求较高的任务。 2、启动M0核固件的前期准备 目前,飞凌嵌入式OK3562J-C开发板上默认并没有启动M0核固件。因此,我们需要通过一系列步骤来配置和启动M0核。以下是具体的操作步骤: 1. U-Boot修改 理论上我们需要打开AMP(非对称多处理)编译宏,但由于飞凌嵌入式OK3562J-C开发板的U-Boot已默认配置AMP功能,因此用户无需进行任何U-Boot修改操作。 2. Kernel修改 (1)安装工具包 首先,我们需要安装SCons工具包,用于后续的编译工作。可以通过以下命令进行安装: forlinx @ubuntu :~ $ sudo apt-get install scons (2)添加AMP设备树的调用 OK3562J-C开发板已经添加了AMP设备树的调用,我们可以查看相关配置文件以了解其内容。 forlinx @ubuntu :~ $ cd /home/forlinx/work/ OK3562 -linux-source/ forlinx @ubuntu :~/work/OK3562-linux-source $ vi kernel- 5.10 /arch/arm64/boot/dts/rockchip/ OK3562 -C-common.dtsi + include "rk3562-amp.dtsi" 主要内容包括: / { /* 描述设备 */ rockchip_amp: rockchip-amp { compatible = "rockchip,amp" ; clocks = , , , , // , , , , ; //pinctrl-names = "default" ; //pinctrl-0 = ; amp-cpu-aff-maskbits = /bits/ 64 ; amp-irqs = /bits/ 64 ; status = "okay" ; }; /* 定义了一些保留内存区域 */ reserved-memory { #address-cells = ; #size-cells = ; ranges; /* remote amp core address */ amp_shmem_reserved: amp-shmem@7800000 { reg = ; no-map; }; rpmsg_reserved: rpmsg@7c00000 { reg = ; no-map; }; rpmsg_dma_reserved: rpmsg-dma@8000000 { compatible = "shared-dma-pool" ; reg = ; no-map; }; /* mcu address */ mcu_reserved: mcu@8200000 { reg = ; no-map; }; }; /* 实现Rockchip RPMsg功能 */ rpmsg: rpmsg@7c00000 { compatible = "rockchip,rpmsg" ; mbox-names = "rpmsg-rx" , "rpmsg-tx" ; mboxes = ; rockchip,vdev-nums = ; /* CPU3: link-id 0x03; MCU: link-id 0x04; */ rockchip,link-id = ; reg = ; memory-region = ; status = "okay" ; }; }; 3. 生成配置文件 接下来,我们需要生成M0核固件的配置文件。在RTOS源码目录下,通过复制默认配置文件并运行SCons菜单配置界面来生成所需的配置文件。虽然在此示例中无需进行额外配置,但用户可以根据需求进行相应的配置。 forlinx @ubuntu :~/work/OK3562-linux-source $ cd rtos/bsp/rockchip/rk3562- 32 forlinx @ubuntu :~/work/OK3562-linux-source/rtos/bsp/rockchip/rk3562- 32 $ cp board/rk3562_evb1_lp4x/defconfig .config forlinx @ubuntu :~/work/OK3562-linux-source/rtos/bsp/rockchip/rk3562- 32 $ scons --menuconfig 打开图形化配置界面后,无需配置,直接退出即可。 若有其他功能需求,可进行相应配置后再退出并保存。 forlinx @ubuntu :~/work/OK3562-linux-source/rtos/bsp/rockchip/rk3562- 32 $ cp .config board/rk3562_evb1_lp4x/defconfig forlinx @ubuntu :~/work/OK3562-linux-source/rtos/bsp/rockchip/rk3562- 32 $ cp rtconfig.h board/rk3562_evb1_lp4x/defconfig.h 4. 编译源码 完成配置文件的生成后,我们可以开始编译源码。通过运行构建脚本,选择相应的defconfig配置,并分别编译Linux系统和M0核固件。编译成功后,会在指定目录下生成 amp.img 镜像文件。 forlinx @ubuntu :~/work/OK3562-linux-source/rtos/bsp/rockchip/rk3562- 32 $ cd forlinx @ubuntu :~/work/OK3562-linux-source $ ./build.sh chip Log colors: message notice warning error fatal Log saved at /home/forlinx/work/ 3562 /git/ OK3562 -linux-source/output/sessions/ 2024 -08- 27_15 - 48 - 21 Switching to chip: ok3562Pick a defconfig: 1 . forlinx_defconfig 2 . forlinx_ok3562_linux_defconfig 3 . forlinx_ok3562_linux_mcu_defconfig 4 . forlinx_ok3562_linux_rtos_defconfigWhich would you like? : 4 / /选择第四个配置forlinx@ubuntu:~/work /OK3562-linux-source$ ./build .sh rtos forlinx @ubuntu :~/work/OK3562-linux-source $ ./build.sh mcu 编译后在rockdev目录下生成amp.img: forlinx @ubuntu :~/work/OK3562-linux-source $ ls rockdev/amp.img boot.img linux-headers.tar MiniLoaderAll .bin misc.img oem.img parameter.txt recovery.img rootfs.img uboot.img update.img userdata.img 3、烧写镜像 将生成的 amp.img 镜像文件拷贝到电脑中,并将开发板切换到烧写模式。使用烧写工具配置 amp.img 的路径。 点击“设备分区表”,读取成功后点击“执行”。 4、验证启动 重新启动开发板时按下空格键进入U-Boot菜单。在U-Boot菜单中,输入 3 将 amp start 配置成 on。 然后输入 1 重启开发板。在启动过程中,观察U-Boot阶段的打印信息,如果看到与M0核固件启动相关的打印信息,则说明已成功使用U-Boot启动M0核固件。 5、总结 上述操作仅为简单启动M0核并打印信息。实际上,M0核的功能非常强大,支持UART、PWM、I2C、SPI等多种外设接口。(目前飞凌嵌入式暂无更多M0核接口的测试例程,您若有相关需求,可以联系技术支持获取瑞芯微官方资料进行深入学习和开发) 希望通过本文的介绍和实践操作,能让您对RK3562J处理器的M0核有更进一步的了解,并为后续的开发工作提供帮助。
  • 2025-1-17 14:14
    218 次阅读|
    0 个评论
    Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用 触觉智能EVB3568鸿蒙开发板 演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步! 添加新账号 1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下: root @ido :/ # sudo adduser industio 2、赋予sudo权限:为了让 industio用户具有执行管理员命令的能力,需要将其添加到sudo组,命令如下: root @ido :/ # sudo usermod -aG sudo industio 3、开机以industio的用户登录,命令如下: root @ido :/ /etc/hostname 查看自动登录信息 查找getty相关服务,getty为tty(Teletype)终端提供远程访问服务。 root @ido : / # systemctl list - units | grep getty getty @tty1 .service loaded active running Getty on tty1 serial - getty @ttyFIQ0 .service loaded active running Serial Getty on ttyFIQ0 system - getty.slice loaded active active system -getty.slice system - serial\x2dgetty.slice loaded active active system - serial\x2dgetty.slice getty.target loaded active active Login Prompts 根据Serial Getty on ttyFIQ0的提示信息,自动登录功能可能与serial-getty@ttyFIQ0.service服务有关,该服务配置文件在以下目录: /etc/systemd/system/serial-getty@.service.d/override.conf 配置文件可能包含了-f root或其他与自动登录相关的设置。 查看配置文件信息: root @ido : /# cat / etc/systemd/ system /serial-getty\ @. service.d/override.conf ExecStart= ExecStart=- /sbin/ag etty -a root --keep-baud 115200 , 38400 , 9600 %I $TERM 修改配置文件并重启 修改配置文件,内容如下: root @ido : /# vi / etc /systemd/ system /serial-getty@.service.d/ override .conf #第一行 ExecStart = 为空,用于清除原有的 ExecStart 设置 。 ExecStart = # ExecStart =-/ sbin /agetty -a root --keep-baud 115200,38400,9600 %I $TERM ExecStart=-/ sbin / agetty -- noclear % I $TERM 重启后即为industio账号,命令如下: root @ido :/ # reboot 成功改为通过输入账号密码登录,如图所示: 产品购买 触觉智能EVB3568鸿蒙开发板 是一款基于RK3568开发的鸿蒙开发板/工控主板,适用于各种智慧显示终端、工业自动化终端和边缘计算网关类产品。应用可覆盖边缘计算、人工智能、工业HMI、工业网关、智慧医疗、自助终端、智能零售、能源电力等行业。具有以下优势: 支持开源鸿蒙OpenHarmony/Andriod/ Linux多操作系统; 四核A55处理器,主频最高2.0GHz, Mali G52-2EE GPU支持2D加速; 8M ISP性能,支持HDR; 1T算力NPU,支持TensorFlow/Caffe/ MXNet/PyTorch等深度学习框架; 配备2 x 千兆以太网、9 x USB拓展、 工业互联接口(2路CAN和5路串口); 支持4K视频解码与多屏异显,支持 HDMI/MIPI/eDP/LVDS视频接口; 支持5G/4G/WiFi蓝牙无线通信功能;
  • 2025-1-16 13:15
    378 次阅读|
    0 个评论
    一个易用且轻量化的UI可以大大提高用户的使用效率和满意度——通过快速启动、直观操作和及时反馈,帮助用户快速上手并高效完成任务;轻量化设计则可以减少资源占用,提升启动和运行速度,增强产品竞争力。 LVGL(Light and Versatile Graphics Library)是一个免费开源的图形库,专为嵌入式系统设计。它以轻量级、高效和易于使用而著称,支持多种屏幕分辨率和硬件配置,并提供了丰富的GUI组件,能够帮助开发者轻松构建出美观且功能强大的用户界面。 近期,飞凌嵌入式为基于NXP i.MX93系列处理器打造的OK-MX9352-C开发板成功移植了LVGL v8.3,不仅界面美观精致,启动速度也大幅提升,仅需3.1s。 下面,我们将通过Ebike Screen Demo来展示LVGL v8.3在OK-MX9352-C开发板上的实际运行效果。 在OK-MX9352-C开发板上运行的LVGL v8.3版本中,飞凌嵌入式移植了一个Ebike Screen Demo,用于模拟电助力自行车屏幕界面。它充分利用了LVGL的组件和特性,展示了一个既美观又实用的仪表盘。 01 自定义背景图片 Demo使用了自定义绘制的背景图片,不仅美观,还通过LVGL的图像处理功能被完美地嵌入到界面中,使得整个仪表盘看起来更为美观。 02 基本组件的灵活应用 Demo中使用了按钮、页面跳转等基本组件,提供了丰富的交互功能。用户可以通过点击按钮来切换不同的页面,查看不同的信息。这些组件的灵活应用使得Demo的界面更加直观和易用。 03 丰富的信息显示 Ebike Screen Demo中展示了包括速度、电池、时间、地图和设置在内的多种信息,这些信息通过LVGL的图表和文本组件被清晰地呈现在屏幕上,使用户能够一目了然地了解电助力自行车的当前状态。 通过Ebike Screen Demo的展示,我们可以看到LVGL在OK-MX9352-C开发板上运行的优势——快速启动、功能丰富、界面美观,这对于正在寻找轻量化、易集成GUI解决方案的开发者来说,是一个非常具有优势的选择。 相信在未来,LVGL的图形界面将会更加多样化和智能化。飞凌嵌入式也将有更多产品适配LVGL,为嵌入式设备带来更加丰富和高效的交互体验,大家敬请期待。
  • 2025-1-10 09:59
    78 次阅读|
    0 个评论
    飞凌嵌入式FETMX8MM-C核心板现已支持Linux6.1系统,此次升级不仅使系统功能更加丰富,还通过全新BSP实现了内存性能的显著提升。 基于NXP i.MX8M Mini处理器设计开发的飞凌嵌入式FETMX8MM-C核心板,拥有4个Cortex-A53高性能核和1个Cortex-M4实时核,拥有高性能、高算力和流畅的系统运行速度。Linux6.1系统则为其带来了更多新特性,包括硬件加速功能的增强、电源管理的优化以及系统安全性和稳定性的提升等等,这些改进使得FETMX8MM-C核心板在数据处理、功耗控制和数据安全方面的表现更加出色。 FETMX8MM-C平台内置了丰富的命令行工具和Forlinx测试程序可供用户使用,输入如下命令,即可查看内核信息: root @okmx8mm : ~ # uname -a Linux okmx8mm 6.1 . 36 #19 SMP PREEMPT Wed Oct 9 18:15:14 CST 2024 aarch64 GNU/Linux 此次升级的最大亮点在于内存带宽的提升。 得益于全新的BSP,FETMX8MM-C的内存读带宽飙升至约2170MB/s,写带宽也达到约1030MB/s,相比之前近乎翻倍 。这意味着在处理大数据、高清视频或复杂算法时,核心板能提供更流畅、高效的表现,显著提升用户体验。 此外,FETMX8MM-C核心板配备的外设接口也非常丰富,如MIPI-CSI、MIPI-DSI、USB、PCIe等,能够为用户提供极大的扩展灵活性。 特别值得一提的是,FETMX8MM-C核心板所搭载的i.MX8M Mini处理器享有NXP的长期供货承诺,确保至少15年的供货稳定性,为用户提供了可靠的供货保障。 综上所述,飞凌嵌入式FETMX8MM-C核心板在Linux6.1系统的加持下,不仅内存带宽大幅提升,系统功能也更加完善,是高性能嵌入式应用开发的理想选择。
  • 2025-1-6 10:43
    197 次阅读|
    0 个评论
    本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板, 触觉智能RK3562开发板 演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。 制作图片 开机logo图片制作注意事项 (1)图片必须为bmp格式; (2)图片大小不能大于4MB; (3)BMP位深最大是32,建议设置为8; (4)图片名称为 logo.bmp 和 logo_kernel.bmp ; 开机logo图片制作工具 制图工具可使用自定义的第三方工具,也可使用我们推荐的工具,工具链接如下: https://online-converting.com/image/convert2bmp 图片制作工具使用教程 Color项修改为8,其它默认。 编辑 添加自定义图片,点击【Add image files】按钮。 编辑 添加后,等待生成图片。 编辑 生成图片后,点击【Download】下载。 编辑 将下载的图片另复制一份出来,并且分别重命名为 logo.bmp 和 logo_kernel.bmp 。 编辑 替换开机logo并编译 在SDK源码 kernel 目录下,替换 logo.bmp 和 logo_kernel.bmp 图片,然后开始编译源码。 编译分包源码命令如下: ./build.sh kernel 编译整包源码命令如下: ./build.sh 烧录固件验证效果 烧录固件到开发板,烧录教程可搜索往期教程或官网查看,烧录后开机效果如下: 编辑 产品简介 触觉智能 RK3562 开发板 (型号EVB3562),基于瑞芯微新一代Soc RK3562/RK3562J设计,可用于轻量级人工智能应用。EVB3562开发板配备了PCIe2.1/USB3.0 OTG/千兆网口等各类型接口,支持4G/5G通信、多摄像头及多种视频接口,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示、工业控制等行业领域。 编辑
相关资源
  • 所需E币: 0
    时间: 2023-12-25 10:31
    大小: 2.57KB
    上传者: 开心就很好了
    今天我将给大家讲解基于C++的Linux高性能事件驱动网络编程框架的设计方法及技巧,我在文中采取渐进迭代的方式,配合C++11新特性的使用,以及网络编程理论的深度讲解,并手把手带着大家落地实现,助力在网络编程领域有更大的技术提升!Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。Linux提供三个「点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间转换」的接口 publicGraceJSONResultdoLogin(HttpServletRequestrequest,                  HttpServletResponseresponse,                  RegisterLoginBOregisterLoginBO,                  BindingResultresult){  //判断BindingResult是否保存错误的验证信息,如果有,则直接return  if(result.hasErrors()){    Map<String,String>errorMap=getErrors(result);    returnGraceJSONResult.errorMap(errorMap);  }  //获得前端传来的基本信息  StringsmsCode=registerLoginBO.getSmsCode();  Stringmobile=registerLoginBO.getMobile();  //0.校验验证码是否匹配  StringredisSMSCode=redis.get(MOBILE_SMSCODE+mobile);  if(StringUtils.isBlank(redisSMSCode)||!redisSMSCode.equalsIgnoreCase(smsCode)){    returnGraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);  }  returnGraceJSONResult.ok();}用户信息其实并不会经常发生变动,所以这块内容完全可以放入缓存,这么一来可以大大减少对数据库的压力。privateAppUsergetUser(StringuserId){  //1.查询redis中是否包含用户信息,如果包含则查询redis返回,如果不包含则查询数据库  StringuserJson=redis.get(REDIS_USER_INFO+":"+userId);  AppUseruser=null;  if(StringUtils.isNotBlank(userJson)){    user=JsonUtils.jsonToPojo(userJson,AppUser.class);  }else{    user=userService.getUser(userId);    //2.由于用户信息不怎么会变动,对于千万级别的网站,这类信息数据不会去查询数据库,完全可以把用户信息存入redis    //哪怕修改信息,也不会立马体现,这也是弱一致性,在这里有过期时间,比如1天以后,用户信息会更新到页面显示,或者缩短到1小时,都可以    //基本信息在新闻媒体类网站是属于数据一致性优先级比较低的,用户眼里看的主要以文章为主,至于文章是谁发的,一般来说不会过多关注    redis.set(REDIS_USER_INFO+":"+userId,JsonUtils.objectToJson(user),1);  }  returnuser;}虽然在表设计的时候把文章阅读数字段进行了设计,但是在大数据量下,文章阅读的累计并发是很高的,在这里我们也是采用redis的计数功能来进行实现。@OverridepublicGraceJSONResultlist(StringarticleId,Integerpage,IntegerpageSize){  if(page==null){    page=COMMON_START_PAGE;  }  if(pageSize==null){    pageSize=COMMON_PAGE_SIZE;  }  PagedGridResultgridResult=         commentPortalService.queryArticleComments(articleId,                           page,                           pageSize);  returnGraceJSONResult.ok(gridResult);}生成html的步骤分为以下几步:定义freemarker生成的html位置配置freemarker基本环境获得ftl模板获得动态数据融合ftl和动态数据,并输出到html@Value("${freemarker.html.target}")privateStringhtmlTarget;@GetMapping("/createHTML")@ResponseBodypublicStringcreateHTML(Modelmodel)throwsException{  //0.配置freemarker基本环境  Configurationcfg=newConfiguration(Configuration.getVersion());  //声明freemarker模板所需要加载的目录的位置  Stringclasspath=this.getClass().getResource("/").getPath();  cfg.setDirectoryForTemplateLoading(newFile(classpath+"templates"));//    System.out.println(htmlTarget);//    System.out.println(classpath+"templates");  //1.获得现有的模板ftl文件  Templatetemplate=cfg.getTemplate("stu.ftl","utf-8");  //2.获得动态数据  Stringstranger=;  model.addAttribute("there",stranger);  model=makeModel(model);  //3.融合动态数据和ftl,生成html  FiletempDic=newFile(htmlTarget);  if(!tempDic.exists()){    tempDic.mkdirs();  }  Writerout=newFileWriter(htmlTarget+File.separator+"10010"+".html");  template.process(model,out);  out.close();  return"ok";}
  • 所需E币: 0
    时间: 2023-12-25 11:06
    大小: 3.48KB
    LinuxSocket网络编程框架主要由3大模块组成:BSDSocketAPIsSocketAbstractionLayerVFSLayerTCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地用了客户端/服务器模型,即所有客户端都通过访问服务器来获取所需的资源。BS和CS服务器架构(1)CS架构介绍(clientserver,客户端服务器架构)(2)BS架构介绍(broswerserver,浏览器服务器架构)TCP协议(1)建立连接需要三次握手(2)建立连接的条件:服务器listen时客户端主动发起connect(3)关闭连接需要四次握手(4)服务器或者客户端都可以主动发起关闭packagecom.example.emos.wx.controller.form;importio.swagger.annotations.ApiModel;importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.Pattern;@Data@ApiModelpublicclassRegisterForm{  @NotBlank(message="注册码不能为空")  @Pattern(regexp="^[0-9]{6}$",message="注册码必须是6位数字")  privateStringregisterCode;  @NotBlank(message="微信临时授权不能为空")  privateStringcode;  @NotBlank(message="昵称不能为空")  privateStringnickname;  @NotBlank(message="头像不能为空")  privateStringphoto;}在UserController.java中创建login()方法。@PostMapping("/login")@ApiOperation("登陆系统")publicRlogin(@Valid@RequestBodyLoginFormform){intid=userService.login(form.getCode());  Stringtoken=jwtUtil.createToken(id);  Set<String>permsSet=userService.searchUserPermissions(id);  saveCacheToken(token,id);  returnR.ok("登陆成功").put("token",token).put("permission",permsSet);}在CheckinServiceImpl类中,实现抽象方法……publicclassCheckinServiceImplimplementsCheckinService{……publicvoidcreateFaceModel(intuserId,Stringpath){    HttpRequestrequest=HttpUtil.createPost(createFaceModelUrl);    request.form("photo",FileUtil.file(path));    HttpResponseresponse=request.execute();    Stringbody=response.body();    if("无法识别出人脸".equals(body)||"照片中存在多张人脸".equals(body)){      thrownewEmosException(body);    }else{      TbFaceModelentity=newTbFaceModel();      entity.setUserId(userId);      entity.setFaceModel(body);      faceModelDao.insert(entity);    }  }}在CheckinServiceImpl.java类中,实现三个抽象方法。publicclassCheckinServiceImplimplementsCheckinService{……@Override  publicHashMapsearchTodayCheckin(intuserId){    HashMapmap=checkinDao.searchTodayCheckin(userId);    returnmap;  }  @Override  publiclongsearchCheckinDays(intuserId){    longdays=checkinDao.searchCheckinDays(userId);    returndays;  }  @Override  publicArrayList<HashMap>searchWeekCheckin(HashMapparam){    ArrayList<HashMap>checkinList=checkinDao.searchWeekCheckin(param);    ArrayList<String>holidaysList=holidaysDao.searchHolidaysInRange(param);    ArrayList<String>workdayList=workdayDao.searchWorkdayInRange(param);    DateTimestartDate=DateUtil.parseDate(param.get("startDate").toString());    DateTimeendDate=DateUtil.parseDate(param.get("endDate").toString());    DateRangerange=DateUtil.range(startDate,endDate,DateField.DAY_OF_MONTH);    ArrayListlist=newArrayList();    range.forEach(one->{      Stringdate=one.toString("yyyy-MM-dd");      //查看今天是不是假期或者工作日      Stringtype="工作日";      if(one.isWeekend()){        type="节假日";      }      if(holidaysList!=null&&holidaysList.contains(date)){        type="节假日";      }elseif(workdayList!=null&&workdayList.contains(date)){        type="工作日";      }      Stringstatus="";      if(type.equals("工作日")&&DateUtil.compare(one,DateUtil.date())<=0){        status="缺勤";booleanflag=false;        for(HashMap<String,String>map:checkinList){          if(map.containsValue(date)){            status=map.get("status");flag=true;            break;          }        }DateTimeendTime=DateUtil.parse(DateUtil.today()+""+constants.attendanceEndTime);Stringtoday=DateUtil.today();if(date.equals(today)&&DateUtil.date().isBefore(endTime)&&flag==false){          status="";        }      }      HashMapmap=newHashMap();      map.put("date",date);      map.put("status",status);      map.put("type",type);      map.put("day",one.dayOfWeekEnum().toChinese("周"));      list.add(map);    });    returnlist;  }}在EmosWxApiApplicationTests.java类中提供了contextLoads()测试用例方法,我们把生成大量系统消息记录的代码写在其中,程序运行的时候这些消息记录就会写入到MongoDB里面。@SpringBootTestclassEmosWxApiApplicationTests{  @Autowired  privateMessageServicemessageService;  @Test  voidcontextLoads(){    for(inti=1;i<=100;i++){      MessageEntitymessage=newMessageEntity();      message.setUuid(IdUtil.simpleUUID());      message.setSenderId(0);      message.setSenderName("系统消息");      message.setMsg("这是第"+i+"条测试消息");      message.setSendTime(newDate());      Stringid=messageService.insertMessage(message);      MessageRefEntityref=newMessageRefEntity();      ref.setMessageId(id);      ref.setReceiverId(11);//注意:这是接收人ID      ref.setLastFlag(true);      ref.setReadFlag(false);      messageService.insertRef(ref);    }  }}在该页面的模型层里面声明静态数据。list数组保存的是后端Java返回的成员数据,内容上按照部门进行分组。members数组保存的是页面上选择的成员id。#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<stdlib.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h> #defineBACKLOG5 intmain(intargc,char*argv[]){  intfd;  structsockaddr_inaddr;  charbuf[BUFSIZ]={};   if(argc<3){    fprintf(stderr,"%s<addr><port>\n",argv[0]);    exit(0);  }   /*创建套接字*/  fd=socket(AF_INET,SOCK_STREAM,0);  if(fd<0){    perror("socket");    exit(0);  }   addr.sin_family=AF_INET;  addr.sin_port=htons(atoi(argv[2]));  if(inet_aton(argv[1],&addr.sin_addr)==0){    fprintf(stderr,"Invalidaddress\n");    exit(EXIT_FAILURE);  }   /*向服务端发起连接请求*/  if(connect(fd,(structsockaddr*)&addr,sizeof(addr))==-1){    perror("connect");    exit(0);  }  while(1){    printf("Input->");    fgets(buf,BUFSIZ,stdin);    write(fd,buf,strlen(buf));  }  close(fd);  return0;}
  • 所需E币: 0
    时间: 2023-12-19 21:14
    大小: 19.01MB
    上传者: xxxml
    Linux基础知识,非常全面
  • 所需E币: 3
    时间: 2023-12-15 09:34
    大小: 10.67MB
    上传者: 二月半
    Linux命令行与shell脚本编程大全(第4版)(RichardBlum、ChristineBresnahan) 
  • 所需E币: 0
    时间: 2023-12-6 15:17
    大小: 3.8KB
    网络编程概述管道(父子进程)、消息队列(内核经营消息队列)、共享内存(创建一个空间)、信号(通过pid号通信)、信号量(对临界资源,共享内存做P、V控制)。特点:依赖于Linux内核AB两个通信基于内核。缺陷:无法多机通信(不适用与两台不同的电脑)TCP和UDP对比:TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信TCP首部开销20字节;UDP的首部开销小,只有8个字节TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道传统的进程间通信借助内核提供的IPC机制进行,但是只能限于本机通信。若要跨机通信,就必须使用网络通信,这就需要用到内核提供给用户的socketAPI函数库。2.1网络字节序大端字节序:也叫高端字节序(网络字节序),是高端地址存放低位数据,低端地址存放高位数据小端字节序:也叫低端字节序,是低地址存放低位数据,高地址存放高位数据。在application.yml文件中,填入SaToken的配置信息,如下:sa-token: #HTTP请求头中哪个属性用来上传令牌 token-name:token #过期时间(秒),设置为30天 timeout:2592000 #临时有效期,设置为3天 activity-timeout:259200 #不允许相同账号同时在线,新登陆的账号会挤掉原来登陆的账号 allow-concurrent-login:false #在多人登陆相同账号的时候,是否使用相同的Token is-share:false token-style:uuid #是否读取Cookie中的令牌 isReadCookie:false #同端互斥 isConcurrent:false #SaToken缓存令牌用其他的逻辑库,避免业务数据和令牌数据共用相同的Redis逻辑库 alone-redis:  database:1  host:localhost  port:6379  password:abc123456  timeout:10s  lettuce:   pool:    #连接池最大连接数    max-active:200    #连接池最大阻塞等待时间(使用负值表示没有限制)    max-wait:10s    #连接池中的最大空闲连接    max-idle:16    #连接池中的最小空闲连接    min-idle:8Java语言允许我们自己封装异常类,我们可以自定义各种异常类,比如每种业务一个异常类,或者每个模块一个异常类。我这里不想做的那么复杂,不如我们创建一个通用的异常类,用来封装与业务有关的异常信息。在com.example.his.api.exception包中,创建HisException.java类。packagecom.example.his.api.exception;importlombok.Data;@DatapublicclassHisExceptionextendsRuntimeException{  privateStringmsg;  privateintcode=500;  publicHisException(Exceptione){    super(e);    this.msg="执行异常";  }  publicHisException(Stringmsg){    super(msg);    this.msg=msg;  }  publicHisException(Stringmsg,Throwablee){    super(msg,e);    this.msg=msg;  }  publicHisException(Stringmsg,intcode){    super(msg);    this.msg=msg;    this.code=code;  }  publicHisException(Stringmsg,intcode,Throwablee){    super(msg,e);    this.msg=msg;    this.code=code;  }}SpringBoot提供了全局处理异常的技术,只要我们给某个Java类用上@RestControllerAdvice注解,这个类就能捕获SpringBoot项目中所有的异常,然后统一处理(精简异常信息)再返回给前端项目。在com.example.his.api.config包中,创建ExceptionAdvice.java类。packagecom.example.his.api.config;importcn.dev33.satoken.exception.NotLoginException;importcn.felord.payment.PayException;importcn.hutool.json.JSONObject;importcom.example.his.api.exception.HisException;importlombok.extern.slf4j.Slf4j;importorg.springframework.validation.BindException;importorg.springframework.http.HttpStatus;importorg.springframework.http.converter.HttpMessageNotReadableException;importorg.springframework.web.HttpRequestMethodNotSupportedException;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.multipart.support.MissingServletRequestPartException;@Slf4j@RestControllerAdvicepublicclassExceptionAdvice{  /*   *捕获异常,并且返回500状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  publicStringexceptionHandler(Exceptione){    JSONObjectjson=newJSONObject();    if(einstanceofHttpMessageNotReadableException){      HttpMessageNotReadableExceptionexception=(HttpMessageNotReadableException)e;      log.error("error",exception);      json.set("error","请求未提交数据或者数据有误");    }     elseif(einstanceofMissingServletRequestPartException){      MissingServletRequestPartExceptionexception=(MissingServletRequestPartException)e;      log.error("error",exception);      json.set("error","请求提交数据错误");    }     elseif(einstanceofHttpRequestMethodNotSupportedException){      HttpRequestMethodNotSupportedExceptionexception=(HttpRequestMethodNotSupportedException)e;      log.error("error",exception);      json.set("error","HTTP请求方法类型错误");    }     //Web方法参数数据类型转换异常,比如String[]数组类型的参数,你上传的数据却是String类型    elseif(einstanceofBindException){      BindExceptionexception=(BindException)e;      StringdefaultMessage=exception.getFieldError().getDefaultMessage();      log.error(defaultMessage,exception);      json.set("error",defaultMessage);    }    //没有通过后端验证产生的异常    elseif(einstanceofMethodArgumentNotValidException){      MethodArgumentNotValidExceptionexception=(MethodArgumentNotValidException)e;      json.set("error",exception.getBindingResult().getFieldError().getDefaultMessage());    }    //处理业务异常    elseif(einstanceofHisException){      log.error("执行异常",e);      HisExceptionexception=(HisException)e;      json.set("error",exception.getMsg());    }     //微信支付异常    elseif(einstanceofPayException){      PayExceptionexception=(PayException)e;      log.error("微信支付异常",exception);      json.set("error","微信支付异常");    }    //处理其余的异常    else{      log.error("执行异常",e);      json.set("error","执行异常");    }    returnjson.toString();  }  /*   *捕获异常,并且返回401状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.UNAUTHORIZED)  @ExceptionHandler(NotLoginException.class)  publicStringunLoginHandler(Exceptione){    JSONObjectjson=newJSONObject();    json.set("error",e.getMessage());    returnjson.toString();  }}因为Controller类用上@RestController注解之后,Web方法返回的对象会被自动转换成JSON对象,所以我们只需要声明一个封装类,让所有Web方法返回这个封装类的对象即可。除了公共属性之外,不同的Web方法要返回的业务数据也不尽相同,所以选择动态的结构才是最佳的方案,恰好HashMap允许我们随便添加数据,那就选择HashMap作为父类吧。在com.example.his.api.common包中,创建R.java类。packagecom.example.his.api.common;importorg.apache.http.HttpStatus;importjava.util.HashMap;importjava.util.Map;publicclassRextendsHashMap<String,Object>{  publicR(){    //默认创建的R对象中包含了公共的属性    put("code",HttpStatus.SC_OK);    put("msg","success");  }  /*   *覆盖继承的put函数,添加Key-Value数据   */  publicRput(Stringkey,Objectvalue){    super.put(key,value);    //把自己返回,用于链式调用    returnthis;  }  publicstaticRok(){    returnnewR();  }  publicstaticRok(Stringmsg){    Rr=newR();    r.put("msg",msg);    returnr;  }  publicstaticRok(Map<String,Object>map){    Rr=newR();    r.putAll(map);    returnr;  }  publicstaticRerror(intcode,Stringmsg){    Rr=newR();    r.put("code",code);    r.put("msg",msg);    returnr;  }  publicstaticRerror(Stringmsg){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,msg);  }  publicstaticRerror(){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,"未知异常,请联系管理员");  }}
  • 所需E币: 5
    时间: 2023-11-14 17:51
    大小: 21.11MB
    上传者: 浩瀚星蓝
    这是一本学习linux的经典书籍,详细介绍了shell的使用方法
  • 所需E币: 2
    时间: 2023-11-14 18:00
    大小: 85.65MB
    上传者: 浩瀚星蓝
    这本是是Linux典藏大系的其中一本,详细讲述了ARM嵌入式相关知识
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1021KB
    上传者: Argent
    第11讲Linux内核顶层Makefile分析
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1005.5KB
    上传者: Argent
    第10讲Linux内核源码目录分析
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1006KB
    上传者: Argent
    第9讲正点原子官方Linux内核编译与体验
  • 所需E币: 0
    时间: 2023-11-10 15:47
    大小: 1014KB
    上传者: Argent
    第13讲Linux内核移植.ppt
  • 所需E币: 0
    时间: 2023-11-10 15:48
    大小: 1011KB
    上传者: Argent
    第17讲Linux内核移植(NAND版本)-补录
  • 所需E币: 0
    时间: 2023-11-10 15:47
    大小: 1MB
    上传者: Argent
    第12讲Linux内核启动流程简介
  • 所需E币: 0
    时间: 2023-11-10 16:41
    大小: 1011KB
    上传者: Argent
    第13讲Linux连接文件
  • 所需E币: 0
    时间: 2023-11-10 16:41
    大小: 1018.5KB
    上传者: Argent
    第15讲LinuxC编程
  • 所需E币: 1
    时间: 2023-11-10 11:50
    大小: 30.02KB
    上传者: Argent
    第34讲LinuxPWM驱动实验
  • 所需E币: 1
    时间: 2023-11-10 11:47
    大小: 28.75KB
    上传者: Argent
    第22讲LinuxIIC驱动实验_笔记
  • 所需E币: 1
    时间: 2023-11-10 11:48
    大小: 36.78KB
    上传者: Argent
    第23讲LinuxSPI驱动实验_笔记
  • 所需E币: 1
    时间: 2023-11-10 11:51
    大小: 27.83KB
    上传者: Argent
    第37讲LinuxADC驱动实验
  • 所需E币: 1
    时间: 2023-11-10 11:48
    大小: 29.9KB
    上传者: Argent
    第25讲Linux多点电容触摸屏实验_笔记