最近在做物联网项目,踩了不少坑,也积累了一些进阶技巧,今天就来分享一下,这些技巧,可能很多人不知道,但是在实际项目中,非常实用,能帮你少走很多弯路,提升项目的稳定性和效率。

物联网IoT,是最近几年很热门的技术,从智能家居,到工业物联网,到智慧城市,应用越来越广泛。但是,物联网项目,涉及的技术栈很广,从硬件、嵌入式,到网络、通信,到云端、大数据,再到前端、移动端,非常复杂,很多人入门之后,很难进阶,遇到问题不知道怎么解决。

今天这篇文章,就从硬件、通信、云端、安全、调试等几个方面,分享一些物联网的进阶技巧,都是我在实际项目中总结出来的。

一、硬件和嵌入式方面的技巧

先说说硬件和嵌入式方面的技巧,这是物联网的基础,也是最容易出问题的地方。

1. 电源设计一定要留足余量,注意纹波和噪声

这是最重要的一点,很多物联网项目的问题,归根结底都是电源的问题。电源设计不好,会导致设备不稳定,频繁重启,传感器数据不准,通信失败等各种奇怪的问题,而且很难排查。

电源设计,一定要留足余量,不要刚好够用,比如设备最大电流是1A,电源至少要选1.5A到2A的,留50%到100%的余量。而且,要注意电源的纹波和噪声,尤其是给传感器、ADC、射频模块供电的时候,纹波和噪声太大会严重影响性能,一定要加滤波电路,比如LC滤波、π型滤波,必要的时候加LDO稳压。

还有,不同模块的电源,要分开供电,比如主控、传感器、通信模块、电机,都要分开供电,或者至少分开滤波,避免互相干扰。尤其是电机、继电器这些大电流、有干扰的设备,一定要和主控、传感器分开供电,并且做好隔离。

我之前做过一个项目,传感器数据总是不准,跳动很大,排查了很久,最后发现是电源纹波太大,传感器供电不干净,加了一个LDO和滤波电路之后,问题就解决了。所以,电源设计,一定要重视,不要觉得能点亮就行。

2. 传感器数据要做滤波和校准,不要直接用原始数据

很多新手,拿到传感器,读出来原始数据,就直接用了,结果数据跳动很大,不准确,影响后续的处理和决策。传感器的原始数据,都是有噪声的,而且很多传感器,出厂就有偏差,需要校准,所以,一定要对传感器数据做滤波和校准。

滤波方面,最简单的是滑动平均滤波,取最近N个数据的平均值,能有效去除随机噪声。还有卡尔曼滤波,对于运动传感器、温度传感器等,效果很好,能在响应速度和滤波效果之间取得平衡。还有中值滤波,对于脉冲干扰很有效,能去除异常值。根据不同的传感器和应用场景,选择合适的滤波算法。

校准方面,很多传感器,比如温度、湿度、气压、加速度、陀螺仪等,出厂都有偏差,需要校准。最简单的校准,是两点校准,找两个已知的标准点,测出传感器的读数,然后计算偏移和比例,做线性校准。比如温度传感器,放在冰水混合物里(0度)和沸水里(100度),测出读数,然后做线性校准。

还有,传感器的安装位置也很重要,比如温度传感器,不要靠近发热元件,不然测的是元件的温度,不是环境温度;湿度传感器,不要放在密闭的地方,要通风;加速度传感器,要安装在设备的重心位置,并且保持水平。这些细节,都会影响传感器数据的准确性。

3. 嵌入式代码要考虑低功耗,用中断代替轮询

物联网设备,很多都是电池供电的,低功耗非常重要,直接影响设备的续航。很多新手,写嵌入式代码,都是用while循环轮询,不管有没有事件,CPU都在跑,功耗很高,电池很快就没电了。

低功耗的关键,是让CPU尽量处于休眠状态,只有在有事件的时候,才唤醒处理。所以,要用中断代替轮询,比如传感器数据就绪,用中断通知CPU;按键按下,用中断通知;定时器到了,用中断唤醒。没有事件的时候,CPU进入休眠模式,功耗会大大降低。

