找回密码
 注册
搜索
查看: 2315|回复: 24

[讨论] MTK不同版本socket的差异,回调不响应

[复制链接]
发表于 2009-10-27 17:06:10 | 显示全部楼层 |阅读模式
我的socket在我们自己的平台上(6225)一切ok,移植到别的平台(软件版本应该不同,我也不知道怎么看软件版本,那位指点一下)后creat 和 connet都能正常返回,但是回调不会响应(SetProtocolEventHandler(ah_sock_notify_handler, MSG_ID_APP_SOC_NOTIFY_IND););log如下:
[em10]
【文件名】:091027@52RD_311.txt
【格 式】:txt
【大 小】:20K
【简 介】:
【目 录】:


那位帮忙看看。。。感激不尽!
[此贴子已经被作者于2009-10-27 20:00:58编辑过]
 楼主| 发表于 2009-10-27 20:10:01 | 显示全部楼层
移植的目标平台浏览器是可以正常上网的,account我也都试过了
点评回复

使用道具 举报

发表于 2009-10-27 21:56:59 | 显示全部楼层
从Log上看,没有什么有价值的错误信息.

ap_id = 0x00 代表的是什么意思啊?
点评回复

使用道具 举报

发表于 2009-10-27 22:59:48 | 显示全部楼层
log上看似没问题,建议在
“SetProtocolEventHandler(ah_sock_notify_handler, MSG_ID_APP_SOC_NOTIFY_IND);”
和“lah_sock_notify_handler” 加点log,确认走到后再再分析问题。
点评回复

使用道具 举报

 楼主| 发表于 2009-10-28 09:01:42 | 显示全部楼层
以下是引用eastvenuslee在2009-10-27 22:59:48的发言:
log上看似没问题,建议在
“SetProtocolEventHandler(ah_sock_notify_handler, MSG_ID_APP_SOC_NOTIFY_IND);”
和“lah_sock_notify_handler” 加点log,确认走到后再再分析问题。

SetProtocolEventHandler(ah_sock_notify_handler, MSG_ID_APP_SOC_NOTIFY_IND)确定有走到,ah_sock_notify_handler里面是有log的。

谢谢eastvenuslee
点评回复

使用道具 举报

 楼主| 发表于 2009-10-28 09:13:11 | 显示全部楼层
以下是引用shakiraberet在2009-10-27 21:56:59的发言:
从Log上看,没有什么有价值的错误信息.

ap_id = 0x00 代表的是什么意思啊?

ap_id我也不知道什么用的,浏览器是3,但我改成3还是不行。ap_id会或到accout的第二个字节,如accout是0x0000000e,或上ap_id后就是0x0000030e,如果是sim2,则会在accout的第三个字节或上1,如果是always ask encode则还会在第三个字节或上2.
点评回复

使用道具 举报

发表于 2009-10-28 09:42:59 | 显示全部楼层
我先顶起,赚点小钱。。。
点评回复

使用道具 举报

发表于 2009-10-28 15:15:37 | 显示全部楼层
一定是账号问题
点评回复

使用道具 举报

 楼主| 发表于 2009-10-28 16:32:13 | 显示全部楼层
以下是引用552333在2009-10-28 15:15:37的发言:
一定是账号问题

能不能说具体点   可以怎么改    我程序中的账号是14,我把14给成非cmwap,打出来的log是不同的,connet都失败。
现在的情况是,connet是成功的,notify也注册了,MOD_SOC也向MOD_MMI发送的MSG_ID_APP_SOC_NOTIFY_IND,但是跑不到我注册的notify。

