本文分享自华为云社区《智慧路灯实验手册(MQTT+Wi-Fi)-完善版》,作者:华为云社区精选。
本示例代码工程基于IoT LINK 2.1.0版本构建。
智慧路灯是城市智能化道路上重要一环,智慧路灯的实施具有节约公共照明能耗、较少因照明引起的交通事故等多种社会意义。路灯也是大家在日常生活中可以强烈感知到的公共设施,更易理解其智能化的场景。
本实验基于NB-IoT和WIFI实现智慧路灯案例,实现实时数据的采集,实现命令下发的响应,实现端云互通。

E53_SC1扩展板采用了E53标准接口,包含了一个路灯灯珠,一个BH1750光照强度传感器,其中路灯灯珠使用普通GPIO控制,BH1750使用IIC接口通信。
• 已注册华为云官方帐号。未注册可点击注册页面 完成注册。
• 已完成实名制认证。未完成可在华为云上点击实名认证 完成认证,否则无法使用设备接入功能。
• 已开通设备接入服务。未开通则访问设备接入服务 ,点击“免费试用”后开通该服务。
• 已下载IDE:Huawei LiteOS Studio 1.45+(含扩展插件)
• 已下载编译烧录工具包 :包含arm-none-eabi、build、openocd-0.10.0。
• 已下载ST-Link驱动包:ST-Link.zip
• 开发板:小熊派开发板(含WIFI通信扩展板、E53_SC1案例扩展板)
1. 硬件连接
连接好E53_SC1案例扩展板和Wi-Fi通信扩展板。将串口选择开关拨到AT-MCU模式,并用USB线将开发板与电脑连接,如图所示。

2. IDE安装配置
1) 下载并解压HUAWEI-LiteOS-Studio.zip 。
2) 双击运行HUAWEI-LiteOS-Studio-Setup-x64-1.45.9.exe,根据提示步骤完成默认安装。

3) 启动运行HUAWEI-LiteOS-Studio,在IDE活动栏中,打开扩展视图,点击更多操作...,在弹出的菜单中选择从VSIX安装,然后指定中文语言包MS-CEINTL.vscode-language-pack-zh-hans-1.45.1.vsix文件路径,即可完成安装。

4) 根据提示重启IDE,即可切换为中文界面。
3. 编译烧录工具配置
下载并解压Tools.zip ,将解压后的arm-none-eabi、build、openocd-0.10.0全部拷贝到C:\Users\xxx\.huawei-liteos-studio\tools目录下。
注:xxx为本地PC用户名,请根据实际路径进行配置。

4. 驱动安装
下载并解压ST-Link.zip ,根据操作系统类型,双击配套的执行文件进行安装。

1. 创建产品
对于设备上报至物联网平台的数据,云端物联网平台要能够解析设备上报的数据。故需要在设备接入服务侧完成产品模型定义,编解码插件开发部署等。
产品模型是用来描述设备能力的文件,通过JSON的格式定义了设备的基本属性、上报数据和下发命令的消息格式。定义产品模型,即在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的属性信息。
步骤1 进入设备接入服务控制台,选择左侧导航栏“产品”进入页面。

步骤2 单击右上角的“创建产品”,按照页面提示填写信息。
• 所属资源空间:选择默认资源空间
• 产品名称:自定义,如MQTT_streetlight
• 协议类型:MQTT
• 数据格式:JSON
• 设备类型选择:自定义类型
• 设备类型:自定义,如MQTT_ streetlight

步骤3 单击“确定”,创建产品成功。

步骤4 单击“查看详情”,进入产品详情页面。在“模型定义”页签下,单击“上传模型文件”。

步骤5 添加产品模型文件“Smart_Light_profile.zip ”,并单击“确定”完成上传。
模型文件下载链接:Smart_Light_profile.zip

查看服务列表,属性和命令信息如下:

2. 注册设备
步骤1 进入设备接入服务控制台,选择左侧导航栏“设备”进入设备列表页面。

