【IoT迷你赛】基于TencentOS Tiny的运动手表方案

前言

很荣幸能参与到TencentOS Tiny内测,物联网近年一直得到很高的关注,各大平台也纷纷推出了自己的物联网接入平台,这也说明了市场越来越成熟,开发者拥有更好的工具打造更实用的产品。我对物联网中“物”的定义一直都有“物理”的概念,things的网络,更是things所感知、所影响的物理世界的链接。而things上的关键,就是如何高效,可靠实现things的功效,这就引入今天的一大主角TencentOS Tiny及其所连接的Tencent IoT explorer。

现如今成熟的OS非常多,开发者甚至自己都可以开发一个实用的RTOS内核。但OS的目标不仅仅是调度,本质要提供的是便捷成熟的服务。TencentOS Tiny除了拥有可靠高效精简的RTOS内核外,还提供了更为实用的中间件服务(文件系统、网络通讯、各云平台接口等),除了完成了对上的应用,TencentOS Tiny还在不断扩展了对下的驱动和移植(一大波支持的开发板正在来袭)。

此外,为了此次的内侧活动,组织方还贴心提供了定制的开发板(By 物联网俱乐部)和完善的SDK资料,让开发者可以把更多精力放在Tiny和IoT explorer的体验上,加之活跃的讨论群和及时的支持,都可以看出此次活动满满的诚意。

由物联网俱乐部定制的全球首款TencentOS Tiny开发板

整体方案

运动的人原来越多,户外运动又是非常大的群体,安全运动也是智能设备一大需求点。这里定义了一款简易的智能运动手表,主要功能有:

  • 本地业务:手表在本地显示时间,实现手表的基本功能
  • 下行数据:云端推送各种天气运动信息,给手表显示,向客户提供实时资讯
  • 上行事件:当用户遇到危险时,通过按键出发上传报警事件,云端可以第一时间收到并处理。

根据上述描述,时间显示与云端无关,所以只需要在本地完成即可,无需在云端有所呈现;云端信息下发到手表,属于设备的一个属性,云端通过修改该属性,即可推送信息给手表;按键报警则为上行事件。所以我们就可以创建一个如图所示的拥有一个属性和一个事件组成的数据模板。

数据模板

得益于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中添加上述的产品信息及密钥,即可完成开发。

效果如图及视频:

云端下发数据到手表上显示
Things端设备显示IoT explorer推送的信息;按键F3长按2秒后可以出发告警事件
在IoT explorer平台上显示告警事件
视频demo,消息下发和事件上报

总结:

  1. TencentOS Tiny内核精简,说明文档也很丰富,使用非常方便
  2. TencentOS Tiny长时间运行稳定
  3. TencentOS Tiny组件丰富,便于开发
  4. IoT explorer开发平台很便捷、易用
  5. 支持的硬件平台和IoT explorer标准数据模板有待增加

再次感谢主办方提供的此次内侧机会,整体体验很不错,期待TencentOS Tiny和IoT explorer日后带来更多惊喜。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券