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

3,修改为自己的阿里云物联网平台上的参数(如果只是发送图片到阿里云OSS,不使用阿里云物联网平台可以不用填写)


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
GY001_0000_0.0.0: GY001 代表板子型号; 中间的0000代表硬件版本,字符串随意规定; 最后的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,在mqtt回调函数里订阅主题,发布一些消息, 把接收的数据发送到缓存


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获取图片去处理

.