确保Windows Mobile通过GPRS连接CMNET成功的办法(附源码)

Python 开发的实践:从数据结构选型到框架决策 规模多大?决定用list还是set,Pandas 还是 Polars。瓶颈在哪?I/O 密集用异步,CPU 密集用进程/自由线程,内存受限用列式与惰性执行。代价是什么?消除手动维护窗口的出错面,TaskGroup消除失败任务不被取消的泄漏,消除 N+1,Protocol消除为类型约束而引入的继承层级——每个选择都在消除某类代价,同时也引入新的约束。能回答这三个问题,比记住更多 API 更有用。愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意! 阅读详情

【版   本】

1.0.0

【操作系统】

Windows Mobile 6.1

【作   者】

谢红伟·chrys ·chrys@163.com ·http://callgle.xicp.net

【开发日期】

2010-04-02 1:24

【文档日期】

2010-04-02 3:53

【说明】

用连接管理器API可以对Windows Mobile的GPRS连接进行管理,由程序发起连接GPRS请求完成连接的建立,但是有时候不那么幸运,Internet设置里多了一些其他无效的连接或者是复位后所有连接都丢失了,那我们应该主动创建自己的连接,然后实现联网。

【源代码下载】

 

http://www.pudn.com/downloads237/sourcecode/comm/windows_mobile/detail1109614.html

问题出现

