doubao_chat/apps/wifi_ipc/wifi/network_mssdp.c

279 lines
8.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mssdp/mssdp.h"
#include "device/device.h"
#include "camera.h"
#include "fs/fs.h"
#include "app_config.h"
#include "dev_desc.h"
#include "gpio.h"
#include "json_c/json.h"
#include "json_c/json_tokener.h"
#include "event/event.h"
static char json_buffer[1024];
static char MassProduction_mode = 0;
const char *__attribute__((weak))get_dev_desc_doc()
{
int ret;
memset(json_buffer, 0, 1024);
memcpy(json_buffer, DEV_DESC_CONTENT, strlen(DEV_DESC_CONTENT));
return json_buffer;
}
char get_MassProduction(void)
{
#ifdef CONFIG_MASS_PRODUCTION_ENABLE
#ifdef CONFIG_PRODUCTION_IO_PORT
char ret = MassProduction_mode;
if (!ret) {
gpio_set_die(CONFIG_PRODUCTION_IO_PORT, 1);
gpio_set_pull_up(CONFIG_PRODUCTION_IO_PORT, !CONFIG_PRODUCTION_IO_STATE);
gpio_set_pull_down(CONFIG_PRODUCTION_IO_PORT, CONFIG_PRODUCTION_IO_STATE);
gpio_direction_input(CONFIG_PRODUCTION_IO_PORT);
delay(1000);
ret = gpio_read(CONFIG_PRODUCTION_IO_PORT);
MassProduction_mode = (ret == CONFIG_PRODUCTION_IO_STATE) ? true : false;
ret = MassProduction_mode;
}
return ret;
#else
return 1;//1量产模式
#endif
#else
return 0;
#endif
}
const char *create_mssdp_notify_msg(char *msg, u16_t dev_online_flag)
{
char ip_addr[64];
extern char wifi_get_rssi(void);
extern void Get_IPAddress(char is_wireless, char *ipaddr);
extern int storage_device_ready();
Get_IPAddress(1, ip_addr);
#ifdef CONFIG_VIDEO_720P
sprintf(msg, "{\"RTSP\":\"rtsp://%s/avi_rt/front.hd\",\
\"SIGNAL\":\"%d\",\
\"SD_STATUS\":\"%d\",\
\"DEV_ONLINE_FLAG\":\"%d\"\
}", \
ip_addr, \
wifi_get_rssi(), \
storage_device_ready(), \
dev_online_flag);
#else
sprintf(msg, "{\"RTSP\":\"rtsp://%s/avi_rt/front.sd\",\
\"SIGNAL\":\"%d\",\
\"SD_STATUS\":\"%d\",\
\"DEV_ONLINE_FLAG\":\"%d\"\
}", \
ip_addr, \
wifi_get_rssi(), \
storage_device_ready(), \
dev_online_flag);
#endif
return msg;
}
u8 video0_dev_wr_reg(u8 addr, u8 data, u8 is_write, u8 close, u8 *logo)
{
int cmd;
int wr_data = 0;
static void *video_dev = NULL;
if (!video_dev) {
video_dev = dev_open("video0.0", NULL); //用来设置摄像头参数
if (!video_dev) {
printf("video open err \n");
return -EINVAL;
}
}
if (logo) {
dev_ioctl(video_dev, CAMERA_GET_SENSOR_TYPE, (u32)logo);
} else if (!close) {
if (is_write) {
cmd = CAMERA_WITE_BIT | addr;
wr_data = data;
dev_ioctl(video_dev, cmd, (u32)wr_data);
wr_data = 0;
} else {
cmd = CAMERA_READ_BIT | addr;
dev_ioctl(video_dev, cmd, (u32)&wr_data);
}
}
if (close) {
dev_close(video_dev);
video_dev = NULL;
}
return (u8)wr_data;
}
void mssdp_camera_sensor_reg_save(u8 addr, u8 value)
{
//addr,value拿到寄存器地址和寄存器值,用户自行保存到flash,这里只能保存1个寄存器地址和值
//TODO...
}
int mssdp_recv_get_param(char *mssdp_buf)
{
char *content = mssdp_buf;//MSSDP_TAB;
json_object *new_obj = NULL;
json_object *parm = NULL;
json_object *camera_obj = NULL;
json_object *addr_opj = NULL;
json_object *value_obj = NULL;
json_object *tmp = NULL;
char buf[32];
char *wlog = "write_reg";
char *rlog = "read_reg";
char *slog = "save_reg";
char logo[8];
char *str;
int str_len;
int err;
u8 addr;
u8 value;
u8 num = 0;
u8 read_reg;
u8 write_reg;
u32 flash_addr = 0;
extern int json_object_string_set(struct json_object * jso, const char *s, int len);
//分解content字段
new_obj = json_tokener_parse(content);
camera_obj = json_object_object_get(new_obj, "camera");
if (!camera_obj) {
camera_obj = json_object_object_get(new_obj, "CAMERA");
if (!camera_obj) {
printf("err no camera_table\n\n");
goto exit;
}
}
printf("--->recv cjson\n\n%s\n\n", content);
video0_dev_wr_reg(0, 0, 0, 0, logo);
for (char cnt = 0; cnt < 3; cnt++) {
num = 0;
do {
switch (cnt) {
case 0:
sprintf(buf, "%s%d", rlog, num++);
break;
case 1:
sprintf(buf, "%s%d", wlog, num++);
break;
case 2:
sprintf(buf, "%s%d", slog, num++);
break;
default:
goto exit;
}
parm = json_object_object_get(new_obj, buf);
if (parm) {
addr_opj = json_object_object_get(parm, "addr");
value_obj = json_object_object_get(parm, "value");
if (addr_opj && value_obj) {
addr = value = read_reg = 0;
str = json_object_get_string(addr_opj);
str_len = json_object_get_string_len(addr_opj);
if (str && str_len) {
addr = (u8)strtoul(str, NULL, 16);
}
str = json_object_get_string(value_obj);
str_len = json_object_get_string_len(value_obj);
if (str && str_len) {
value = (u8)strtoul(str, NULL, 16);
}
if (cnt < 2) {//读写摄像头寄存器
read_reg = (u8)video0_dev_wr_reg(addr, value, cnt, 0, NULL);
if (!cnt) {
if (!str || !str_len || (strstr(str, "0x") || strstr(str, "0X")) || !value) {
sprintf(buf, "0x%02x", read_reg);
} else {
str = json_object_get_string(addr_opj);
str_len = json_object_get_string_len(addr_opj);
if (!str || (!value && !(strstr(str, "0x") || strstr(str, "0X")))) {
sprintf(buf, "0x%02x", read_reg);
} else {
sprintf(buf, "%02x", read_reg);
}
}
err = json_object_string_set(value_obj, buf, strlen(buf));
if (err) {
printf("err in json_object_string_set = %d \n", err);
}
} else {
read_reg = (u8)video0_dev_wr_reg(addr, value, !cnt, 0, NULL);//读回来校验是否写成功
if (read_reg != value) {
video0_dev_wr_reg(addr, value, cnt ? 0 : 1, 0, NULL);//重写
}
}
} else {//addr,value拿到寄存器地址和寄存器值,用户自行保存到flash,这里只能保存1个寄存器地址和值
mssdp_camera_sensor_reg_save(addr, value);
}
}
}
} while (num < 32); //最多32项
}
sprintf(buf, "%s", logo);
err = json_object_string_set(camera_obj, buf, strlen(buf));//修改camera
if (err) {
printf("err in json_object_string_set = %d \n", err);
}
str = json_object_get_string(new_obj);//获取整个cjson
video0_dev_wr_reg(0, 0, 0, 1, NULL);
mssdp_set_user_msg((const char *)str, 2);
printf("--->send cjson\n\n%s\n\n", str);
exit:
json_object_put(new_obj);
return 0;
}
static void network_ssdp_cb(u32 dest_ipaddr, enum mssdp_recv_msg_type type, char *buf, void *priv)
{
char msg[128];
switch (type) {
case MSSDP_SEARCH_MSG:
printf("ssdp client[0x%x] search, %s\n", dest_ipaddr, buf);
break;
case MSSDP_BEFORE_SEND_NOTIFY_MSG:
if (get_MassProduction()) {
mssdp_set_notify_msg((const char *)create_mssdp_notify_msg(msg, 0), 2);
}
break;
case MSSDP_USER_MSG:
mssdp_recv_get_param(buf);
break;
default :
break;
}
}
void network_mssdp_init(void)
{
char msg[128];
puts("mssdp run \n");
if (get_MassProduction()) {
mssdp_init("MSSDP_SEARCH ", "MSSDP_NOTIFY ", "MSSDP_REGISTER ", 3333, network_ssdp_cb, NULL);
mssdp_set_notify_msg((const char *)create_mssdp_notify_msg(msg, 0), 2);
} else {
mssdp_init("MSSDP_SEARCH ", "MSSDP_NOTIFY ", "MSSDP_REGISTER ", 3889, network_ssdp_cb, NULL);
mssdp_set_notify_msg((const char *)get_dev_desc_doc(), 60);
}
}
void network_mssdp_uninit(void)
{
mssdp_uninit();
}