<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/product/audioCamera.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节实现的功能是设备动态注册,然后连接阿里云物联网平台, 通过阿里云物联网平台发送拍照命令给设备;
设备接收到命令以后拍照上传到阿里云的OSS; 同时支持使用阿里云物联网平台OTA升级程序;
测试
1,把这节的工程放到开发环境下面的目录里面并解压!
把这节的工程放到开发环境下面的目录里面并解压!
把这节的工程放到开发环境下面的目录里面并解压!

2,然后右键选择通过 Code 打开

3,修改为自己的阿里云物联网平台上的参数


4,修改为自己的OSS参数

编译下载测试(远离补光灯,远离补光灯,远离补光灯)
1,点击这个进行编译
提示: 第一次编译时间有点长, 编译完这一次后面再编译就快了

2,编译下载程序,在日志窗口打印下面的日志说明可以了


可以在平台上看到设备在线

3,点击查看, 在平台上发布消息给设备


{"cmd":"take","delay":0,"count":3,"interval":1000,"giveup":6}
delay//设备启动以后延迟多少时间进行拍照(ms)
count//拍照次数
interval//连拍时的时间间隔(ms)
giveup//第一次采集摄像头图片时舍弃前面的多少张(刚启动采集时前几张不稳定)

4,可以在日志上看到设备执行状态

可以在阿里云对象存储oss上看到图片

测试OTA
1,修改下程序版本号,原先是0.0.0, 改为0.0.1
注:前面的A1代表型号: 建议每个产品定义不同的型号, 程序下载固件前会对比型号,主要为了预防升级错;
中间的 0 代表硬件版本, 后面会有说明;
后面的0.0.0 代表程序版本;

2,然后编译

3,编译完成以后固件是这个


4,添加升级包

4.选择添加模块(使用默认的好像不能主动查询到固件信息)
升级包名称:随意写, 所属产品:选择您当前设备所属的产品

5.模块名称,这个是和单片机程序设置的型号对应的


7.选择咱刚才添加的升级包模块,版本号填写用户程序设置的版本号

5.上传固件

6.先选择不需要验证
验证的话需要先让其中一个设备远程升级验证下.不过实际产品应用尽量选择验证!
这个验证呢后面会说,咱先快速的使用起来.

7.点击批量升级

8.选择动态升级
注意哈,待升级版本号那里之所以是0.0.0 是因为咱设备连上服务器以后会上报了自己的版本号


9.下面这些选项,按照自己的需求更改

10.观察下串口日志



测试带验证的
1,修改版本0.0.2 然后编译下

2,添加升级包(其它步骤和上面一样,只是选择需要平台验证)

3,选择验证


设备就会开始升级,并升级完成

然后后续步骤就可以和上面一样点击批量升级升级全部设备; 建议每次更改程序以后都先使用自己的设备测试一下升级,然后再批量进行升级其它设备;

程序说明(OTA)
1,设备连接上服务器以后先上报软件版本



2,接收服务器返回的数据,有升级数据以后执行升级


其实就是把固件url下载地址flash记录一下,然后重启;

3,重启以后获取url

下面有个硬件版本设置, 列如: 同一个板子,也是同一个项目,但是外接的传感器不一样, 烧录程序的时候就可以设置不同的硬件版本,
然后程序里面判断硬件版本号执行不同的采集程序.

4,等待联网成功执行更新

可以在回调函数里面获取升级状态

5,升级程序默认是提供的重启以后升级, 也可以在当前运行程序中升级;

程序说明(连接阿里云物联网平台)
1,初始化



2,在回调函数里订阅主题,发布一些消息, 把接收的数据发送到缓存


3,提取缓存数据, 根据topic进行不同的处理


程序说明(上传图片到阿里云OSS)
1,初始化


2,等获取拍照命令

注:这个拍照命令是从这里过来的(阿里云物联网平台的数据)

3,后面就是执行拍照, 还有发送一些数据给物联网平台

/***发布消息******/
int len = sprintf(struct_aliyun_mqtt_device.mqtt_send_buff, "/%s/%s/user/update", struct_aliyun_mqtt_device.aliyun_product_key, struct_aliyun_mqtt_device.aliyun_device_name);//topic
struct_aliyun_mqtt_device.mqtt_send_buff[len]=0;
//发送的数据, 按照code 来解析, 后面的是具体的消息字符串和消息id
len = sprintf(&struct_aliyun_mqtt_device.mqtt_send_buff[mqtt_data_topic_len],"{\"code\":%d,\"msg\",\"%s\",\"msg_id\",%d}",201,"take",0);//开始执行拍照
struct_aliyun_mqtt_device.mqtt_send_buff[mqtt_data_topic_len+len]=0;
int msg_id = esp_mqtt_client_publish(struct_aliyun_mqtt_device.mqtt_handle, struct_aliyun_mqtt_device.mqtt_send_buff, &struct_aliyun_mqtt_device.mqtt_send_buff[mqtt_data_topic_len], len, 0, 0);
这里使用的自定义topic发送了执行状态, 我规定的是 code 是对应的执行到哪一步了; 后面的 msg 和 msg_id 是为了提供更详细些的描述
4,发送物模型数据, 地理位置和电池电压, 这是这边添加的物模型数据
地理位置不能显示在地图上,还不知道为啥,只能显示上报的数据;

需要在产品里面添加物模型-添加地理位置




需要在产品里面添加物模型-添加电池电压



然后就可以在平台上看到设备上报的数据

5,把图片发送到阿里云对象存储OSS

6,发送完以后还使用自定义topic上报了图片存储的路径
实际项目中后台需要知道上报的图片路径,后台就可以从oss获取图片去处理

.