代码 如下:
if (trans_type == TRANS_TYPE_TCP)
                transport->socket_id = soc_create(PF_INET, SOCK_STREAM, 0, MOD_MMI, __NET_ACCOUNT_ID);

        if (transport->socket_id < 0){
                        ___log("soc_create failed:%d", transport->socket_id);
                        return -3;
        }
                lval = 1;
                ret = soc_setsockopt(transport->socket_id, SOC_NBIO, &lval, sizeof(lval));
                if (ret<0)
                {
                        ___log("socket_id %d set nonblocking mode failed,err_ret:%d", transport->socket_id, ret);
                        return -4 ;
                }
                lval =SOC_READ|SOC_WRITE|SOC_CLOSE|SOC_CONNECT; //meaningless ???
                ret = soc_setsockopt(transport->socket_id ,SOC_ASYNC,&lval ,sizeof(lval));
                if (ret<0)
                {
                        ___log("socket_id %d set async mode failed, err_ret:%d", transport->socket_id, ret);
                        return -5;
                }
            memcpy(transport->server_ip_addr.addr, &peer_ip, sizeof(peer_ip));
                ___log("peer_id: %d %d %d %d", transport->server_ip_addr.addr[0], transport->server_ip_addr.addr[1],
                                transport->server_ip_addr.addr[2], transport->server_ip_addr.addr[3]);
                transport->server_ip_addr.port = peer_port;
                transport->server_ip_addr.addr_len = 4 ;
               
        con_result = soc_connect(transport->socket_id, &transport->server_ip_addr);
        ___log("socket_id:%d 's connection result%d", transport->socket_id, con_result);        
                if (con_result == SOC_SUCCESS) {
                        ___log("socket_id:%d connection successed", transport->socket_id);
                        transport->connected_handler(transport);
                        SetProtocolEventHandler(ah_sock_notify_handler, MSG_ID_APP_SOC_NOTIFY_IND);
                                //transport->req = idx+1;
                                transport->valid_flag = 1;
                        return 0;
                }
                else
                {
                        if (con_result == SOC_WOULDBLOCK)
                        {
                                SetProtocolEventHandler(ah_sock_notify_handler, MSG_ID_APP_SOC_NOTIFY_IND);
                                transport->valid_flag = 1;
                                return 0;
                        }
                        else
                        {
                                ___log("socket_id %d connect failed", transport->socket_id);

                                transport->error_handler(transport);
                                transport->valid_flag = 1;  //to do: bug
                                return -6;
                        }
                }

}
点评回复

使用道具 举报

发表于 2009-10-28 17:49:17 | 显示全部楼层
顶贴人,努力中。。。
点评回复

使用道具 举报

发表于 2009-10-28 18:54:45 | 显示全部楼层
  改一下__NET_ACCOUNT_ID试试,要把AccountID改为你手机中实际的Id数值。

  请参考下面ACCOUNT_ID的接入点的计算方法:

  1,打开手机“数据帐户”设置页面,进入“GSM设置”;

  2,计算GSM帐户的数量,一般为5,或者10个;

  3,退出GSM设置页面,进入“GPRS设置”页面;

  4,找到并记下各接入点对应的位置;

  5,计算各接入点的索引值,方法为[GSM帐户数量]+[GPRS接入点位置索引(从0开始计)],填入对应的输入框内。

  eg:GSM帐户有10个,CMWAP(一般名称为ChinaMobileGPRS)接入点为GPRS接入点列表中的第五个(从0开始计算,应该是4),

  则CMWAP接入点索引应为10+4,即应该在__NET_ACCOUNT_ID应该填写“14”。

  
点评回复

使用道具 举报

 楼主| 发表于 2009-10-28 19:20:16 | 显示全部楼层
以下是引用eastvenuslee在2009-10-28 18:54:45的发言:
  改一下__NET_ACCOUNT_ID试试,要把AccountID改为你手机中实际的Id数值。

  请参考下面ACCOUNT_ID的接入点的计算方法:

  1,打开手机“数据帐户”设置页面,进入“GSM设置”;

  2,计算GSM帐户的数量,一般为5,或者10个;

  3,退出GSM设置页面,进入“GPRS设置”页面;

  4,找到并记下各接入点对应的位置;

  5,计算各接入点的索引值,方法为[GSM帐户数量]+[GPRS接入点位置索引(从0开始计)],填入对应的输入框内。

  eg:GSM帐户有10个,CMWAP(一般名称为ChinaMobileGPRS)接入点为GPRS接入点列表中的第五个(从0开始计算,应该是4),

  则CMWAP接入点索引应为10+4,即应该在__NET_ACCOUNT_ID应该填写“14”。

  



