我是靠谱客的博主 迷路羊,最近开发中收集的这篇文章主要介绍4G模块加网流程_4G拨号上网相关知识,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

       随着物联网技术的广泛应用,移动端联网变得越来越普遍。这里我们一起分享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、拨号的基本流程如下,

63a839a7ecaebef203c1f90a362295c8.png

        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拨号上网的正常流程,实际过程中会受很多因素影响,如运营商、附件基站状态等因素可能并不会那么顺利,但我们要保持微笑,积极面对,做程序猿里最靓的仔;如果实在解决不了,还是放弃吧,毕竟活着就要快乐,不能太难为自己。

619d689ea242519093081555bb015468.png

      如果对文章内容比较喜欢,觉得有用,记得扫码关注,随后会继续分享一些常用的相关知识,更多精彩内容敬请期待。

                                                   ---end---

                                   记得扫码关注不走丢哦!

99ca4d09b809dd9b5b3f6600d0ebcf73.png

最后

以上就是迷路羊为你收集整理的4G模块加网流程_4G拨号上网相关知识的全部内容,希望文章能够帮你解决4G模块加网流程_4G拨号上网相关知识所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部