最近开发了一款嵌入式物联网门锁, 用到了阿里云IoT平台的OTA能力, 设备端用了阿里云的HAAS210模组, 有些收获, 在此做个分享.
作为一个小微企业, 自建云平台不现实, 因此一个靠谱的做法就是在诸多物联网平台之间做一个选择.
考虑到近年来相继多个小型物联网平台的停服的事件, 我们要选只能在头部几个大平台之间选择, 即阿里, 华为, 亚马逊, 微软等.
我们的产品需要用到OTA服务, 因此我们在各大平台的OTA服务之间做了一个对比. 我们需要支持多种推送方式, 包括主动推送/被动请求/单设备多模块等OTA能力, 同时在推送方面又希望有多种参数的配置, 比如超时时间/单批次推送个数设置等能力. 综合易用性和性价比, 我们选择阿里的物联网平台, 里面的免费的公共实例提供了入门级的服务, 方便我们这样的小微企业接入.
选择其他头部平台, 要实现这些功能理论上也是可行的, 但是需要我们自己再自购一些服务器和云资源, 招相应的后端开发人员, 加上开发调试的成本, 这个对于我们希望短平快交付的企业不是非常现实.
我们的设备简单, 是典型的MCU+WiFi模组架构. WiFi模组有多个选择, 包括乐鑫/汉枫/庆科/涂鸦/小米等.
涂鸦/小米等厂家的模组功能跟他们云平台深度绑定, 同时我们的场景中也用不上他们的移动端能力, 因此不在我们的考虑之列.
剩下的只有通用模组. 通用模组中, 功能每家都是大同小异, 主要分为下面两种情况:
有没有一个提供了阿里云平台高阶能力(包含OTA等能力)的AT指令的WiFi模组? 考虑到我们MCU的ROM空间的限制, 以及开发时间/人力的不足, 我们倾向于在市面上找这样一款模组.
在阿里云的物联网平台上浏览新功能, 看到了他们关于云模组HAAS210的介绍, 基本符合我们的预期.我们主要用到OTA/物模型/一型一密等功能都有封装好的AT指令, 配网的话他们也提供了AT命令直接配网/蓝牙配网/设备热点等能力. 经询价, 价格基本与主流的WiFi模组相当, 甚至略有优势.
通过阿里云官网的链接, 联系阿里云IoT解决方案的有关人员, 购买到几个样品, 按照他们官网资料, 连接起来, 如下图. 
其中上面的串口是AT口(波特率115200), 下面的串口是debug口(波特率2000000).
我们用的配网方式很简单, 用AT命令直接传送ssid/passwd给设备端,
输入:AT+IWIFICONNECT=,,[save_to_flash]
AT+IWIFICONNECT=myssid,mypasswd,0
OK
配网成功后, AT口返回如下日志, 提示已经成功接入WiFi路由器
OK
+INETSTAT:4,192.**.**.101,B4:**:**:**:6a:7b
为了让工厂烧录设备身份的时候更加简单, 我们采用了一型一密(动态注册)的方式, 即让产品出厂的时候使用统一的产品秘钥, 设备连云的时候自己指定设备名称(比如填写mac地址), 平台根据建连信息自动为该设备创建身份信息, 并下发秘钥给设备.
设置认证方式: AT+IMQTTPARA=<para_key>, <para_value>
设置设备身份: AT+IDMAUTH=<product_key>,<device_name>,<device_secret>,<product_secret>
参考交互
AT+IMQTTPARA=AUTHMODE,2
//这里2表示设备首次连云的时候在云平台注册身份. 需要在控制台开启动态注册的选项.
OK
AT+IDMAUTH=c1***a1l,c1_***_dev,1**1*,dc****m
//四个参数都要输入, 由于选择了一型一密, 云端会在认证成功后下发真实的device_secret, 因此这里的device_secret可以暂时填写随机字符
OK
除了上述通用的一型一密的认证方式外, 模组也支持其他认证方式, 比如一机一密(用户预先在控制台创建设备, 在模组中直接输入product_key, device_name, device_secret). 用户请参考模组AT手册.
AT+IDMCONN=< host>,< port>
AT+IDMCONN=iot-05****al.mqtt.iothub.aliyuncs.com,1883
+IDMSTATE:1
OK
IDMSTATE返回1, 表示MQTT已经连接上
AT+IMQTTPUB=< topic>,< qos>, < payload>
参考上行: 上报helloworld
AT+IMQTTPUB=/ab8*****1U/t01_**_001/user/update,0,helloworld
+IMQTTPUB:0
OK
云模组有免订阅能力, 对于阿里云物联网平台的系统级的topic, 不用订阅即可收到下行消息.
参考下行: 控制台设置设备影子后, 设备收到的下行报文
+IMQTTRCVPUB:/shadow/get/gb80***u1U/eng_**_005,258,{"method":"control","payload":{*****},"timestamp":1650447219,"version":1}
物模型的协议是阿里云物联网平台自定义的一套数据格式, 用于标识设备的属性/事件/服务, 功能上类似于涂鸦的DP点.
格式如:
AT+IDMPP=< message>
参考输入:
AT+IDMPP={"LightStatus":1}
+IDMPP:8
OK
格式如
+IDMPS:<msg_id>,<msg_len>,
OK
参考输出:
+IDMPS:238420054,17,{"LightStatus":1}
格式如:
AT+IDMEP=<event_id>,<event_payload>
参考输入:
AT+IDMEP=OnSync,{"SyncTime":1}
+IDMEP:15
OK
云模组集成了阿里云LinkSDK中的OTA能力, 用户可以在控制台部署OTA任务, 为连接在云模组上的MCU下推升级固件. 交互步骤如下:
3.6.1 控制台部署OTA任务后, 模组收到了OTA消息, 告知MCU:
+IOTASTATE:< state>,< version>,<image_size>
参考交互:
+IOTASTATE:0,2.0.1,521540
3.6.2 MCU收到上述消息后, 通知模组是否接受OTA升级:
AT+IOTASTART=< enable>
模组响应: OK
参考交互:
AT+IOTASTART=1
OK
+IOTASTATE:1
如果接受, 模组就开始下载固件.
3.6.3 模组下载完固件, 通知MCU去收取:
+IOTASTATE:< state>,< version>,<image_size>
参考交互:
+IOTASTATE:2 //模组在校验固件
+IOTASTATE:5 //模组已经收完固件,通知MCU去分片读取
3.6.4 MCU查询固件的分片详情:
AT+IOTASHO
模组响应: +IOTASHO:<total_frame>, <frame_size>,, <image_size>,<digest_method>, <expect_digest>
参考交互:
AT+IOTASHO
+IOTASHO:2038,256,2.0.1,521540,0,fe52d2203d3406160f440a55fa7e6073
3.6.5 MCU获取其中某个分片:
AT+IOTASTX=< frame>
模组响应: +IOTASTX:< frame>,< data_size>, < crc16>,< data>
AT+IOTASTX=0
+IOTASTX:0,256,27069,**********************
MCU要持续请求(frame数值持续增加,直到total_frame-1), 取到的固件要存到MCU的flash里面.
3.6.6 升级结束, 上报新的固件版本号, 以确认固件升级成功:
AT+IOTAVER=2.0.0 //2.0.0表示新的固件版本号. 控制台收到后进行校验, 如果一致则更新任务状态
3.6.7 设备主动查询云端是否有OTA任务:
AT+IOTAQUERY //如果服务端有部署OTA任务, 会收到3.6.1中提到的下行报文
对于需要开发一些自定义功能的物联网厂家来说, 阿里云物联网平台提供了不错的原子化能力, 厂家可以基于这些能力快速实现自己的功能, 而使用他们的云模组可以快速实现端侧功能, 比通用的WiFi模组性价比要高.
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
我正在尝试整个BDD方法并想测试AMQP基于Vanilla的方面Ruby我正在写的应用程序。选择Minitest后作为与其他名副其实的蔬菜框架不同的平衡功能和表现力的测试框架,我着手编写此规范:#File./test/specs/services/my_service_spec.rb#Requirementsfortestrunningandconfigurationrequire"minitest/autorun"require"./test/specs/spec_helper"#Externalrequires#MinitestSpecsforEventMachinerequire