本帖最后由 luoorshi 于 2020-6-30 13:28 编辑
作者:落拾
一、概述
本次作品采用官方提供的麻雀一号开发板,具体就不介绍该开发板的具体内容了。说说该开发板的硬件匹配吧:
摄像头:作为视频监控
显示屏:可以作为设置时使用的监视屏(不使用时可以睡眠lcd_enter_sleep)、视频对话(暂时还未实现)。
MIC:音频采集、视频对话(暂时还未实现)
喇叭:可以实现报警,视频对话(暂时还未实现)
TF卡:作为视频暂存
二、RT_Thread使用情况
说实话作为一个刚刚使用嵌入式系统 还没有转变过来思维的人 我也不知道使用了那些。带后续仔细了解后更新吧。
三、硬件框架
主要硬件为麻雀一号
四、软件框架
该软件主要基于官方源码修改以下内容
1、在bk7221u_release\components\player\example\cmd\cmd_player.c内添加代码播放固定音源
2、将bk7221u_release\test\show_photo_test.c内的代码添加将图片发送到网络
3、在bk7221u_release\drivers\wlan\drv_wlan.c内添加新函数,通过线程调用读取flash内的wifi的ssid 和password
后续需要添加
1、将mic采集的音频参数发送到网络
2、修改蓝牙代码 使用蓝牙控制
五、软件模块说明
本代码主要有三大模块具体实现如下
1、音频播放模块
/**********************************************************
* 函数名:player_my
* 参数:
* action:动作值,0:stop
* uri:地址可以为空
* vol:音量
* 返回值:
* RT_EOK:无错误
* RT_ERROR:有错误,具体看log
* 函数功能:控制MP3播放
* ********************************************************/
#define stop_p 0
#define star_P 1
#define pause_P 2
#define resume_p 3
int player_my(char action,char *uri,char vol)
{
switch(action)
{
case stop_p:
rt_kprintf("//////////////////////////// player_stop \n");
player_stop();
rt_kprintf("//////////////////////////// player_stop end \n");
rt_kprintf("stop play.\n");
break;
case star_P:
if(uri !=RT_NULL)
{
rt_kprintf("//////////////////////////// player_play \n");
player_stop();
player_set_uri(uri);
player_play();
rt_kprintf("//////////////////////////// player_play end \n");
if(vol>0 && vol<100)
{
player_set_volume(vol);
rt_kprintf("set play volume %d%%.\n", vol);
}
}else
{
rt_kprintf("url == null\n");
return RT_ERROR;
}
break;
case pause_P:
rt_kprintf("//////////////////////////// player_pause \n");
player_pause();
rt_kprintf("//////////////////////////// player_pause end \n");
rt_kprintf("pause play.\n");
break;
case resume_p:
rt_kprintf("//////////////////////////// player_play(resume) \n");
player_play();
rt_kprintf("//////////////////////////// player_play(resume) end \n");
rt_kprintf("resume play.\n");
break;
default :
rt_kprintf("action ERROR\n");
return RT_ERROR;
}
}
2、视频模块
该模块直接使用现有函数showphoto_thread进实现代码。由于希望将该摄像头的图片直接拍摄保存成图片,故去掉该函数的start_flag标志位判断。启动还是需要通过串口启动,后续准备使用蓝牙启动。
3、wifi模块
以下代码用于保存wifi密码和读取wifi密码
代码通过将账号和密码保存到txt文件实现(也可以保存成其他文件)
/****************************************************
* save_wifi_password
* 参数:
* ssid:ID
* password:密码
* 返回值:
* RT_EOK:无错误
* RT_ERROR:有错误,具体看log
* 函数功能:保存wifi ID和密码
****************************************************/
int save_wifi_password(char *ssid,char *password)
{
int fb_ssid,fb_password;
fb_ssid = open("/sd/wifi_ssid.txt", O_WRONLY | O_CREAT);
if(fb_ssid==NULL)
{
rt_kprintf("open file error!");
return RT_ERROR;
}else
{
write(fb_ssid,ssid,sizeof(ssid));
close(fb_ssid);
}
fb_password = open("/sd/wifi_password.txt", O_WRONLY | O_CREAT);
if(fb_password==NULL)
{
rt_kprintf("open file error!");
return RT_ERROR;
}else
{
write(fb_password,password,sizeof(password));
close(fb_password);
}
return RT_EOK;
}
/****************************************************
* 函数名:join_flsh_wifi
* 参数:
*
* 返回值:
* RT_EOK:无错误
* RT_ERROR:有错误,具体看log
* 函数功能:加入wifi
****************************************************/
int join_flsh_wifi(void)
{
network_InitTypeDef_st wNetConfig;
struct rt_wlan_device *wlan = RT_NULL;
char *ssid = RT_NULL;
char *password = RT_NULL;
int len;
int fb_ssid,fb_password;
fb_ssid = open("/sd/wifi_ssid.txt", O_RDONLY | O_CREAT);
if(fb_ssid==0)
{
rt_kprintf("open file:/sd/wifi_ssid.txt error!");
return -RT_ERROR;
}else
{
read(fb_ssid,ssid,32);
close(fb_ssid);
}
fb_password = open("/sd/wifi_password.txt", O_RDONLY | O_CREAT);
if(fb_password==0)
{
rt_kprintf("open file:/sd/wifi_password.txt error!");
return -RT_ERROR;
}else
{
read(fb_password,password,32);
close(fb_password);
}
rt_memset(&wNetConfig, 0x0, sizeof(network_InitTypeDef_st));
if (ssid == NULL)
{
rt_kprintf("ssid is null\r\n");
return -RT_ERROR;
}
len = rt_strlen(ssid);
rt_kprintf("ssid len = %d\r\n",len);
if (32 < len)
{
rt_kprintf("ssid name more than 32 Bytes\r\n");
return -RT_ERROR;
}
rt_strncpy((char *)wNetConfig.wifi_ssid, ssid, sizeof(wNetConfig.wifi_ssid));
if (password == NULL)
{
rt_memset(wNetConfig.wifi_key, 0, sizeof(wNetConfig.wifi_key));
}
else
{
if (sizeof(wNetConfig.wifi_key) < rt_strlen(password))
{
rt_kprintf("wifi key is more than %d Bytes\r\n", sizeof(wNetConfig.wifi_key));
return -RT_ERROR;
}
rt_strncpy((char *)wNetConfig.wifi_key, password, sizeof(wNetConfig.wifi_key));
}
wNetConfig.wifi_mode = STATION;
wNetConfig.dhcp_mode = DHCP_CLIENT;
wNetConfig.wifi_retry_interval = 100;
rt_kprintf("join_flsh_wifi: ssid:%.*s key:%.*s\r\n", wNetConfig.wifi_ssid, wNetConfig.wifi_key);
bk_wlan_start(&wNetConfig);
return RT_EOK;
}
六、演示效果
由于现在已经变砖,无法看到实际效果 请参考代码
七、代码
半成品代码
https://wws.lanzous.com/iokMMe68y6d
|