2021爱智先行者—记录一次 Spirit 1 和 IoT Pi 开发板的实战经历

目录

前言

正文

一、IoT Pi 开发板介绍

二、开发实战

1. 连接设备

2. 搭建开发环境

3. 开始编码

4. 编译打包

5. 安装应用程序

6. LED灯开关控制演示

7. 程序升级改造

8. 如何支持设备热插拔  

​结尾


前言

IoT Pi 是一块小巧的物联网开发板,开发者们可以把它入门级开发板来使用,通过它熟悉和掌握 MS-RTOS 的开发实战技能。今天就来介绍一下如何使用 Spirit 1 配合 IoT Pi 开发板开发一个 LED 灯控制系统。

正文

一、IoT Pi 开发板介绍

IoT Pi 开发板内置了主频高达100MHz的 Cortex-M4 处理器,包含512KB的 FLASH 储存空间和256KB的RAM空间,通过烧录系统,能够保证流畅的运行 MS-RTOS 和多个应用程序。另外,IoT Pi 开发板还搭载了 EEPROM 和 SD 卡插座,可用于储存数据和与 PC 机交互文件。 同时,还支持 WiFi 功能。IoT Pi 还板载了三个按键和三个 LED 及一个 USB 转串口,使用USB线供电的同时也能与 PC 机进行串口通信。讲了这么多,让我们来看看 IoT Pi 开发板长什么样吧,如下图所示:

再来看一下官方给出 IoT Pi 产品的详细参数:

主芯片STM32F412RET6,512KB FLASH,256KB RAM
EEPROMFT24C02
SD 卡板载 TF 卡座
下载接口SWD 下载调试接口,2.54mm插针
USB 通信5V供电,和 USB 串口通信
按键3个用户自定义按键,1个复位功能按键
LED 灯3个用户自定义 LED,1个电源指示灯
IO 接口两排2.54mm,20PIN 插针接口,其中24个通用 IO,
4个5V,4个3.3V,6个GND

如果想更加直观的了解上述硬件模块,请参看下图:

好了,通过上面的介绍,我们基本上对 IoT Pi 开发板有了大致的认识。接下来就让我们基于它开发一个 LED 灯智能控制程序吧。

二、开发实战

1. 连接设备

首先,给 IoT Pi 开发板安装四个塑料铜柱,方便固定和散热。接下来,使用电源线🔌连接 IoT Pi 开发板和 PC 电脑。

然后,电脑连接 Spirit 1 的 wifi,同时,连续按 IoT Pi 开发板的 key1 键三次,启动设备发现模式,此时,开发板的三个 LED 灯会不断闪烁,表明已经进入发现模式。之后,我们在浏览器中输入地址:https://192.168.128.1/#/desktop,进入 Spirit 1 界面,打开“设备”,进入应用内选择添加设备,具体操作如下图所示:

当然,我们也可以在手机端操作添加设备,在下图中点击“添加设备”按钮。

点击“添加设备”按钮后进入扫描设备页面,具体情况如下图所示:

在扫描设备页面打开“高级设置”,启动“SmartConfig”开关,输入SSID和密码后,点击“完成”按钮,比如下图所示:

在扫描设备页面提示我们发现了 IoT Pi 开发板,我们选择“添加”,操作如下图所示:  

在添加 IoT Pi 开发板的过程中需要输入设备密码,这是系统烧录时写死的,目前官方默认开发板的密码是1234567890,如果输入错误会给出“设备拒绝连接,请重试”的提示,具体如下图所示:

完成添加后,我们在设备列表中就可以看到 IoT Pi 开发板的设备了,如下图所示:

完成设备添加后,我们开始进行开发环境的搭建工作。 

2. 搭建开发环境

在 PC 端搭建爱智系统的开发环境还是非常方便的,可以直接使用 VSCode 开发工具,再安装一个 EdgerOS 开发插件。插件的安装也非常方便,在 VSCode 中扩展程序中搜索 edger 关键字,会出现下图所示的插件工具,点击“安装”即可。

安装完成后,在 VSCode 的左下角选择“创建项目”,具体操作如下图所示: 

项目创建页面会出现很多模板库,如果只有两个或者没有模版,可以尝试点击左下角的“刷新模板信息”按钮。如果还是没有,可以切换仓库源为 Gitee,因为开发插件默认的仓库源在 Github 上,国内很多用户可能会因为网络问题导致无法访问,具体操作可以参考下图:

获取全部模板库之后,我们可以从中看到一个名为“IoT Pi”的模板库,因为我们设备就是 IoT Pi 开发板,因此选择这个模板库初始化项目工程,选择“立即应用”,具体操作请看下图:

点击“立即应用”后,我们进入了项目信息页面,可以参考下图完成项目配置,然后选择“立即创建”。   

工程创建后,我们可以看到一个前后端分离的工程目录,其中,iotpi目录是后端逻辑部分,web目录中是前端页面部分。 

3. 开始编码

引入依赖库和定义部分变量,代码如下:

const Web = require('webapp');
var Device = require('device');

/* IoT Pi device */
var iotpi = undefined;

/* IoT Pi devices */
var iotpis = new Map();

const app = Web.createApp();
app.use(Web.static('./public', { index: ['index.html', 'index.htm'] }));

选择设备服务接口,代码如下:

app.post('/api/select/:devid', function(req, res) {
	iotpi = new Device();
	iotpi.request(req.params.devid, function(error) {
		if (error) {
			res.send({
				result: false,
				code: 50004,
				message: `设备错误:${error.message}`
			});
			iotpi = undefined;
		} else {
			res.send({
				result: true,
				code: 20000,
				message: 'success'
			});
			iotpi.on('lost', iotpiRemove);

			iotpi.on('message', function(msg) {
				io.emit('iotpi-message', msg);
			});

			iotpi.send({ query: true }, function(error) {
				if (error) {
					console.error('Query IoT Pi error:', error.message);
				} else {
					console.log('Query IoT Pi Ok!');
				}
			}, 3);
		}
	});
});

启动 Socket IO 通道,用来完成前后端的消息通讯,代码如下:

/* Socket IO */
var io = require('socket.io')(
	app, {
		path: '/iotpi',
		serveClient: false,
		pingInterval: 10000,
		pingTimeout: 5000,
		cookie: false
	}
);

// 客户端连接或者断开
io.on('connection', function(sockio) {
	sockio.on('iotpi-control', function(msg) {
		if (iotpi && iotpi.devid) {
			console.log('Client send message:', JSON.stringify(msg));
			iotpi.send(msg, function(error) {
				if (error) {
					console.error('Send message to IoT Pi error:', error.message);
				}
			}, 3);
		} else {
			sockio.emit('iotpi-error', { code: 50002, error: '无效设备!' });
		}
	});

	sockio.on('iotpi-list', function(result) {
		var devs = [];
		iotpis.forEach(function(iotpi) {
			devs.push(iotpi);
		});
		result(devs);
	});
});

监控设备的连接状态,可能设备会有热插拔的操作,代码如下:

// 移除设备
Device.on('lost', function(devid) {
	if (iotpis.has(devid)) {
		iotpis.delete(devid);
		if (iotpi && iotpi.devid === devid) {
			iotpiRemove();
		}
		io.emit('iotpi-lost', devid);
	}
});

// 添加设备
Device.on('join', function(devid, info) {
	if (info.report.name === 'IoT Pi') {
		var devobj = {
			devid: devid, alias: info.alias, report: info.report
		};
		iotpis.set(devid, devobj);
		io.emit('iotpi-join', devobj);
	}
});

function iotpiRemove() {
	if (iotpi) {
		iotpi.release();
		iotpi.removeAllListeners();
	}
}

4. 编译打包

其实,前后端目录可以理解成两个单独的 Node.js 工程,在 iotpi 和 web 目录中分别执行如下命令:

npm install

执行成功后,两个目录中各自生成了自己的 node_modules 目录。

进入 web 目录,执行如下命令进行编译打包:

npm run build

命令执行成功后,会生成对应的 dist 目录。最后,需要将其中的文件拷贝到 iotpi 的 public 目录中。

5. 安装应用程序

在安装应用程序之前,我们可以参考下图添加新的 IoT Pi 设备选项。

添加设备之后,我们选择“安装 EdgerOS APP”,具体操作如下图所示:

安装过程中可能会遇到如下两个问题,这里记录一下。

问题1. Install EdgerOS App : Error: edger connect illegalConnect

这个错误不用担心,其实是你没有连接 Spirit 1 的 wifi,切换 wifi 网络就好了。

问题2. Install EdgerOS App : Error: edger connect wrongPassword 

这个问题其实是设备开发密码写错了,需要重新填写一遍,具体可以参考下图获取。

正确安装应用程序后,会给出如下提示: 

Install app success

具体如下图所示:

6. LED灯开关控制演示

程序安装成功后,我们回到浏览器页面(https://192.168.128.1/#/desktop)中, 会发现主页中新增了一个 IoT Pi Trying 的应用图标,具体如下图所示:

点击图标进入应用程序中,在设备列表中选择 IoT Pi 设备,此时,可能会出现设备权限问题,如下图所示:

那么,我们可以在系统设置中进行授权,如下图所示:

完成授权后,就可以进入设备操作界面了,在界面中控制三个 LED 灯的打开和关闭,同时,手动操作开发板的开关,操作页面也会随着变化,具体如下所示:

为了更加形象的展示实现效果,我们来看一段视频:

IoT Pi 开发板 LED 灯控制演示

7. 程序升级改造

其实,我们还可以进一步修改程序,在页面左上角添加一个总的开关按钮,同时控制开发板上三个 LED 灯的打开和关闭。编码实现也非常简单,开关时分别发送三条控制就可以了,下面看一下实现效果:

全部 LED 灯都打开的情况:

全部 LED 灯都关闭的情况: 

8. 如何支持设备热插拔  

在开发过程中发现,系统是支持设备热插拔的,我非常好奇其中的实现机制,因此自己特别留意了一下。最终发现,系统检测设备的连接和断开状态是通过心跳包机制来实现的,这符合我们常规的做法。通过每15秒一次的 ping 请求来判断设备是否在线,具体如下图所示: 

设备离线时的弹窗提醒:

设备上线时的弹窗提醒:

结尾

好了,本次利用 Spirit 1 配合 IoT Pi 开发板开发一个 LED 灯控制系统的实战经历就介绍完了,是不是非常精彩?自己非常喜欢在 EdgerOS 系统上开发物联网应用的感觉,架构设计清晰合理,技术栈简单易学,设备性能也非常给力,总之是一次非常愉快的开发体验。如果你感兴趣的话,也来一期参与吧!一起为国产操作系统加油助力!

【本文正在参与"2021爱智先行者-征文大赛"活动】,活动链接:https://bbs.csdn.net/topics/602601454 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Data-Mining

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值