61ic电子在线 首页 技术 嵌入式系统 查看内容

C6678开通HTTP服务

2017-6-6 14:54| 发布者: 61ic| 查看: 1305| 评论: 0|原作者: Dyi|来自: 61ic

摘要: 如果你遇到此类问题,非常值得借鉴。


之所以以DSP开HTTP服务作为题目,是因为这是我最近这段时间唯一拿得出手的文档了。现在的DSP强大的直接开HTTP服务,当我和其他同学说起输入DSP的IP地址可以打开一个网站的时候,他们共同的反应就是——不相信。

    上面这张图片是CCS5.3中的配置.cfg文件中的界面,可以通这个界面来配置以上的这些协议栈。因为用的C6678,所以说介绍的过程都是针对KeyStone架构的。

    OK开始介绍,重点放在注意事项,因为那里记录着我遇到的问题:
先说一下参考资料吧:
NDK(Network Development Kit) User Guide
NDK Reference Guide
例程:*\mcsdk_2_01_02_05\examples\ndk\client\evmc6678l

编程过程
首先,EVM平台初始化:
    void EVM_init();  
然后,转换.html文件,利用NDK中的工具binsrc.exe完成转换,在CMD中输入
    binsrc  test_multi.html  webpage.h  TEST_MULTI
转换出的文件如下所示:
#define TEST_MULTI_SIZE 1074
unsigned char TEST_MULTI[] = {
    0x3C, 0x68, 0x74, 0x6D, 0x6C.
紧接着,初始化一堆(QMSS、CPPI、PA)
再然后,打开网络系统:
  NC_SystemOpen( NC_PRIORITY_LOW, NC_OPMODE_INTERRUPT );
  可以设置优先级和模式(中断模式、轮训模式)
随后开始各种配置:
  主机名、IP配置、配置页面、HTTP认证、插入HTTP服务、配置调试消息级别
  直接上代码了:
   // Create a new configuration
    hCfg = CfgNew();
    if( !hCfg ){
        platform_write("Unable to create configuration\n");
        goto main_exit;
    }
    // We better validate the length of the supplied names
    if( strlen( DomainName ) >= CFG_DOMAIN_MAX ||
        strlen( HostName ) >= CFG_HOSTNAME_MAX )
    {
        platform_write("Names too long\n");
        goto main_exit;
    }
 
    // Add our global hostname to hCfg (to be claimed in all connected domains)
    CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_HOSTNAME, 0,
                 strlen(HostName), (UINT8 *)HostName, 0 );
 
    // If the IP address is specified, manually configure IP and Gateway
#if defined(_SCBP6618X_) || defined(_EVMTCI6614_) || defined(DEVICE_K2H) || defined(DEVICE_K2K)
   
    if (0)
#else
    if (!platform_get_switch_state(1))