还有,不用的外设,要及时关闭,比如ADC、SPI、I2C、UART等,不用的时候要关闭,降低功耗。射频模块,比如WiFi、蓝牙、LoRa,功耗很高,不用的时候要进入休眠,或者关闭,需要的时候再唤醒。

还有,CPU的主频,也可以动态调整,处理复杂任务的时候,用高主频,处理简单任务或者休眠的时候,降低主频,也能降低功耗。

我之前做过一个电池供电的传感器节点,最开始用轮询,续航只有一周,改成中断驱动+低功耗模式之后,续航提升到了半年,差距非常大。所以,低功耗设计,一定要重视。

4. 看门狗一定要开,并且正确喂狗

物联网设备,很多都是无人值守的,长时间运行,难免会出现程序跑飞、死锁、死机等问题,这时候,看门狗就非常重要了,能自动重启设备,恢复运行。

很多人,开了看门狗,但是喂狗不正确,比如,在主循环里喂狗,但是如果程序卡在某个中断或者某个循环里,主循环不跑了,就不会喂狗,看门狗会重启,这是对的。但是,如果在中断里喂狗,或者在每个可能卡住的地方都喂狗,那么就算程序跑飞了,也可能还在喂狗,看门狗就不起作用了。

正确的做法是,只在主循环的合适位置喂狗,并且,喂狗的条件,是程序正常运行,所有的任务都正常完成了。比如,可以设置一个标志位,每个任务正常完成了,就置位,主循环检查所有标志位都置位了,才喂狗,然后清除标志位。这样,如果某个任务卡住了,标志位没有置位,就不会喂狗,看门狗就会重启。

还有,看门狗的超时时间,要设置合适,不能太短,不然正常运行也会重启;也不能太长,不然死机了很久才重启,影响使用。一般设置为程序最长正常运行时间的1.5到2倍比较合适。

我之前做过一个项目,设备偶尔会死机,需要人工重启,后来加了看门狗,并且正确喂狗之后,就算死机了,也会自动重启,基本不用人工干预了,稳定性大大提升。

二、通信和网络方面的技巧

再说说通信和网络方面的技巧,物联网设备,通信是关键,也是很容易出问题的地方。

1. 无线通信一定要做重传和确认,不要假设数据一定能送到

无线通信,比如WiFi、蓝牙、LoRa、NB-IoT、Zigbee等,都是不可靠的,会有丢包、干扰、信号弱等问题,数据不一定能送到。很多新手,发了数据,就假设对方一定能收到,结果数据丢了,也不知道,导致各种问题。

所以,无线通信,一定要做重传和确认机制。发送方发了数据之后,要等待接收方的确认,如果在超时时间内没有收到确认,就重传,重传几次之后,还是失败,就认为通信失败,做相应的处理。

而且,数据要加序号,避免重复包和乱序。接收方收到数据之后,检查序号,如果是已经收到过的,就丢弃,或者只回复确认,不处理;如果序号不对,就做相应的处理。

还有,对于重要的数据,比如控制指令、配置参数,要做持久化,发送成功之后,要保存到Flash或者EEPROM里,设备重启之后,还能恢复,不会丢失。

我之前做过一个LoRa的项目,最开始没有做重传和确认,数据丢包率很高,很多指令都没有送到,设备不动作,后来加了重传和确认之后,通信成功率大大提升,基本没有丢包的问题了。

2. MQTT要合理设置QoS、KeepAlive和遗嘱消息

MQTT是物联网最常用的协议之一,很多人用MQTT,但是只是简单地连接、发布、订阅,没有合理设置QoS、KeepAlive和遗嘱消息,导致各种问题。

QoS(服务质量),有三个级别,0(最多一次)、1(至少一次)、2(恰好一次)。对于不重要的数据,比如传感器的高频数据,可以用QoS 0,丢了也没关系,下一次还会发;对于重要的数据,比如控制指令、告警信息,要用QoS 1或者2,确保数据能送到。不要所有数据都用QoS 0,也不要所有数据都用QoS 2,QoS越高,开销越大,效率越低,要根据数据的重要性,合理选择。

KeepAlive(心跳保活),是客户端和Broker之间,定期发送心跳包,保持连接,并且检测连接是否断开。KeepAlive的时间,要设置合适,不能太短,不然心跳包太多,浪费流量和电量;也不能太长,不然连接断开了,很久才发现。一般设置为30秒到5分钟比较合适,根据网络情况和应用场景调整。而且,要处理连接断开的情况,自动重连,重连之后,重新订阅主题,恢复状态。

遗嘱消息(LWT),是客户端在连接的时候,告诉Broker,如果我异常断开了,就发布这个遗嘱消息。这样,其他订阅了这个主题的设备,就能知道这个设备离线了,做相应的处理。比如,设备异常断开,Broker发布遗嘱消息,主题是device/123/status,内容是offline,其他设备收到之后,就知道这个设备离线了,可以告警,或者做故障转移。遗嘱消息,对于无人值守的物联网设备,非常重要,一定要设置。

还有,MQTT的主题设计,也要合理,用层级结构,比如device/{deviceid}/sensor/{sensortype},方便订阅和管理,不要用太简单或者太复杂的主题。

3. 网络不稳定的时候,要做数据缓存和断点续传

物联网设备,很多都在网络不稳定的地方,比如野外、地下、偏远地区,网络时断时续,这时候,如果数据直接发,网络断了,数据就丢了。所以,要做数据缓存和断点续传。

数据缓存,就是设备采集到数据之后,先保存到本地的Flash、EEPROM或者SD卡里,然后再发送,发送成功之后,再删除。如果网络断了,数据就存在本地,等网络恢复了,再继续发送,这样就不会丢数据了。

断点续传,就是发送数据的时候,如果发送到一半,网络断了,下次发送的时候,从上次断开的地方继续发,而不是从头开始,这样能节省流量和时间。对于大文件、固件升级等,断点续传非常重要。

而且,缓存要有大小限制,不能无限缓存,不然存储空间满了,就有问题了。可以设置一个最大缓存条数或者最大缓存大小,超过了,就覆盖最旧的数据,或者告警。还有,缓存的数据,要做校验,避免数据损坏。

我之前做过一个野外的环境监测项目,网络很不稳定,经常断,最开始数据直接发,丢了很多数据,后来加了本地缓存,数据先存到Flash里,网络恢复了再发,就再也没有丢过数据了,非常稳定。

4. 设备上线要做时间同步,并且处理时间不同步的问题

很多物联网应用,都需要准确的时间,比如数据采集的时间戳、日志的时间、定时任务、事件排序等,如果设备的时间不准确,就会出问题。很多设备,上电之后,时间是随机的,或者是出厂时间,不准确,需要同步时间。

时间同步,最常用的是NTP,设备联网之后,从NTP服务器获取准确的时间,同步到本地的RTC。但是,NTP需要联网,而且有时候网络不好,NTP同步失败,时间就不准了。所以,要有备用方案,比如,设备可以从基站获取时间(NB-IoT、Cat.1等蜂窝模块,很多都支持从基站获取时间),或者,从服务器下发时间,设备同步。

而且,就算同步了时间,设备的RTC也会有漂移,长时间运行,时间会慢慢不准,所以,要定期重新同步时间,比如每天同步一次。

还有,要处理时间不同步的问题,比如,设备的时间还没同步,就采集了数据,这时候的时间戳是不准的,要标记出来,或者等时间同步了,再修正。还有,不同设备之间,时间可能不同步,数据到了云端,要做时间校准,或者用服务器的接收时间,作为统一的时间。

我之前做过一个项目,设备时间没有同步,数据的时间戳都是错的,到了云端,数据排序乱了,分析也错了,后来加了NTP时间同步,并且处理了时间未同步的情况,问题就解决了。

三、云端和平台方面的技巧

再说说云端和平台方面的技巧,物联网的后端,和普通的互联网后端,有很多不一样的地方。

1. 设备数据要做时序存储,不要存在普通的关系型数据库里

物联网设备,会产生大量的时序数据,比如传感器数据,每秒甚至每毫秒都有数据,数据量非常大,而且都是带时间戳的,查询的时候,基本都是按时间范围查询。如果把这些数据,存在普通的关系型数据库里,比如MySQL,数据量大了之后,查询会非常慢,而且存储成本很高。

所以,物联网的时序数据,要存在时序数据库(TSDB)里,比如InfluxDB、TimescaleDB、TDengine、OpenTSDB等,这些数据库,专门为时序数据设计,存储压缩率高,查询速度快,支持按时间范围聚合、降采样等操作,非常适合物联网数据。

而且,时序数据,要做降采样和聚合,比如,原始数据,保留最近7天或者30天,超过的,就降采样,比如把1秒的数据,聚合成1分钟、1小时、1天的平均值、最大值、最小值,这样,既能节省存储空间,又能满足大部分的查询需求。

还有,设备的元数据,比如设备ID、名称、类型、配置、状态等,可以存在关系型数据库里,或者NoSQL数据库里,和时序数据分开存储,元数据查询用关系型数据库,时序数据查询用时序数据库,各司其职。

我之前做过一个项目,最开始把传感器数据存在MySQL里,数据量到了几百万条之后,查询就很慢了,经常超时,后来迁移到了InfluxDB,并且做了降采样,查询速度提升了几十倍,存储空间也省了很多。

2. 设备指令要做队列和状态机,不要直接发了就不管

很多物联网应用,需要给设备发指令,比如开关控制、参数配置、固件升级等,很多人,发了指令,就不管了,假设设备一定能收到,一定能执行,结果,指令丢了,或者设备没执行,也不知道,导致问题。

所以,设备指令,要做队列和状态机。每条指令,都有一个唯一的ID,有状态,比如待发送、已发送、已确认、执行中、已完成、失败、超时等。指令先放到队列里,按顺序发送,发送之后,等待设备确认,设备确认收到了,状态改成已确认;设备执行完成了,上报执行结果,状态改成已完成;如果超时没有确认,或者执行失败,就重发,或者标记失败,做相应的处理。

而且,指令要有优先级,比如紧急的告警指令、安全指令,优先级高,先发;普通的查询指令、配置指令,优先级低,后发。还要有超时和重试机制,指令发送之后,多久没有确认,就重发,重发几次之后,还是失败,就标记失败,告警。

还有,固件升级这种大的指令,要做分片传输、断点续传、CRC校验,确保升级包完整、正确地送到设备,设备升级之后,要上报版本号,确认升级成功,如果升级失败,要支持回滚,避免设备变砖。

我之前做过一个智能家居的项目,最开始发指令,发了就不管了,经常出现APP显示成功,但是设备没动作的情况,后来加了指令队列和状态机,每条指令都有状态,有确认,有重试,问题就解决了,用户体验大大提升。

3. 设备影子(Device Shadow)非常有用,一定要用

设备影子,是很多物联网平台都有的功能,比如AWS IoT、阿里云IoT、华为云IoT等,都有设备影子。设备影子,就是在云端,保存一份设备的最新状态和期望状态,设备上线的时候,同步影子的状态;设备离线的时候,也能查询和设置影子,等设备上线了,再同步。

设备影子,非常有用,能解决很多问题。比如,设备离线的时候,用户想控制设备,这时候指令发不到设备,就可以先设置设备影子的期望状态,等设备上线了,同步影子,获取期望状态,执行指令,然后更新影子状态。这样,就算设备离线,用户也能操作,不会失败。

还有,设备上线的时候,不需要查询自己的状态,直接同步设备影子,就能获取最新的期望状态,执行,然后上报实际状态,更新影子。这样,设备的状态,始终和云端保持一致,不会出现状态不同步的问题。

还有,APP端查询设备状态的时候,不需要直接查询设备,只需要查询设备影子,就能获取最新的状态,响应很快,而且,就算设备离线,也能显示最后一次上报的状态,不会显示未知。

如果用的是MQTT,自己也可以实现简单的设备影子,用一个主题,比如device/{id}/shadow,保存设备的状态,设备上线的时候,订阅这个主题,获取状态,状态变化的时候,发布到这个主题,更新状态。

我之前做过一个项目,没有用设备影子,设备离线的时候,用户操作就失败,体验很差,后来加了设备影子,设备离线的时候,用户操作先存在影子里,设备上线了再执行,体验大大提升,而且设备状态也始终同步,非常方便。

4. 要做好设备管理和监控,及时发现异常设备

物联网项目,设备数量多,分布广,很多都是无人值守的,如果设备出了问题,比如离线、数据异常、电量低、故障等,不能及时发现,就会影响使用,甚至造成损失。所以,一定要做好设备管理和监控。

设备管理,包括设备的注册、认证、配置、分组、标签、固件升级等,要能方便地管理大量的设备,批量配置,批量升级。设备监控,包括设备的在线状态、运行状态、数据上报情况、电量、信号强度等,要能实时监控,发现异常,及时告警。

比如,设备超过一定时间没有上报数据,就认为离线了,告警;设备的数据,超出了正常范围,就认为异常,告警;设备的电量低于阈值,就告警,提醒更换电池;设备的信号强度太弱,就告警,检查网络。

而且,要做设备的健康度评估,根据设备的在线率、数据上报率、故障率、信号强度、电量等,给设备打分,健康度低的设备,优先排查和维护。

还有,要做设备的日志和远程诊断,设备上报日志,云端保存,出问题的时候,可以远程查看日志,远程诊断,甚至远程调试,不需要到现场,能大大降低维护成本。

我之前做过一个工业物联网的项目,有几百台设备,分布在不同的工厂,最开始没有设备监控,设备出了问题,都是用户反馈了才知道,很被动,后来做了设备管理和监控系统,实时监控设备状态,发现异常自动告警,很多问题,在用户发现之前,我们就已经知道了,并且解决了,大大提升了服务质量,也降低了维护成本。

四、安全方面的技巧

再说说安全方面的技巧,物联网安全,非常重要,但是很多人都忽视了,导致各种安全问题。

1. 设备一定要做认证和加密,不要用默认密码,不要明文传输

很多物联网设备,安全做得很差,用默认密码,甚至没有密码,通信明文传输,很容易被攻击,被控制,造成安全隐患。比如,很多摄像头,用默认密码,被黑客控制,变成肉鸡,甚至被偷窥隐私;很多智能家居设备,通信明文,被中间人攻击,被控制,造成安全问题。

所以,设备一定要做认证和加密。认证方面,每个设备,都要有唯一的设备ID和密钥,连接云端的时候,要做身份认证,比如用Token、证书、一机一密等,不要用默认密码,不要用通用密码,每个设备的密码都不一样。而且,认证信息,要存在安全的存储区,比如Secure Element、TPM,或者加密存储,不要明文存在Flash里,容易被读取。

加密方面,通信一定要加密,比如用TLS(MQTT over TLS、HTTPS),或者应用层加密,数据加密之后再传输,不要明文传输,避免被窃听和篡改。而且,敏感数据,比如密码、密钥、个人信息,要加密存储,不要明文存在设备或者云端。

还有,要定期更新设备的固件,修复安全漏洞,很多物联网设备,出厂之后,就再也不更新了,漏洞一直存在,很危险。所以,一定要支持OTA固件升级,定期更新,修复安全漏洞。

我之前做过一个项目,最开始通信是明文的,也没有认证,后来被安全扫描扫出来了,有很多安全漏洞,后来加了TLS加密和设备认证,并且做了固件加密和安全启动,才通过了安全审计。所以,物联网安全,一定要重视,不要等出了问题才补救。

2. 不要把设备直接暴露在公网,用反向代理或者VPN

很多人,为了远程访问设备,把设备直接暴露在公网上,端口映射,或者直接用公网IP,这样非常危险,很容易被扫描,被攻击,被控制。物联网设备,很多都有安全漏洞,直接暴露在公网,就像裸奔一样,很危险。

所以,不要把设备直接暴露在公网,要用反向代理或者VPN。比如,设备在内网,云端有一个反向代理服务器,设备主动连接反向代理,用户访问反向代理,反向代理转发到设备,这样,设备不需要暴露在公网,只需要主动向外连接,很安全。

或者,用VPN,设备和用户都连到同一个VPN里,通过VPN访问设备,这样,设备也不需要暴露在公网,很安全。

还有,用MQTT等消息协议,设备主动连接云端,不需要监听端口,也不需要公网IP,这样,设备就不会被扫描和攻击,很安全。大部分物联网应用,都应该用这种模式,设备主动连接云端,云端下发指令,而不是设备暴露在公网,被访问。

我之前见过一个项目,把摄像头直接暴露在公网,用默认密码,结果被黑客扫描到,控制了摄像头,还被加入了僵尸网络,后来改成了设备主动连接云端,用MQTT通信,并且加了认证和加密,才解决了安全问题。

3. 最小权限原则,设备和用户的权限,能小就小

安全里有一个很重要的原则,就是最小权限原则,每个设备、每个用户,只给完成任务所需要的最小权限,不要给多余的权限,这样,就算被攻破了,造成的损失也有限。

比如,设备的权限,只能发布和订阅自己相关的主题,不能发布和订阅其他设备的主题,更不能发布和订阅管理主题,避免一个设备被攻破,影响其他设备。用户的权限,也是分级的,普通用户,只能查看和控制自己的设备;管理员,才能管理所有设备,修改系统配置。而且,管理员账号,要启用双因素认证,不要用弱密码。

还有,云端的服务,也是最小权限,数据库账号,只能访问需要的表,只能做需要的操作,不要给root权限;API接口,也要做权限控制,每个接口,只能被有权限的用户调用,避免越权访问。

还有,设备的调试接口、串口、SSH等,出厂的时候要关闭,或者加密码,不要开放,不然很容易被利用,获取设备的权限。

我之前做过一个项目,最开始,所有设备都能订阅所有主题,结果一个设备出了bug,发了错误的消息,影响了所有设备,后来改成了最小权限,每个设备只能操作自己的主题,就再也没有出现过这种问题了。

五、调试和排查问题的技巧

最后,说说调试和排查问题的技巧,物联网项目,问题很多,而且很难排查,掌握一些技巧,能帮你快速定位和解决问题。

1. 设备一定要有详细的日志,并且支持远程查看

物联网设备,很多都在现场,或者无人值守,出了问题,不能到现场调试,所以,一定要有详细的日志,并且支持远程查看。

日志,要分级,比如DEBUG、INFO、WARN、ERROR,不同级别的日志,记录不同的内容。DEBUG级别的,记录详细的调试信息,比如传感器原始数据、通信报文、函数调用等;INFO级别的,记录正常的运行信息,比如设备启动、连接成功、数据上报、指令执行等;WARN级别的,记录警告信息,比如数据异常、通信重试、电量低等;ERROR级别的,记录错误信息,比如通信失败、传感器故障、程序异常等。

日志,要输出到串口,方便现场调试,也要保存到本地的Flash或者文件,并且支持远程上传到云端,远程查看。而且,日志要带时间戳,方便排查问题的时候,知道是什么时候发生的。

还有,要支持动态调整日志级别,比如,正常运行的时候,用INFO级别,减少日志量,出问题的时候,远程调整到DEBUG级别,获取详细的调试信息,排查完了,再调回INFO级别,这样,既能正常运行,又能在需要的时候获取详细信息。

我之前做过一个项目,设备出了问题,但是没有日志,不知道是什么原因,只能到现场,接串口调试,很麻烦,后来加了详细的日志,并且支持远程查看和调整日志级别,出了问题,远程就能看日志,排查问题,效率大大提升。

2. 要善于抓包分析,通信问题大部分都能通过抓包解决

物联网项目,很多问题都是通信问题,比如数据发不出去、收不到、丢包、乱序、格式错误等,这些问题,大部分都能通过抓包分析来解决。

抓包,常用的工具是Wireshark,能抓取网络数据包,分析各种协议,比如TCP、UDP、MQTT、HTTP、CoAP等。如果是WiFi或者以太网的设备,直接在电脑上抓包,或者在路由器、交换机上做端口镜像抓包。如果是蜂窝网络(NB-IoT、Cat.1等),可以在云端抓包,看设备发上来的数据包,或者用专用的蜂窝网络抓包工具。

如果是串口通信,比如UART、SPI、I2C,可以用逻辑分析仪抓波形,分析通信时序和数据,很多硬件通信问题,用逻辑分析仪一看就知道了。

抓包的时候,要注意,先明确通信的协议和格式,知道正常的数据包应该是什么样的,然后对比抓包的数据,看哪里不一样,是没发出来,还是发错了,还是丢了,还是格式不对,一步步排查,就能找到问题。

我之前遇到过很多通信问题,比如MQTT连接不上、数据收不到、指令不执行等,大部分都是通过抓包分析,很快就找到了原因,比如是端口不对、Topic写错了、QoS不匹配、数据包格式错了等,抓包一看就清楚了。所以,抓包是排查通信问题的利器,一定要掌握。

3. 复现问题是关键,不能复现的问题,要想办法创造条件复现

排查问题,最关键的是复现问题,能稳定复现的问题,都不难解决,不能复现的问题,才是最难的。很多物联网问题,都是偶现的,比如偶尔掉线、偶尔数据异常、偶尔重启,很难复现,排查起来很头疼。

对于偶现的问题,要想办法创造条件复现,比如,压力测试,长时间高频率运行,看能不能复现;环境测试,高低温、湿度、干扰等环境下测试,看能不能复现;边界测试,测试边界条件,比如最大数据量、最弱信号、最低电量等,看能不能复现。

还有,要增加日志和监控,记录问题发生时的上下文,比如,问题发生前的操作、设备状态、环境参数、日志等,这样,就算不能稳定复现,也能根据记录的信息,分析问题的原因。

还有,可以用故障注入的方法,主动注入一些故障,比如断网、断电、干扰、丢包等,看设备的表现,能不能复现问题,同时也能测试设备的容错能力。

我之前遇到过一个偶现的设备重启问题,很难复现,后来做了压力测试,连续运行了几天,并且记录了详细的日志和环境参数,终于复现了,发现是内存泄漏导致的,修复之后,问题就解决了。所以,遇到偶现问题,不要放弃,要想办法复现,只要能复现,就一定能解决。

六、写在最后

物联网IoT,是一个很有前景的技术,也是一个很复杂的技术,涉及的知识面很广,从硬件到软件,从嵌入式到云端,从通信到安全,都要懂,想要进阶,确实不容易。

今天分享的这些技巧,都是我在实际项目中踩坑总结出来的,可能很多人不知道,但是非常实用,能帮你少走很多弯路,提升项目的稳定性和效率。当然,物联网的进阶技巧,还有很多,今天只是分享了一部分,以后有机会,再和大家分享更多。

物联网项目,最重要的,是稳定和可靠,尤其是无人值守的设备,一旦出了问题,维护成本很高,所以,在设计和开发的时候,一定要考虑周全,电源、通信、安全、低功耗、容错、监控等,都要重视,不要觉得能跑起来就行,能稳定运行,才是真正的做好了。

希望今天的分享,能给大家一些帮助,也希望大家在做物联网项目的时候,少踩坑,多总结,不断提升自己的技术水平,做出更稳定、更可靠的物联网产品。

最后,愿每一个物联网开发者,都能做出稳定可靠的产品,享受技术带来的乐趣和成就感。