[3G/4G]3G/4G模块开发
转自:http://mywutuobang.blog.sohu.com/260073467.html
一. 修改内核支持3G模块,一般内核需要枚举相关的通讯模块,其接口为串口,其数据接口和通讯接口枚举成不同的设备,如果出现问题,详见以下步骤:
3G 出现问题,通常应先检查系统是否识别到了 modem 设备,可用如下命令确认:
ls /dev/ttyU*
或者
ls /dev/ttyA*
如果在/dev 下没有找到 ttyU* 或者 ttyA* 设备,此时可通过观察内核 LOG 来定位问题:
1. USB 设备枚举失败或者系统根本就没有发现 USB 设备,此时应检查硬件电路
2. USB 枚举成功,但没有注册到 ttyUSB 或者 ttyACM 设备,此时应检查你的内核:
a). 你的内核没有开启 usb serial 功能
b). 你的内核代码中的 usb serial 相应驱动中没有添加该设备的 VID/PID,请修改
kernel/drivers/usb/serial/option.c,在数组 static struct usb_device_id option_ids[] 的末
尾添加上新设备的 VID/PID
3. USB 枚举成功,且相关配置且 ID 都已添加,但还是不出来 ttyUSB 或者 ttyACM 设备,此时
可观察系统是否有对它执行 usb mode switch,可通过 logcat:
# logcat –s Vold vold &
观察是否有调用了 usb_modeswitch 程序,如果没有执行,则检查如下:
a). 检查一些必要的文件是否存在:
ls /system/bin/usb_modeswitch
ls /etc/usb_modeswitch.sh
ls /etc/usb_modeswitch.d/[VID_PID] #[VID_PID]应替换成你的 modem 的
VID/PID,如: 12d1_1001
如果是缺少了 usb_modeswitch、usb_modeswitch.sh 等文件,则可能是你的 福州瑞芯微电子有限公司 福州瑞芯微电子有限公司 福州瑞芯微电子有限公司 福州瑞芯微电子有限公司
gingerbread/device/rockchip/sdkDemo/BoardConfig.mk 中的配置存在问题,请确认
BOARD_RADIO_DATAONLY := true
如果是缺少了/etc/usb_modeswitch.d/[VID_PID],请告知我!
b). VOLD 中关于 usb_modeswitch 这部分的代码没有被编译,你可查看 Vold 的 log 中是
否有“Start Misc devices Manager…”的字样,如果没有这串字符,请检查你的
gingerbread/system/vold/下的内容。
通常,3G 问题中,不出来 ttyUSB 或者 ttyACM 设备,主要就是上述的那些情况 。
二.如果是开发短信功能,需要获取3G模块供应商的AT指令集,大部分的3G模块的指令集一致。
1、先执行AT命令,若返回OK,则说明三级模块与单片机的串口连接好了;
2、接着执行AT+CFUN=1, 启动初始化SIM模块命令,该命令不管有没有插卡都会返回OK;
3、接下来执行AT+CREG=1,初始化网络,允许网络注册主动提供结果代码(将<mode>设为了1);理论上可以通过查询AT+CREG?命令来判断是否注册成功,根据返回的指令判断是否注册到网络,返回命令的格式为::+CREG:<mode>,<stat> [,<lac>,<ci>],若<stat>为1(注:由于注册网络需要一段时间,所以初始返回值可能为2,即处于未注册,终端正在搜寻基站,因此需要延时一段时间,供硬件反应),则表示注册到本地网络。具体原因参见命令解释,但是由于不插上SIM卡也可以有返回指令,所以检测不便,另外硬件需要一段反应时间,从而使得测出来的结果不准确,为此应该使用以下命令。
4、接下来执行AT+COPS?如果返回0,则表示插入了SIM卡,但是此时SIM卡不一定注册成功,需要延时一段时间,然后再判断AT+COPS?返回结果,若返回+COPS: 0,0,"中国联通",0,则还需要判断AT+CREG?判断格式是否为+CREG:1.1(主要看第二个参数);若返回+CMEERROR:10,则SIM卡注册失败,有可能SIM卡未插入插槽中,此时应该检测是否将SIM卡插好,确信卡是插好的。因为硬件连接传输有可能延迟,应该多试几次。
通过以上分析,为了简化判断程序,可以只判断AT+COPS?是否能够返回0,这样就表示硬件连接上有没有问题了。
在以上步骤成功后,先执行AT+CMGF=1,设定发送短消息的格式,1代表TEXT,0代表PDU格式。返回OK,则执行成功。接着输入AT+CMGS=”13988888888”回车(对应的16进制为0x0D),后面的号码表示发送短消息的目的地号码。若成功,则会返回一个>符号,提示输入信息,接着输入想要发送的信息即可,最后在发送的末尾加上CTRL+Z(对应的16进制为0X1A),则短消息发送成功。
经常涉及的指令:
1、AT+CFUN=1(全功能命令,立即执行)
此命令可以开启simcom模块的大部分功能,一般在初始化模块的时候都要写上;AT+CFUN=0的功能与+CPOF相同。(AT+CPOF,关机)
2、AT+CREG 网络注册和漫游
AT+CREG=<mode>,命令响应(Response):+CREG:<mode>,<stat> [,<lac>,<ci>]
参数说明:
<mode>
0: 禁止网络注册主动提供结果代码(默认设置)
1: 允许网络注册主动提供结果代码:+CREG:<stat>
2: 启用网络注册和位置信息非请求结果码+CREG:<stat>[,<lac>,<ci>]
<stat>
0:未注册,终端当前并未在搜寻新的运营商
1:已注册本地网络
2:未注册,终端正在搜寻基站
4:未知代码
5:已注册,处于漫游状态
<lac> 位置区编号
<ci>小区ID
注意:当设置AT+CREG成功时调制解调器回复OK.之后将网络注册状态通过响应返回。当网络注册状态发生改变时,调制解调器将状态通过响应反映上来。
LAC及CI也可以从+CCED命令查询出来。
3、AT+COPS(运营商选择)
AT+COPS=? 返回网络上支持的运营商描述列表,可能的返回结果如下:
+COPS: (2,"中国联通","CUCC","46001",0),(3,"中国移动","CMCC","46000"),,(0-4),(0-2)
读指令:AT+COPS? 返回当前选择的模式和网络运营商,格式为:+COPS:<mode>[,<format>[,<oper>]]OK
可能的返回结果:+COPS: 0,0,"中国联通",0
写指令:AT+COPS=<mode>[,<format>[,<oper>]] 强制选择和注册GSM网络运营商,返回:OK
参数:
<stat> 0 不知道
1 可用的运营商
2 当前运营商
3 禁用的运营商
<oper> 运营商
<mode> 0 自动模式 <oper>被忽略
1 手动选择
2 从网络中手动注销
3 选择尽有有格式
4 手动或自动选择,如果手动失败,则自动使能
<format> 0 支持长字节格式,能升到16字节长
1 短字节格式
2 数字格式,
AT+CREG与AT+COPS结合使用事例:
AT+CREG=1//允许网络注册主动提供结果代码
AT+COPS=0//设置为自动模式
AT+COPS?//查询当前模式和网络运营商
4、AT+CSQ(读取信号强度)
返回+CSQ: 20.0之格式的信息,信号强度
5、AT+CMGF(设置短消息格式)
AT+CMGF=0 选择PDU格式,=1选择TEXT格式
6、AT+CMGS(发送短信)
若想发往13508485560,短消息内容为:“test“,则格式如下:
AT+CMGS="13508485560"(目的地址)回车 >test^z ;发送完号码后回车,符号”>”为系统返回,不是需要输入的符号。输入完短信内容后,按Ctrl+Z结束。
另一方面也可以发送命令AT+CMGS=6,即设置发送的短信的长度为6个。
7、AT+CSCA 设置短消息中心
AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。其中+861380不变,后四位是地区区号。这里显示0270表示地区为武汉,后三位基本不变为500)。
AT+CSCA?可以得到短信中心号码。
8、AT+CSQ?(查询信号强度)
三. 发送短信
开发环境是ARM11&linux。例子是飞凌的6410开发板,3G模块选中兴的AD3812,
短信的发送一般分为三种模式:Block Mode, Text Mode和PDUMode,其中blockmode已经很少使用。下面介绍的内容,是在PDUMode下发送和接收短消息的实现方法。text模式发送短信的时候比较简单,pdu模式相比而言的话要麻烦一下。具体使用那种模式,还要看你的需求,如果所要发送的短信内容全部是英文或者数字的话可以使用text模,如果你发送的短信中含有中文字符或者汉子的话就只能用pdu模式进行发送了。
我做的短信开发,发送的信息包含中文,而且接收的短信命令中也有中文,所以使用的是pdu模式。使用pdu模式发送短信的步骤如下:
(1)串口初始化。
(2)构建SMS的pdu串。
(3)设置短信发送模块的模式。
(4)使用AT指令发送pdu串到指定的手机号码。
下面对以上步骤进行详细的解释:
(1)串口初始化,串口的初始化要按照短信发送模块的默认来设置,我所使用的AD3812的说明书上明确指出 :115200,8,N,1,即传输速率是115200,数据位是8位,无奇偶校验位,一位停止位。
(2)构建SMS的pdu串。这一步是整个过程最主要的一步,关系到发送能否成功。首先要知道短信pdu串的组成,sms pdu串主要由9个部分组成,按照顺序分别为 SCA(servicecenter adress)服务中心的电话号码;pdu—type(protocoldata unit type):协议数据但与类型;MR(messagereference) 所有成功的sms—submit参考数目;OA (originatoradress)发送方sme(short-message-entity)的地址;DA(destination)接收方SME的地址;PID(ProtocolIdentifier)参数显示SMSC以何种方式处理SM;DCS(datacoding scheme)参数表示用户数据采用什么编码方案;SCTS(servicecenter time stamp)smsc接收到消息是的时间戳;UDL,用户数据长度;UD,用户要发送信息的内容。
(3)之前已经说过了,使用pdu模式,所以这一步其实就是告诉设备,我们使用的是pdu模式,对用的at指令是:AT+CMGF=0\r.注意:\r表示的是回车,指令后面必须跟有\r设备才能识别。
(4)第1-3搞定之后,剩下的就是告诉设备发送该短信了,具体的命令是AT+CMGS=%d\r,%d是一个正整数,该数的值与你发送短信的内容有关系,%d=15+2*发送的字符数。
现在根据我做的具体来说明过程,希望对你有帮助:
上面已经把我的软硬件环境说明了,下面重点说明短信的发送过程,我需要发送的短信内容是:江大科茂欢迎您!目的电话号码是18796082112,我使用是移动的sim卡。最后构建的sms pdu为:0891683108501105F011000D91688197062811F2000800166C5F592779D183026B228FCE60A8FF01
如上所示,其实整个sms pdu构建过程中,需要自己做的只有四处,分别是发送方的短信中心号码,目的手机号码,短信内容长度,短信内容的unicode码。其中紫色的为所在地的短信中心号码,因为我用的是镇江移动的号吗作为发送手机号,所以从网上就可以查到,对应的短信中心号是13800511500,需要按照前后位交换,最后一位补F进行重新排列。3108501105F0。红色的为目的手机号码,也需要进行重新排列。绿色的是短信的内容的长度具体计算方法为:短信内容的字符数*2,并要注意要以4位16进制表示。蓝色的为短信内容“江大科茂欢迎您!”的unicode吗,网上可以查到,这样就sms pdu就构建完成了。还需要特别提醒一下的是,在pdu构建完成,向设备写pdu串的时候不要忘记最后要添加ctrl+z,因为这是设备识别pdu串结束的标志。ctrl+z的assic码是0x1a。其中还要重点提一下就是 AT+CMGS=?的计算方法 15+短信字符数*2。具体的实现代码如下。
charsmstype[]="AT+CMGF=0\r";
charsmscmgs[]="AT+CMGS=31\r";
charpdu[]="0891683108501105F011000D91688197062811F2000800316C5F592779D183026B228FCE60A8FF01
\0x1a";
write(fd_usb,smstype,sizeof(smstype));
usleep(20000);
write(fd_usb,smscmgs,sizeof (smscmgs));
usleep(20000);
write(fd_usb,pdu_warn,sizeof(pdu_warn));
usleep(20000);
四. 开发其他功能,详细参见AT指令集
[3G/4G]3G/4G模块开发的更多相关文章
- Android与.Net交互模拟用户屏幕操作添加APN和网络4G/3G切换
前几天接到一个需求,我们的客户需要对手机网络接入点进行可用性测试,简单点说就是需要实现Android上的APN配置的添加,APN切换网络模式4G/3G/2G切换,我要调研下写个demo. 因为是要实现 ...
- STM32开发 -- 4G模块开发详解(转)
STM32开发 -- 4G模块开发详解(1) STM32开发 -- 4G模块开发详解(2) STM32开发 -- 4G模块开发详解(3) STM32开发 -- 4G模块开发详解(4)
- 迅为IMX6开发板支持4G全网通模块GPS模块
IMX6开发板特点 处理器:IMX6开发板支持4G全网通模块GPS模块. 核心板配置:2GB DDR3内存 16GB EMMC 存储,扩展引脚多达320个:运行温度-20 ℃到+80 ℃之间. 核心 ...
- Luatools v2烧录教程(适用于2G、4G Cat.1、4G Cat.4模块)
目录,可以根据需要直接点击跳转: 下载LuaTools工具 2G模块烧写教程(Air2xx系列.Air8xx系列) 连接模块 刷入AT版本的lod 刷入任意的lod固件 下载lua脚本文件 [4G 模 ...
- AngularJS多模块开发
angularJS中的多模块开发是指多个module模块开发,步骤为: 1. 确定主模块 var app=angular.module('myApp',[]); 2. 其他的子模块添加到主模块后 ...
- js模块开发(一)
现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是j ...
- seajs实现JavaScript 的 模块开发及按模块加载
seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...
- Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”
整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--模块开发
之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了大家的评论,有以下几个问题: 1.希望有更多的文档说明. 2.希望介绍下Orchard的 ...
- js 模块开发之一(模块开发价值)
首先引用我们的今天的主角 ----<前端模块化开发的价值> 1,前端开发最常见的两个问题 ---命名冲突和文件依赖 2,对于命名冲突的基本解决办法就是学习其他语言的习惯,添加命名空间 va ...
随机推荐
- 让MyEclipse支持mac的Retina屏解决字体模糊的问题
最近在使用MyEclipse时最让我头疼的问题就是MyEclipse并不能很好的支持苹果的Retina屏幕,看着字体会非常模糊,那叫一个心酸,真白瞎了这块好屏幕.(不知道最新的版本有没有支持,反正我的 ...
- asp.net三层架构详解(转)
摘自:http://www.cnblogs.com/cresuccess/archive/2008/12/10/1351675.html 一.数据库 ,) ) no ...
- HDUOJ-----1085Holding Bin-Laden Captive!
Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- 【LeetCode】18. 4Sum (2 solutions)
4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d ...
- 【LeetCode】49. Anagrams (2 solutions)
Anagrams Given an array of strings, return all groups of strings that are anagrams. Note: All inputs ...
- android离线地图源码
最近一直在玩Android手机,当然也忘不了在这个平台下搞些和地图相关的东西. Android手机自带了Google的地图软件,不过原来不支持离线浏览,所以很费流量,5.0版本以后可以支持离线浏览,需 ...
- go语言学习 ---iota
iota iota,特殊常量,可以认为是一个可以被编译器修改的常量. iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota ...
- RHEL6.4 多路径绑定
# rpm -qa | grep mapper #查看multipath是否安装 # lsmod | grep dm_multipath #查看multipath模块是否加载 # rpm -ivh | ...
- Linux内核(3) - 分析内核源码如何入手(下)
下面的分析,米卢教练说了,内容不重要,重要的是态度.就像韩局长对待日记的态度那样,严谨而细致. 只要你使用这样的态度开始分析内核,那么无论你选择内核的哪个部分作为切入点,比如USB,比如进程管理,在花 ...
- Codeforces Round #263 (Div. 2) proC
题目: C. Appleman and Toastman time limit per test 2 seconds memory limit per test 256 megabytes input ...