config.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "config.h"
  2. #include <ctype.h>
  3. AppConfig g_cfg;
  4. size_t safe_strcpy(char*dest,const char*src,size_t size){
  5. if(!dest||size==0) return 0;
  6. dest[0]=0; if(!src) return 0;
  7. size_t i=0; for(;i<size-1 && src[i];i++) dest[i]=src[i];
  8. dest[i]=0; return i;
  9. }
  10. char* str_trim(char*s){
  11. if(!s) return s;
  12. while(*s && isspace((unsigned char)*s)) s++;
  13. char*e=s+strlen(s); while(e>s && isspace((unsigned char)e[-1])) *--e=0;
  14. return s;
  15. }
  16. void config_defaults(AppConfig*c){
  17. memset(c,0,sizeof(*c));
  18. safe_strcpy(c->cms_ip, "117.131.63.98", sizeof(c->cms_ip)); /* from screenshot */
  19. c->cms_port = DEFAULT_CMS_PORT; /* 7031 */
  20. safe_strcpy(c->device_id,"AX5324540", sizeof(c->device_id));
  21. safe_strcpy(c->license, "abc12345", sizeof(c->license));
  22. safe_strcpy(c->proto_version, ISUP_PROTO_VERSION, sizeof(c->proto_version));
  23. c->sms_port = DEFAULT_SMS_PORT; /* 7660 */
  24. c->alarm_port = 7200;
  25. safe_strcpy(c->rtmp_host,"127.0.0.1",sizeof(c->rtmp_host));
  26. c->rtmp_port = DEFAULT_RTMP_PORT; /* 1935 */
  27. safe_strcpy(c->rtmp_app, "live", sizeof(c->rtmp_app));
  28. c->fps=SIM_FPS; c->width=SIM_IMAGE_WIDTH; c->height=SIM_IMAGE_HEIGHT; c->bitrate_kbps=SIM_BITRATE/1000;
  29. safe_strcpy(c->log_file,"./isup.log",sizeof(c->log_file));
  30. c->log_level=LOG_INFO; c->simulate=0;
  31. }
  32. int config_load(const char*path,AppConfig*c){
  33. config_defaults(c);
  34. FILE*f=fopen(path,"r"); if(!f){ LOG_WARN("config '%s' not found, using defaults",path); return SUCCESS; }
  35. char line[512];
  36. while(fgets(line,sizeof(line),f)){
  37. if(line[0]=='#'||line[0]==';'||line[0]=='\n') continue;
  38. char*val=strchr(line,':'); if(!val) val=strchr(line,'='); if(!val) continue;
  39. *val=0; char*k=str_trim(line); char*v=str_trim(val+1);
  40. #define EQ(x) (strcmp(k,x)==0)
  41. if(EQ("cms_ip")) safe_strcpy(c->cms_ip,v,sizeof(c->cms_ip));
  42. else if(EQ("cms_port")) c->cms_port=atoi(v);
  43. else if(EQ("device_id")) safe_strcpy(c->device_id,v,sizeof(c->device_id));
  44. else if(EQ("license")) safe_strcpy(c->license,v,sizeof(c->license));
  45. else if(EQ("proto_version")) safe_strcpy(c->proto_version,v,sizeof(c->proto_version));
  46. else if(EQ("sms_port")) c->sms_port=atoi(v);
  47. else if(EQ("alarm_port")) c->alarm_port=atoi(v);
  48. else if(EQ("rtmp_host")) safe_strcpy(c->rtmp_host,v,sizeof(c->rtmp_host));
  49. else if(EQ("rtmp_port")) c->rtmp_port=atoi(v);
  50. else if(EQ("rtmp_app")) safe_strcpy(c->rtmp_app,v,sizeof(c->rtmp_app));
  51. else if(EQ("fps")) c->fps=atoi(v);
  52. else if(EQ("width")) c->width=atoi(v);
  53. else if(EQ("height")) c->height=atoi(v);
  54. else if(EQ("bitrate_kbps")) c->bitrate_kbps=atoi(v);
  55. else if(EQ("log_file")) safe_strcpy(c->log_file,v,sizeof(c->log_file));
  56. else if(EQ("log_level")) c->log_level=atoi(v);
  57. else if(EQ("simulate")) c->simulate=atoi(v);
  58. }
  59. fclose(f);
  60. if(c->fps<=0){ LOG_WARN("invalid fps<=0, reset to %d",SIM_FPS); c->fps=SIM_FPS; } /* FIX: div-by-zero */
  61. return SUCCESS;
  62. }
  63. int config_save(const char*path,const AppConfig*c){
  64. FILE*f=fopen(path,"w"); if(!f) return FAILURE;
  65. fprintf(f,"# Hikvision ISUP client config (generated)\n");
  66. fprintf(f,"cms_ip=%s\ncms_port=%d\ndevice_id=%s\nlicense=%s\nproto_version=%s\n",
  67. c->cms_ip,c->cms_port,c->device_id,c->license,c->proto_version);
  68. fprintf(f,"sms_port=%d\nalarm_port=%d\nrtmp_host=%s\nrtmp_port=%d\nrtmp_app=%s\n",
  69. c->sms_port,c->alarm_port,c->rtmp_host,c->rtmp_port,c->rtmp_app);
  70. fprintf(f,"fps=%d\nwidth=%d\nheight=%d\nbitrate_kbps=%d\nlog_file=%s\nlog_level=%d\nsimulate=%d\n",
  71. c->fps,c->width,c->height,c->bitrate_kbps,c->log_file,c->log_level,c->simulate);
  72. fclose(f); return SUCCESS;
  73. }
  74. void config_print(const AppConfig*c){
  75. LOG_INFO("config: platform=%s:%d dev=%s proto=%s rtmp=%s:%d/%s fps=%d %dx%d @%dkbps",
  76. c->cms_ip,c->cms_port,c->device_id,c->proto_version,c->rtmp_host,c->rtmp_port,
  77. c->rtmp_app,c->fps,c->width,c->height,c->bitrate_kbps);
  78. }