感谢电子发烧友,感谢润和软件,提供星闪派物联网开发套件试用。
用星闪派物联网开发套件,先实现本地交通灯项目,接入WiFi连上云端,本地红绿灯状态上传云端,云端显示,云端远程控制红绿灯。
开发套件已收到:星闪派物联网开发套件x1,星闪派物联网开发板x1
套件介绍参考试用连接:https://bbs.elecfans.com/try_HiHope.html
套件中有:星闪开发板,5个模块,1个底板,1条数据线
单独的星闪派开发板:
全家福:
星闪派物联网开发套件,模块化、集成化,各功能模块已集成到小电路板上,通过底板互联,不同组合实现不同功能。
比如:
OLED显示模块百搭,显示传感器信息,红绿灯状态等
模块化硬件,组装方便快捷,对软件开发人员十分友好
本项目使用星闪开发板+底板+红绿灯模块+OLED模块组合
参考海思社区gitee网页的方法:
链接:https://gitee.com/HiSpark/
链接:https://gitee.com/HiSpark/fbb_ws63
软件开发环境:windows 系统
软件开发工具:hispark studio,类似 vscode 界面
软件烧录工具:hispark studio 集成,不用单独安装
软件版本管理工具:git,自己下载windows版本。wsl 中的ubuntu git工具运行很慢,换 windows git 工具快很多。
创建工程,也参考上面海思社区gitee网页的方法
已调通红绿灯模块,OLED显示模块,实现本地红绿灯控制,OLED显示红绿灯状态,如文章开头视频
智能****交通灯本地控制逻辑的实现:
因为ws63 星闪派开发板运行的 RTOS 系统,本项目创建以下 6 个进程/任务实现红绿灯控制逻辑。系统运行时许如下
1,按键进程:初始化按键为中断模式,按下按键发出信号。Beep进程能收到,红绿灯主进程也能收到
2,beep进程:收到按键按下信号,发出pwm调制的方波信号,驱动无源蜂鸣器响。
3,红绿灯进程:收到按键按下信号,切换红绿灯闪烁模式,一共有四种模式:红绿灯交替闪烁模式,黄灯闪烁模式,红绿黄灯全亮,全灭。四种模式循环切换
4,红绿灯交替闪烁子进程:依次点亮绿-黄-红,交替亮起,循环下去
5,黄灯闪烁子进程:黄灯闪烁
6,oled显示进程:把oled显示缓存写入oled模块,周期性循环刷新。
红绿灯主进程,和两个子进程,控制红绿灯模式,红绿灯开关,同时也会把模式,红绿灯状态信息写入oled显示缓存。Oled显示进程刷新后,oled实时显示模式和状态
要实现的功能:
1,把本地交通灯状态推送到云端,云端可查看。
2,云端可以下发指令,远程控制本地交通灯。实现本地到云端,双向通信。
本项目,星闪派开发板不直接连接云端。
先接入阿里云网关,再通过阿里云网关和阿里云同步。
网络拓扑如下图:
通信数据流:
到阿里官网开物联网服务器,开通等一会就能用:
打开实例,创建产品:
在产品下面创建设备:
编辑产品物模型:
这个主灯亮度模块,可以满足需求,选这个
稍后阿里云网关上传数据,上传到这里,下发指令,也用这个属性
阿里云网关,基于LinkSDK二次开发实现,怎么开发?
先理清LinkSDK怎么运行,什么运行逻辑,开放了什么接口,什么功能,怎么调用。
LinkSDK 代码分析:
先初始化SDK 底层依赖,参数就是要自己实现的部分,是一些posix标准系统接口,如下
有内存相关接口,malloc,free,
有时间戳接口time
有休眠接口sleep
有网络接口init ,recv,send,deinit,
有随机数接口rand
有互斥锁接口init,deinit,lock,unlock
有mqtt接口setopt,establish
这些接口移植到自己平台实现,就可以把mqtt客户端跑起来,接入阿里云物联网平台了。
直接移植到星闪派也可以
本项目是把mqtt客户端部署到linux主机,当作阿里云网关。阿里云网关连接阿里云服务器,星闪派开发板再连接阿里云网关。
这里注册recv handle,接受回调函数,网关收到阿里云服务器下发的指令,会调用这个函数处理。
这个函数中数据处理部分需要自己实现。下文会分析为什么需要
这里还注册了event handle,事件回调函数,主要是mqtt客户端保持心跳,断联,重连,会调用这个函数
函数 aiot_mqtt_connect,与阿里云服务器建立连接
创建两个进程,一个是g_mqtt_process_thread 进程如下,会遍历pub_list,发送消息
还有一个进程是g_mqtt_recv_thread,会遍历 sub_list 处理,调用recv_handle 处理数据
遍历了两个列表,处理数据。可是两个列表都是空的,肯定不会正常收发消息。
接着看以下两个函数
Aiot_mqtt_sub 函数最终把 node 插入到 sub_list 中,如下 186行
aiot_mqtt_pub 函数最终调用以下函数插入pub_list 列表
Mqtt 客户端框架基本理清。
LinkSDK本质是个mqtt客户端,和阿里云服务器mqtt服务器通信。
稍后基于linkSDK二次开发,实现阿里云网关和阿里云服务器双向通信
阿里云网关连阿里云物联网服务器,需要以下信息:
1,阿里云服务器网址,端口号:接入地址如下
端口号:1883
2,阿里云设备证书:
3,修改LinkSDK 设备证书,mqtt 地址,端口号
4,如上文所说:调用aiot_mqtt_pub 发布消息,到阿里云服务器。实现云端查看状态
5,调用aiot_mqtt_sub 订阅消息,阿里云服务器下发指令,就能接收到了。并实现消息处理,收到数据做对应的动作,实现云端远程控制
消息处理代码,要添加到AIOT_MQTTRECV_PUB 中。本截图标识以下代码位置,代码不全,添加自己代码就好
6,LinkSDK 开发完成,编译不过,会报错,不是啥要紧的错误,改改 CFLAGS ,如下第四行,直接跳过去报错,继续编译完成,运行调试
编译生成output/mqtt-basic-demo
运行调试:
运行:output/mqtt-basic-demo
查看网关log:
发布的消息成功,消息内容是:LightLuminance:0
查看阿里云服务器:
设备在线,正常。
主灯亮度0 ,没问题,阿里云网关发布的值就是0。
阿里云服务器云端运行日志,实时监控数据,都正常。
云端远程查看状态实现。
云端下发指令:
阿里云网关收到以下消息:
阿里云网关收到消息,把交通灯设置好状态,把最新的状态再次发布到阿里云服务器。
查看历史数据一切正常:
云端远程控制实现。
阿里云网关和阿里云服务器之间,双向通信调通。
云端查看状态,云端控制,全部实现。
更多回帖