步骤2 单击右上角的“注册设备”,按照页面提示填写相关参数。
• 所属资源空间:选择上一步创建产品时选择的资源空间
• 所示产品:选择刚创建的产品,如MQTT_streetlight
• 设备标识码:自定义,如streetlight012345
• 设备名称:自定义,如streetlight_01
• 设备认证类型:选择“密钥”
• 密钥/确认密钥:自定义,如12345678

步骤3 单击“确定”,添加设备成功,请保存好设备ID和密钥,用于设备接入平台认证。

3. 导入代码工程
步骤1 获取项目工程代码包 并解压(注:路径不要包含中文、空格)。
获取项目工程:MQTT_StreetLight_Demo.rar
步骤2 启动HUAWEI LiteOS Studio工具,单击“Open Project”,打开项目工程。

项目工程预览如下:

4. 配置项目工程

步骤3 单击
打开工程配置,目标板选择STM32L431RC,并“确认”。

步骤4 填写编译器配置选项后,单击“确认”。
• 编译器类型:arm-none-eabi
• 编译器目录:请根据实际路径配置,例如 c:\Users\xxx\.huawei-liteos-studio\tools\arm-none-eabi\bin
• Make构建器:请根据实际路径配置,例如c:\Users\xxx\.huawei-liteos-studio\tools\build\bin\make.exe
• Make脚本:请根据打开的项目工程进行配置,例如targets\STM32L431_BearPi\GCC\Makefile

步骤5 填写烧录器配置选项后,单击“确认”。
• 烧录方式:选择OpenOCD
• 端口:选择USB
• 烧录器配置:请根据实际路径配置,例如.\tools\openocd-0.10.0\bin-x64
• Interface文件:默认值
• Target文件:默认值
• 烧录文件:无需配置,待项目工程编译成功后会自动填充,例如.\targets\STM32L431_BearPi\GCC\build\Huawei_LiteOS.bin

5. 修改配置参数
步骤1 在代码中修改设备信息。
1) 打开文件:*\targets\STM32L431_BearPi\iot_config.h
2) 修改CN_EP_DEVICEID为在物联网平台注册设备时生成的设备ID,修改CN_EP_PASSWD为在物联网平台注册设备时填写的密钥。
3) 修改完成,请按Ctrl+S保存修改。

步骤2 配置WIFI用户名和密码。
此处只能使用用户名密码加密方式认证的WIFI,不能使用其他加密方式的WIFI。(可以使用手机开启WIFI热点,数据量不大不会占用太多个人流量)
开发板Wifi模块仅支持2.4GHz频段的热点,暂不支持5GHz频段。
1) 打开文件:*\targets\STM32L431_BearPi\.config
2) 修改CONFIG_ESP8266_SSID为热点设备名称,修改WIFI_ESP8266_PWD为热点密码。
3) 修改完成,请按Ctrl+S保存修改。

4) 打开文件:*\targets\STM32L431_BearPi\iot_config.h
5) 修改CONFIG_ESP8266_SSID为热点设备名称,修改WIFI_ESP8266_PWD为热点密码。
6) 修改完成,请按Ctrl+S保存修改。

6. 编译烧录

步骤1 单击
进行编译,单击
进行烧录。
如果修改了.config文件和iot_config.h文件,请单击
全量重新编译,否则修改点可能不会生效。
步骤 2 单击
打开串口终端,选择端口,设置波特率115200,开启串口,可以在接收区查看到打印的日志信息。

步骤3 在LCD屏上,可以看到实时数据显示。
7. 调试运行
步骤1 在物联网平台中,可以看到设备实时上报属性数据。

步骤2 在物联网平台中下发控制命令(开启路灯),查看命令下发结果及开发板的响应。

注:当前MQTT设备仅支持同步命令下发,NB设备仅支持异步命令下发。
案例程序文件:
"targets\STM32L431_BearPi\Demos\oc_streetlight_template\oc_streetlight_template.c"
详细了解IoT设备接入服务,请参考IoTD A 帮助文档 。

很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI