很荣幸能参与到TencentOS Tiny内测,物联网近年一直得到很高的关注,各大平台也纷纷推出了自己的物联网接入平台,这也说明了市场越来越成熟,开发者拥有更好的工具打造更实用的产品。我对物联网中“物”的定义一直都有“物理”的概念,things的网络,更是things所感知、所影响的物理世界的链接。而things上的关键,就是如何高效,可靠实现things的功效,这就引入今天的一大主角TencentOS Tiny及其所连接的Tencent IoT explorer。
现如今成熟的OS非常多,开发者甚至自己都可以开发一个实用的RTOS内核。但OS的目标不仅仅是调度,本质要提供的是便捷成熟的服务。TencentOS Tiny除了拥有可靠高效精简的RTOS内核外,还提供了更为实用的中间件服务(文件系统、网络通讯、各云平台接口等),除了完成了对上的应用,TencentOS Tiny还在不断扩展了对下的驱动和移植(一大波支持的开发板正在来袭)。
此外,为了此次的内侧活动,组织方还贴心提供了定制的开发板(By 物联网俱乐部)和完善的SDK资料,让开发者可以把更多精力放在Tiny和IoT explorer的体验上,加之活跃的讨论群和及时的支持,都可以看出此次活动满满的诚意。
运动的人原来越多,户外运动又是非常大的群体,安全运动也是智能设备一大需求点。这里定义了一款简易的智能运动手表,主要功能有:
根据上述描述,时间显示与云端无关,所以只需要在本地完成即可,无需在云端有所呈现;云端信息下发到手表,属于设备的一个属性,云端通过修改该属性,即可推送信息给手表;按键报警则为上行事件。所以我们就可以创建一个如图所示的拥有一个属性和一个事件组成的数据模板。
得益于IoT explorer人性化设计,一个产品定义可以非常便捷的完成,在这里记录下产品ID,设备名称,和设备密钥,我们就可以开发things端设备了。
对于things端的开发,首先我们要完成和IoT explorer交互的主线程,SDK中的light_data_template_sample是个非常适合的例程,因为我们只需要在这个例程中稍作修改,就可以在things设备端实现上述的数据模板,而数据通讯的上下行操作,在例程中也实现的很完善,无需修改。
//定义属性
static void _init_data_template(void)
{
memset((void *)&sg_ProductData, 0, sizeof(ProductDataDefine));
strncpy(sg_ProductData.m_msg, "Hello_world", MAX_STR_NAME_LEN);
sg_ProductData.m_msg[strlen("Hello_world")] = '\0';
sg_DataTemplate[0].data_property.key = "message";
sg_DataTemplate[0].data_property.data = sg_ProductData.m_msg;
sg_DataTemplate[0].data_property.type = TYPE_TEMPLATE_STRING;
};
//定义事件
static TYPE_DEF_TEMPLATE_BOOL sg_alarm_status;
static DeviceProperty g_propertyEvent_alarm[] = {
{.key = "alarm_event", .data = &sg_alarm_status, .type = TYPE_TEMPLATE_BOOL},
};
static sEvent g_events[]={
{
.event_name = "alarm_event",
.type = "alert",
.timestamp = 0,
.eventDataNum = sizeof(g_propertyEvent_alarm)/sizeof(g_propertyEvent_alarm[0]),
.pEventData = g_propertyEvent_alarm,
},
};
对于时间显示,这里我们使用TencentOS Tiny创建一个task,在这个task中使用周期为1秒的osDelay来维护显示手表时间。
#define TM_STK_SIZE 512
void tm(void *arg);
osThreadDef(tm, osPriorityNormal, 1, TM_STK_SIZE);
void tm(void *arg)
{
char time[20];
int hh = gethour();
int mm = getmin();
int ss = getsec();
while (1) {
osDelay(1000);
sprintf(time,"%02d:%02d:%02d",hh,mm,ss);
printf("The time is %s\r\n",time);
OLED_ShowString(0,2,(uint8_t *)time,20);
ss++;
if(ss == 60){mm++;ss=0;}
if(mm == 60){hh++;mm=0;}
if(hh == 24){hh=0;}
}
}
对于按键检测,得益于TencentOS Tiny多线程的支持,我们可以再但对创建一个按键检测任务,按键初始状态为释放状态,在任务中以100ms周期检查按键是否按下,若2秒按键持续按下,则判定按键长按,此时应发送事件给数据模板所在的任务,进行告警事件上报。
#define BTN_STK_SIZE 512
void btn(void *arg);
osThreadDef(btn, osPriorityNormal, 1, BTN_STK_SIZE);
void btn(void *arg)
{
int count = 0;
while (1) {
osDelay(100);
if(g_update)
continue;
if(!HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin))
count++;
else
{
count=0;
g_btn_status = 0;
}
if(count > 20)
{
printf("Button is pressed!\r\n");
g_update = 1;
g_btn_status = 1;
count = 0;
}
}
}
最后在tencent_cloud_sdk_explorer.c中增加WiFi的SSID及password,在tos_hal_os.c中添加上述的产品信息及密钥,即可完成开发。
效果如图及视频:
再次感谢主办方提供的此次内侧机会,整体体验很不错,期待TencentOS Tiny和IoT explorer日后带来更多惊喜。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。