Ai-WB2-12F使用安信可中间件接入爱星云,远程点个灯——第二篇

[复制链接]
查看1592 | 回复11 | 2023-12-29 16:34:23 | 显示全部楼层 |阅读模式
本帖最后由 起个名字好难啊 于 2023-12-29 16:34 编辑
一、前言

昨天已经给大家讲了如何搭建中间件SDK:Ai-WB2-12F使用安信可中间件接入爱星云,远程点个灯——第一篇
并且已经完成一个新项目的添加,使用WB2编译成功,今天讲的,就是如何移植爱星云的源码。
在正式开始之前,先介绍一下设备上云的流程。
爱星云配网流程.png
VScode 启动
二、连接WiFi
流程上的第一步是设备进入配网,而在配网之前,需要可以正式连接网络的能力,所以我们第一步应该写连接WiFi 的功能。
先把项目中的“h1”和“h2”两个文件夹删除。
  • 新建文件夹为“wifista”(文件夹名字根据自己喜好定义就行)
  • wifista 新建连接WiFi的.c 和.h 文件,名字自定义

连接WiFi 主要写三个函数:

  • WiFi 初始化函数
  • WiFi 连接函数
  • WiFi 断开函数

WiFi 初始化函数:staWiFiInit()

  1. void staWiFiInit(void)
  2. {
  3.     aiio_wifi_register_event_cb(cb_wifi_event);
  4.     int ret = aiio_wifi_init();
  5. }
复制代码
WiFi 连接函数函数:staWiFiConnect(char* ssid,char* password)

  1. void staWiFiConnect(char* ssid, char* password)
  2. {
  3.     if (wifi_is_connect)
  4.         aiio_wifi_disconnect();
  5.     aiio_wifi_set_mode(AIIO_WIFI_MODE_STA);
  6.     aiio_wifi_config_t wifi_sta_config;
  7.     memset(wifi_sta_config.sta.ssid, 0, sizeof(wifi_sta_config.sta.ssid));
  8.     strcpy(wifi_sta_config.sta.ssid, ssid);
  9.     if (password)
  10.     {
  11.         memset(wifi_sta_config.sta.password, 0, sizeof(wifi_sta_config.sta.password));
  12.         memcpy(wifi_sta_config.sta.password, password, strlen(password));
  13.     }
  14.     wifi_sta_config.sta.channel = 0;
  15.     wifi_sta_config.sta.use_dhcp = 1;
  16.     wifi_sta_config.sta.flags = 0;
  17.     aiio_log_d("ssid = %s \r\n", wifi_sta_config.sta.ssid);
  18.     aiio_log_d("password = %s \r\n", wifi_sta_config.sta.password);
  19.     aiio_wifi_set_config(AIIO_WIFI_IF_STA, &wifi_sta_config);
  20.     aiio_wifi_start();
  21.     wifi_is_connect = false;
  22. }
复制代码
WiFi 断开函数:staWiFiDisconnect()

  1. void staWiFiDisconnect(void)
  2. {
  3.     aiio_wifi_disconnect();
  4. }
复制代码
之后在Main.c 中调用之后就能实现连接WiFi。
三、LED控制
不好说移植爱星云,这么快就控制灯干嘛?RGB灯是开发板上唯一能过作为指示的器件,所以使用RGB作为网络指示灯最好不过。设置以下状态:
  • 网络未连接或者断开:绿灯快闪
  • 网络成功连接或已连接:隔2s 闪烁一次
  • 正在连接WiFi:1s 间隔慢闪
3.1创建源码文件
直接创建名为"LED" 的文件夹,然后在里面创建.c和.h 文件名字自定,我这里用的是 led_dev.c 和led_dev.h。并且写几行基础的代码。
led_dev.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "aiio_adapter_include.h"
复制代码
led_dev.h
  1. #ifndef LED_DEV_H
  2. #define LED_DEV_H


  3. #endif
复制代码
3.2编写功能函数
后面也会使用这个库写受控灯的函数,暂且写网络灯的函数吧,一共有四个:
  • 网络灯初始化函数,Ai-WB2-12F 的蓝色灯在IO3,并且创建闪烁任务
  • 快闪状态 间隔100ms
  • 隔2s 闪烁两次状态
  • 500ms 间隔慢闪状态

