Skip to content

wiota按键发送和接收数据

概述

这里描述的是终端(IoTE)每按键一次就向AP端发送一次数据的简单demo,且AP支持多终端连接。首先确保AP和终端的静态数据表同步以及设置的频点相同。终端向AP发送随机长度的随机字符数据,AP将收到的数据发回给对应终端。终端每按下KEY16一次就向AP发送一次数据,每当终端数据发送成功或者数据发送失败或者接收到数据都有LED提示,且引脚名称分别对应LED15、LED14、LED11(GPIO引脚定义,开发板对应LED引脚位置下方有说明)。AP将收到的数据(user_id、data)存放到队列,循环访问队列并向对应终端(对应user_id)发送数据,若检测到队列为空,则不发送。

DEMO源码放在文章末尾。

下面分别对AP端和终端的程序流程进行说明。

一、AP端

DEMO所在工程目录路径:PS\app\test\test_wiota_key_send_data.c

默认该DEMO为关闭状态,打开需要添加宏定义如下:

#define WIOTA_AP_KEY_SEND_DATA_DEMO

在main.c文件中加入声明:

void wiota_ap_data_key_recv_and_send_demo(void);

同时在main()函数中调用下列函数:

wiota_ap_data_key_recv_and_send_demo();

1.主流程

如图所示,DEMO主要包括三部分,wiota初始化、数据接收回调、数据发送线程。通过接收回调函数将接收到的数据信息(user_id和data)存放到队列,在发送线程内获取队列信息后发送到对应的user_id,若队列为空,则不发送。

2.使用的API接口列表

序号 函数名 功能
1 uc_wiota_init() WIoTa协议栈的初始化
2 uc_wiota_set_freq_info(freq) 设置固定频点
3 uc_wiota_register_recv_data_callback() 注册接收回调
4 uc_wiota_recv_callback() 接收回调函数
5 uc_wiota_run() 启动WIoTa协议栈
6 wiota_ap_send_data_task() 发送数据任务
7 uc_wiota_send_data() 指定终端发送数据
8 uc_wiota_exit() 关闭WIoTa协议栈

二、终端(IOTE)

DEMO所在工程目录路径:PS\app\test\test_wiota_key_send_data.c

默认该DEMO为关闭状态,打开需要添加宏定义如下:

#define WIOTA_IOTE_KEY_SEND_DATA_DEMO

在main.c文件中加入声明:

void wiota_iote_key_data_recv_and_send_demo(void);

同时在main()函数中调用下列函数:

wiota_iote_key_data_recv_and_send_demo();

1.主流程

终端主要包含两部分:数据发送线程和LED控制线程。如果线程创建失败,则退出wiota协议栈。数据发送线程下方有详细流程说明。

控制LED线程主要是为了更好更直观的观察终端收发信息的状态,当接收到AP的消息时,LED11闪烁,发送信息时,发送成功则LED15闪烁,否则LED14闪烁。其余状态则均处于暗状态。因为控制LED线程流程较简单,故此处就不做流程图分析。

按键控制线程主要任务是循环的作电平检测,每当检测到按键16对应的pin口处于高电平时,且延迟100ms后(延迟100ms起一个防抖的作用)依旧处于高电平则判断为有按键的行为,故释放一个信号量。按键每按一次都有LED2提示。因为按键控制程流程较简单,故此处就不做流程图分析。

下图为终端开发板LED对应位置。

2.数据发送线程流程

如图所示,数据发送线程分为外循环和内循环。外循环主要对终端进行初始化(包括设置频点、接收回调注册、设置user_id等)和连接AP。

内循环主要任务是当成功连接AP后,每当按键中断触发后,会给一个信号,在内循环中信号值有效时,且延迟20ms后(延迟20ms起一个防抖的作用)按键16对应的pin口依旧处于高电平则判断为有按键的行为。按键每按一次都有LED2提示。。每发一条信息前先进行状态检测,若检测到错误则返回到外循环重新对终端初始化。如果信息发送成功,则LED15闪烁。若信息发送失败,则LED14闪烁,而后退出内循环和退出wiota协议栈,然后在外循环重新对协议栈进行初始化

3.使用的API接口列表

序号 函数名 功能
1 uc_wiota_init() WIoTa协议栈的初始化
2 uc_wiota_set_freq_info(freq) 设置固定频点
3 uc_wiota_run() 启动WIoTa协议栈
4 pin_app_init() 初始化GPIO PIN
5 uc_wiota_register_recv_data_callback() 注册接收回调
6 wiota_recv_cb() 接收回调函数
7 uc_wiota_set_userid() 设置用户ID
8 uc_wiota_connect() 连接同步AP
9 uc_wiota_wait_sync() 等待同步连接
10 rt_pin_mode() 设置GPIO工作模式
11 rt_pin_write() 设置GPIO输出高低电平
12 rt_pin_read() 读取GPIO电平
13 rt_pin_attach_irq() 绑定GPIO中断回调函数
14 rt_pin_irq_enable() 使能GPIO中断
15 uc_wiota_reset_stats() 清空wiota状态
16 uc_wiota_get_state() 查询wiota当前状态
17 uc_wiota_get_all_stats() 获取wiota当前所有状态
18 rt_thread_create() 创建线程
19 wiota_test_recv_data_task() 控制接收LED线程
20 wiota_ap_send_data_task() 发送数据线程
21 uc_wiota_send_data() 发送数据给AP
22 uc_wiota_exit() 关闭WIoTa协议栈

三、运行结果

下图是终端给AP发送随机长度的随机信息。AP收到什么信息就相应的回什么信息。

user_id为0xabe44fca给AP发送信息:

AP收到0xabe44fca发送的信息且回复相同信息:

Back to top