谢谢  account我已经确认,我把__NET_ACCOUNT_ID打到log中,显示是14,gprs接入点第五个也是cmwap,并且10到15都试过了,如果所使用的接入点不是14,连接的结果不是我log中那样
点评回复

使用道具 举报

 楼主| 发表于 2009-10-28 20:15:14 | 显示全部楼层
刚才实验了一下,在log中看到soc发送了MSG_ID_APP_SOC_NOTIFY_IND msg之后(event id =8  ,connect),用定时器跑了一下ah_sock_notify_handler,是可以正常联网的。
奇怪的是,问什么我注册的handler没有生效,是不是又被别的程序重新注册了MSG_ID_APP_SOC_NOTIFY_IND这个event?
期待高人解答
点评回复

使用道具 举报

 楼主| 发表于 2009-10-29 16:35:29 | 显示全部楼层
回调没有响应的问题解决了
之前我们的应用移植到客户的平台都是以库文件提供的,回调函数及设置回调都是在库文件中,现在我把回调函数及回调的设置放到一个单独的 .c文件中,在客户平台编译,就没有什么问题了。
在MTK中,消息的发送目标是mod_id,看日志,mod_soc确实向mod_mmi发送了notify,难道我以库文件提供应用,应用的mod_id就不是mod_mmi了?
期待高人解答
点评回复

使用道具 举报

 楼主| 发表于 2009-10-30 15:58:03 | 显示全部楼层
以下是引用rfsmby在2009-10-29 16:35:29的发言:
回调没有响应的问题解决了
之前我们的应用移植到客户的平台都是以库文件提供的,回调函数及设置回调都是在库文件中,现在我把回调函数及回调的设置放到一个单独的 .c文件中,在客户平台编译,就没有什么问题了。
在MTK中,消息的发送目标是mod_id,看日志,mod_soc确实向mod_mmi发送了notify,难道我以库文件提供应用,应用的mod_id就不是mod_mmi了?
期待高人解答


没有人遇到过这个问题吗???
点评回复

使用道具 举报

发表于 2009-12-6 22:53:54 | 显示全部楼层
看你的log位置应该是在 if (con_result == SOC_SUCCESS)的时候打印出来的,这个时候你应该去调用soc_send了把,这个时候去注册回调函数可能已经晚了,或者这个时候不会发出那个notify消息了
点评回复

使用道具 举报

 楼主| 发表于 2009-12-8 14:58:49 | 显示全部楼层
好早之前的问题了,真正的原因是:设置回调是在库文件中做的,MTK中event id是个enum变量,该值在编译阶段就已经确定,同一个平台,开关某些宏后有可能是不同的,而不同的平台就更有可能不同。直观的说就是,我设置了错误的回调。
点评回复

使用道具 举报

发表于 2009-12-9 09:40:33 | 显示全部楼层
MSG_ID_APP_SOC_NOTIFY_IND
消息ID值 不对了 呵呵.
点评回复

使用道具 举报

发表于 2009-12-9 09:43:00 | 显示全部楼层
你封在库里的ID是就是你那个版本平台的值
移植到其他平台后 ID换了 所以你永远都没有注册新的 MSG_ID_APP_SOC_NOTIFY_IND ID的回调
解决方法:
写一个开放的函数
return MSG_ID_APP_SOC_NOTIFY_IND;
库中调用该函数.
点评回复

使用道具 举报

发表于 2009-12-9 09:49:03 | 显示全部楼层
有问题 请加QQ群 74809808.有时间我会给您解答的.
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2025-2-26 06:57 , Processed in 0.087605 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表