tag 标签: linux

相关帖子
相关博文
  • 2025-4-11 18:14
    0 个评论
    本文介绍Linux开发板CAN总线测试方法,使用 触觉智能EVB3568鸿蒙开发板 演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步! 方法一-主板can节点对接测试 1、检测主板是否有CAN节点 ifconfig - a 2、连接主板上的两个CAN接口: 注意某些主板虽硬件参数中带有CAN接口,但实际可能被复用成其他默认功能,具体请查看对应硬件规格书,找到CAN接口,以触觉智能RK3568开发板EVB3568-V1为例,使用J39。 、 将这里的两组CAN信号,H对H,L对L 连接好 3、配置通信基本参数,命令如下: ip link set can0 down #需先关闭can ip link set can0 type can bitrate 250000 #设置通信速率 ip -detail link show can0 #查看设置是否生效 3 : can0: NOARP,ECHO mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10 link /can promiscuity 0 minmtu 0 maxmtu 0 can state STOPPED (berr-counter tx 0 rx 0 ) restart-ms 1 bitrate250000 sample-point 0 . 868 #bitrate 250000生效 tq40 prop-seg 42 phase-seg1 43 phase-seg2 13 sjw 1 rockchip_canfd: tseg1 1..128 tseg2 1..128 sjw 1..128 brp 1..256 brp-inc 2 clock 148500000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 root@industio:~# ip link set can0 up #启用can0 #can1的设置如上一致,只需将can0替换为can1即可 4、测试验证,命令如下: cansend can0 123 #DEADBEEF #can0 发送 candump can1 #can1接收 效果如下: 方法二-使用USB转CAN工具与CANTest软件进行测试。 1、将抓包工具上的CAN0接口与主板CAN0接口,H对H,L对L接好,另一端与电脑usb接口连接。 2、CANTest软件参数设置 下载CANTest软件安装后,启动软件后界面如下,我们关闭弹出的界面,点击左上角的设备选择。 选择USBCAN1设置,设置对应的波特率,其他参数默认即可。 注:主板CAN接口的参数设置请根据本文方法一第3段-设置通信基本参进行设置。 3、测试验证 把candump can0,can0进入接收模式,CANTest工具发送数据验证。
  • 2025-4-11 14:07
    0 个评论
    2025年4月8日-11日,第91届中国国际医疗器械博览会 (CMEF)在国家会展中心(上海)举办,来自世界各地的上千家展商齐聚一堂,为全球健康产业带来探析前沿、洞见未来的医疗盛宴,飞凌嵌入式在7.1号馆J49展位隆重亮相。 飞凌嵌入式作为业界领先的嵌入式解决方案提供商,多年来致力于为医疗器械行业提供高性能、高可靠性的嵌入式解决方案。 本届CMEF,飞凌嵌入式展出了一系列适用于IVD、医疗影像、生命体征监测等医疗设备的嵌入式板卡和高性能显控一体机,以及专为智慧医疗领域打造的动态方案。 飞凌嵌入式始终秉持专业态度,积极探索嵌入式ARM技术在医疗行业的应用,将“专注智能设备核心平台研发与制造”的理念充分融入产品设计中,不仅通过产品来帮助客户缩短研发周期,降低时间成本,还通过专业的技术支持团队,帮助用户解决产品开发过程中的问题,降低开发难度,并成功助力数千家医疗设备企业快速完成产品开发上市。 飞凌嵌入式期待与更多行业伙伴携手,以嵌入式技术为纽带,探索智慧医疗的无限可能!
  • 2025-4-2 18:15
    64 次阅读|
    0 个评论
    教大家介绍在更换用户名和修改密码的方法,此方法不适用于Buildroot系统。使用 触觉智能RK3568工控主板(型号为IDO-SBC3528) 演示,搭载了瑞芯微RK3568四核处理器,板载2路RS232+4路隔离RS485,集成DIDO,自研RS485自动收发驱动,支持超2KM传输距离,并率先适配了电鸿物联操作系统! 更改用户名与密码 首先开始更改用户名,Ubuntu20.04直接进行如下步骤即可: root@ido:~# pkill -9 -u ido #杀死所有ido相关进程,该操作会使ido退出桌面登录。 root@ido:~# usermod -l pdd ido #将ido修改为pdd root@ido:~# groupmod -n pdd ido #将ido用户组修改为pdd组 root@ido:~# usermod -d /home/pdd -m pdd #指定pdd的家目录 root@ido:~# ls /home/ #查看home下是否有pdd pdd #出现pdd说明前面的操作一切正常 注意:若为Ubuntu22.04应先进行如下操作后再执行上面pkill等操作: root@ido:~# vim /etc/gdm3/custom.conf …… AutomaticLoginEnable=true AutomaticLogin=root #将custom.conf中AutomaticLogin后面修改为root 使用root登录后删除ido的进程 #否则pkill后还是需要ido登录命令行,这样将无法执行usermod …… root@ido:~# passwd root #为root设置一个新密码 #执行完上述操作后需重启用root登录 接口默认配置为SPI0功能: 可以看到当前桌面登录用户已经修改为pdd。 注意:Ubuntu22.04不显示该界面,而是开机logo,需执行下文“修改默认桌面登录用户”的操作 ,正常进入桌面。 第二步更改密码,命令如下: root@ido:~# passwd pdd #为pdd设置一个秘密,Ubuntu下默认不会显示输入的密码,按提示输入就好 New password: Retype new password: passwd: password updated successfully 第三步,为pdd添加sudo权限,命令如下: root@ido:~# chmod u+w /etc/sudoers #添加写权限 root@ido:~# vim /etc/sudoers …… # User privilege specification root ALL=(ALL:ALL) ALL pdd ALL=(ALL:ALL) ALL #为pdd添加权限 …… root@ido:~# chmod u-w /etc/sudoers #去除写权限 root@ido:~# su pdd #切换到pdd用户 pdd@ido:/root$ sudo apt-get update 可以看到apt-get update执行成功。 修改登录主机名 修改hosts,命令如下: pdd@ido:/root$ sudo vim /etc/hosts 127.0.0.1 localhost 127.0.1.1 pdd #此处改为pdd 修改hostname,命令如下: http://pdd@ido/root$%20sudo%20vim%20/etc/hostname pdd #此处改为pdd 可以看到主机名已经修改为pdd 修改默认桌面登录用户 更改用户名后需同步修改默认桌面登录用户,否则开机无法进入桌面。 root@pdd:~# vim /etc/lightdm/lightdm.conf #若没有该文件 vim会自动创建 在文件中输入如下内容 autologin-user=pdd #这里修改为自己的用户名即可 autologin-user-timeout=0 #保存后重启系统 重启后自动登录到桌面。 若为Ubuntu22.04则修改如下配置文件: root@ido:~# vim /etc/gdm3/custom.conf …… AutomaticLoginEnable=true AutomaticLogin=pdd #此处改为修改后的用户名 修改成功后重启 …… SSH远程登录pdd示例 首先查看IP地址,命令如下: ip a #查看ip地址 ssh远程登录pdd成功,如图: Ubuntu22.04登录,如图: 产品购买 触觉智能SBC3528工控主板 采用瑞芯微RK3568/RK3568J四核A55处理器,主频最高2.0GHz,内置独立1Tops算力NPU,支持开源鸿蒙OpenHarmony、Andriod、Linux多操作系统,广泛应用于工控、能源等领域。
  • 2025-4-2 16:39
    34 次阅读|
    0 个评论
    近日,飞凌嵌入式FET3576-C核心板正式发布了新系统Forlinx Desktop 24.04。至此,FET3576-C核心板已完成Linux 6.1、Android 14、Forlinx Desktop 24.04等多种操作系统的适配,充分展现了其在系统丰富性方面的卓越实力。 1、多系统适配,满足多样化需求 飞凌嵌入式FET3576-C核心板基于Rockchip RK3576处理器开发设计,该处理器集成了4个ARM Cortex-A72和4个ARM Cortex-A53高性能核,内置6TOPS超强算力NPU,为AI应用赋能,多种操作系统的适配,则进一步拓宽了其应用场景。 Linux 6.1系统的加入,使得飞凌嵌入式FET3576-C核心板在开源、稳定、高效等方面表现出色;Android 14系统的适配,则让飞凌嵌入式FET3576-C核心板在智能移动终端、边缘计算等领域大放异彩。 此次新发布的Forlinx Desktop 24.04系统,针对嵌入式设备进行了深度优化,提供了更加直观、易用的用户界面和丰富的应用生态,满足用户在工业控制、智能家居、数字多媒体等多个领域的需求。 2、多重测试,确保稳定运行 飞凌嵌入式深知稳定性对于用户的重要意义,因此对FET3576-C核心板进行了多重测试。这些测试涵盖了硬件可靠性、系统稳定性、性能表现等多个方面,确保核心板在各种复杂环境下都能稳定运行。 3、广泛应用,助力产品快速上市 得益于其卓越的系统丰富性和稳定性,飞凌嵌入式FET3576-C核心板在工业、AIoT、边缘计算、智能移动终端以及其他多种数字多媒体相关的应用领域都展现出了广泛的应用前景。无论是需要高性能计算能力的工业控制设备,还是需要智能交互功能的智能家居产品,FET3576-C核心板都能提供更具优势的解决方案。 此外,飞凌嵌入式还拥有强大的技术支持服务能力,助力客户快速完成产品开发、测试和上市。 总结来说,飞凌嵌入式FET3576-C核心板与多种操作系统的深度适配,不仅充分发挥了核心板硬件的卓越性能,还通过系统的优化与升级,为用户带来了更加流畅、智能、安全的使用体验。对于工业、AIoT、边缘计算、智能移动终端以及其他多种数字多媒体相关的应用领域的专业用户而言,飞凌嵌入式FET3576-C核心板都是一个值得信赖的选择。
  • 2025-4-2 11:12
    163 次阅读|
    0 个评论
    NXP iMX8MP ARM 平台 EMQX 部署测试
    B y Toradex 秦海 1). 简介 EMQX 是一款基于 Erlang/OTP 平台开发的开源 MQTT 消息服务器,广泛应用于物联网( IoT )领域,以实现设备到服务器以及服务器到设备的消息传递与控制 , 文本就基于 NXP i.MX8M Plus ARM 处理器平台,通过在 Yocto Linux BSP 中集成 Docker 环境来部署测试 EMQX 。 本文所演示的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台 。 2. 准备 a). Verdin i.MX8MP ARM 核心版配合 Dahlia 载板, 并连接调试串口用于测试 。 3). Verdin i.MX8MP Yocto Linux 编译部署 a). 首先 参考 这里 说明创建 Yocto /Openembedded 编译 框架 , 当前最新版本是对应于 Toradex Yocto Linux BSP 7.x 版本的 scarthgap-7.x.y branch 。 b). 增加包含 Docker 支持的 meta-virtualization layer 。 ------------------------------- ### add meta-virtualization ### $ cd OE_ROOT_PATH/layers $ git clone -b scarthgap git://git.yoctoproject.org/meta-virtualization ### add meta-clang layer for PySide6 ### $ git clone -b kirkstone https://github.com/kraj/meta-clang.git ------------------------------- c). 创建定制化 layer meta-customer-demos ,用于添加 Docker 需要的额外修改和配置,首先添加 layer 配置文件 --------------------------------------- $ mkdir -p ../oe_core/layers/meta-customer-demos/conf $ cd .../oe_core/layers/meta-customer-demos/conf ### create layer.conf file ### # We have a conf and classes directory, append to BBPATH BBPATH .= ":${LAYERDIR}" # We have recipes-* directories, add to BBFILES BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" BBFILE_COLLECTIONS += "customer-demos" BBFILE_PATTERN_customer-demos = "^${LAYERDIR}/" BBFILE_PRIORITY_customer-demos = "24" # Let us add layer-specific bbappends which are only applied when that # layer is included in our configuration BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bbappend' % layer \ for layer in BBFILE_COLLECTIONS.split())}" # Add layer-specific bb files too BBFILES += "${@' '.join('${LAYERDIR}/%s/recipes*/*/*.bb' % layer \ for layer in BBFILE_COLLECTIONS.split())}" LAYERDEPENDS_customer-demos = " \ core \ yocto \ openembedded-layer gnome-layer multimedia-layer networking-layer \ " LAYERSERIES_COMPAT_customer-demos = "hardknott honister kirkstone scarthgap" --------------------------------------- d). 在定制化 layer meta-customer-demos 下面添加 Docker bbapend 文件,配置 Docker 可以启动自动加载 --------------------------------------- $ cd .../oe_core/layers/meta-customer-demos/ $ mkdir -p recipes-containers/docker $ cd recipes-containers/docker ### cteate docker-moby_git.bbappend file ### FILES:${PN} += "${sysconfdir}/systemd/system/docker.service" SYSTEMD_SERVICE:${PN} = "docker.service" SYSTEMD_AUTO_ENABLE:${PN} = "enable" --------------------------------------- e). Docker daemon 启动需要额外比如 IPSec/Netfilter/NF_table 等网络相关的 Kernel Modules ,因此如下增加额外的 Linux Kernel 配置。 --------------------------------------- $ cd .../oe_core/layers/meta-customer-demos/ $ mkdir -p recipes-kernel/linux/ $ cd recipes-kernel/linux ### cteate linux-toradex%.bbappend file ### SRCREV_meta-custom = "1e293f75e7e5569f0d86d752fbf4180dd3fac6eb" SRCREV_meta-custom:use-head-next = "${AUTOREV}" KMETABRANCH = "scarthgap-7.x.y" KMETAVIRTUALITION = "kernel-meta-custom" KMETAREPOSITORY="github.com/toradex/toradex-kernel-cache.git" KMETAPROTOCOL="https" SRC_URI += "git://${KMETAREPOSITORY};protocol=${KMETAPROTOCOL};type=kmeta;name=meta-custom;branch=${KMETABRANCH};destsuffix=${KMETAVIRTUALITION}" ## Compose additional .scc file including docker requirement and include it to our build. KERNEL_FEATURES += "bsp/${MACHINE}-${LINUX_KERNEL_TYPE}-torizon.scc" --------------------------------------- f). 最终完整 meta-customer-demos layer 文件结构如下 meta-customer-demos ├── conf │ └── layer.conf ├── recipes-containers │ └── docker │ └── docker-moby_git.bbappend └── recipes-kernel └── linux └── linux-toradex % .bbappend g). 修改 bblayers.conf 和 local.conf 文件 ------------------------------- ### modify bblayer.conf ### --- a/build/conf/bblayers.conf +++ b/build/conf/bblayers.conf @@ -34,7 +34,7 @@ ${TOPDIR}/../layers/meta-openembedded/meta-python \ ${TOPDIR}/../layers/meta-freescale-distro \ ${TOPDIR}/../layers/meta-toradex-demos \ + ${TOPDIR}/../layers/meta- virtualization \ + ${TOPDIR}/../layers/meta- customer-demos \ \ \ ${TOPDIR}/../layers/meta-toradex-distro \ ### add below to local.conf ### # enable meta-virtualization DISTRO_FEATURES:append = " virtualization" # enable docker support IMAGE_INSTALL:append = " docker docker-compose" # add Freescale EULA ACCEPT_FSL_EULA = "1" ------------------------------- h ). 编译 Yocto Linux image ------------------------------- # ## compile Reference-Multimedia image ### $ MACHINE="verdin- imx8mp " bitbake tdx-reference-multimedia-image ------------------------------- i ). Yocto Linux image 部署 参考 这里 通过 Toradex Easy installer 将上面编译好的 image 更新部署到模块 4 ). EMQX 部署测试 a ). 关于 EMQX 的更多说明和介绍可以参考如下 https://docs.emqx.com/en/emqx/latest/getting-started/getting-started.html b ). 在 Verdin i.MX8MP 设备上面通过如下命令确认 Docker daemon 已经成功运行 ------------------------------- root@verdin-imx8mp-06849028:~# systemctl is-enabled docker.service enabled root@verdin-imx8mp-06849028:~# systemctl status docker.service * docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Fri 2025-03-28 01:54:37 UTC; 5h 16min ago TriggeredBy: * docker.socket Docs: https://docs.docker.com Main PID: 685 (dockerd) Tasks: 19 Memory: 99.6M (peak: 146.5M) CPU: 14.376s CGroup: /system.slice/docker.service `-685 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ... Mar 28 01:54:37 verdin-imx8mp-06849028 dockerd : time="2025-03-28T01:54:37.583078000Z" level=info msg="Daemon has completed initialization" Mar 28 01:54:37 verdin-imx8mp-06849028 dockerd : time="2025-03-28T01:54:37.684308375Z" level=info msg="API listen on /run/docker.sock" Mar 28 01:54:37 verdin-imx8mp-06849028 systemd : Started Docker Application Container Engine. ------------------------------- c). 参考 这里 通过如下命令安装并运行 EMQX ARM64 Docker Image ,本文采用 offline 方式,如果网络条件允许也可以 online 方式安装。 ------------------------------- ### download $ wget https://www.emqx.com/en/downloads/broker/5.8.6/emqx-5.8.6-docker-arm64.tar.gz ### install $ docker load emqx-5.8.6-docker-arm64.tar.gz ### $ docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.8.6 ------------------------------- d ). 此时在开发主机,通过浏览器通过如下网址可以查看已经运行的 EMQX 控制台页面,默认登录信息为 admin/public ,可以后续自行更改密码。 ------------------------------- http:// verdin_imx8mp_ip_address :18083/ ------------------------------- e). 通过如下自带的基于 Websocket 的 MQTT 客户端进行测试 ./ 进入客户端后,首先连接 Verdin i.MX8MP 核心节点设备 ./ 然后再订阅默认的 “ testtopic ” 主题 ./ 最后可以修改 payload 内容后,点击发布,可以看到核心节点可以正常接收数据 5 ). 总结 本文 基于 NXP i.MX8MP 处理器简单演示了通过 Docker 环境部署运行 EMQX MQTT 消息服务器。
相关资源
  • 所需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多点电容触摸屏实验_笔记