确保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系统。 阅读详情

相关推荐

极化码理论及算法研究6-SCL、CA-SCL及matlab仿真

极化码译码算法5——SCL/CA-SCL译码算法系列目录1、引言2、串行抵消列表(SCL)译码算法2.1、路径度量PM 系列目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 1、引言 在上一节中,介绍了经典的SC译码算法的理论原理以及其matlab仿真代码,SC译码算法具有较低的译码复杂度,但是由于每个译码的比特信息都依赖于前面所有的比特信息的译码结果,得

1万+

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

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

a bit 201

串口调试神器诞生记:我是如何用Cursor+AI自动生成C#上位机的(含VSCode插件清单)

本文详细介绍了如何利用Cursor和AI技术快速开发C#上位机程序,实现高效的串口通讯调试。从开发环境搭建到代码自动生成,再到性能优化和功能增强,全面展示了AI辅助开发在串口调试中的实际应用和显著效率提升。

weixin_28340315的博客 302

C# 数据结构和特殊类型

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

cccloveforever的博客 696

计算机网络实验(华为eNSP模拟器)——第十章 Eth-Trunk(链路聚合)

目录一、Eth-Trunk的定义二、Eth-Trunk的工作模式(一)LACP模式1、定义2、命令(二)手工负载分担模式1、定义2、命令三、结语 一、Eth-Trunk的定义 Eth-Trunk是指设备的链路聚合,即将该设备的多个接口捆绑成一个接口,从而达到了增加带宽和提高可靠性的目的。我们要注意它是将多条物理链路,在逻辑上合并成一条,而不是串在一起。例我们将LSW1交换机S5700的三个端口(即GE0/0/1 、GE0/0/2、GE0/0/3)定义为一个Eth-Trunk接口与LSW2交换机相连,如下:

小宇y的博客 8417

网络协议——Modbus-RTU

网络协议——Modbus-RTU,简介、消息格式、Modbus寄存器种类说明、功能码01H、功能码02H、功能码03H、功能码04H、功能码05H、功能码06H、功能码0FH、功能码10H。

计算机硕士的博客 9904

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

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

wo_jack的博客 234

从Simulink到Amesim:一份FMU联合仿真的避坑指南(含UDP通讯完整配置)

本文详细解析了从Simulink到Amesim的FMU联合仿真全流程,重点介绍了UDP通讯配置中的常见陷阱与解决方案。通过实战案例,帮助工程师规避编译器不兼容、步长设置冲突等典型问题,提升复杂系统仿真的效率与准确性。

weixin_34046298的博客 337

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

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

emfuture的博客 396

单细胞实战之数据净化三部曲:细胞周期校正、双胞体剔除与RNA污染清理——技术解析与实战指南

本文深入解析单细胞数据分析中至关重要的数据净化步骤,即细胞周期校正、双胞体剔除与RNA污染清理。通过实战代码演示与原理剖析,指导读者如何有效识别并去除技术噪音,从而获得更纯净、可靠的数据,为后续的细胞分群、差异表达等高级分析奠定坚实基础。

weixin_29274337的博客 205

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

S7-1500 PLC与多台S7-200SMART PLC进行PROFINET通信的快捷方法

Robot_PLC_HMI_Automation 5689

list

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

xie0510_的博客 276

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

http://www.cierobot.com 1523

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

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

weixin_45934659的博客 65

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

qq_39496637的博客 283

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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 更重要——因为当你面对新的智能体场景时,真正指导你做出合理拆分的,正是这些分离原则。

张晨光老师的播客 383

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

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

cjpabc的博客 453

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

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

204

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

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

2303_77004089的博客 123

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

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

sandaoliuge的博客 266

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值