#endif
    {
        CI_IPNET NA;
        CI_ROUTE RT;
        IPN      IPTmp;
 
        // Setup manual IP address
        bzero( &NA, sizeof(NA) );
        NA.IPAddr  = inet_addr(LocalIPAddr);
        NA.IPMask  = inet_addr(LocalIPMask);
        strcpy( NA.Domain, DomainName );
        NA.NetType = 0;
 
        // Add the address to interface 1
        CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
                           sizeof(CI_IPNET), (UINT8 *)&NA, 0 );
 
        // Add the default gateway. Since it is the default, the
        // destination address and mask are both zero (we go ahead
        // and show the assignment for clarity).
        bzero( &RT, sizeof(RT) );
        RT.IPDestAddr = 0;
        RT.IPDestMask = 0;
        RT.IPGateAddr = inet_addr(GatewayIP);
 
        // Add the route
        CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
                           sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );
 
        // Manually add the DNS server when specified
        IPTmp = inet_addr(DNSServer);
        if( IPTmp )
            CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_DHCP_DOMAINNAMESERVER,
                         0, sizeof(IPTmp), (UINT8 *)&IPTmp, 0 );
 
        platform_write("IP configure done! \n");
    }
    // Else we specify DHCP
    else
    {
        CI_SERVICE_DHCPC dhcpc;
 
        platform_write("Configuring DHCP client\n");
 
        // Specify DHCP Service on IF-1
        bzero( &dhcpc, sizeof(dhcpc) );
        dhcpc.cisargs.Mode   = CIS_FLG_IFIDXVALID;
        dhcpc.cisargs.IfIdx  = 1;
        dhcpc.cisargs.pCbSrv = &ServiceReport;
        dhcpc.param.pOptions = DHCP_OPTIONS;
        dhcpc.param.len = 2;
 
        CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_DHCPCLIENT, 0,
                     sizeof(dhcpc), (UINT8 *)&dhcpc, 0 );
    }
 
 
    // Create RAM based WEB files for HTTP
    AddWebFiles();
 
    // HTTP Authentication
    {
        CI_ACCT CA;
 
        // Name our authentication group for HTTP (Max size = 31)
        // This is the authentication "realm" name returned by the HTTP
        // server when authentication is required on group 1.
        CfgAddEntry( hCfg, CFGTAG_SYSINFO, CFGITEM_SYSINFO_REALM1,
                     0, 30, (UINT8 *)"DSP_CLIENT_DEMO_AUTHENTICATE1", 0 );
 
        // Create a sample user account who is a member of realm 1.
        // The username and password are just "username" and "password"
        strcpy( CA.Username, "username" );
        strcpy( CA.Password, "password" );
        CA.Flags = CFG_ACCTFLG_CH1;  // Make a member of realm 1
        rc = CfgAddEntry( hCfg, CFGTAG_ACCT, CFGITEM_ACCT_REALM,
                          0, sizeof(CI_ACCT), (UINT8 *)&CA, 0 );
    }
 
 
    // Specify HTTP service
    bzero( &http, sizeof(http) );
    http.cisargs.IPAddr = INADDR_ANY;
    http.cisargs.pCbSrv = &ServiceReport;
    CfgAddEntry( hCfg, CFGTAG_SERVICE, CFGITEM_SERVICE_HTTP, 0,
                 sizeof(http), (UINT8 *)&http, 0 );
 
 
    //
    // Configure IPStack/OS Options
    //
 
    // We don't want to see debug messages less than WARNINGS
    rc = DBG_INFO;
    CfgAddEntry( hCfg, CFGTAG_OS, CFGITEM_OS_DBGPRINTLEVEL,
                 CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
   最后才是退出处理:
 
platform_write ("NetWork failed \n");
    // Free the WEB files
    efs_destroyfile("index.html");
    efs_destroyfile("cal_multi.cgi");
    // Delete Configuration
    CfgFree( hCfg );
    // Close the OS
main_exit:
    NC_SystemClose();
注意事项
OSAL和resourcemgr.c
      初次接触sys/bios,对这两个文件肯定都是困惑的,个人理解:操作系统抽象层在SYS/BIOS库中已经声明了一些函数,而这些函数并没有定义,需要用户自己定义在代码文件中。很有面向对象思想中的Interface或者是虚函数的意思。
载入网页、卸载网页
void AddWebFiles(void)
{
    void *pFxn;
 
    efs_createfile("test_multi.html", TEST_MULTI_SIZE, TEST_MULTI);
 
    pFxn = (void*) &cgi_cal_multi;
    efs_createfile("cal_multi.cgi", 0, (UINT8 *) pFxn);
}
 
void RemoveWebFiles(void)
{
    efs_destroyfile("test_multi.html");
    efs_destroyfile("cal_multi.cgi");
}
.cfg配置
配置.cfg我觉得是刚入门比较头疼的东西,一个比较关键的点就是现在link和inc的目录大部分都不需要在工程->属性 中修改。只需要用.cfg载入适当的库即可,举例:
 
var Cache       =   xdc.useModule('ti.sysbios.family.c66.Cache');
这要一来就把Cache类的库全都包含进来的。不需要配置link和inc的目录。
绑定事件组
        .cfg中需要配置如下一段代码,我始终没弄懂的 
 
 
Ecm.eventGroupHwiNum[0] = 7;
Ecm.eventGroupHwiNum[1] = 8;
Ecm.eventGroupHwiNum[2] = 9;
Ecm.eventGroupHwiNum[3] = 10;
    一度因为缺少这段代码无法ping到地址,这段非常重要,但是并不明确具体含义。
System Reset
    与网络有关的程序,重载入会出错,如下:

    解决办法:Run->Reset->System Reset。参考TI E2E论坛,似乎是NDK的bug。

鲜花

握手

雷人

路过

鸡蛋

地址 :湖南省株洲市天元区利江花园
合作 Email: administration@61ic.com

  • 关注61ic官方微博
    了解最新动态

  • 关注61ic微信公众号
    这里有好玩的讯息

  • 加入61ic交流群
    不断在这里成长

© 2014-2017 HuNan 湖南索炜达电子科技有限公司 . All rights reserved.
湘公网安备 43020202000020号

Archiver|手机版|小黑屋||湘ICP备13001086号-2 QQ 
返回顶部