网络灯初始化函数  devLedNetWorkdInit(void)

  1. void devLedNetWorkdInit(void)
  2. {
  3.     aiio_hal_gpio_init(0, DEV_LED_NETWORKD_BLUE);
  4.     aiio_hal_gpio_pin_direction_set(0, DEV_LED_NETWORKD_BLUE, AIIO_GPIO_OUTPUT);
  5.     aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 0);
  6.     aiio_os_thread_create(NULL, "led_state_task", led_dev_run_task, 1024, NULL, 15);
  7. }
复制代码

其实每种状态指示延时时间上的区别而已,所以只需要在任务当中改变延时时间就行了。
网络灯状态处理任务,led_dev_run_task(void* arg):
  1. static void led_dev_run_task(void* arg)
  2. {
  3.     __uint8_t delay_ms = 0;
  4.     while (1)
  5.     {
  6.         switch (led_dev_state)
  7.         {
  8.             case LED_DEV_NETWORKD_STATE_DISCONNECT:
  9.                 /*  断开连接 */
  10.                 delay_ms = 100;
  11.                 break;
  12.             case LED_DEV_NETWORKD_STATE_CONNECTING:
  13.                 /* 正在配网 */
  14.                 delay_ms = 500;
  15.                 break;
  16.             case LED_DEV_NETWORKD_STATE_CONNECTED:
  17.                 /*  连接成功*/
  18.                 delay_ms = 50;
  19.                 aiio_os_tick_dealy(aiio_os_ms2tick(2000));
  20.                 aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 1);
  21.                 aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
  22.                 aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 0);
  23.                 aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
  24.                 break;
  25.             default:
  26.                 aiio_os_tick_dealy(aiio_os_ms2tick(50));
  27.                 continue;
  28.         }
  29.         aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 1);
  30.         aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
  31.         aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 0);
  32.         aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
  33.     }

  34. }
复制代码
状态更新函数 devLedNetWorkdChangeState():
  1. void devLedNetWorkdChangeState(led_dev_state_t led_dev_t)
  2. {
  3.     led_dev_state = led_dev_t;
  4. }
复制代码
3.3 调用状态更新函数
状态更新函数只需要在WiFi 回调中的各个事件中调用即可,效果如下:
config1.gif
四、按键读取
Ai-WB2-12F 开发板要进入配网的话,需要有个控制方式,开发板上的IO8按键正好可以使用,读取IO8按键按下为高电平的长按,长按2s 后进入配网。
按键初始化函数configButtomInit():

  1. void configButtomInit(void)
  2. {
  3.     aiio_hal_gpio_init(0, CONFIGBUTTOM_PIN);
  4.     aiio_hal_gpio_pin_pull_set(0, CONFIGBUTTOM_PIN, AIIO_GPIO_PULL_DOWN);
  5.     aiio_hal_gpio_pin_direction_set(0, CONFIGBUTTOM_PIN, AIIO_GPIO_INPUT);
  6.     aiio_os_thread_create(NULL, "config_buttom_task", configButtomLongPressCb, 1024*2, NULL, 14);
  7. }
复制代码
长按识别任务:
  1. static void configButtomLongPressCb(void* arg)
  2. {
  3.     static int config_buttom_press_cout = 0;
  4.     while (1)
  5.     {
  6.         if (aiio_hal_gpio_get(0, CONFIGBUTTOM_PIN)) {
  7.             aiio_os_tick_dealy(aiio_os_ms2tick(10));
  8.             while (aiio_hal_gpio_get(0, CONFIGBUTTOM_PIN))
  9.             {
  10.                 config_buttom_press_cout++;
  11.                 aiio_os_tick_dealy(aiio_os_ms2tick(100));
  12.                 if (config_buttom_press_cout>=(CONFIGBUTTOM_LONG_PRESS_TIME/100)) {
  13.                     /**** 按键长按测试打印 ****/
  14.                     aiio_log_d(">>>>>>>>>>>> config buttom long press >>>>>>>>>>>>");
  15.                     config_buttom_press_cout = 0;
  16.                 }
  17.             }
  18.         }
  19.         config_buttom_press_cout = 0;
  20.         aiio_os_tick_dealy(aiio_os_ms2tick(100));
  21.     }
  22. }
复制代码
其他进入配网的方式也可以自己去实现,只需要能够进入配网状态就行。
五、爱星云配网移植
这一节,就正式进入爱星云的移植,按照惯例,先新建一个文件夹用来存放爱星云的移植文档,本贴使用“aiio_cloud”作为文件名,大家可以根据自己喜好创建,之后关于爱星云的源码都会放在该文件夹中。
然后在该文件夹中新建一个.h 用来声明爱星云的配置比如产品信息,三元组等,我这里命名为“cloud_config.h"。
爱星云的配网有两种:BLE 和AP配网,本贴主要介绍BLE 配网。BLE 配网主要有两个函数:
  • BLE 配网启动函数
  • BLE 配网停止函数
BLE 配网启动函数bleConfigStart()
  1. void bleConfigStart(void)
  2. {
  3.     aiio_ble_iot_config_t ble_iot_config = { 0 };

  4.     ble_iot_config.deviceid = DEVICE_ID;
  5.     ble_iot_config.productid = PRODUCT_ID;
  6.     ble_iot_config.wifi_flag = PRODUCT_FLAG;
  7.     ble_iot_config.aiio_ble_iot_config_cb = ble_iot_config_cb;
  8.     aiio_ble_config_init(&ble_iot_config);
  9. }
复制代码
BLE 配网启动函数bleConfigStop()
  1. void bleConfigStop(void)
  2. {
  3.     aiio_log_i("aiio_ble_config_stop \r\n");
  4.     aiio_ble_config_deinit();
  5. }
复制代码
BLE 配网回调函数:
  1. static void ble_iot_config_cb(aiio_ble_iot_data_t* ble_data)
  2. {
  3.     switch (ble_data->event)
  4.     {
  5.         case AIIO_BLE_CONFIG_FAIL:                                                  /* The BLE distribution network failed, and the failed event was sent through the queue */
  6.         {
  7.             aiio_log_i("AIIO_BLE_CONFIG_FAIL \r\n");
  8.         }
  9.         break;

  10.         case AIIO_BLE_DISCONNECED:
  11.         {
  12.             aiio_log_i("AIIO_BLE_DISCONNECED \r\n");

  13.         }
  14.         break;

  15.         case AIIO_BLE_CONFIG_OK:                                                    /*The BLE distribution network is successful, and the successful events and distribution network data are sent through the queue */
  16.         {
  17.             aiio_log_i("AIIO_BLE_CONFIG_OK");
  18.             if (ble_data->ble_data->ssid)
  19.             {
  20.                 aiio_log_d("ssid = %s ", ble_data->ble_data->ssid);
  21.             }
  22.             if (ble_data->ble_data->passwd)
  23.             {
  24.                 aiio_log_d("passwd = %s", ble_data->ble_data->passwd);
  25.             }
  26.             if (ble_data->ble_data->mqttip)
  27.             {
  28.                 aiio_log_d("mqttip = %s ", ble_data->ble_data->mqttip);
  29.             }
  30.             staWiFiConnect(ble_data->ble_data->ssid, ble_data->ble_data->passwd);
  31.         }
  32.         break;

  33.         default:
  34.             aiio_log_e("not find event ");
  35.             break;
  36.     }
  37. }
复制代码
在回调函数当中,获取到了SSID、PASSWORD和MQTT 服务器地址以及其他的连接参数,打印出来之后,直接调用WiFi连接,就能实现配网。
在WiFi连接成功之后,停止调用配网函数就行。
说明:
此时因为没有连接爱星云,所以使用App 配网时会出现添加失败的提示,但是实际上WiFi是连接成功的,只是没有连接爱星云而已
六、其他内容

剩下的就是爱星云真正接入的部分,但是应该不会这样介绍这么详细的内容,因为需要教大家比较多的东西,这么写下去太耽误事了。于是决定直接做一份基本连接的源码,大家根据基本连接的源码可以快速实现爱星云的连接。所以剩下的内容我直接在源码README 中介绍。
源码地址:https://gitee.com/seahi007/my-aithinker_obj
回复

使用道具 举报

爱笑 | 2023-12-29 16:40:43 | 显示全部楼层
打卡莫工的第二篇
用心做好保姆工作
回复 支持 反对

使用道具 举报

1084504793 | 2023-12-29 17:38:32 | 显示全部楼层
回复

使用道具 举报

lazy | 2023-12-30 13:41:55 | 显示全部楼层
莫工威武
回复

使用道具 举报

san | 2023-12-30 23:49:24 | 显示全部楼层
学习
回复

使用道具 举报

jennifer | 2024-1-3 15:29:19 | 显示全部楼层
回复

使用道具 举报

物联网 | 2024-2-24 16:58:16 | 显示全部楼层
回复

使用道具 举报

noonezero | 2024-2-24 19:25:57 | 显示全部楼层
回复

使用道具 举报

知行合一 | 2024-2-24 20:26:15 | 显示全部楼层
回复

使用道具 举报

sansui | 2024-2-25 14:50:23 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则