• [问题求助] 小熊派iot开发板uart
    我想问下小熊派iot的开发板出口通信的电平标准是多少伏
  • [问题求助] 华为笔记本14S屏幕自动触碰故障严重
    2023年3月15日,于拼多多“华为百补专卖店”下单华为14S2022款云杉绿1T笔记本电脑,16日签收,激活后使用一两次无故障,后使用偶有故障,以为是自己的原因,4.14日至今故障异常频繁,(补充:①对电脑使用需求不高,电池至今充满过两次,现在满电②此故障已经拿到华为线下店咨询,工程师已经感受过故障及程度)故障具体为:电脑左上角位置自动触屏,看视频打字或者刚开机时,都遇到过,一直点左上角位置,经工程师检测,非软件问题(山西太原平阳路店,可核实情况是否属实)
  • [交流吐槽] 深圳弘毅云佳科技有限公司 经销批发的无线数传模块
    深圳弘毅云佳科技有限公司 经销批发的无线数传模块、项目开发、蓝牙4.0/4.2/5.0模块、LOAR模块.WIFI 模组. ZIGBEE组网模组、 串口模块、语音模块、通讯模块畅销消费者市场,在消费者当中享有较高的地位,公司与多家公司建立了长期稳定的合作关系。深圳弘毅云佳科技有限公司经销的无线数传模块、项目开发、串口模块、语音模块、通讯模块 LOAR模块  蓝牙模块品种齐全、价格合理。深圳弘毅云佳科技有限公司实力雄厚,重信用、守合同、保证产品质量,以多品种经营特色和薄利多销的原则,赢得了广大客户的信任。  
  • [问题求助] 使用Postman调测通过,使用Python却报IOTDA.000001
    我在使用上层应用控制下层ESP32,需要用到平台下发命令,我是用Postman调测通过,但是使用Python时却报了{"error_code":"IOTDA.000001","error_msg":"Internal server error."}以下是我的代码import requests url = "XXXX" payload = { "service_id" : "SmokeDetectorControl", "command_name" : "ON_OFF", "paras" : { "value" : "1" } } headers = { 'x-auth-token': 'XXXXXX' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)与API explorer示例代码基本一致,希望哪位朋友能帮我看一下,不胜感激
  • [其他] DSP+ZYNQ评估板例程使用手册XQTyer【分享】
    【开源资料】XQTyer评估板例程使用手册链接:https://share.weiyun.com/8csewUvh 密码:8r9by7         XQ6657Z35/45-EVM(XQTyer 评估板)是一款基于 TI KeyStone 架构 C6000 系列 TMS320C6657双核C66x 定点/浮点 DSP以及 Xilinx Zynq-7000 系列 XC7Z035/045 SoC 处理器设计的高端异构多核评估板,由核心板与评估底板组成。
  • AP供电降档
    关于供电标准: 目前主流的AP供电方式多采用POE供电方式,省去了铺设电源线,也便于维护,AP数量较多时会使用POE交换机供电,AP数量较少时可以在普通的交换机和AP之间增加一个POE供电模块。POE供电系统包括供电设备(PSE)和受电设备(PD),如网口或者光口需要进行协商一样,供电设备和受电设备之间也需要协商POE供电协议,不同厂商可能会使用不同的供电和受电标准,也就是说大家各自支持的输出和输入功率存在差异,这样就可能出现供不上电或供电电流过大等问题导致设备不能正常上电使用。IEEE委员会因此推出了三套POE供电标准:802.3af、802.3at、802.3bt。如果厂商的设备符合这些国际标准,那么一旦双方协商到了某个标准之下,就可以使用对应标准的功率进行供电。协商方式分为硬件协商或LLDP协议协商,硬件协商时通常PSE会通过PD回应的分级确认电流协商出一个输出的功率,LLDP协商时会通过协议交互报文专门的Power via MDI TLV字段协商出一个输出功率。如果使用POE模块供电,LLDP协议可以透传模块,实际上还是交换机与AP在进行协商。那是不是只要符合POE国标了,供电协商就一定没有问题了呢?当然不是,因为不同AP对供电的标准要求不同,而交换机支持的供电输出能力也各有差异,当供电功率无法稳定达到相应级别,就会出现供电降档甚至供电不足的情况,现象就是出现AP功能受限,或者无法发射信号、反复重启、无法上线等问题。AP供电降档常见的影响:其中有线侧不可用的部分一般都是额外拓展接口,例如部分AP支持对接物联网功能,如果供电降档则物联网插卡就无法正常使用;有额外可以用来连接终端的电口也会无法UP;光电复用的电口只能使用其中一个,无法使用电口供电光口传输数据;像USB或者可以对外额外输出供电的POE OUT接口也会因为供电输出功率不够而不能使用。无线侧部分通常是降低了性能,例如支持的空间流数减少,无线发射功率降低等,个别也可能导致业务功能有影响。如何查询华为设备供电规格指标:具体的AP支持的功率标准可以在Info-Finder规格查询网站上确认:cid:link_0选择对应的AP型号,点击硬件中心,选择AP查看规格详情,规格表最下面可以看到供电相关说明信息AP供电异常需要关注硬件和软件两个方面,多种因素都可能导致出现供电不足或供电降档,供电降档在业务不受影响的情况下可以正常使用,如果想最大化实现AP功能或性能则需要保证供电正常,请从POE供电设备和AP两端分别排查。相关信息参考资料:cid:link_1
  • [openEuler] openeuler系统outbox外部驱动使能指导
    Outbox外部驱动使能指导  1    QLogic qla2xxx 1.    驱动下载链接:https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP3/contrib/drivers/source/Packages/qla2xxx-10.02.06.04_k-1_OpenEuler.zip 2.    环境信息 openeuler-20.03lts-sp33.    解压驱动包  4.    cd /qla2xxx-10.02.06.02-k ./extras/build.sh  install        仅做测试使用,重启不生效 ./extras/build.sh  initrd        重启生效  5.    查看新驱动 modinfo qla2xxx qla2xxx 第二种 1.    驱动下载地址:https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP3/contrib/drivers/source/Packages/qla2xxx-10.02.06.04_k-1_OpenEuler.zip 或     https://driverdownloads.qlogic.com/QLogicDriverDownloads_UI/Files/TempDownlods/99261/qla2xxx-10.02.06.04_k-1_OpenEuler.zip 2.    环境信息 openeuler-20.03lts-sp33.    安装新驱动   rpm –ivh qla2xxx-10.02.06.04_k-1dkms.noarch.rpm  tmp/dkms.xxxx/下面是新驱动,把原来的ko文件备份 modinfo qla2xxx.ko |grep dep  insmod qla2xxx.ko  4.查看新驱动 modinfo qla2xxx |more  2    Intel     igb/i40e/ixgbe/ixgbevf/ice 1.    驱动下载地址:https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/drivers/x86_64/Packages/igb-5.5.2-1.x86_64.rpm 2.    环境信息 openeuler-20.03lts-sp13.    安装新驱动 rpm –ivh igb-5.5.2-1.x86_64.rpm  find / -name “igb.ko”  把新的igb.ko文件替换掉内核自带的igb.ko文件,updates这个目录下是新驱动的文件,把原来的ko文件备份  rmmod        igb insmod        igb.ko modprobe        igb      4.    查看新驱动  igb 第二种情况 1.    驱动下载地址 https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP3/contrib/drivers/source/Packages/igb-5.11.4.tar.gz  2.    环境信息 openeuler-20.03lts-sp3 3.    安装新驱动 解压缩软件包 tar –xvf igb-5.11.4.tar.gz cd igb-5.11.4/src make install 4.    查看新驱动 Modinfo igb |more                3    Avago megaraid_sas 1.    驱动下载地址:https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/drivers/x86_64/Packages/RAID-3004iMR_3108_3408iMR_3416iMR_3508_3516-openEuler20.03-megaraid_sas-07.714.04.00-1-x86_64.rpm  2.    环境信息 openeuler-20.03lts-sp1     3.    安装新驱动 rpm -ivh RAID-3004iMR_3108_3408iMR_3416iMR_3508_3516-openEuler20.03-megaraid_sas-07.714.04.00-1-x86_64.rpm 4.    查看新驱动 modinfo megaraid_sas megaraid_sas(官网) 1.    驱动下载地址:https://docs.broadcom.com/docs-and-downloads/raid-controllers/raid-controllers-common-files/MR_LINUX_DRIVER_7.21-07.721.02.00-1.tgz 2.    环境信息 openeuler-20.03lts-sp13.    安装驱动     解压驱动包     tar –xvf MR_LINUX_DRIVER_7.21-07.721.02.00-1.tgz     tar –xvf megaraid_sas_components.tgz     cd openEuler     cd rpms-1     rpm –ivh kmod-megaraid_sas-07.721.02.00_oe20.03-1.aarch64.rpm 4.    查看新驱动  Megaraid_sas 官网下载地址:https://docs.broadcom.com/docs-and-downloads/raid-controllers/raid-controllers-common-files/MR_LINUX_DRIVER_7.22-07.722.02.00-2.tgz 1.环境信息:  openeuler-20.03lts-sp13.解压缩安装包 解压源码包  cd megaraid_sas-07.722.02.00 ./compile.sh        会在当前目录生成一个megaraid_sas.ko文件 find  / -name “megaraid_sas.ko”  备份/kernel 路径下的ko文件 把上面生成的Ko文件放到kernel/drivers/scsi/megaraid/路径下 reboot 4.查看新驱动 modinfo megaraid_sas 4    Huawei hifc/hinic 1.    驱动下载地址:https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS/contrib/drivers/aarch64/Packages/FC-IN300-openEuler20.03-hifc-3.7.0.8-aarch64.rpm 2.    环境信息  openeuler-20.03-lts3.    安装驱动  rpm -ivh xxxx4.    查看驱动信息 modprobe hifc  5    Mellanox mlx5_core 1.     驱动下载地址: https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ MLNX_OFED_LINUX-5.6-2.0.9.0-openeuler20.03sp1-x86_64.tgz 2.    环境信息  openeuler-20.03lts-sp13.    安装新驱动      解压OFED驱动包  ./mlnxofedinstall    --add-kernel-support 安装报错缺少依赖包    yum install 即可  4.    查看新驱动     modinf mlx5_core  Mellanox ofed community 驱动 1.     驱动下载地址:  https://repo.oepkgs.net/openEuler/rpm/openEuler-22.03-LTS/contrib/drivers/source/Packages/MLNX_OFED_SRC-5.7-1.0.2.0.tgz https://www.mellanox.com/downloads/ofed/ MLNX_OFED-5.7-1.0.2.0/ MLNX_OFED_SRC- 5.7-1.0.2.0.tgz 2.    环境信息 openeuler-22.03-lts3.安装驱动     解压安装包     tar –xvf MLNX_OFED_SRC-5.7-1.0.2.0.tgz     cd MLNX_OFED_SRC-5.7-1.0.2.0     yum install python     ./install.pl      选择2          选择1     报错缺少依赖,安装所需要的依赖,重复上面的步骤./install.pl     yum install cmake …… 4.查看新驱动       6    Broadcom lpfc 1.     驱动下载地址: https://docs.broadcom.com/docs-and-downloads/oem/support/elx/rt14.0.1/14.0.326.19/elx-lpfc-dd-openEuler20-14.0.326.19-ds-1.tar.gz 2.    环境信息   openeuler-20.03lts-sp13.    安装新驱动 解压安装包 cd elx-lpfc-dd-openEuler20-14.0.326.19-ds-1 ./elx_lpfc_install.sh  4.    查看新驱动 lpfc 第二种 1.     驱动下载地址: https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/drivers/source/Packages/elx-lpfc-dd-openEuler20-12.8.614.14-ds-1.tar.gz     或     https://docs.broadcom.com/docs-and-downloads/oem/support/elx/rt12.8.13/12.8.614.20/elx-lpfc-dd-openEuler20-12.8.614.14-ds-1.tar.gz 2.    环境信息  openeuler-20.03lts-sp13.    安装新驱动 解压安装包  cd elx-lpfc-dd-openEuler20-12.8.614.14-ds ./elx_lpfc_install.sh  find  / -name  “lpfc.ko”  extra/elx-lpfc/lpfc.ko是新驱动,把新驱动复制到kernel/drivers/scsi/lpfc/下面,把原来的lpfc.ko备份 modprobe  lpfc  4.    查看新驱动 modinfo lpfc|more  
  • [问题求助] 使用晟腾310做人工智能识别开发,应该买晟腾310什么型号的开发板?
    1.本人研究生一名,要使用YOLO算法进行物体检测,导师说支持国产芯片和开发板,想要买晟腾310的一块开发板,但是不知道哪一个开发板是目前大众使用多的开发板,导师说一定会买一块大众使用的晟腾310开发板,因此想要大家给我推荐一下,希望广大技术友们给点推荐,谢谢大家!
  • [交流分享] DFA典型案例
    1. 简化产品设计、减少零件数量在DFA的所有设计指南中,第1个设计指南“简化产品设计、减少零件数量”排在首位,对产品成本、质量等有着决定性的影响。如果要降低产品成本,通过DFA第1设计指南是最好的办法;当然,也是最难的办法。“简化产品设计、减少零件数量”包含但不限于以下手段:#1 考查每个零件,考虑去除每个零件的可能性:#2 把相邻的零件合并成一个零件. #3 把相似的零件合并成一个零件:#4 把对称的零件合并成一个零件:#5 合理选用零件制造工艺、设计多功能的零件#6 减少紧固件的数量和类型#7 减少线缆的种类和数量胶带封箱器 DFA优化案例如下图所示,原始设计的胶带封箱器零部件众多,结构复杂,组装工序复杂。在满足相同的功能及性能前提下,通过DFA优化之后,改进的设计减少了22个零件,减少了27个组装工序,组装时间节省了75%。下图是改进设计的爆炸图,及工作状态图。零件数量对比组装工序对比组装时间对比组装时间由4分钟到1分钟                                                                                                                                                                                                        出自公zhong号将本设计.
  • [openEuler] openEuler 安装 Nvidia 驱动
    Nvidia cuda及驱动安装方式下载驱动wget cid:link_1安装驱动编译解压相关依赖包dnf install -y tar禁用nouveau驱动rmmod nouveauecho ‘blacklist nouveau’ >> /etc/modprobe.d/blacklist.conf安装驱动bash cuda_11.7.1_515.65.01_linux.run 执行 nvidia-smi命令,如果能看到设备信息,表示驱动安装成功。Nvidia 纯驱动安装方式下载驱动wget cid:link_0安装驱动编译解压相关依赖包dnf install -y tar禁用nouveau驱动rmmod nouveauecho ‘blacklist nouveau’ >> /etc/modprobe.d/blacklist.conf安装驱动bash NVIDIA-Linux-x86_64-515.65.01.run出现选择时都选“yes"​​​​​​​​​​​​​​执行 nvidia-smi命令,如果能看到设备信息,表示驱动安装成功。Agenda执行nvidia-smi报错No devices found执行lspci | grep -i nvidia,确认机器中是否有GPU卡,如果没有,需要插上GPU卡才能使用。
  • oec-hardware 工具使用问题解答
    目录1     Content 22     Support 22.1      安装... 22.2      acpi 32.3      cpufreq. 42.4      disk. 62.5      ethernet/infiniband. 72.6      fc. 82.7      raid. 82.8      kdump. 92.9      memory. 102.10    system... 112.11    usb. 132.12    cdrom... 132.13    watchdog. 142.14    gpu/vgpu. 152.15    板卡四元组信息获取... 152.16    测试依赖安装说明... 161 Contentoec-hardware工具是openEuler社区提供的一款硬件兼容性测试工具,oec-hardware提供服务器整机、板卡与openEuler的兼容性验证测试,验证仅限于基本功能验证,不包括性能测试等其它测试。本词条提供 oec-hardware 工具在工具安装或者测试过程中可能遇到的问题解答。2 Support2.1 安装2.1.1 oec-hardware 工具安装oec-hardware 工具已发布到openEuler 官方的 everything 和 update repo源,请使用 dnf 安装软件包。dnf install oec-hardware安装完成后执行oech命令进行测试。详细使用指导请看:cid:link_32.1.2 oec-hardware 工具服务端安装oec-hardware 工具已发布到openEuler 官方的 everything 和 update repo源,请配置相关repo源,然后通过以下步骤进行安装:(1)使用  dnf  获取软件包进行安装。dnf install oec-hardware-server(2)服务端 web 展示页面需要的部分组件系统本身不提供,需要使用  pip3  安装(请自行配置可用 pip 源)。pip3 install Flask Flask-bootstrap uwsgi(3)启动服务。本服务默认使用 8080 端口,同时搭配 nginx(默认端口 80)提供 web 服务,请保证这些端口未被占用。systemctl start oech-server.servicesystemctl start nginx.service(4) 关闭防火墙和 SElinux。systemctl stop firewalldiptables -Fsetenforce 0详细使用指导请看:cid:link_32.1.3 oec-hardware 工具服务端启动失败oech-server依赖的部分软件包需要通过pip3安装,如果执行systemctl start oech-server 启动服务失败,请确认相关服务依赖的安装,请执行以下命令进行安装:pip3 install Flask Flask-bootstrap uwsgi2.1.4 oec-hardware 工具上传测试结果至服务端失败如果oec-hardware工具在测试完成后上传测试结果至服务端失败,出现upload failed的报错,请按照以下步骤进行排查:1. 确认服务端和客户端可以ping通;2. 检查服务端的防火墙和selinux是否正确关闭,请执行以下命令关闭:systemctl stop firewalldiptables -Fsetenforce 03. 检查初始配置信息是否配置正确,初始化时配置的三个参数不能为空,如果配置异常,请执行oech –clean清除配置信息,重新进行配置。2.2 acpi2.2.1 oec-hardware 工具测试acpi 失败,无法找到acpi表acpi是“Advanced Configuration and Power Interface”的缩写,中文意思是“高级配置与电源管理接口”,因此acpi测试是OS与服务器之间硬件信息交互的测试。oec-hardware 测试acpi时如果出现以下报错,无法找到acpi表:Cannot open directory - /sys/firmware/acpi/tables这个报错说明服务器不支持acpi电源管理,请确认服务器的管理方式。以下是一般服务器提供的acpi表:2.3 cpufreq2.3.1 oec-hardware 工具测试cpufreq时无法找到CPU frequency相关文件系统安装完成后,如果 /sys/devices/system/cpu/cpu0-95 目录下缺少cpufreq目录文件,导致用例读取文件中的值失败,用户可以通过以下步骤使系统显示对应目录:1. 修改bios相关配置,将bios中的power policy 值设置为Efficiency 、DEMT值设置为Disabled。2. 查看CONFIG_CPU_FREQ_GOV_COMMON=Y 是否为可设置grep FREQ /boot/config-4.19.90-2016.3.0.0096.oe1.x86_64 |grep GOV |grep -v “is not set”3. bios 下查看Powe Polily Select值是否为performance,bios->advanced->Power Polily Select4. cat scaling_available_governors,如果只有两种模式,需要检测驱动5. 使用modinfo 查询加载的驱动类型cpufreq涉及到的驱动类型有两种:intel_pstate、acpi_cpufreq。如果是intel_pstate,需要按照下面的步骤,在grub中增加intel_pstate=disable1)vi /etc/default/grub 在GRUB_CMDLINE_LINUX 所在行最后添加intel_pstate=disable参数。2)执行grub2-mkconfig -o /boot/efi/EFI/openeuler/grub.cfg (legacy模式下执行grub2-mkconfig -o /boot/grub2/grub.cfg)。3)cat /proc/cmdline 再检查下修改的cmd,然后重启生效。4)cpupower frequency-info 可以查看目前支持5种模式。如果执行以上步骤后,仍然没有cpufreq的相关目录和文件,请升级BIOS固件版本。相关issue链接:cid:link_52.4 disk2.4.1 oec-hardware 工具测试disk信息配置oec-hardware 工具的disk 测试项需要用户在配置文件 test_config.yaml 中指定相关测试信息,工具执行测试时会自动读取该文件获取相关信息,默认值为all(all表示测试除系统盘以外的所有硬盘)。vi /usr/share/oech/lib/config/test_config.yaml2.5 ethernet/infiniband2.5.1 oec-hardware 工具测试网卡信息配置oec-hardware 工具的 ethernet/inifiband测试项需要用户在配置文件 test_config.yaml 中指定相关测试信息,工具执行测试时会自动读取该文件获取相关信息。vi /usr/share/oech/lib/config/test_config.yaml2.5.2 oec-hardware 工具测试网卡时无法ping通服务端直连网卡使用oec-hardware工具测试网卡时,需要关闭服务端的防火墙、selinux等配置,保证测试端和服务端直连网卡互相可以ping通。 详细使用指导请看:cid:link_32.5.3 oec-hardware 工具测试网卡的rdma模式如果环境中有一张ib卡,当前ib卡使用的是普通网卡模式,可以使用oec-hardware工具的 ethernet 测试项,指定测试rdma 模式,在该模式下会对这张板卡进行ib模式的读写等测试。如果环境中的ib卡使用的infiniband 模式,可以使用oec-hardware工具的 infiniband 测试项对这张卡进行测试。2.6 fc2.6.1 oec-hardware 工具测试FC卡信息配置oec-hardware 工具的fc卡测试项需要用户在配置文件 test_config.yaml 中指定相关测试信息,工具执行测试时会自动读取该文件获取相关信息,默认值为all。vi /usr/share/oech/lib/config/test_config.yaml2.7 raid2.7.1 oec-hardware 工具测试raid卡信息配置oec-hardware 工具的raid卡测试项需要用户在配置文件 test_config.yaml 中指定相关测试信息,工具执行测试时会自动读取该文件获取相关信息,默认值为all。vi /usr/share/oech/lib/config/test_config.yaml2.8 kdump2.8.1 oec-hardware工具执行测试kdump测试套失败oec-hardware工具执行kdump 测试失败,首先尝试手动执行以下命令触发kdump:echo c > /proc/sysrq-trigger如果系统无法正常切换到第二内核,重启失败并且服务器控制台上出现以下CPU报错:造成该问题的原因是服务器的BIOS固件版本较低,用户可以通过升级BIOS固件版本解决该问题。2.8.2 oec-hardware 工具测试kdump时无法切换内核如果遇到oec-hardware工具执行测试kdump测试套失败,手动重启系统,查看是否能出现切换内核的界面。如果没有出现切换内核的界面,可以通过dnf update进行更新,更新后重启确认是否能出现切换内核界面,如果出现该界面,可以重新测试kdump。2.8.3 oec-hardware 工具测试kdump测试时无法读取vmcore文件vmcore文件是由kexec-tools提供的,如果相关文件不存在,请安装软件包kexec-tools。2.9 memory2.9.1 oec-hardware 工具测试memory 出现Error eatmem_test failed, please check the space of SWAPoec-hardware 工具测试memory时如果出现以下报错信息: Error eatmem_test failed, please check the space of SWAP这个是因为swap空间不足导致的报错,需要检查当前系统可用的SWAP分区大小,保证可用大小在4G以上。执行以下步骤动态调整swap分区:创建一个磁盘分区sda1fdisk /dev/sda执行mkswap /dev/sda1格式化分区执行swapon /dev/sda1挂载swap分区free -h查看当前swap可用空间2.9.2 oec-hardware 工具测试memory hotplug失败内存热插拔测试时,如果内存被cpu占用,会出现无限刷屏,oec-hardware 工具暂时未解决这种场景下内存的分析处理,因此在1.1.0版本起工具中暂时取消内存热插拔测试,待修复完成后,工具会重新集成测试。如果执行测试出现memory hotplug失败或以下刷屏现象,请挂载openEuler 官方的 everything 和 update repo源,安装最新版本的工具。2.10 System2.10.1 oec-hardware 工具测试system报错OS版本不支持如果oec-hardware执行system测试项失败,日志中出现类似以下的OS版本不支持的报错:Error: openEuler 22.03 LTS is not supported.请查看oec-hardware 工具 支持的OS版本:cid:link_2如果工具明确支持测试的OS版本,但是执行测试出现报错,说明安装的工具版本太低,请配置openEuler官方everything和update repo源后,通过dnf install oec-hardware安装最新版本的工具软件包。工具最新版本请查看:cid:link_6如果工具版本没有说明支持的OS版本,请在工具仓库下提issue反馈或者发邮件至openEuler社区兼容性SIG组邮箱进行确认:oecompatibility@openeuler.org。2.10.2 oec-hardware 工具测试system报错内核被修改oec-hardware 工具会检查内核的完整性,如果内核被重编或者升级, oec-hardware执行system测试项会失败,日志中会出现类似以下内核被修改的报错:[ERROR] Files in kernel-5.10.0-60.18.0.50.oe2203.aarch64 were modified.详细被修改文件请执行以下命令查看:rpm -V --nomtime --nomode --nocontexts kernel如果确认需要修改内核来支持适配整机/硬件,请将相关patch提交至openEuler社区的kernel中,等内核合入patch后重新进行验证。2.10.3 oec-hardware 工具测试system报错SElinux is not enforcingoec-hardware 工具会检查SElinux的状态,如果日志中出现以下报错,说明系统默认的selinux模式是disabled,所以测试时无法临时打开selinux:[ERROR] SElinux is not enforcing, expect is enforcing.修改/etc/selinux/config中配置项SELINUX的值变更SELinux模式,使用enforcing或permissive模式。修改完成后重启系统,使之生效。然后执行oech重新测试system,selinux可以测试通过。详细的selinux配置方式请参考openEuler各个版本中的安全加固指南,以openEuler 22.03LTS为例,可以参考以下文档:cid:link_02.11 usb2.11.1 oec-hardware 工具测试usboec-hardware进行usb测试时,需要人工进行辅助测试,在出现以下提示时插入usb设备,设备类型不限。插入设备后在控制台输入”y”继续测试,在出现以下提示时拔出usb设备。拔出设备后在控制台输入”y”继续测试。2.12 cdrom2.12.1 oec-hardware 工具测试cdromoec-hardware进行cdrom测试时,需要人工进行辅助测试,在出现以下提示时插入cdrom设备 插入设备后在控制台输入”y”继续测试。注意:cdrom测试时会对CD/DVD进行读写测试,会破坏里面的数据,所以测试时要确认设备里的数据已进行备份。2.13 watchdog2.13.1 oec-hardware 工具执行测试watchdog失败oec-hardware工具如果执行watchdog用例失败,请先执行下面两条命令,然后再进行测试:rmmod sbsa_gwdtmodprobe sbsa_gwdt action=1相关issue链接:cid:link_42.13.2 oec-hardware 工具执行测试获取watchdog时间报错oec-hardware工具执行watchdog用例失败,如果出现以下报错,表示获取watchdog时间失败:请执行下面两条命令:cd /usr/share/oech/lib/tests/watchdog./watchdog -s 20如果手动测试通过,请重新测试watchdog。2.14 gpu/vgpu2.14.1 oec-hardware 工具无法显示gpu/vgpu测试项 oec-hardware 工具提供了gpu/vgpu 测试能力,在使用工具测试前,用户需要手动安装gpu/vgpu驱动,配置好硬件环境后再执行 oech 命令,工具会识别并显示 gpu/vgpu 测试项。2.14.2 oec-hardware 工具测试vgpu失败 oec-hardware 工具集成了nvidia vgpu测试能力,nvidia 的gpu和vgpu使用的是不同的驱动,因此如果要测试vgpu,需要单独安装vgpu驱动,配置好环境,并在/root目录下放置nvidia 客户端(虚拟机)可使用的vgpu驱动。2.15 板卡四元组信息获取用户可以通过以下三种方式查看板卡四元组信息:通过iBMC查看使用 lspci -nvv 查看使用 lspci -xs 查看以网卡的四元组信息查询为例:执行ethtool -i 网卡名,查看网卡的bus-info;执行lspci -xs 网卡的bus-info,查看四元组信息;vendorID: 19e5deviceID: a222svID: 19e5ssID: 04cc2.16 测试依赖安装说明oec-hardware 工具存在软件包安装依赖和编译依赖,并且每个测试项会有不同的测试依赖。如果测试环境无法连接外网,可以通过挂载本地repo源或提前下载相关软件包、工具上传至测试环境中,再进行测试。以下文档中提供了oec-hardware 工具的相关依赖软件包列表:cid:link_1
  • [Atlas500] 如何查询硬件编解码的资源使用率
    在Atlas500上有没有什么命令可以查看硬件编解码的使用率吗? npu-smi上可以查看npu的资源,内存的资源,但查不了硬件编解码的资源。请问有类似的命令查看硬件编解码资源吗?
  • [技术干货] 【论文分享】智能穿戴设备基于动态模板匹配算法的3D手势识别
    智能穿戴设备基于动态模板匹配算法的3D手势识别李云鹤肇庆学院,广东 肇庆526061摘要随着物联网设备的日益普及,智能穿戴设备行业发展迅速,其中以腕带类的智能手环、手表为主。智能穿戴设备具有丰富的传感器和一定的计算能力,通过手势识别作为自身以及面向其他物联网设备的人机交互,具有广泛的用户需求。提出基于动态模板匹配算法的3D手势识别系统,通过智能穿戴设备收集用户的特定手势来判断手势的含义,从而利用更自然的人机交互技术实现对智能设备的控制。使用智能设备的运动传感器读取相应的3D手势数据,结合优化的动态时间规整算法来识别手势;基于移动设备的特征和动态编程,通过斜率来界定曲线路径;同时,通过预存储失真阈值减少模板匹配的计算量和手势识别成本。在手机上进行测试,所提算法与传统算法相比,耗时更少,识别效率和精度更高,可以带来更好的人机交互体验。关键词: 智能穿戴 ; 手势识别 ; 人机交互 ; 动态模板匹配算法 ; 动态时间规整1 引言以腕带类智能手环、手表为代表的智能穿戴设备越来越普及,为广大用户提供了便捷服务。智能穿戴设备一般受尺寸约束,对人机交互形式有特殊的要求。在日常生活中,手势交互是一种常见的、直观的沟通方式,结合了智能穿戴设备受的约束、智能传感设备具有的丰富传感器以及一定的计算能力,相对于传统的人机交互形式,使用穿戴设备作为手势识别终端,改善了人机交互体验,使用户可以进行自由、自然的交互。目前,基于传感器的手势识别已取得一定成果。在文献[1]中, Yao等人设计了一种分为14个分片的手势分区方法并整合到基于视觉的手势识别框架中,用于开发桌面应用程序、跟踪三维空间中的手势,使用简单轮廓模型来匹配手势,从而支持复杂的实时互动。在文献[2]中,Lu等人提出了一种用于处理手势识别的加速度和表面肌电图(SEMG,surface electromyography)信号的算法框架。在文献[3]中,Marin 等人提出了一种关于体感控制数据的手势识别方案,该方案计算基于指尖位置和方向的特征集,并将其发送到 SVM 分类器中,用于识别已执行的手势。在文献[4]中,Molchanov 等人提出了一种使用 3D 卷积神经网络将驾驶员姿势识别算法的深度和强度数据在 VIVA 比赛数据集上实现的算法,正确分类率可达 77.5%。在文献[5]中,Caramiaux 等人描述了基于模板的识别方法,该方法采用序贯蒙特卡罗推理法的同时调整输入手势,不同于基于动态编程的标准模板法,如动态时间规整(DTW,dynamic time warping),该算法具有实时跟踪手势变化的自适应过程。在文献[6]中,Zhang 等人提出了一种新的有效描述符,即3D平面直方图(H3DF),使用H3DF清晰地编码 3D 形状信息。在文献[7]中,Tsai 等人提出了一个便于查阅日常信息的方法,即不需要操作鼠标和键盘以省去接收信息步骤的系统。在文献[8]中,Cheng 等人介绍了近年来关于 3D 深度手势识别的研究。目前,基于传感器的手势研究主要集中在将收集的手势相关数据发送到电脑,然后使用轻型设备识别手势。但是,这种识别模型过于依赖电脑进行数据处理和分类,限制了手势的应用范围。本文提出的基于穿戴设备的 3D 手势识别算法,直接利用智能穿戴设备进行数据处理,这种3D手势识别可以在任何地方实现,不受网络连接和地点限制。因此,此识别模型可以极大地扩大手势的应用范围。如用于PPT讲座演示、控制智能家电甚至无人驾驶飞行器的飞行轨迹。此外,每个人有独特的手势习惯,尤其是复杂手势,因此可以提取每个人的独特手势特征,创建用于手机解锁和简单身份认证的轨迹指纹。不同于基于视觉的手势识别,本文提出的手势识别方法受环境背景和光照条件的影响较小。即使在步行时,也可以使用该方法,对识别率影响小,比基于视觉的手势识别优势更大。本文利用动态时间归整算法识别并优化手势,从而提高手势识别效率[9]。DTW算法的核心思想为:将输入的主要数据与预存储的模板进行匹配,并通过测量两个模板之间的相似性完成识别任务[10]。考虑手势持续时间会随机发生变化,模板匹配必须在时序长度上处理输入的数据和预存储的模板之间的一致性[11],因此,DTW算法具有一定优势。本文提出的识别方法包括使用DTW算法进行的数据预处理和识别。2 结束语本文研究了基于运动传感器的动态手势识别,应用智能穿戴设备的算法并测试了识别精度。创新性地识别了移动设备的 3D 手势,并解决了传统的基于视觉的手势识别技术,这种传统技术容易受外部环境的干扰并受摄像头移动范围的限制。随着移动设备的日益普及,本文提出的方法将推广到更多领域,实现更好的人机交互体验。本文设计了8种相对简单且常见的手势,可以根据轨迹进行区分,为将研究成果推广到更多领域奠定了坚实基础。对于所提出的方案,考虑每个人有独特的手势习惯,特别是在做复杂手势时,可以从手势中提取唯一特征,以创建手机解锁和简单身份认证的轨迹指纹。大量测试表明,本文提出的手势识别算法合理有效,平均精度达90%左右。当识别闭环手势时,准确率超过90%。与其他具有相同精度的手势识别算法相比,本文提出的算法复杂度更低,识别速度更快。在行走期间识别手势时,平均识别精度可以满足识别要求,因此,本文提出的算法可以实现较高的识别率。The authors have declared that no competing interests exist.作者已声明无竞争性利益关系。3 原文链接http://www.infocomm-journal.com/wlw/article/2019/2096-3750/2096-3750-3-1-00097.shtml
  • [交流吐槽] 科技常识之物联网
    一、定义物联网即“物物相连的互联网”,是互联网基础上的延伸和扩展的网络,将各种信息传感设备与互联网结合起来而形成的一个巨大网络,实现在任何时间、任何地点,人、机、物的互联互通。在这项技术中,每一个设备都能自动工作,根据环境变化自动响应,与其他或多个设备交换数据,不需要人为参与。整个系统由无线网络和互联网的完美结合而构建。物联网的主要目的是提高设备的效率和准确性,为人们节省金钱和时间。二、来源最早是Peter T. Lewis 在1985提出这个概念。而后比尔·盖茨在1995年出版的《未来之路》一书中提及物互联。1998年麻省理工学院提出了当时被称作EPC系统的物联网构想。1999年,在物品编码(RFID)技术上Auto-ID公司提出了物联网的概念。2005年11月17日,世界信息峰会上,国际电信联盟发布了《ITU互联网报告2005:物联网》,其中指出“物联网”时代的来临。三、与互联网的关系物联网的核心和基础仍将是互联网。但互联网需要一系列技术升级才能满足物联网的需求。四、物联网如何运作下面就和牡丹江中公教育一起了解。物联网的每一个设备都需要由两部分组成,第一个,也是必不可少的——互联网。任何一个物联网设备都离不开网络。第二个,是智能手机或移动设备,每个物联网设备都需要另外一个或多个设备相互交换数据才能确保其正常工作,这也是目前控制物联网设备的唯一方法。五、物联网在生活中的运用物联网涉及到生活的方方面面,包括健康、制造业、运输、银行、食品服务、石油勘探农业、防御等多个行业,主要运用于智能建筑智能制造、智能门锁,可以上传盗窃信息、物流配送最佳时间、智能机器人、监控冰箱、与冰箱里的食物保存状态、智能汽车、智能运动检测程序、智能园艺浇水、智能家居系统、智能供应链定制、智能环境监测系统、智能贩卖机、智能城市、智能交通等领域。比如,为生活带来便捷。如果在家中使用了物联网设备,会使你的生活变得更加方便。比如你要出门,家里的电视机、空调、灯泡等电器设备的电源会自动关闭,扫地机器人开始工作,烟雾警报器自动打开。而且你可以在任意地点任何时间控制家中的智能设备,比如下班后通过手机中的APP打开家里的空调,到家后打开房间的灯,这样一回到家就能享受到舒适的温度,也不用摸黑去找灯的开关了。比如,保障安全。你可以通过智能摄像头连接到互联网,24小时随时随地查看家里录像,还可以自动检测到家里有没有异常,发现可疑人员会自动提醒甚至报警。智能门锁,利用指纹开锁,更加安全快速,不用怕忘记带钥匙而无法开门,通过摄像头和麦克风与门外的访客进行交谈,确保安全再开门。如果你安装了自动门窗,这些设备上的特定传感器可以根据环境的变化自动开关。比如,智能驾驶。一般汽车上的数字技术基于优化自身的内部功能。但是,当物联网与汽车相结合时,能够通过传感器和互联网进行自动优化,实现自动驾驶,同时可以保护乘客安全。比如,建立智慧城市.这是物联网的另一项重大应用,智能城市可以通过自动化系统让城市生活更健康便捷。智能监控、供水、电力获取和供应、城市交通、自动化运输、城市安全都是智能城市的提现。原文链接:https://www.163.com/dy/article/HEG1E8LG0516L524.html
  • [技术干货] 基于STM32设计的环境检测设备
    ## 1. 前言 随着人们生活质量的提高,对于生活环境的问题,人们的关注度进一步提高,同时政府部门采取了许多措施来改善环境状况。但是总体上来说我国的环境监测技术水平比较落后,传统上的监测手段比较单一,监测数据也不够准确,耗尽了大量的人力和财力,却成效不高。 针对上述缺点,当前文章综合了嵌入式处理技术、传感器技术、无线网络通信等技术,设计了一个基于STM32的无线环境监测系统,系统主要实现了对湿度、温度、有毒气体、烟雾浓度、空气质量等参数进行实时监测的功能。为了实现无线数据传输功能,采用了无线wifi技术。系统的测试分析表明系统整体数据采集性能良好,数据传输稳定性可靠,到达了预期目标。 系统与传统的监测技术相比,具有监测数据准确,监测范围广,智能化高等特点。且系统具有一定的创新性,在实际的工程运用和理论研究上体现出了一定的研究价值最后通过实物的调试,各项参数及功能符合设计要求,能达到预期的目的。 设计以STM32微控制器为平台,采用DHT11温湿度传感器、烟雾传感器MQ-2、易燃气体传感器MQ-4、空气质量检测传感器MQ-135对室内温湿度和危险气体进行采集。通过wifi无线网络将数据传送给微控制器,STM32微控制器处理数据后,由自带oled液晶屏显示。当室内温度达到预警值或有危险气体时,系统将会自动警报并将警报信息通过wifi网络传输给客户手机。且每隔一段时间会通过wifi自动发送监测信息到手机,从而实现对室内环境的监测及报警功能。 [基于STM32设计的环境检测设备视频演示地址](https://live.csdn.net/v/182605) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/9/1660008434916542173.png) ## 2. 实现功能与整体框架图 开发板采用STM32最小系统板,主控CPU采用STM32F103C8T6,其他传感器采用模块的形式连接到开发板。 **主要实现以下功能实现:** 1、通过DHT11温湿度传感器、烟雾传感器MQ-2、易燃气体传感器MQ-4、空气质量检测传感器MQ-135对室内温湿度和危险气体进行采集。 2、通过传感器用ADC模拟数字的转换,采集到的数据显示在oled屏幕上。 3、当检测到的数据超过设定的安全值时,屏幕上会显示警报。 4、检测到的数据能定时通过ESP8266 wifi无线传输发送到所连接的用户的手机上,实现监测功能。 **系统框架图如下:** ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/9/1660008470754409632.png) ## 3. 硬件特点介绍 **(1) 温湿度传感器** 温湿度传感器采用DHT11,这是一款直接输出数字信号的温湿度传感器;其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。通过单总线时序输出,占用的IO口也比较少,工作电压3V~5V,单片机连接控制很方便。 **(2) MQ系列的气体检测传感器** 烟雾传感器MQ-2、易燃气体传感器MQ-4、空气质量检测传感器MQ-135,这些传感器都是输出模拟信号。 配置好STM32的ADC采集接口,采集数据进行处理即可。 **(3) ESP8266 WIFI** 联网的模块采用ESP8266 WIFI,ESP8266在物联网里使用非常多,有很多成熟的案例.WIFI本身也支持二次开发,默认集成的SDK支持AT指令控制,单片机可以通过串口方式控制ESP8266完成网络通信,非常方便. **(4) OLED显示屏** OLED显示屏采用中景园电子的0.96寸OLED,分辨率是128x64,使用的SPI引脚接口屏幕,刷屏速度很快,控制简单 **(5) 上位机设计** 手机APP和PC端没有单独设计精美的界面,只是简单的展示了数据显示。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/9/1660008485937886200.png) ## 4. 核心源码 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20228/9/1660008499397380289.png) ### 4.1 DHT11温湿度代码 ```cpp #include "dht11.h" #include "delay.h" //复位DHT11 void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ DelayMs(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us } //等待DHT11的回应 //返回1:未检测到DHT11的存在 //返回0:存在 u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry100)//DHT11会拉低40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry100)//DHT11拉低后会再次拉高40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } //从DHT11读取一个位 //返回值:1/0 u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry100)//等待变为低电平 { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry100)//等待变高电平 { retry++; delay_us(1); } delay_us(40);//等待40us if(DHT11_DQ_IN)return 1; else return 0; } //从DHT11读取一个字节 //返回值:读到的数据 u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i8;i++) { dat=1; dat|=DHT11_Read_Bit(); } return dat; } //从DHT11读取一次数据 //temp:温度值(范围:0~50°) //humi:湿度值(范围:20%~90%) //返回值:0,正常;1,读取失败 u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); //printf("------------------------\r\n"); if(DHT11_Check()==0) { for(i=0;i5;i++)//读取40位数据 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } }else return 1; return 0; } //初始化DHT11的IO口 DQ 同时检测DHT11的存在 //返回1:不存在 //返回0:存在 u8 DHT11_Init(void) { RCC->APB2ENR|=12; //使能PORTG口时钟 GPIOA->CRL&=0XFF0FFFFF;//PORTG.11 推挽输出 GPIOA->CRL|=0X00300000; GPIOA->ODR|=15; //输出1 DHT11_Rst(); return DHT11_Check(); } ``` ### 4.2 ESP8266代码 ```cpp #include "esp8266.h" extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN字节 extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节 extern vu16 USART3_RX_STA; //接收数据状态 /////////////////////////////////////////////////////////////////////////////////////////////////////////// //用户配置区 //连接端口号:8086,可自行修改为其他端口. const u8 portnum[]="8089"; //WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改. const u8 wifista_ssid[]="wbyq1"; //路由器SSID号 const u8 wifista_encryption[]="wpa2_aes"; //wpa/wpa2 aes加密方式 const u8 wifista_password[]="123456789"; //连接密码 //WIFI AP模式,模块对外的无线参数,可自行修改. const u8 wifiap_ssid[]="Cortex_M3"; //对外SSID号 const u8 wifiap_encryption[]="wpawpa2_aes"; //wpa/wpa2 aes加密方式 const u8 wifiap_password[]="12345678"; //连接密码 /* 函数功能:向ESP82668266发送命令 函数参数: cmd:发送的命令字符串 ack:期待的应答结果,如果为空,则表示不需要等待应答 waittime:等待时间(单位:10ms) 返 回 值: 0,发送成功(得到了期待的应答结果) 1,发送失败 */ u8 ESP8266_SendCmd(u8 *cmd,u8 *ack,u16 waittime) { u8 res=0; USART3_RX_STA=0; UsartStringSend(USART3,cmd);//发送命令 if(ack&&waittime) //需要等待应答 { while(--waittime) //等待倒计时 { DelayMs(10); if(USART3_RX_STA&0X8000)//接收到期待的应答结果 { if(ESP8266_CheckCmd(ack)) { res=0; //printf("cmd->ack:%s,%s\r\n",cmd,(u8*)ack); break;//得到有效数据 } USART3_RX_STA=0; } } if(waittime==0)res=1; } return res; } /* 函数功能:ESP8266发送命令后,检测接收到的应答 函数参数:str:期待的应答结果 返 回 值:0,没有得到期待的应答结果 其他,期待应答结果的位置(str的位置) */ u8* ESP8266_CheckCmd(u8 *str) { char *strx=0; if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 strx=strstr((const char*)USART3_RX_BUF,(const char*)str); //查找是否应答成功 printf("RX=%s",USART3_RX_BUF); } return (u8*)strx; } /* 函数功能:向ESP8266发送指定数据 函数参数: data:发送的数据(不需要添加回车) ack:期待的应答结果,如果为空,则表示不需要等待应答 waittime:等待时间(单位:10ms) 返 回 值:0,发送成功(得到了期待的应答结果)luojian */ u8 ESP8266_SendData(u8 *data,u8 *ack,u16 waittime) { u8 res=0; USART3_RX_STA=0; UsartStringSend(USART3,data);//发送数据 if(ack&&waittime) //需要等待应答 { while(--waittime) //等待倒计时 { DelayMs(10); if(USART3_RX_STA&0X8000)//接收到期待的应答结果 { if(ESP8266_CheckCmd(ack))break;//得到有效数据 USART3_RX_STA=0; } } if(waittime==0)res=1; } return res; } /* 函数功能:ESP8266退出透传模式 返 回 值:0,退出成功; 1,退出失败 */ u8 ESP8266_QuitTrans(void) { while((USART3->SR&0X40)==0); //等待发送空 USART3->DR='+'; DelayMs(15); //大于串口组帧时间(10ms) while((USART3->SR&0X40)==0); //等待发送空 USART3->DR='+'; DelayMs(15); //大于串口组帧时间(10ms) while((USART3->SR&0X40)==0); //等待发送空 USART3->DR='+'; DelayMs(500); //等待500ms return ESP8266_SendCmd("AT","OK",20);//退出透传判断. } /* 函数功能:获取ESP82668266模块的AP+STA连接状态 返 回 值:0,未连接;1,连接成功 */ u8 ESP8266_ApStaCheck(void) { if(ESP8266_QuitTrans())return 0; //退出透传 ESP8266_SendCmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态 if(ESP8266_CheckCmd("+CIPSTATUS:0")&& ESP8266_CheckCmd("+CIPSTATUS:1")&& ESP8266_CheckCmd("+CIPSTATUS:2")&& ESP8266_CheckCmd("+CIPSTATUS:4")) return 0; else return 1; } /* 函数功能:获取ESP8266模块的连接状态 返 回 值:0,未连接;1,连接成功. */ u8 ESP8266_ConstaCheck(void) { u8 *p; u8 res; if(ESP8266_QuitTrans())return 0; //退出透传 ESP8266_SendCmd("AT+CIPSTATUS",":",50); //发送AT+CIPSTATUS指令,查询连接状态 p=ESP8266_CheckCmd("+CIPSTATUS:"); res=*p; //得到连接状态 return res; } /* 函数功能:获取ip地址 函数参数:ipbuf:ip地址输出缓存区 */ void ESP8266_GetWanip(u8* ipbuf) { u8 *p,*p1; if(ESP8266_SendCmd("AT+CIFSR\r\n","OK",50))//获取WAN IP地址失败 { ipbuf[0]=0; return; } p=ESP8266_CheckCmd("\""); p1=(u8*)strstr((const char*)(p+1),"\""); *p1=0; sprintf((char*)ipbuf,"%s",p+1); } /* 函数功能:将收到的AT指令应答数据返回给电脑串口 参 数:mode:0,不清零USART3_RX_STA; 1,清零USART3_RX_STA; */ void ESP8266_AtResponse(u8 mode) { if(USART3_RX_STA&0X8000) //接收到一次数据了 { USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符 printf("%s",USART3_RX_BUF); //发送到串口 if(mode)USART3_RX_STA=0; } } /* 函数功能:ESP8266 AP模式+TCP服务器模式测试 */ void ESP8266_APorServer(void) { u8 p[100]; u8 ipbuf[20]; while(ESP8266_SendCmd("AT\r\n","OK",20))//检查WIFI模块是否在线 { ESP8266_QuitTrans();//退出透传 ESP8266_SendCmd("AT+CIPMODE=0\r\n","OK",200); //关闭透传模式 printf("未检测到模块,正在尝试连接模块...\r\n"); DelayMs(800); } printf("ESP8266模块检测OK!\r\n"); while(ESP8266_SendCmd("ATE0\r\n","OK",20)); //关闭回显 printf("请用设备连接WIFI热点:%s,%s,%ss\r\n",(u8*)wifiap_ssid,(u8*)wifiap_encryption,(u8*)wifiap_password); /*1. 设置WIFI AP模式 */ ESP8266_SendCmd("AT+CWMODE=2\r\n","OK",50); /*2. 重启模块 */ ESP8266_SendCmd("AT+RST\r\n","OK",20); /*3. 延时3S等待重启成功*/ DelayMs(1000); DelayMs(1000); DelayMs(1000); /*5. 配置模块AP模式无线参数*/ sprintf((char*)p,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",wifiap_ssid,wifiap_password); ESP8266_SendCmd(p,"OK",1000); /*4. 设置多连接模式:0单连接,1多连接(服务器模式必须开启)*/ ESP8266_SendCmd("AT+CIPMUX=1\r\n","OK",20); /*5. 开启Server模式(0,关闭;1,打开),端口号为portnum */ sprintf((char*)p,"AT+CIPSERVER=1,%s\r\n",(u8*)portnum); ESP8266_SendCmd(p,"OK",50); /*6. 获取当前模块的IP*/ ESP8266_GetWanip(ipbuf);// printf("IP地址:%s 端口:%s",ipbuf,(u8*)portnum); USART3_RX_STA=0; //清空串口的接收标志位 // while(1) // { // key=GetKeyVal(1);//退出测试 // if(key==1) // { // printf("退出测试!\r\n"); // ESP8266_QuitTrans(); //退出透传 // ESP8266_SendCmd("AT+CIPMODE=0","OK",20); //关闭透传模式 // break; // } // else if(key==2) //发送数据 // { // ESP8266_SendCmd("AT+CIPSEND=0,12\r\n","OK",200); //设置发送数据长度为12个 // ESP8266_SendData("ESP8266测试!","OK",100); //发送指定长度的数据 // DelayMs(200); // } // t++; // DelayMs(10); // if(USART3_RX_STA&0X8000) //接收到一次数据了 // { // rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度 // USART3_RX_BUF[rlen]=0; //添加结束符 // printf("接收的数据: rlen=%d,%s",rlen,USART3_RX_BUF); //发送到串口 // USART3_RX_STA=0; // if(constate!=3)t=1000; //状态为还未连接,立即更新连接状态 // else t=0; //状态为已经连接了,10秒后再检查 // } // if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在. // { //// constate=ESP8266_ConstaCheck();//得到连接状态 //// if(!constate)printf("连接失败!\r\n"); // t=0; // } // if((t%20)==0)LED2=!LED2; // ESP8266_AtResponse(1); // } } ```