在前文Android——4.2 - 3G移植之路之 reference-ril .pppd 拨号上网 (三)中分析了3G连接网络的流程,当中有说道通过AT指令建立连接,

在这里记录一下3G中的AT通信.

撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/41083363

概念:

来自AT命令手冊中的概念例如以下:

TE

Terminal Equipment

终端设备 与DTE 等价 比方一个计算机

它是和信息网络的一端相接的可提供必要功能的设备 这些功能使得用户通过接入协议

能接入网络 如发送信息和接收信息 也可指由线路 电路 信道 数据链路的终端或起点组成的设备

TA

Terminal Adapter

终端适配器 与DCE 等价

提供终端适配功能的物理实体 是一种接口设备

DCE

Data Circuit terminating Equipment

数据电路终接设备

一种接口设备 在线路之间进行代码或信号转换 同数据终端设备实现接口 可以建立

保持和释放数据终端设备与传输数据线之间的连接

DTE

Data Terminal Equipment

数据终端设备

它具有向计算机输入和接收计算机输出的能力 与数据通信线路连接的通信控制能力以

及一定的数据处理能力

ME

Mobile Equipment

移动设备 比方GSM 话机就属于ME

移动台中的一种发射机或接收机或发射机与接收机二者的组合

MS

Mobile Station

移动台

在移动通信业务中 能够在移动中使用的通信站 包含车 船 载台便携台和手持机

AT

即Attention

AT 命令集是从TEDTETADCE  发送的 通过TA ,TE 发送AT 命令来控制MS  的功能 与GSM 网络业务进行交互

用户能够通过AT 命令进行呼叫 短信 电话本 数据业务 补充业务 传真等方面的控制

这里仅仅是应用到android设备(TE)与3G模块(TA)之间的通信

不同芯片的3G模块所支持的AT 指令集会有差异,详细须要查看相应规格书.

角色:

在前文 Android——RIL 机制源代码分析 中知道:

android电话系统的ril驱动文件文件夹是在源代码/hardware/ril下,当中包括:



rild— ril主体控制机制。



libril— ril与上层socket通信,



reference-ril— ril与serial设备AT指令通信



这三个目录,当中reference-ril是第三方驱动,依据不同的设备选择不同.

也就是说 AT 指令就是我们android 设备与 须要移植的第三方的3G设备之间的 终于通信的桥梁

详细实现存在与reference-ril文件里的atchannel.c 中,终于编译成第三方的动态库。

实现:

前文中知道当3G设备通过usb-modeswitch之后出现的/dev/ttyUSB*时,reference-ril.c中的mainLoop 就会检測到,然后跳出loop:

static void *mainLoop(void *param)
{
int fd;
int ret; ... else if (s_device_path != NULL) {
fd = open (s_device_path, O_RDWR);
if ( fd >= 0 && !memcmp( s_device_path, "/dev/tty", 8 ) ) { //能够看到这里的筛选
/* disable echo on serial ports */
struct termios ios;
tcgetattr( fd, &ios );
ios.c_lflag = 0; /* disable ECHO, ICANON, etc... */
if( cfsetispeed( &ios, B115200) != 0 )
ALOGE("Failed to set in speed");
if ( cfsetospeed( &ios, B115200) != 0 )
ALOGE("Failed to set out speed");
tcsetattr( fd, TCSANOW, &ios );
ALOGI("[%s] jscese _display in reference listener device insert path== %s \n",__func__,s_device_path); }
} if (fd < 0) {
perror ("opening AT interface. retrying...");
sleep(10);
/* never returns */
}
} s_closed = 0;
ret = at_open(fd, onUnsolicited); // 这里初始化,传了上面的设备的文件描写叙述符fd。打开 AT 返回值的读取 if (ret < 0) {
ALOGE ("AT error %d on at_open\n", ret);
return 0;
} RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0); //这里会调用到initializeCallback 函数进行初始化AT指令的发送 // Give initializeCallback a chance to dispatched, since
// we don't presently have a cancellation mechanism
sleep(1);
waitForClose();
ALOGI("Re-opening after close");
}
}

前文at_open 干了啥都有分析。这里就不提了。解析下initializeCallback函数:

/**
* Initialize everything that can be configured while we're still in
* AT+CFUN=0
*/
static void initializeCallback(void *param)
{
ATResponse *p_response = NULL;
int err; setRadioState (RADIO_STATE_OFF); at_handshake(); /* note: we don't check errors here. Everything important will
be handled in onATTimeout and onATReaderClosed */ /* atchannel is tolerant of echo but it must */
/* have verbose result codes */
at_send_command("ATE0Q0V1", NULL); //决定是否回显字符 ATE0就是不回显,ATE1反之 /* No auto-answer */
at_send_command("ATS0=0", NULL); //自己主动应答,非常明显这里不自己主动 /* Extended errors */
at_send_command("AT+CMEE=1", NULL); //报告移动设备的错误。这个命令决定同意或不同意用结果码 “+CME ERROR:<xxx>”或者 “+CMS ERROR:<xxx>”取代简单的“ERROR”。 /* Network registration events */
err = at_send_command("AT+CREG=2", &p_response); //网络注冊。获得手机的注冊状态 ALOGI("[%s] jscese AT Network registration events err== %d \n",__func__,err); /* some handsets -- in tethered mode -- don't support CREG=2 */
if (err < 0 || p_response->success == 0) {
at_send_command("AT+CREG=1", NULL);
} at_response_free(p_response); /* GPRS registration events */
at_send_command("AT+CGREG=1", NULL); //初始化GPRS模块 /* Call Waiting notifications */
at_send_command("AT+CCWA=1", NULL); //呼叫等待 /* Alternating voice/data off */
at_send_command("AT+CMOD=0", NULL); // 配置交替模式呼叫 single mode
... #endif /* USE_TI_COMMANDS */ /* assume radio is off on error */
if (isRadioOn() > 0) {
setRadioState (RADIO_STATE_SIM_NOT_READY);
}
ALOGI("[%s] jscese ============= AT INIT OVER =============\n",__func__);
}

能够看到AT指令的组成 大部分使用 AT+*** 组成,详细支持那些AT指令,须要看相应芯片的AT手冊,那样才是最权威可靠的由于不同厂家的会有出入,并且另一些自己定义AT指令。

atchannel.c中实现at_send_command ,终于调用到的地方:

**
* Internal send_command implementation
* Doesn't lock or call the timeout callback
*
* timeoutMsec == 0 means infinite timeout
*/ static int at_send_command_full_nolock (const char *command, ATCommandType type,
const char *responsePrefix, const char *smspdu,
long long timeoutMsec, ATResponse **pp_outResponse)
{
int err = 0; ... err = writeline (command); //写命令,上面有提到。往初始化AT时传进来的fd,我这里也就是dev/ttyUSB2 ... sp_response = at_response_new(); //置空 全局的response,这个指针由processLine(line)函数引导去维护。processLine用来处理at_open 时开启的readerLoop 中读取到的response ... while (sp_response->finalResponse == NULL && s_readerClosed == 0) { //等待一下 response
if (timeoutMsec != 0) {
#ifdef USE_NP
err = pthread_cond_timeout_np(&s_commandcond, &s_commandmutex, timeoutMsec);
#else
err = pthread_cond_timedwait(&s_commandcond, &s_commandmutex, &ts);
#endif /*USE_NP*/
} else {
err = pthread_cond_wait(&s_commandcond, &s_commandmutex);
} if (err == ETIMEDOUT) {
err = AT_ERROR_TIMEOUT;
goto error;
}
} if (pp_outResponse == NULL) {
at_response_free(sp_response);
} else {
/* line reader stores intermediate responses in reverse order */
reverseIntermediates(sp_response);
*pp_outResponse = sp_response;
} sp_response = NULL; // 重置 ... } }

再往下终于就能够看到 write 以及 read 代表设备文件/dev/ttyUSB* 的fd了.

shell调试:

可使用 cat /dev/ttyUSB*  &

查询这个设备文件的值

echo “AT+**”  > /dev/ttyUSB*   写入指令

我经常使用到的调试指令:

echo  “AT” > /dev/ttyUSB*

看是否返回OK 代表AT 正常连通

echo  “AT+CGMI” > /dev/ttyUSB*

这个会返回模块厂商信息。我调试的华为的。就返回 huawei

echo “AT+CPIN?” > /dev/ttyUSB*

查询SIM卡状态,一般返回 +CPIN:READY  OK 代表正常

echo  “AT+CREG?” > /dev/ttyUSB*

查询网络注冊情况,一般返回样式:+CREG:<n>,<stat>

n , stat 代表含义详细可參考手冊。huawei这边的:

<n>:

0(开机默认值) 禁止+CREG 的主动上报。

1 使能+CREG:<stat>的主动上报。

不带<n>等同于<n>为 0。

<stat>:

0 没有注冊,MT 如今并没有在搜寻要注冊的新的运营商。

1 注冊了本地网络。

2 没有注冊,但 MT 正在搜寻要注冊的新的运营商。

3 注冊被拒绝。

4 注冊了漫游网络。

5 未知状态。

命令非常多,不一一列举,详细可參照手冊发命令调试~

