• [华为嵌入式软件大赛] 2022年嵌入式大赛算法组答疑专区
    [算法赛答疑]欢迎各位参赛者。算法赛初赛相关答疑请在此帖跟帖,我们会尽快答复。
  • [赛事资讯] 2022年嵌入式大赛算法组答疑专区
    [算法赛答疑]欢迎各位参赛者。算法赛初赛相关答疑请在此帖跟帖,我们会尽快答复。
  • [赛事资讯] [赛事通知]2022华为嵌入式软件大赛初赛赛题下载
    赛题简介:本次比赛赛题根据实际嵌入式产品场景,抽象为智能工厂仪器部署问题。我们期待您精彩的解决方案。赛题背景:我们乘坐时光机来到2050年,戴维斯在退休后开了一家智能工厂,这种工厂使用一套加工仪器,支持成千上万种加工流水线。现在场地和仪器都已经购置好了,戴维斯需要你来帮忙规划一下仪器的安装位置,使得安装费用和出货速度达到最优。初赛比赛规则:选手可在下方附件中下载赛题包,编程语言支持C、C++,选手在本地编译调试完成后,通过“提交作品”页面提交代码,每个团队每天可提交5次。后台将取选手提交的代码运行、评分,然后以提交代码所获得的最好成绩进行排名,并每天发布排行榜。作品提交要求:请将赛题包中的code目录压缩为zip文件后提交到比赛平台。评分和排名规则:1. 编译失败不得分;2. 执行任意一组测试用例出现以下5种情况之一都不得分: (1)运行异常退出(2)运行时读/写/执行了提交内容以外的文件(3)运行时间超过15s(4)运行内存超过512M(5)输出结果不符合题面要求3. 全部用例判题成功,则:(1)分数计算:用例分数*用例系数的累和(2)分数从低到高排名 (3)分数相同,先提交的排名靠前 (4)同一个队伍的提交,以最优成绩的为准,分数相同以先提交的为准4. 大赛比赛过程中,评委组将对选手作品进行复核审查,如出现影响比赛公平性的代码实现方式,将取消团队成绩。判题环境:linux、g++8.5.0、cmake3.20.2
  • [技术干货] C/C++在嵌入式中地位不保,Rust将成为更好的“备胎”?【转载】
    【CSDN 编者按】在嵌入式环境中,C、C++作为最常见的编程语言,早已被广泛应用在底层工具链、库中。不过,近日嵌入式工程师Omar Hiari提出一种完全不同的看法,他认为一开始就考虑安全问题的编程语言Rust才是嵌入式领域的未来。虽然要将嵌入式应用程序代码迁移到一种新的编程语言上非常麻烦,但他认为这是可行的,只是需要一些方法和实践。软件故障在嵌入式领域时常发生,随着物联网(IoT)和网络物理系统(CPS)等技术的普及,这些故障也没有得到应有的重视。当人们谈论自动驾驶汽车、机器人、无人机时,他们总认为这些出错的机率很小。但在了解一些历史上著名的软件事故、Bug案例研究后,你就不会这么想了。重现问题简直是一场噩梦首先,需要声明的是,我主要从事汽车嵌入式领域。此外,在职业生涯中,我还接触到了功能安全领域。功能安全,简单来说,是指一个系统或是设备整体安全的组成部分。其达成安全性的方式是靠系统或组成零件在接受输入讯号后,可以正常的动作,来减少导致人类受伤的事故风险。例如一个马达中加装温度感测器,若温度超过一定值,即停止马达运转,此机能就属于功能安全。在进入到汽车行业这些年,我担任过几个项目的技术负责人,其中部分职责会涉及到处理客户退货的问题。之所以这些汽车会被退回,大概率是由于电子单元或模块出现了问题,而我们团队需要确定导致该问题的根本原因。如果问题的根源确认是模块中出现了一个错误,我们会针对这个错误提出一个修复方案,并且将它整合到未来的更新中。有时我们会花费几天,甚至是几周来找出Bug的原因。我现在还记得我第一次处理这些问题的的经历,那时我还是一个做模块测试的实习生。我们发现,有几个被退回的模块,在现场测试时出现了不一样的结果。有些能够正常工作,有些不能。在和软件团队调试了很长时间后,我们终于找出了问题所在,原来是因为一个未初始化的变量!我惊讶于这样的错误竟然没有被检测出来。随着在这个行业不断地成长,我所遇到的问题越来越复杂。有时,我们会在成千上万的模块中找一个有问题的模块。通常情况下,第一步是尝试复现这种问题,以便用调试工具追踪问题的来源。这简直是一场噩梦!复现某些行为需要几天或者几周的时间,有时甚至需要更长的时间,因为要复现这个问题,需要非常具体的实现过程相组合。在大多数情况下,这些实现过程会存在一些未经测试的配置,最终导致触发Bug。正常导致汽车故障的大多数问题本质上出在软件上。有趣的是,即使是在一些质量至上,而且拥有大量经验丰富软件工程师的公司也会出现这种情况。基本上,这些遇到现场问题的模块,已经进行了彻底的测试、代码审查、代码标准的实施(例如MISRA-C)。一开始就考虑安全问题?后来,在从汽车嵌入式领域进入功能安全领域时,我发现我的经历更加有趣。在功能安全方面,像工业IEC-61508和汽车ISO-26262这样的标准在汽车行业开始流行起来。遵循这些标准的目的是为了减少产品故障的风险,风险的大小取决于产品的使用方式或者地点。通过在开发过程中加入更多的测试和检查,可以让产品达到一定的安全水平。以ISO-26262为例,该标准对软件和硬件中可能发生的故障类型进行了分类。硬件的故障被分为两种类型:随机硬件故障和系统故障。在软件方面,只有一种类型,即系统性故障。根据ISO-26262,随机硬件故障被定义为:在硬件元素的生命周期中,可能会发生不可预测的故障,并且遵循概率分布。该标准还补充说:随机硬件故障率可以以合理的精度进行预测。而系统性故障被定义为:故障以确定的方式与某种原因相关,只能通过改变设计或制造过程、操作程序、文件或其他相关因素来消除。这意味着,系统故障或多或少源于人为错误,并不是真正可以预测的。因此,如果我们考虑修复软件问题,就意味着需要更多额外的检查。当然,在应用程序中也可以添加一些方法让其自己检查(例如N-版本编程),尽管如果把这些方法添加到动态的应用软件代码中,消耗的内存空间会增多。鉴于我前面提到的,人们可能会认为这种变化是喜闻乐见的。但情况恰恰相反,大多数工程师都会反对整合功能安全流程。事实上,如何让工程师和团队接受这一点,让许多管理安全开发者感到很头疼。这种推动力通常来自于产业链的顶端,即建立一种 “安全文化”。我认为,部分原因是由于流程和额外的文件或者可交付成果方面的重大变化,而不一定是因为个人反对安全的想法本身。(如果有什么是是工程师不喜欢做的,我想写文件一定排在首位。)还有一点也让管理安全开发者感到头疼,即说服团队,让他们知道产品需要从一开始就以安全前提来设计。这意味着,工程师不应该只致力于让现有产品开始应用其功能来满足安全要求。换句话说,就是对现有产品进行修补以使其满足安全要求。这主要是针对硬件和应用软件来说。让我感到不解的是,为什么这一项不能应用在编译语言或者编译器上呢?与编译器一起使用的语言并没有从一开始就考虑到安全问题。相反,它们是根据功能安全应用中的标准准则进行修改的。比如创建语言的”子集“,删除其中被认为不安全的部分。这意味着排除了编程语言结构中存在的不安全因素。迫在眉睫的问题对于一些了解甚少的人来说,在汽车领域最普遍的编程语言是C。但从我的亲身经历来看,我认为C、C++并不是能够引领未来应用趋势的语言。事实上,从长远来看,坚持使用C、C++,不管有多少标准引入都令我感到担忧。毫无疑问,C、C++是强大的语言,但与即将到来的应用程序相比,目前的应用程序还是太简单了。此外,随着行业的发展,工程师的水平会参差不齐。所以无论流程多么严格,出现系统性错误的可能性都会越来越大。随着经验的不断积累,实践不断增加,以及在C、C++这样的语言中不断增加补丁,但是类似的问题仍然是由于系统性错误而产生,是不是至少应该考虑切换到另一种思路来设计语言,即一开始就把安全性作为前提来设计?又或者只是创造出一种更加现代的语言,正如系统性故障所定义的一样:只能通过改变设计来消除问题。一条可能的前进道路我在Rust中找到了一条可能通往嵌入式的道路,它似乎就是我在这个行业多年来所要找的。Rust的设计初衷是为了成为一种安全的语言。当然,要把嵌入式程序代码迁移到一种新的编程语言上是非常麻烦的。显然,阻碍因素之一是在汽车等嵌入式环境中,C、C++的工具链和库已经根深蒂固了,早已成为了生态系统中的一部分。然而,虽然代码迁移有困难,但也不是不可能,我们可以制定计划,循环渐进地进行切换。在非嵌入式环境中,Rust已经获得了相当大的知名度,并且得到了亚马逊、Discord、Dropbox、Facebook、谷歌和微软等公司的投资。事实上,微软和谷歌已经为Rust在某些领域能够消除70%的安全问题做了担保。到目前为止,关于嵌入式,某些团体已经有了一些有趣的动向。有一个Rust嵌入式工作组正在社区内工作,以弥合与Rust团队的差距,同时发展嵌入式生态系统。该小组在发展生态系统方面的速度令人印象深刻。(如果对这个工作小组的成就感兴趣可以访问这个网站:https://www.autosar.org/news-events/details/autosar-announces-new-working-group-for-programming-language-rust-in-automotive-software-context-202/)另一个是Ferrous Systems,它在支持Rust生态系统方面也做了大量工作。Ferrous在为Rust创建不同的工具和扩展方面做出了重大努力,并且正在ferrocene项目下为ISO26262认证Rust编译器工具链。有趣的是,在我写这篇文章的时候,AUTOSAR(AUTomotive Open System ARchitecture汽车开放系统架构)也宣布了一个在新的汽车背景下的Rust工作小组。(感兴趣可以访问这个链接:https://www.autosar.org/news-events/details/autosar-announces-new-working-group-for-programming-language-rust-in-automotive-software-context-202/)(补充:我不属于也没有参与过上述任何实体)Rust可能是嵌入式未来市场方向表明,我们开始从C、C++向更安全、更现代的编译型编程语言转变的时机到了。(并不是对于所有的应用,只是对于那些C或者C++可能出现问题的应用)Rust编程语言虽然相当年轻,但似乎是最适合这种情况的。对于公司和个人来说,使用Rust编程可能是一个很好的战略决定,能够在未来获得优势。对于个人来说,即使像Rust这样的语言永远不会被采用,但它至少会给个人一个全新的视角,让他知道如何成为一个更好的C/C++开发者。原文链接:https://apollolabsblog.hashnode.dev/why-you-should-be-worried-about-the-future-of-cc-in-embedded-a-case-for-rust
  • [技术干货] 教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino开发)
    教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino IDE开发)一、简介        esp8266系列作为低功耗高性价比的嵌入式无线网络控制模块,深受对嵌入式感兴趣的小伙伴的喜爱,是很多人理想的一款wifi模块的选择,不仅可以完成通信,还可以当单片机使用完成程序控制,可满足智能家居、远程控制、智慧医疗等物联网应用的需求,总结:功能强大,价格便宜;某宝最便宜的ESP01s或12f系列五六块就可以搞定(建议大家还是支持正版),对质量有要求的,在某创平台也仅仅是十多块钱,玩法多样,本篇幅主要带大家讲解如何利用Arduino和esp8266系列完成设备接入华为云物联网平台(IOTDA)并完成设备属性上报。二、整体流程概述创建产品、注册设备、添加属性使用MQTT.fx进行测试[可跳过]Arduino IDE+esp8266编程三、具体详细步骤创建产品、注册设备、添加属性创建产品(https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product)                                                     b. 注册设备                                             此时可获取设备ID和密钥:               device_id: "61fb2d7fde9933029be5ff9e_esp8266_test01"               secret: "自己设定的密钥"               c. 添加属性                             d. 获取MQTT三元组(ClientId、Username、Password)              我们可以通过华为云提供的官方产品帮助文档中,根据参数描述自己计算出三元组;或者我们可以使用下面的网页来帮助我们生成三元组              https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/)                            补充:平台接入地址为:iot-mqtts.cn-north-4.myhuaweicloud.com,端口号:1883              此时我们已经获取了下面这些信息,就可以使用MQTT.fx客户端软件进行登陆测试              device_id: "61fb2d7fde9933029be5ff9e_esp8266_test01"              secret: "自己设定的密钥"              ClientId: 61fb2d7fde9933029be5ff9e_esp8266_test01_0_0_2022020310              Username:61fb2d7fde9933029be5ff9e_esp8266_test01              Password:xxxxxxxxxx计算出来的秘钥xxxxxxxxxxxxxxxxxxxx              MQTT_Address:iot-mqtts.cn-north-4.myhuaweicloud.com              MQTT_Port:1883       2. 使用MQTT.fx进行测试[可跳过]登陆MQTT测试(创建完后点击Connect,右上角会有绿色提示灯即代表登陆成功)                           b. 查看在线状态                            c. 添加服务、属性、命令                            d.常用的Topic:(参考官方文档https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html)              设备上报属性:$oc/devices/{device_id}/sys/properties/report(需将“{device_id}”替换为所需的设备id)                           平台下发命令:$oc/devices/{device_id}/sys/commands/#(需将“{device_id}”替换为所需的设备id)               数据格式:{"services":[{"service_id":"你的服务id","properties":{"你的属性名称": 设置的值}}]}              e. 上报测试(监控运维的在线调试中可查看具体信息)                            f. 下发测试              、     3. Arduino IDE+esp8266编程程序源代码不到70行,非常简单的一个小Demo源码获取方式:关注公众号“IOT趣制作”,回复关键字“华为云物联网”即可
  • [精彩回顾] 暑不尽的盛夏 | 2021华为嵌入式软件大赛区域复赛回顾
    华为嵌入式软件大赛2021年7月17日-18日,华为嵌入式软件大赛迎来了一个赛事高潮——区域复赛!从区域初赛中脱颖而出的算法组和实物组共计约120支队伍,在4个赛区现场同时开战,争夺进入总决赛的入场券。晋级总决赛名单已新鲜出炉,点我查看来一起回顾一下复赛现场吧~感恩相遇,感谢每一位参赛选手以及工作人员的努力!进入总决赛的同学们,期待你们全力以赴,奔赴7月24日的旅程!我们在松山湖欧洲小镇等你!
  • [技术干货] 常用的嵌入式操作系统----.inux
    inux是一个类似于UNIX的操作系统,inux系统不仅能够运行于PC平台,还在嵌入式系统方面大放光芒,在各种嵌入式inux OS迅速发展的状况下,inux OS逐渐形成了可与Windows CE等EOS进行抗衡的局面。嵌入式inux OS的特点如下。 精简的内核,性能高、稳定,多任务。 适用于不同的CPU,支持多种体系结构,如X86、ARM、MIPS、APHA、SPARC等。 能够提供完善的嵌入式GUI及嵌入式X-Windows. 提供嵌入式浏览器、邮件程序、MP3播放器、MPEG播放器、记事本等应用程序。 提供完整的开发工具和SDK,同时提供PC上的开发版本。 用户可定制,可提供图形化的定制和配置工具。 常用嵌入式芯片的驱动集,支持大量的周边硬件设备,驱动丰富。 针对嵌入式的存储方案,提供实时版本和完善的嵌入式解决方案。 完善的中文支持,强大的技术支持,完整的文档。 开放源码,丰富的软件资源,广泛的软件开发者的支持,价格低廉,结构灵活,适用面广。
  • [技术干货] 常用的嵌入式操作系统----.Windows CE
    Windows CE也是一个开放的、可升级的32位嵌入式操作系统,是基于掌上电脑类的电子设备操作。Windows CE的图形用户界面相当出色。其中,CE中的C代表袖珍(Compact)、消费 (Consumer)、通信能力(Connectivity)和伴侣(Companion);E代表电子产品 (Eectronics)。与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于Win32 API重新开发的、新型的信息设备平台。Windows CE具有模块化、结构化和基于Win32应用程序接口及与处理器无关等特点。Windows CE不仅继承了传统的Windows图形界面,并且在Windows CE平台上可以使用Windows 95/98上的编程工具(如Visua Basic、Visua C++等),使用同样的函数,使用同样的界面网格,使绝大多数的应用软件只需简单修改和移植就可以在 Windows CE平台上继续使用。 Windows CE的设计目标是:模块化及可伸缩性、实时性能好,通信能力强大,支持多种CPU.它的设计可以满足多种设备的需要,这些设备包括了工业控制器、通信集线器及销售终端之类的企业设备,还有像照相机、电话和家用娱乐器材之类的消费产品。一个典型的基于Windows CE的嵌入系统通常为某个特定用途而设计,并在不联机的情况下工作。它要求所使用的操作系统体积较小,内有对中断的响应功能。 Windows CE有如下特点。 具有灵活的电源管理功能,包括睡眠/唤醒模式。 使用了对象存储技术,包括文件系统、注册表及数据库。它还具有很多高性能、高效率的操作系统特性,包括按需换页、共享存储、交叉处理同步、支持大容量堆等。 拥有良好的通信能力。广泛支持各种通信硬件,亦支持直接的局域连接及拨号连接,并提供与PC、内部网及因特网的连接,还提供与Windows 9x/NT的最佳集成和通信。 支持嵌套中断。允许更高优先级别的中断首先得到响应,而不是等待低级别的ISR完成。这使得该操作系统具有嵌入式操作系统所要求的实时性。 更好的线程响应能力。对高级别IST(中断服务线程)的响应时间上限的要求更加严格,在线程响应能力方面的改进,帮助开发人员掌握线程转换的具体时间,并通过增强的监控能力和对硬件的控制能力帮助他们创建新的嵌入式应用程序。 256个优先级别。可以使开发人员在控制嵌入式系统的时序安排方面有更大的灵活性。Windows CE的API是Win32 API的一个子集,支持近1 500个Win32 API.有了这些API,足可以编写任何复杂的应用程序。当然,在Windows CE系统中,所提供的API也可以随具体应用的需求而 定。
  • [技术干货] 常用的嵌入式操作系统----Pam OS
    1.Pam OS Pam OS是一种32位的嵌入式操作系统。Pam提供了串行通信接口和红外线传输接口,利用它可以方便地与其他外部设备通信、传输数据;拥有开放的OS应用程序接口,开发商可根据需要自行开发所需的应用程序。Pam OS是一套具有强开放性的系统,现在有大约数千种专门用Pam OS编写的应用程序,从程序内容上看,小到个人管理、游戏,大到行业解决方案。Pam OS是一套专门为掌上电脑开发的OS.在编写程序时,Pam OS充分考虑了掌上电脑内存相对较小的情况,因此它只占有非常小的内存。由于基于Pam OS编写的应用程序占用的空间也非常 小,所以,基于Pam OS的掌上电脑(虽然只有几兆字节的RAM)可以运行众多应用程序。由于Pam产品的最大特点是使用简便、机体轻巧,因此决定了Pam OS应具有以下特点。 操作系统的节能功能。由于掌上电脑要求使用的电源尽可能小,因此在Pam OS的应用程序中,如果没有事件运行,则系统设备进入半休眠的状态;如果应用程序停止活动一段时间,则系统自动进入休眠状态。 合理的内存管理。Pam的存储器全部是可读写的快速RAM,动态RAM类似于PC机上的RAM,它为全局变量和其他不需永久保存的数据提供临时的存储空间;存储RAM类似于PC机上的硬盘,可以永久保存应用程序和数据。 Pam OS的数据是以数据库的格式来存储的,为保证程序处理速度和存储器空间,在处理数据的时候,Pam OS不是把数据从存储堆拷贝到动态堆后再进行处理,而是在存储堆中直接处理。 Pam OS与同步软件结合可以使掌上电脑与PC机上的信息实现同步,把台式机的功能扩展到了掌上电脑上。
  • [互动交流] 嵌入式系统集成OBS SDK
    嵌入式系统需要集成OBS的服务,有没有相关集成的指南文档,谢谢
  • [云计算周刊] 华为发布欧拉操作系统,面向服务器、云计算等数字基础设施
    9月25日,华为在全联接大会上正式发布面向数字基础设施的开源操作系统欧拉(openEuler)。华为称,欧拉操作系统可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态设备,应用场景覆盖IT(Information Technology)、CT(Communication Technology)和OT(Operational Technology),实现统一操作系统支持多设备,应用一次开发覆盖全场景。欧拉全新发布华为计算产品线总裁邓泰华表示,操作系统“碎片化”现状,导致数字基础设施产生大量“软烟囱”,带来生态割裂、应用重复开发、协同繁琐的挑战,数字化新时代,呼唤新的统一操作系统。在ICT领域,华为提供服务器、存储、云服务、边缘计算、基站、路由器、工业控制等产品和解决方案,都需要搭载操作系统,所以华为一直在构建能力,旨在通过统一的操作系统架构来满足不同应用场景的需求。本次欧拉全新升级,同时支持服务器、云计算、边缘计算、嵌入式等各种形态设备的需求;支持多样性计算,致力于提供安全、稳定、易用的操作系统;并通过为应用提供确定性保障能力,支持OT领域应用及OT与ICT的融合。至此,全新发布的欧拉操作系统可覆盖从IT、CT到OT数字基础设施全场景。24日,华为轮值董事长徐直军在接受采访时透露,2019年华为把欧拉正式开源,像麒麟软件等在基于欧拉操作系统发布了自己的商业发行版,并提供服务。“最近我们把欧拉重新进行了定位。原来的欧拉更多是服务好鲲鹏,让我们的鲲鹏生态发展得更好。我们开源的主力也是聚焦在支持鲲鹏。现在我们把欧拉定位为未来的数字基础设施的操作系统,不仅仅是服务于鲲鹏,也能支持X86;同时支持边缘计算,也能支持云基础设施,还准备发展一个分支,未来去支持嵌入式设备。”徐直军解释称,嵌入式设备是指电信设备里一块一块“板子”,这些板子也需要操作系统。欧拉:数字基础设施开源操作系统据介绍,欧拉创造性的提出全栈原子化解耦,支持版本灵活构建、服务自由组合,通过一套架构灵活支持南向多样性设备,北向全场景应用。此外,欧拉和鸿蒙已经实现了内核技术共享,未来计划在欧拉构筑分布式软总线能力,让搭载欧拉操作系统的设备可以自动识别和连接鸿蒙终端。后续进一步在安全OS、设备驱动框架以及新编程语言等方面实现共享。通过能力共享、实现生态互通,“欧拉+鸿蒙”更好地服务数字全场景。本次大会正式发布了第一个支持数字基础设施全场景的openEuler 21.09创新版本,将于9月30日在社区上线。该版本不仅对服务器和云计算场景能力进行了增强,还实现了对于边缘计算和嵌入式场景的支持。2022年一季度,欧拉开源社区将发布支持全场景融合的社区LTS版本,使能合作伙伴面向不同场景发布商业发行版。华为称,自欧拉开源以来,已有超过6000名开发者和100多家企业、高校、组织和机构加入欧拉社区,汇聚从处理器、整机、操作系统发行版厂商、到行业应用等全产业链,十多家主流操作系统领军企业发行基于欧拉的商业版本。欧拉的全新发布将吸引更多云、边缘、嵌入式领域伙伴加入社区,共同加速欧拉在数字基础设施全领域的广泛应用。(本文来自澎湃新闻,更多原创资讯请下载“澎湃新闻”APP)
  • [技术干货] 正确管理物联网设备的关键考虑因素
    物联网产品中的设备配置、管理和保护需要在流程的一开始就进行仔细规划。对选项进行严格评估,然后进行概念验证,这有助于确定正确的解决方案。一旦概念验证获得批准,物联网产品将进入生产阶段。然后,真正的乐趣开始了,许多战略考虑开始发挥作用。我们将它们列举如下:▲强大且安全的 OTA 软件更新▲设计安全▲可扩展性▲自动化▲远程终端管理▲设备配置、监控和故障排除强大且安全的 OTA 软件更新强大且安全的 OTA 软件更新对于保持物联网设备的安全至关重要,因为这些设备上的软件在其生命周期内会变得过时,如果保持初始状态,肯定会出现漏洞。因此,从项目开始到生命周期结束,安全、风险容忍能力、高效的更新机制必须成为每个产品开发团队的核心。设计安全设备安全漏洞事件可能会中断操作、损坏系统并对虚拟和物理进程产生负面影响。这会转化为不满意的客户和失去业务。正如 BG Networks 的创始人兼首席执行官 Colin Duggan 在接受 Device Chronicle 采访时所说,“在设计完成后,很难再增加安全性。原因有很多,嵌入式系统具有有限的MHz、内存和嵌入式处理器上的网络接口限制。安全功能可以在事后添加,但通常不会消除所有漏洞”。 这就是为什么在产品生命周期的早期阶段通过设计确保安全性的原因所在。可扩展性管理少量嵌入式设备与在现场部署数千甚至数百万台设备之间存在显著差异。微软新的物联网信号报告发现缺乏可扩展性是物联网项目失败的主要原因。复杂性是最大的可扩展性问题之一。因此,选择具有正确体系架构的正确解决方案对于保护连网设备集群的长期管理可行性非常重要。自动化为了防止因人为错误引起的任何风险,将某些流程自动化是一种可以为企业减少损失的解决方案。Mender是一款嵌入式设备的OTA软件更新管理器,它提供广泛的自动化来安全地管理这些设备。Mender 提供的功能之一是自动重试失败的设备部署。设备部署可能会因各种间歇性原因而失败,例如断电、网络或设备使用情况。失败时自动重试可将设备部署错误率降低多达 90%。这转化为管理部署的时间和金钱节省,还可以让客户更快地收到更新。远程管理远程管理对于任何类型的嵌入式设备都是必要的。任何推出物联网产品的公司都需要从一个中心位置控制其系统。与 VPN 访问相比,服务提供商更喜欢 SSH、安全隧道和远程终端访问,因为它们可以确保客户在访问和排除设备故障时的安全性。此外,管理还包括分组和访问嵌入式设备、远程安全地配置和监控。考虑到不仅需要安全的空中无线进程,而且还需要可靠的方法来监控、配置、分组和访问嵌入式设备,Mender的团队决定通过上述远程管理功能来扩展他们的产品。Mender是一款开源软件,这意味着有许多贡献者可以使其更好,并支持各种客户硬件和软件,例如 NVIDIA Jetson 和 NXP 的 iMX 处理器系列。它提供了从原型到生产的软件和硬件选择的灵活性,这意味着没有供应商锁定。Mender支持从完整磁盘映像到应用程序更新的所有设备软件更新,并可自由自定义更新和安装过程以适应您的工作流程。它还与谷歌云和微软Azure物联网集成,以便于设备身份验证。设备配置、故障排除和监控不应忽视正确的设备管理设置。强大且安全的设备管理是物联网产品的必要基石,因此您需要找到高质量的解决方案。一旦您在现场部署了数千或数百万台设备,您就需要能够正确配置它们、收集数据并快速解决出现的任何问题。许多组织将这些功能视为事后的想法,这将导致仓促的修复,并且,这可能会对连网设备的稳健性和安全性产生严重影响。为了推出成功、安全且强大的物联网产品,在发布之前必须考虑以上关键因素。
  • [技术干货] sqlite嵌入式数据库的移植和使用
    sQlite是D. Richard Hipp 用C语言编写的开源嵌入式数据库引擎。它是完全独立的,没有外部依赖性。占用资源非常低,在嵌人式设备中,只需要几百KB的内存。它能够支持Windows, Limux等主流操作系统,可与Tel, PHP和Java等程序语言结合,提供ODBC接口,其处理速度甚至令开源世界著名的数据库管理系统MysQL和PostgreSQL.望尘莫及。solie对50192标准的支持包括索引、限制、触发和查看,支持原子的、一致的、独立的和持久(ACID)的事务。在内部, SoLite由SQL编译器、内核、后端以及附件几个组件组成。 sqlite通过利用虚拟机和虚拟数据库引擎(VDBE) ,使调试、修改和扩展SQLite的内核变得更加方便。所有sql,语句都被编译成易读的,可以在SQLite虚拟机中执行的程序集。现在项目需要使用SOLite数据库,需要将SQLite移植到ARM 2440嵌人式主机中,并续写一个简单的测试程序。现在项目需要使用sqlite数据库  需要将sqlite移植到arm2440嵌入式主机中并编写一个简单的测试程序项目实施步骤:1)下载并编译sqlite2)下载到arm虚拟机并使用sqlite如何下载编译sqlite从http://www.sqlite.org/download.html下载sqlite文件 当前版本是:3.9.2 文件名为:sqlite-autoconf-3090200.tar.gz解压并查看当前目录及install文件# tar zsf sqlite -autoconf-309200.tar,gz#lsaclocal.m4 configure.ac #itmain.sh #Readme#sqlite3ext.hconfig guess depcomp  make file.am  shell.c sqlite3.hconfig.sub  install  makefile.in sqlite 3.1 sqlite 3.pc inconfigure install-sh missing sqlite3.c tea创建一个目录build进入主目录在这个目录中将进行交叉编译在build目录中运行sqlite-autoconf-309200中的configure脚本 生成makefile文件 代码如下:../configure--host=ARM-LINUX -- PREFIX =/opt/sqlite-autoconf-309200/build 选项host指定的是用arm交叉编译器进行编译 选项prefix后面的鲤鱼精是编译安装后目标存放的目录可以任意设置#mkdir build  #cd mkdir #../configure --houst=arm-linux--prefix=/opt/sqlite-autoconf-309200/build#ls#config.log config.log config.status libtool makefile sqlite3.pc#make #makeinstall#lsbin  include  libtool  sqlite3  sqlite3.pcconfig.log  lib   makefile  sqlite3.lo  sqkite3-shell.oconfig.status  libsqlite3.la share  sqlite3.o sqlite3-sqlite3.o编译和安装完成后 在/root/sqlite-autoconf-309200/bulid 目录中会生成3个目标文件夹  分别是bin  include和lib下载到arm虚拟机并使用sqlite 分别将bin下的文件下载到开发板的/user/bin目录中去 lib下的所有文件下载到开发板的/lib目录中即可nclude目录下是sqlite的c语言api的头文件编译时会用到下面示例在arm虚拟机中测试 将root/sqlite-autoconf-309200/build目录中的bin和lib分别复制到/opt/root_qtopia/usr/bin与root_qyopia/lib/目录中#cd /opt/sqlite-autoconf-309200/build#cd bin#cp *.*/opt/root_qtopia/usr/bin#cd..#cd lib#cp *.*/opt/root_qtopia/lib/启动虚拟机 在arm虚拟机终端中运行 sqlite3 tst.db测试运行是否正常#sqlite3 tst.db sqlite version.................sql使用命令行管理数据库 在运行.help会列出常用的命令说明 这里我就不打出来了  也可以在官网中 去查看作者:仙女本仙
  • [技术干货] 如何选择合适的物联网云平台?
    转载自:https://cloud.ofweek.com/news/2019-04/ART-178805-8500-30322921.html如今,物联网的应用越来越广泛,很多组织需要学习基础知识,并根据其需求选择合适的物联网云平台,但通常不知道应该选择哪个。组织选择合适的供应商可能是一项复杂的工作,因为很难确定其真正需要的是什么。因此,需要通过检查物联网云平台所需的基本功能来帮助消除一些混乱。这样,就会知道在比较物联网云解决方案时如何评估不同的平台。大多数公司都希望一个涵盖所有基础的云计算解决方案,同时在存储和传输数据的方式上具有灵活性。什么是物联网云平台?从根本上说,物联网云平台充当设备和网络之间的可靠网关。它还可以作为一组工具来管理组织的场外设备。云平台需要能够支持从设备生成的大量数据,并允许组织配置设备以实施双向的云通信。这意味着云平台应该允许组织将数据从设备传输到云平台,反之亦然(一些物联网云平台只允许组织采用一种方式,即将数据从设备传输到云平台)。最好的物联网云平台使这一双向数据传输过程简单而安全。这不是一个简单的任务,因为数据可以有多个来源,并使用不同类型的数据收集模式。在比较物联网云平台时应该注意什么?在比较平台时,大多数公司通常需要覆盖所有基础的物联网云平台,同时灵活地存储和传输数据。实际上,大多数公司都希望对云平台提供开箱即用的支持,并希望能够灵活地更改那些使其与众不同的默认值。最终,作为一个消费者,组织正在寻找一个最好的物联网云平台,让其基于自己的解决方案实现上述目标。1.可扩展性首先,物联网云平台必须支持数百万个同步设备连接,并允许组织配置设备以实现机器对机器的通信。当然,每个物联网云平台的提供商都声称可以处理数百万个同步设备连接。组织应该寻找具有持续高正常运行时间的物联网云平台,并获知以前停机时间的完全透明度。每个平台都应该有某种类型的平台状态页面;使用它来检查正常运行时间以及它们如何处理过去的事件。它还可以帮助检查他们帮助的客户类型以及他们使用它们部署的设备数量。组织还应该寻找一个可以为其管理扩展云计算基础设施的平台。最好的供应商将监控其设备的性能,并帮助在必要时进行扩展。2.设备管理功能在比较物联网云平台时,组织需要评估供应商是否允许其监控、分割和管理现场外的边缘设备。要从设备中提取正确的数据,组织需要一个可以与物联网设备上的微处理器和本地软件连接的设备管理系统。这构建起来很复杂,因为很少有组织拥有可以处理双向通信流,并提供不干扰此过程的设备管理服务的物联网硬件、软件和连接生态系统。对于想要完全控制其远程设备的公司,这些是组织需要的一些基本功能:云计算API – 能够更好地管理设备,对大量设备进行细分以实现更精细的控制,并实时监控设备的运行状况。开发人员工具 – 一个核心界面或一组工具,允许组织以无线方式管理和重新编程其物联网设备。设备命令和控制 – 基于云计算的功能,允许用户通过其Rest API结构控制变量和事件。事件日志 -允许组织实时查看设备发生情况的界面,以改善查找与其相关的数据的体验。远程诊断 – 允许组织主动监视设备运行状况的功能,并在出现警告标志时采取先发制人的行动。3.无线固件更新无线(OTA)固件更新是任何物联网云平台的重要组成部分。无线固件是指远程更新嵌入式设备上的代码的做法。将无线更新功能纳入互联产品的价值不容低估,其中包括:组织可以通过向一个或多个设备发送更新来测试新功能。组织可以通过无缝统一的界面管理其设备组中的固件,从而节省成本。开发人员可以经常可靠地部署,因为他们知道在更新发布时产品将保持正常运行。无线固件通过在产品发布后向产品添加新功能和基础设施来增强可扩展性。必须使用无线功能构建设备管理系统和嵌入式设备才能使此机制正常工作。一些物联网云平台并没有提供此功能,因为没有完全成熟。成功的无线固件更新需要物联网硬件、设备固件、网络连接和物联网设备云平台之间的复杂协调。这可能听起来像是与合适的专家一起构建的简单问题,但这是一个难以置信的困难,需要正确解决。许多组织都在努力构建一个无线固件更新系统,该系统不会意外地造成临时中断,或者最坏的情况是导致设备进入不可恢复的状态。组织不希望为其团队提供不成熟的无线固件功能。在比较物联网云平台时,通过向原型设备无线发送新功能来测试此功能,尝试大规模测试此功能。组织可能希望与销售代表联系,以充分了解此功能与其当前堆栈的效果。4.完整的系统集成物联网云平台供应商如何将物联网所需的所有复杂设备(如蜂窝调制解调器、运营商/SIM卡、设备诊断、固件更新、云连接、安全性、应用层和RTOS)集成到一个简单的包中,而组织工程团队不必担心这个包。组织与其工程师交谈,确保平台提供成功所需的所有集成。这可能需要联系销售代表以了解这些分立组件如何协同工作。与其工程师交谈,确保这些部件以一种易于操作的方式协同工作,让他们将这些集成与其他物联网云平台进行比较。5.安全性希望实施自己的物联网云平台解决方案的公司经常低估拥有、管理和保护数百万个可能数据点的复杂性。当组织集成物联网传感器和数据流时,现在同时处理数TB的数据,这可能导致许多安全和隐私问题。在安全性方面,组织应该检查物联网云平台供应商过去如何处理安全和隐私问题并查看其安全内容。其应该寻找的一些安全功能包括:(1)硬件密钥 – 每个设备都应有自己的私钥,因此未经授权的设备不能应用在组织中。(2)双因素身份验证 – 在物联网方面,组织总是需要额外的安全性。在其可以访问设备之前,通过添加第二个步骤来保护其帐户,在可以访问自己设备之前验证身份。(3)基于角色的访问控制 – 对于大型公司来说,需要一个物联网云平台,允许其控制谁可以管理和读取其设备上的数据。(4)加密邮件 – 这是标准做法,但要确保每封邮件都是加密且安全的。(5)没有开放端口 – 所有远程设备都不应为端口扫描程序或主动端攻击保留打开的传入端口。6.数据管理当涉及到存储、处理和分析数据时,组织需要一个已经构建的系统来处理。最好的物联网云平台将来自设备群的数据源组合成一个统一的数据流,提供产品范围的商业智能。选择物联网云平台架构也必须将设备数据与现有服务无缝集成。这使组织可以获得将数据存储到所需位置的所有好处,而无需处理托管自己的物联网云平台解决方案的复杂构建和维护等方面事务。例如,许多公司通常希望将设备数据发送到Salesforce、Azure或AWS环境。组织应该寻找可以处理这些集成的物联网云平台,并允许其将数据存储在其想要的位置。底线至关重要的是,组织应对在现场完全控制远程设备所需的工具和功能进行广泛研究。选择正确的物联网云平台要求组织检查的不仅仅是已建立的品牌名称,还有实际的原型和测试功能,这些功能将使他们能够管理数百或数千个远程设备。放弃这一研究过程的组织可能会面临许多挑战和复杂问题,导致不满意的结果或失败。
  • [技术干货] 嵌入式Linux串口基本编程
    嵌入式Linux串口编程Linux下的串口设备主要在dev目录下,比如ttySx或者ttySUx或者ttyOx。比am1808 是ttyS0-S2SU0-SU7,而am335x是ttyO0-O5。一、基本编程API介绍最基本的设置串口包括波特率设置,效验位和停止位设置。1、串口的设置主要是设置 structtermios结构体的各成员值。struct termios   {     unsigned short  c_iflag; /* 输入模式标志 */     unsigned short  c_oflag; /* 输出模式标志 */     unsigned short  c_cflag; /* 控制模式标志*/     unsigned short  c_lflag; /* 本地模式标志 */     unsigned char  c_line; /* 控制协议 */     unsigned char  c_cc[NCC]; /* 控制模式字符*/};所有对串口的操作都是通过结构体 struct  termios和几个函数实现的,其中两个最常用的函数是tcgetattr()和tcsetattr()几乎在所有情况下,程序都是通过tcgetattr()函数获取设备当前的设置,然后修改这些设置,最后用tcsetattr()使这些设置生效。许多程序会保存终端初始的设置并在终止运行前恢复这些设置。函数返回0表示成功。2、tcgetattr和tcsetattr函数int tcgetattr (int  fd ,struct termios *t)   用于获得文件描述符fd所表示设备的当前设置值,并写入指针t内int tcsetattr    (int fd, int options,struct termios *t)用来将termios结构指针t内的设置值赋给当前用文件描述符fd表示的设备终端参数options决定什么时候改变才生效     TCSANOW———修改立即生效     TCSADRAIN——所有已经发送的输出写入fd后生效     TCSAFLUSH——输出队列为空时生效例如:下面是修改波特率的代码:struct termios  Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200); /*设置为19200Bps*/cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);3、波特率设定cfsetispeed()和cfsetospeed()函数分别用来设置设备的输入输出速度。int cfsetispeed(struct termios *t,speed_t speed)    int cfsetospeed(struct termios *t ,speed_t speed)通过结构体t分别将设备的输入输出速度设为speed。它们只是设置了termios结构体的速度,若要修改设备的速度还需要调用tcsetattr()函数下面看一个设置波特率的例子int speed_arr[] = { B38400, B19200,B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200,B300, };    int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,19200, 9600, 4800, 2400, 1200, 300, };void set_speed(int fd, int speed)  { int i; int status;     struct termios Opt;     tcgetattr(fd, &Opt);     for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)        { if (speed == name_arr)              { tcflush(fd, TCIOFLUSH);                 cfsetispeed(&Opt,speed_arr);                                      cfsetospeed(&Opt, speed_arr);                 status = tcsetattr(fd1,TCSANOW, &Opt);                   if (status != 0)                          {perror("tcsetattr fd1");                             return; }              tcflush(fd,TCIOFLUSH); } } }4、tcflush()函数用于丢弃设备上的一些数据 ,丢弃的数据取决于第二个参数queue_selector原型为:int tcflush(int fd,int queue_selector)TCIFLUSH——丢弃接口上已经接收到但还没读入的所有数据TCOFLUSH——丢弃所有已经写入接口但还没发送的数据TCIOFLUSH——丢弃所有输入输出队列上还没有读取或发送的数据5、校验位和停止位的设置No parity (8N1):options.c_cflag &= ~PARENB;//无校验options.c_cflag &= ~CSTOPB;//1位停止位options.c_cflag &= ~CSIZE;       //无位掩码options.c_cflag |= CS8;            //8数据位Even parity (7E1):options.c_cflag |= PARENB ;//有校验options.c_cflag &= ~PARODD ;//偶校验options.c_cflag &= ~CSTOPB;//一位停止位options.c_cflag &= ~CSIZE;      //无位掩码options.c_cflag |= CS7;              //7数据位Odd parity (7O1):options.c_cflag |= PARENB ;//有校验options.c_cflag |= PARODD;//奇校验options.c_cflag &= ~CSTOPB ; //一位停止位options.c_cflag &= ~CSIZE;   //无位掩码options.c_cflag |= CS7;    //7数据位CSIZE ——bit mask for data bitsCS7——7 data bitsCS8——8 data bitsCSTOPB——2 stop bits (1 otherwise)PARENB——enable parityPARODD——use odd parity instead of even6、读写串口设置好串口之后,读写串口就很容易了,可以把串口当作文件读写发送数据:char  buffer[1024];int    Length=1024;int    nByte;nByte = write(fd, buffer,Length)使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。char  buff[1024];int    Len=1024;int  readByte = read(fd, buff, Len);二、具体编程具体的程序在code目录下,以下有几个需要特别注意的地方需要说明的。options.c_iflag&= ~ (IXON | IXOFF | IXANY);c_cc数组的VSTART和VSTOP元素被设定成DC1和DC3,代表ASCII标准的XON和XOFF字符,如果在传输这两个字符的时候就传不过去,需要把软件流控制屏蔽,options.c_lflag&= ~ (ICANON | ECHO | ECHOE | ISIG);有时候,在用write发送数据时没有键入回车,信息就发送不出去,这主要是因为我们在输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的。此时应转换到行方式输入,不经处理直接发送options.c_iflag&= ~ (INLCR | ICRNL | IGNCR);options.c_oflag&= ~(ONLCR | OCRNL);还存在这样的情况:发送字符0X0d的时候,往往接收端得到的字符是0X0a,原因是因为在串口设置中c_iflag和c_oflag中存在从NL-CR和CR-NL的映射,即串口能把回车和换行当成同一个字符,可以进行如下设置屏蔽之: