本帖最后由 起个名字好难啊 于 2023-12-29 16:34 编辑
一、前言
昨天已经给大家讲了如何搭建中间件SDK:Ai-WB2-12F使用安信可中间件接入爱星云,远程点个灯——第一篇
并且已经完成一个新项目的添加,使用WB2编译成功,今天讲的,就是如何移植爱星云的源码。
在正式开始之前,先介绍一下设备上云的流程。
VScode 启动
二、连接WiFi
流程上的第一步是设备进入配网,而在配网之前,需要可以正式连接网络的能力,所以我们第一步应该写连接WiFi 的功能。
先把项目中的“h1”和“h2”两个文件夹删除。
- 新建文件夹为“wifista”(文件夹名字根据自己喜好定义就行)
- 在wifista 新建连接WiFi的.c 和.h 文件,名字自定义
连接WiFi 主要写三个函数:
- WiFi 初始化函数
- WiFi 连接函数
- WiFi 断开函数
WiFi 初始化函数:staWiFiInit()
- void staWiFiInit(void)
- {
- aiio_wifi_register_event_cb(cb_wifi_event);
- int ret = aiio_wifi_init();
- }
复制代码 WiFi 连接函数函数:staWiFiConnect(char* ssid,char* password)
- void staWiFiConnect(char* ssid, char* password)
- {
- if (wifi_is_connect)
- aiio_wifi_disconnect();
- aiio_wifi_set_mode(AIIO_WIFI_MODE_STA);
- aiio_wifi_config_t wifi_sta_config;
- memset(wifi_sta_config.sta.ssid, 0, sizeof(wifi_sta_config.sta.ssid));
- strcpy(wifi_sta_config.sta.ssid, ssid);
- if (password)
- {
- memset(wifi_sta_config.sta.password, 0, sizeof(wifi_sta_config.sta.password));
- memcpy(wifi_sta_config.sta.password, password, strlen(password));
- }
- wifi_sta_config.sta.channel = 0;
- wifi_sta_config.sta.use_dhcp = 1;
- wifi_sta_config.sta.flags = 0;
- aiio_log_d("ssid = %s \r\n", wifi_sta_config.sta.ssid);
- aiio_log_d("password = %s \r\n", wifi_sta_config.sta.password);
- aiio_wifi_set_config(AIIO_WIFI_IF_STA, &wifi_sta_config);
- aiio_wifi_start();
- wifi_is_connect = false;
- }
复制代码 WiFi 断开函数:staWiFiDisconnect()
- void staWiFiDisconnect(void)
- {
- aiio_wifi_disconnect();
- }
复制代码 之后在Main.c 中调用之后就能实现连接WiFi。
三、LED控制
不好说移植爱星云,这么快就控制灯干嘛?RGB灯是开发板上唯一能过作为指示的器件,所以使用RGB作为网络指示灯最好不过。设置以下状态:
- 网络未连接或者断开:绿灯快闪
- 网络成功连接或已连接:隔2s 闪烁一次
- 正在连接WiFi:1s 间隔慢闪
3.1创建源码文件
直接创建名为"LED" 的文件夹,然后在里面创建.c和.h 文件名字自定,我这里用的是 led_dev.c 和led_dev.h。并且写几行基础的代码。
led_dev.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "aiio_adapter_include.h"
复制代码 led_dev.h
- #ifndef LED_DEV_H
- #define LED_DEV_H
- #endif
复制代码 3.2编写功能函数
后面也会使用这个库写受控灯的函数,暂且写网络灯的函数吧,一共有四个:
- 网络灯初始化函数,Ai-WB2-12F 的蓝色灯在IO3,并且创建闪烁任务
- 快闪状态 间隔100ms
- 隔2s 闪烁两次状态
- 500ms 间隔慢闪状态
网络灯初始化函数 devLedNetWorkdInit(void)
- void devLedNetWorkdInit(void)
- {
- aiio_hal_gpio_init(0, DEV_LED_NETWORKD_BLUE);
- aiio_hal_gpio_pin_direction_set(0, DEV_LED_NETWORKD_BLUE, AIIO_GPIO_OUTPUT);
- aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 0);
- aiio_os_thread_create(NULL, "led_state_task", led_dev_run_task, 1024, NULL, 15);
- }
复制代码
其实每种状态指示延时时间上的区别而已,所以只需要在任务当中改变延时时间就行了。
网络灯状态处理任务,led_dev_run_task(void* arg):
- static void led_dev_run_task(void* arg)
- {
- __uint8_t delay_ms = 0;
- while (1)
- {
- switch (led_dev_state)
- {
- case LED_DEV_NETWORKD_STATE_DISCONNECT:
- /* 断开连接 */
- delay_ms = 100;
- break;
- case LED_DEV_NETWORKD_STATE_CONNECTING:
- /* 正在配网 */
- delay_ms = 500;
- break;
- case LED_DEV_NETWORKD_STATE_CONNECTED:
- /* 连接成功*/
- delay_ms = 50;
- aiio_os_tick_dealy(aiio_os_ms2tick(2000));
- aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 1);
- aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
- aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 0);
- aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
- break;
- default:
- aiio_os_tick_dealy(aiio_os_ms2tick(50));
- continue;
- }
- aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 1);
- aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
- aiio_hal_gpio_set(0, DEV_LED_NETWORKD_BLUE, 0);
- aiio_os_tick_dealy(aiio_os_ms2tick(delay_ms));
- }
- }
复制代码 状态更新函数 devLedNetWorkdChangeState():
- void devLedNetWorkdChangeState(led_dev_state_t led_dev_t)
- {
- led_dev_state = led_dev_t;
- }
复制代码 3.3 调用状态更新函数
状态更新函数只需要在WiFi 回调中的各个事件中调用即可,效果如下:
四、按键读取
Ai-WB2-12F 开发板要进入配网的话,需要有个控制方式,开发板上的IO8按键正好可以使用,读取IO8按键按下为高电平的长按,长按2s 后进入配网。
按键初始化函数configButtomInit():
- void configButtomInit(void)
- {
- aiio_hal_gpio_init(0, CONFIGBUTTOM_PIN);
- aiio_hal_gpio_pin_pull_set(0, CONFIGBUTTOM_PIN, AIIO_GPIO_PULL_DOWN);
- aiio_hal_gpio_pin_direction_set(0, CONFIGBUTTOM_PIN, AIIO_GPIO_INPUT);
- aiio_os_thread_create(NULL, "config_buttom_task", configButtomLongPressCb, 1024*2, NULL, 14);
- }
复制代码 长按识别任务:
- static void configButtomLongPressCb(void* arg)
- {
- static int config_buttom_press_cout = 0;
- while (1)
- {
- if (aiio_hal_gpio_get(0, CONFIGBUTTOM_PIN)) {
- aiio_os_tick_dealy(aiio_os_ms2tick(10));
- while (aiio_hal_gpio_get(0, CONFIGBUTTOM_PIN))
- {
- config_buttom_press_cout++;
- aiio_os_tick_dealy(aiio_os_ms2tick(100));
- if (config_buttom_press_cout>=(CONFIGBUTTOM_LONG_PRESS_TIME/100)) {
- /**** 按键长按测试打印 ****/
- aiio_log_d(">>>>>>>>>>>> config buttom long press >>>>>>>>>>>>");
- config_buttom_press_cout = 0;
- }
- }
- }
- config_buttom_press_cout = 0;
- aiio_os_tick_dealy(aiio_os_ms2tick(100));
- }
- }
复制代码 其他进入配网的方式也可以自己去实现,只需要能够进入配网状态就行。
五、爱星云配网移植
这一节,就正式进入爱星云的移植,按照惯例,先新建一个文件夹用来存放爱星云的移植文档,本贴使用“aiio_cloud”作为文件名,大家可以根据自己喜好创建,之后关于爱星云的源码都会放在该文件夹中。
然后在该文件夹中新建一个.h 用来声明爱星云的配置比如产品信息,三元组等,我这里命名为“cloud_config.h"。
爱星云的配网有两种:BLE 和AP配网,本贴主要介绍BLE 配网。BLE 配网主要有两个函数:
BLE 配网启动函数bleConfigStart()
- void bleConfigStart(void)
- {
- aiio_ble_iot_config_t ble_iot_config = { 0 };
- ble_iot_config.deviceid = DEVICE_ID;
- ble_iot_config.productid = PRODUCT_ID;
- ble_iot_config.wifi_flag = PRODUCT_FLAG;
- ble_iot_config.aiio_ble_iot_config_cb = ble_iot_config_cb;
- aiio_ble_config_init(&ble_iot_config);
- }
复制代码 BLE 配网启动函数bleConfigStop()
- void bleConfigStop(void)
- {
- aiio_log_i("aiio_ble_config_stop \r\n");
- aiio_ble_config_deinit();
- }
复制代码 BLE 配网回调函数:
- static void ble_iot_config_cb(aiio_ble_iot_data_t* ble_data)
- {
- switch (ble_data->event)
- {
- case AIIO_BLE_CONFIG_FAIL: /* The BLE distribution network failed, and the failed event was sent through the queue */
- {
- aiio_log_i("AIIO_BLE_CONFIG_FAIL \r\n");
- }
- break;
- case AIIO_BLE_DISCONNECED:
- {
- aiio_log_i("AIIO_BLE_DISCONNECED \r\n");
- }
- break;
- case AIIO_BLE_CONFIG_OK: /*The BLE distribution network is successful, and the successful events and distribution network data are sent through the queue */
- {
- aiio_log_i("AIIO_BLE_CONFIG_OK");
- if (ble_data->ble_data->ssid)
- {
- aiio_log_d("ssid = %s ", ble_data->ble_data->ssid);
- }
- if (ble_data->ble_data->passwd)
- {
- aiio_log_d("passwd = %s", ble_data->ble_data->passwd);
- }
- if (ble_data->ble_data->mqttip)
- {
- aiio_log_d("mqttip = %s ", ble_data->ble_data->mqttip);
- }
- staWiFiConnect(ble_data->ble_data->ssid, ble_data->ble_data->passwd);
- }
- break;
- default:
- aiio_log_e("not find event ");
- break;
- }
- }
复制代码 在回调函数当中,获取到了SSID、PASSWORD和MQTT 服务器地址以及其他的连接参数,打印出来之后,直接调用WiFi连接,就能实现配网。
在WiFi连接成功之后,停止调用配网函数就行。
说明:
此时因为没有连接爱星云,所以使用App 配网时会出现添加失败的提示,但是实际上WiFi是连接成功的,只是没有连接爱星云而已 六、其他内容
剩下的就是爱星云真正接入的部分,但是应该不会这样介绍这么详细的内容,因为需要教大家比较多的东西,这么写下去太耽误事了。于是决定直接做一份基本连接的源码,大家根据基本连接的源码可以快速实现爱星云的连接。所以剩下的内容我直接在源码README 中介绍。
源码地址:https://gitee.com/seahi007/my-aithinker_obj
|