三年前写过一篇文章《Windows Mobile中如何建立GPRS连接以便Socket能正常通信》(http://www.vckbase.com/document/viewdoc/?id=1803),该代码在我的一个项目中一直使用,可最近我的测试员殷慧和曹昌利告诉我说在以下这种情况下会导致GPRS连接CMNET时失败,手机上的连接配置如下图所示:

 

网络连接配置

【注意】这里多了一个“我的连接”,接入点是“cmwap”。

按理说,这些连接里已经有一个“cmnet”的了,应该可以连接到Internet的,我们用IE访问一下网站测试一下,结果令人费解,居然打不开网站,如下图:

 

IE访问百度网页失败

检查连接信息时发现原来系统默认连接到“我的连接”(cmwap)去了,所以无法访问普通的网站,只能访问wap网站,那是不是系统优先选择cmwap的接入点呢?我试了一下,即使我将“我的连接”的接入点有“cmwap”改成“abc”,系统照样优先选择这个错误的连接(因为世界上不存在“abc”这样的接入点),其实系统是自动选择最后一次创建的连接。我将连接列表里的“自动选择”改为手动指定到“cmnet”,如下图:

 

手动指定

手动指定后可以连接到Internet。难道需要我们最敬爱的用户来做如此高难度的事情吗?什么?不难?是的,对于我们程序员来说,将连接从“自动选择”改为手动指定的确没什么难度,但对于一个连电脑开机按钮都找不到的用户来说,那可比一口气吃下十个包子还要难啊!~O(∩_∩)O~

我同事有一台香港买的繁体版HTC S1高档货,复位以后居然一个连接都找不到,当然也不能访问网络了。看来建立我们自己的连接是势在必行了。

想办法解决它

我们是程序员,哪怕是一点小小的问题,只要是为用户提供了方便,减少了用户的困扰,我们就为此而努力,这是我们的人生真谛!

经过测试发现,我只要将手机里所有的连接都删掉,然后建立一个我们自己想要的连接,每次都可以成功,现在我们要做的就是如何删除系统中原有连接,我们这里要用到一个特殊的函数,我们称之为“万能”函数,函数名为“DMProcessConfigXML()”,该函数以XML方式向系统提交修改系统配置的请求,这些请求是多方面的,比如:可以用来发送电子邮件,还可以用来建立Wi-Fi连接、卸载应用程序等。我们这里要利用它来删除系统连接,我们先建立一个删除单个连接的函数,代码如下:

 

BOOL CConnectManager::DeleteOneGPRSConn ( LPCTSTR lpszConnName )

{

       if ( !lpszConnName || lstrlen(lpszConnName) < 1 )

              return FALSE;

 

       CString csWXMLin;

 

       csWXMLin = _T("<wap-provisioningdoc>");

       csWXMLin += _T("<characteristic type=/"CM_GPRSEntries/">");

       csWXMLin += _T("<nocharacteristic type=/"") + CString(lpszConnName) + _T("/"/>");

       csWXMLin += _T("</characteristic>");

       csWXMLin += _T("</wap-provisioningdoc>");

       return DMProcessConfigXML ( CFGFLAG_PROCESS, csWXMLin );

 

 

       return TRUE;

}

 

然后用函数“ConnMgrQueryDetailedStatus()”枚举系统中所有的连接名称,再循环调用“DeleteOneGPRSConn”函数,将所有连接都删掉。

删掉以后接下来应该创建一个“cmnet”的接入点,代码如下:

BOOL CConnectManager::CreateGPRSConn ( LPCTSTR lpszConnName, LPCTSTR lpszAPN )

{

       if ( !lpszConnName || lstrlen(lpszConnName) < 1 )

              return FALSE;

       if ( !lpszAPN || lstrlen(lpszAPN) < 1 )

              return FALSE;

 

       CString csWXMLin;

       csWXMLin = _T("<wap-provisioningdoc>");

       csWXMLin += _T("<characteristic type=/"CM_GPRSEntries/">");

       csWXMLin += _T("<characteristic type=/"") + CString(lpszConnName) + _T("/">");

       csWXMLin += _T("<parm name=/"DestId/" value=/"{436EF144-B4FB-4863-A041-8F905A62C572}/" />");

       csWXMLin += _T("<characteristic type=/"DevSpecificCellular/">");

       csWXMLin += _T("<parm name=/"BearerInfoValid/" value=/"1/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoValid/" value=/"1/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoProtocolType/" value=/"2/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoL2ProtocolType/" value=/"PPP/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoAccessPointName/" value=/"") + CString(lpszAPN) + _T("/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoAddress/" value=/"/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoDataCompression/" value=/"1/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoHeaderCompression/" value=/"1/" />");

       csWXMLin += _T("<parm name=/"GPRSInfoParameters/" value=/"/" />");

       csWXMLin += _T("</characteristic>");

       csWXMLin += _T("</characteristic>");

       csWXMLin += _T("</characteristic>");

       csWXMLin += _T("</wap-provisioningdoc>");

 

       return DMProcessConfigXML ( CFGFLAG_PROCESS, csWXMLin );

}

 

有了这两个函数,那我们建立连接Internet之前先删除再创建,如下代码:

 

BOOL CConnectManager::CreateNewCmnetConn ()

{

       DeleteAllGPRSConn ( NET_CONN_NAME );

       if ( !CreateGPRSConn ( NET_CONN_NAME, _T("cmnet") ) )

              return FALSE;

       return TRUE;

}

 

现在GPRS的连接已经准备就绪,我们只需要调用函数“ConnMgrEstablishConnectionSync()”来建立连接即可,系统会自动选择我们创建的连接。

 

BOOL CConnectManager::ConnectToInternet ()

{

       // 尝试用IID_DestNetInternet 来连接

       GUID guidDestNetInternet = {0};

       guidDestNetInternet.Data1 = 0x436ef144;

       guidDestNetInternet.Data2 = 0xb4fb;

       guidDestNetInternet.Data3 = 0x4863;

       guidDestNetInternet.Data4[0] = 0xa0;

       guidDestNetInternet.Data4[1] = 0x41;

       guidDestNetInternet.Data4[2] = 0x8f;

       guidDestNetInternet.Data4[3] = 0x90;

       guidDestNetInternet.Data4[4] = 0x5a;

       guidDestNetInternet.Data4[5] = 0x62;

       guidDestNetInternet.Data4[6] = 0xc5;

       guidDestNetInternet.Data4[7] = 0x72;

 

       if ( EstablishConnection ( guidDestNetInternet ) )

       {

              return TRUE;

       }

 

       // 映射URL

       CString csDesc;

       GUID guidNetworkObject = {0};

       int nIndex = MapURLAndGUID(_T("www.163.com"), guidNetworkObject, &csDesc );

       if ( nIndex < 0 ) return FALSE;

 

       // 连接映射URL得到的连接对象

       if ( EstablishConnection ( guidNetworkObject ) )

       {

              return TRUE;

       }

 

       return FALSE;

}

 

本文所附带的源代码,是一个Demo程序,实现了自动连接GPRS,且用Socket连接百度网站以检查我们是否真的能建立连接,如下图:

 

连接百度成功

 

被程序处理后的系统连接列表如下图所示:

 

程序创建的连接

 

上图中的“szxys.chrys”为程序自动创建的连接,系统默认会使用该连接,GPRS连接cmnet成功!

结束语

其实我们还可以用RAS(Remote Access Service,即“远程访问服务”)系列API来管理我们的连接,例如用RasDial()函数就可以进行拨号,但我测试发现,这些函数和连接管理器提供的API还是有冲突的,比如用RasDial()拨号成功了,可连接图标不显示,界面上看不出来当前是否已经联网,但又可以访问网络;再比如我用IE连接到cmwap了,再用RasDial()拨号会导致程序挂住。所以建议还是使用连接管理器API来管理我们的GPRS连接会比较安全。

该程序在中国大陆使用中国移动的SIM卡使用没问题,如果在国外,或者是使用联通的卡,接入点不尽相同,需要修改里面的参数。

知识就是力量,知识共享将具有推动时代进步的力量。希望我能为中国的软件行业尽一份薄力。

你可以任意修改复制本代码,但请保留版权信息文字不要修改。

由于水平有限,错误再所难免,请知情者原谅并告知,多谢!

 

·谢红伟

深入大模型-52-Harness综述之(二)四大子系统 一个Harness都由四个子系统拼成,Agentic Loop是主干,四个子系统是Tool系统、Memory & Context、Guardrails,再加上一个把它们优雅组织起来的Skill系统。 阅读详情

相关推荐

我爬取了某非法网贷后台系统数据,终于知道什么叫做利滚利滚利滚利了

我爬取了非法贷款的后台网站!

weixin_44042821的博客 2881

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

a bit 201

Python与numpy版本兼容性排查指南

本文详细解析了Python与numpy版本兼容性问题,提供了快速诊断和解决版本冲突的实用方法。通过查看版本信息、使用官方兼容性对照表以及降级或升级环境等方案,帮助开发者有效避免常见的报错问题,如'ImportError'和'AttributeError'。文章还介绍了使用虚拟环境和requirements.txt等工程实践,确保项目依赖的稳定性。

weixin_29089057的博客 319

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 696

数字IC设计之时序分析基础概念汇总

时序分析主要有两种办法:静态时序分析: (static timing analysis,STA),是遍历电路存在的所有时序路径,根据给定工作条件(PVT)下的时序库.lib文件计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足约束要求,根据最大路径延时和最小路径延时找出违背时序约束的错误。

weixin_45230720的博客 5607

从选型到阵列:基于ESP32-S3的智能硬件麦克风系统设计实战

本文详细介绍了基于ESP32-S3芯片设计智能硬件麦克风阵列的完整实战方案。从核心芯片选型、数字MEMS麦克风的参数解读与电路设计,到关键的声学结构密封、阵列布局策略,再到利用ESP-ADF框架构建音频处理流水线并集成回声消除、噪声抑制等算法,提供了从硬件到软件的全链路设计指南与避坑要点,旨在实现清晰、稳定的远场语音交互。

weixin_29173777的博客 267

C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?

第17课:用大白话讲清 list 的双向链表结构、哨兵头、push_back 四步、迭代器封装、merge 与 splice 的区别,以及 vector 排序为什么常比 list 快。

wo_jack的博客 234

基于深度学习 YOLOv11 的快递包裹检测系统(Python + PySide6 界面 + 训练代码)

成为亟需优化的重要环节。随着电子商务的快速发展,物流行业面临着越来越大的压力,为了解决这些问题,我们提出了一种。目标检测算法,实现快递包裹的。的界面,供用户进行实时监控。本项目的主要目标是利用。

斌擎科技 763

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 396

大疆FPGA/芯片开发工程师(A卷)笔试题(含详解)

大疆芯片开发岗A卷 一、单选题 1.下列关于多bit数据跨时钟域的处理思路,错误的有   A、发送方给出数据,接收方用本地时钟同步两拍再使用   B、发送方把数据写到异步fifo,接收方从异步fifo里读出   C、对于连续变化的信号,发送方转为格雷码发送,接收方收到后再转为二进制   D、发送方给出数据,发送方给出握手请求,接收方收到后回复,发送方撤销数据 2.对12.918做无损定点化,需要的最小位宽是多少位,位宽选择11位时的量化误差是多少   A、12位,0.0118   B、13位,0.0039

Mr.翟的博客 2万+

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2623

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 277

DW3000芯片驱动API介绍

详细介绍DW3000驱动程序API的调用流程说明和中断处理程序流程说明

DT程序员的博客 1522

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 66

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

软件商店常见问题标准处理流程

从底层软件源来看,/etc/apt/sources.list配置错误、源地址失效、公网与内网离线源混用、ARM64与x86_64架构源串用,以及DNS解析异常、系统代理配置错误,都会导致商店无法获取应用数据;打开该应用,确认可正常运行;软件商店作为系统内置的图形化软件分发与安装入口(UKUI桌面配套组件,底层依赖APT软件源),承担着应用软件的浏览、搜索、下载、安装、升级与卸载等核心功能,是终端软件部署与管理的关键通道。覆盖软件商店启动、页面加载、应用下载、安装、卸载、搜索、自身更新等全部业务场景。

qq_39496637的博客 283

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【AI 开发从入门到进阶 · 10】收官篇:LoRA 微调、模型评估、推理加速与生产部署全链路

本文系统梳理了大模型微调与生产落地的全流程,从决策是否微调、优选LoRA技术方案,到代码实现、效果评估、推理加速与FastAPI服务封装,最终构建可迭代的生产级AI系统。强调“逐级升级”原则,倡导以数据闭环驱动优化,避免技术冲动。全系列贯穿工程化思维,提供可复用模板与实战建议,助力开发者从模型训练迈向稳定可用的AI服务部署。

信息安全领域优质创作者|操作系统领域专家 106

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ARIA规范

ARIA用来补充原生HTML缺失的语义,原则:优先原生标签,ARIA仅做补充。 ARIA角色role:定义组件身份,分为地标角色、构件角色、文档角色;构件角色用于自定义弹窗、tab、下拉菜单等复杂组件; ARIA状态与属性:以aria-开头,描述组件实时状态;常用:aria-label、aria-labelledby、aria-describedby、aria-hidden、aria-expanded、aria-selected、aria-modal、aria-live; 常用场景:图标按钮用aria-l

2401_83227843的博客 438

LangGraph 的分离思想总结

LangGraph 的分离思想,本质上是对"高内聚、低耦合"这一经典工程原则在 LLM 应用领域的落地。它通过状态与逻辑分离、节点职责分离、控制流与执行分离、计算与持久化分离、编排与实现分离五个层面,把一个难以维护的"大黑盒"拆解成一组可组合、可测试、可观测的部件。理解这套分离思想,比记住 API 更重要——因为当你面对新的智能体场景时,真正指导你做出合理拆分的,正是这些分离原则。

张晨光老师的播客 384

Java基础:泛型、类型擦除与 PECS 原则

泛型允许类、接口和方法使用类型参数,把许多类型检查提前到编译期,减少显式类型转换,提高代码复用性。例如。

cjpabc的博客 453

RT-Thread 5.4.0 完整版架构剖析(下):IPC、时钟、内存、设备与组件

从 IPC 全量、时钟与定时器、内存管理,到设备框架、组件层、软件包机制、移植裁剪与速查表,补齐 RT-Thread 5.4.0 完整版的下半张地图。

205

CMake 多目录工程实战:静态库与动态库的完整构建示例

本文通过一个完整CMake项目示例,展示了如何构建静态库(math)与动态库(sort),并分别在test1、test2中链接使用。项目结构清晰,顶层CMakeLists.txt统一管理变量,各子目录独立配置编译规则。通过add_library生成库,link_directories和link_libraries实现链接,最终完成构建与验证。重点区分了静态库(打包进可执行文件)与动态库(运行时加载)的差异,适用于实际工程化开发与面试准备。

2303_77004089的博客 123

第2讲:提示注入攻击——原理与防御

提示注入是攻击者通过恶意指令绕过AI系统规则的安全威胁,分为直接注入(如覆盖指令、角色扮演越狱)和间接注入(藏于文档或搜索结果中)。防御需三重机制:检测(识别高危模式与多轮诱导)、加固(设置优先级、随机分隔符、锁定输出)、净化(清除控制字符、编码、截断超长输入)。结合上下文分析与多模态处理,可有效防范编码绕过、过度净化等陷阱。核心理念:防御需检测、加固、净化联动,筑牢AI应用安全防线。

sandaoliuge的博客 267

TypeError: must be str, not list

【代码】TypeError: must be str, not list。

Forerunner and Successor 先駆者と後継者 53

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 487

CMake 实战指南:从基础语法到静态库/动态库制作与链接

本文系统介绍了CMake的基本用法,涵盖注释、变量定义、C++标准设置、可执行文件输出路径配置、文件查找及头文件引入。重点讲解了如何通过add_library创建静态库与动态库,并结合include_directories和target_link_libraries实现依赖管理。内容实用,适合作为CMake入门与项目构建参考。

2303_77004089的博客 216

本地chatbot4--引入LangGraph

上一节实现了chatbot的连续调用工具的功能,但目前流程还是提示词→模型→解析→调用工具(可选)→输出线性的一条路走到底(LangChain)只适合简单线性任务(问答、摘要、简单RAG)agent的本质是:“模型决定调工具→执行→结果喂回模型→再决定……直到完成”。举例:读日志 → 解析 ─失败→ 重试(≤3次) ─→ 退出│成功↓算统计 → 对比历史 → 生成报告 → [人工审核卡点] → 发送。

weixin_45859446的博客 97
上一篇: 单片机Keil C51编程心得,用时间换来的教训!
下一篇: 我爸爸的文章:深圳有感——赞鹏城
chrys2000
博客等级 码龄22年 70粉丝 13原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值