Android——4.2 - 3G移植之路之 AT 通信 (四)的更多相关文章

  1. Android——4.2 - 3G移植之路之 APN (五)

    APN,这东西对于刚接触的人来说并非那么好理解.对于3G移植上网不可缺少,这里记录一下. 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/detail ...

  2. Android——4.2 - 3G移植之路之 reference-ril .pppd 拨号上网 (三)

    Android的RIL机制中的 reference-ril.c 即为厂商提供的驱动接口.这个驱动源代码各个厂商都是有提供的,网上也有下载.我如今用的就是huawei wcdma的.最后编译成libre ...

  3. 基于MT6752/32平台 Android L版本驱动移植步骤

    基于MT6752/32平台 Android L版本驱动移植步骤 根据MK官网所述,在Android L 版本上Turnkey ABS 架构将会phase out,而Mediatek Turnkey架构 ...

  4. Android Vector曲折的兼容之路

    Android Vector曲折的兼容之路 两年前写书的时候,就在研究Android L提出的Vector,可研究下来发现,完全不具备兼容性,相信这也是它没有被广泛使用的一个原因,经过Google的不 ...

  5. Android wifi驱动的移植 realtek 8188

    Android wifi驱动的移植 一般我们拿到的android源代码中wifi应用层部分是好的, 主要是wifi芯片的驱动要移植并添加进去. wifi驱动的移植, 以realtek的8188etv为 ...

  6. Android程序员的进阶之路

    本文主要论述的是Android程序员的进阶之路,博主本人就是一名android开发攻城狮,所以这里讲述的大多数是android开发攻城狮的技术进阶之路,如有问题请多指正. 大家都知道程序员之中有有菜鸟 ...

  7. Android安卓书籍推荐《Android驱动开发与移植实战详解》下载

    百度云下载地址:点我 Android凭借其开源性.优异的用户体验和极为方便的开发方式,赢得了广大用户和开发者的青睐,目前已经发展成为市场占有率很高的智能手机操作系统. <Android驱动开发与 ...

  8. Android模拟器的ip获取以及模拟器之间socket通信

    Android模拟器的ip获取以及模拟器之间socket通信           http://kalogen.iteye.com/blog/1565507 作者:李波 实现网络五子棋时用到了两个设备 ...

  9. Python之路【第十四篇】:AngularJS --暂无内容-待更新

    Python之路[第十四篇]:AngularJS --暂无内容-待更新

随机推荐

  1. hiho 1620 - 股票价格3 - 无限制的单调队列?

    题目链接 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 小Hi想知道,对于第i天的股票价格Ai,几天之后股价会第一次超过Ai. 假设A=[69, 73, 6 ...

  2. 此请求的查询字符串的长度超过配置的 maxQueryStringLength 值

    异常详细信息: System.Web.HttpException: 此请求的查询字符串的长度超过配置的maxQueryStringLength 值. 我碰到此问题出现的原因是重写了HttpModule ...

  3. ftp 一个账号多个家目录的解决方案

    通常,配置ftp时,一个ftp账号只对应一个家目录,不能有多个家目录的情况. 但是,根据公司开发项目的需求,需要做到一个ftp对应多个开发目录.有想过创建软链接的,可是发现通过ftp是访问不了的. 举 ...

  4. 集合(set)的基本操作

    集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 集合中的元素必须是不可变类型 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 a = se ...

  5. 《剑指Offer》——试题1:赋值运算符函数

    题目:如下类型为CMyString的声明,请为该类型添加赋值运算符函数.   class CMyString { public: CMyString(char* pData = NULL); CMyS ...

  6. mysql 修改默认的引擎

      需求: mysql 的默认的引擎为MyISAM  虽然该引擎访问的速度快,但并不支持存储事物,也不支持外键,所以我们修改为innob Linux修改MySql默认存储引擎为InnoDB     一 ...

  7. 安装 glusterfs yum源报错

    yum install glusterfs-server yum 一直报错 把/etc/yum.repos.d 备份 删除了所有文件,从测试机192..168.59.128上同步过来 一直报错 已加载 ...

  8. JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候,去了一家公司面试,面试官现场考了我这道题,我记忆深刻,当时没有想到思路,毫无疑问被面试官当成菜鸟了.最近刚好在研究数组的各种算法实现,就想到这道题,可以拿来实现一下,纪 ...

  9. 微信小程序踩坑记

    1:微信小程序之去掉横向滑动滚动条 /** 去除横向滚动条 */ ::-webkit-scrollbar { width: 0; height: 0; color: transparent; } 2: ...

  10. UILite-MFC/WTL/DirectUI界面库

    之前写了UILite库介绍: http://blog.csdn.net/zhangzq86/article/details/9093945 如今UILite库能够使用git訪问了: https://g ...