概述
随着物联网技术的广泛应用,移动端联网变得越来越普遍。这里我们一起分享4G网络相关知识,以高通平台 data call 管理库dsi_netctrl,移远EC20通信模组进行讲解。
1、首先介绍一下相关概念。
DSI:Data Service Interface,数据业务接口
netctrl:网络控制
APN:Access Point Name,移动接入点名称,用来标识上网业务的种类,针对行业用户主要分两大类:(1)访问互联网(如:联通的3gnet);(2)访问企业局域网。在应用软件上网过程中部分软件免流策略处理可以通过区别APN实现。
DNS:Domain Name Service,域名解析服务,在域名上网过程中,需要通过DNS将域名解析为IP进行上网(如,进行百度过程中www.baidu.com,首先会利用DNS将该域名地址解析为IP地址然后进行网络连接)。
2、拨号的基本流程如下,
3、详细介绍
(1)为每个特定模式初始化DSI_NetCtrl库,并注册回调函数和回调数据。
int dsi_init_ex( int mode, void (* dsi_init_cb_func)( void * ), void *dsi_init_cb_data)
该函数必须在每次线程启动后调用。
目前该库支持的模式有:DSI_MODE_GENERAL(通用默认模式)、DSI_MODE_TEST(用于测试模式)和DSI_MODE_SSR(用于SSR模式)。在用于程序中只能设置为DSI_MODE_GENERAL。
可以通过回调函数确定DSI_NetCtrl库是否初始完成。
(2)如果有新的APN信息,需要在模块已有的APN列表中添加APN。
int QL_APN_Add(ql_apn_add_s *apn, unsigned char *profile_idx)
结构体ql_apn_add_s中包含了以下内容,
typedef struct{ ql_apn_pdp_type_e pdp_type; /*!< Packet Data Protocol (PDP) type specifies the type of data payload exchanged over the airlink when the packet data session is established with this profile. */ ql_apn_auth_proto_e auth_proto; /*认证协议 */ char apn_name[QL_APN_NAME_SIZE]; /*!< A string parameter that is a logical name used to select the GGSN and external packet data network. */ char username[QL_APN_USERNAME_SIZE]; /*在数据网络认证过程中使用的用户名 */ char password[QL_APN_PASSWORD_SIZE]; /*数据网络认证过程中使用的账号密码 */} ql_apn_add_s;
profile_idx保存列表指针。
(3)获取数据服务句柄handle,后面所有的函数都讲使用这个句柄作为输入
dsi_hndl_t dsi_get_data_srvc_hndl( dsi_net_ev_cb cb_fn, void * user_data);
通过注册回调函数cb_fn在拨号成功后可以通知到应用程序。在多路APN拨号过程中,通过user_data可以标识是具体哪一路APN拨号成功。
回调函数cb_fn有4个参数,其中hndl为刚才申请的句柄handle,evt为事件标识,可以在启动拨号后,回调判断拨号结果(后面第(6)步会讲解)。
/** Callback function prototype for DSI NetCtrl events. */typedef void (*dsi_net_ev_cb)( dsi_hndl_t hndl, /**< Handle for which this event is associated. */ void *user_data, /**< Application-provided user data. */ dsi_net_evt_t evt, /*事件标识 */ dsi_evt_payload_t *payload_ptr /*关联的事件信息 */ );
(4)设置拨号参数
int dsi_set_data_call_param( dsi_hndl_t hndl, dsi_call_param_identifier_t identifier, dsi_call_param_value_t *info);
hndl为刚才申请的句柄handle,identifier数为要配置的参数,包括有DSI_CALL_INFO_TECH_PREF(DSI_RADIO_TECH_UNKNOWN)、CDMA ID、UMTS ID、ip版本IPV4(ipv6)、apn 名字 、拨号用户名、拨号密码、认证优先级(DSI_CALL_INFO_AUTH_PREF),info为每个配置参数的具体信息。
(5)开始拨号,连接无线广域网。
int dsi_start_data_call(dsi_hndl_t hndl);
hndl为刚才申请的句柄handle。
(6)判断拨号结果
第(5)步启动拨号后就可以在第(3)步注册的回调函数cb_fn中的参数evt确定拨号是否成功,如果evt为DSI_EVT_NET_IS_CONN标识拨号成功,如果evt为DSI_EVT_NET_NO_NET表示拨号失败了,拨号失败可以通过调用函数dsi_get_call_end_reason查询失败原因。
int dsi_get_call_end_reason( dsi_hndl_t hndl, dsi_ce_reason_t * ce_reason, dsi_ip_family_t ipf);
hndl为刚才申请的句柄handle,ce_reason存放着具体的原因信息。
typedef struct dsi_ce_reason_s{ dsi_ce_reason_type_t reason_type; /* 错误类型 */ int reason_code; /* 错误码 */} dsi_ce_reason_t;
(7)获取拨号成功后的网络参数
有两个重要的函数;
1)获取拨号后的网卡名
int dsi_get_device_name(dsi_hndl_t hndl, char * buf, int len)
同样,hndl为刚才申请的句柄handle, buf中保存着拨号成功后的网卡名,在第(9)步添加防火墙规则中需要用到。
2)获取拨号后的IP地址信息,
int dsi_get_ip_addr( dsi_hndl_t hndl, dsi_addr_info_t * info_ptr, int len);
info_ptr中包含了网络命令信息,
typedef struct dsi_addr_info_s{ /* Network interface address */ dsi_addr_t iface_addr_s; /** unsigned int iface_mask; /** /* Gateway server address */ dsi_addr_t gtwy_addr_s; /** unsigned int gtwy_mask; /** /* Primary DNS server address */ dsi_addr_t dnsp_addr_s; /** /* Secondary DNS server address */ dsi_addr_t dnss_addr_s; /**} dsi_addr_info_t;
DNS地址作为第(10)步使用。
(8)设置默认路由
默认路由用于在上网过程中没有绑定网卡时,从默认的网卡进行上网。如果需要指定从固定网卡上网,用setsockopt函数将sock绑定在需要的网卡上。
(9)添加防火墙规则
(10)设置dns,如果实在获取不到dns地址,对于公网可以直接设置成8.8.8.8,简单又好记。
(8)、(9)、(10)属于通用的知识,可以直接百度,这里不再赘述。
如果是多路APN 同时进行拨号上网,(8)、(9)步骤只需要设置一路就可以了,但是不可以一路也不设置。
(11)停止拨号
如果需要关闭拨号销毁数据连接,通过调用函数dsi_stop_data_call
extern int dsi_stop_data_call(dsi_hndl_t hndl);
hndl为dsi_get_data_srvc_hndl获取的句柄。
最后释放句柄hndl 。
extern void dsi_rel_data_srvc_hndl(dsi_hndl_t hndl);
注,1)带dsi_ 前缀的函数为高通接口,判断函数调用成功或者失败的返回是判断返回值为DSI_SUCCESS 或者DSI_ERROR。
2)带QL_ 前缀的函数为移远接口。
4、测试网络
验证网络是否可以使用,使用命令
ping 8.8.8.8
如果出现
connect: Network is unreachable
表示路由没设置好(也可能是拨号过程处理有问题,需要检查下拨号过程)。
如果ping 8.8.8.8成功了,但是ping www.baidu.com出现
ping: unknown host www.baidu.com
表示dns没设置好,不能解析出该域名对应的IP地址,建议重新检查下dns设置是否正确。
5、总结
拨号上网过程中相关注意项:
(1)相同APN 只需要设置一路就可以了,不能出现多路重复的APN;
(2) 默认路由和防火墙规则一定要设置,但是只用设置一路就可以了,不能对多路都有设置;
(3)sock上网中,对于需要指定APN上网的情况,通过setsockopt函数将sock绑定到需要的网卡端口上,不绑定会走默认路由上网。
文章集中讲解4G拨号上网的正常流程,实际过程中会受很多因素影响,如运营商、附件基站状态等因素可能并不会那么顺利,但我们要保持微笑,积极面对,做程序猿里最靓的仔;如果实在解决不了,还是放弃吧,毕竟活着就要快乐,不能太难为自己。
如果对文章内容比较喜欢,觉得有用,记得扫码关注,随后会继续分享一些常用的相关知识,更多精彩内容敬请期待。
---end---
记得扫码关注不走丢哦!
最后
以上就是迷路羊为你收集整理的4G模块加网流程_4G拨号上网相关知识的全部内容,希望文章能够帮你解决4G模块加网流程_4G拨号上网相关知识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复