1、状态机机制的gprs拨号

像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时。

所以用 状态机 + 超时 的机制来实现比较合理。

如下代码片段来描述数据透传 : 状态机 + 超时 这种机制(代码片段,仅用来描述一种思路)

以下程序是在没有操作系统调度机制下调试的,所以超时用的心跳,如果是linux下,有sleep更方便。

#include <stdio.h>
#include <string.h>
#include <stdlib.h> #define SERVER_IP "115.29.140.xxx"
#define SERVER_PORT "8082" #define BUFF_LEN 64
char aUart5RxBuffer[BUFF_LEN]; static int gprs_init_ok= ;
static int ppp_config_ok = ; void gprs_init(void)
{
if((strstr(aUart5RxBuffer, "command ready") == NULL)
/*||(strstr(aUart5RxBuffer, "+SIM READY") == NULL)*/)
{
gprs_init_ok = ;
}
else
{
gprs_init_ok = ;
} } void reset_gprs(void)
{
memset(aUart5RxBuffer, , BUFF_LEN);
gprs_init_ok= ;
ppp_config_ok = ;
//reset 3g module;
} void ppp_config(void)
{
static uint32_t ppp_config_step = ;
static uint32_t gprs_tick = ; switch (ppp_config_step)
{
case :
gprs_puts("AT+GTSET=\"LPMMODE\",0\r\n");
gprs_tick = msTicks;
ppp_config_step = ;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "OK") == NULL)
{
ppp_config_step = ;
}
else
{
ppp_config_step = ; }
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
gprs_puts("AT+CPIN?\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if((strstr(aUart5RxBuffer, "OK") == NULL) || (strstr(aUart5RxBuffer, "+CPIN: READY") == NULL))
{
ppp_config_step = ;
}
else
{
ppp_config_step = ; }
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
gprs_puts("AT+CSQ\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "OK") == NULL)
{
ppp_config_step = ;
}
else
{
ppp_config_step = ;
}
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
gprs_puts("AT+CREG?\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "+CREG: 0,0") == NULL)
{
ppp_config_step = ;
}
else
{
ppp_config_step = ;
}
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; case :
//gprs_puts("AT+MIPCALL=1,\"3GNET\"\r\n");
gprs_puts("AT+MIPCALL=1,\"xagfzqx.ydoa.snapn\"\r\n");
ppp_config_step = ;
gprs_tick = msTicks;
break;
case :
if((msTicks - gprs_tick) > )
{
if(strstr(aUart5RxBuffer, "+MIPCALL: 0") == NULL)
{
ppp_config_step = ;
ppp_config_ok = ;
}
else
{
ppp_config_step = ;
}
memset(aUart5RxBuffer, , BUFF_LEN);
}
break; default:
break;
} } void http_Send_test(char *data)
{
static unsigned char http_send_step = ;
static int send_err_cnt = ; switch (http_send_step)
{
case :
memset(data_tx_buf, , sizeof(data_tx_buf));
strcat(data_tx_buf, data);
gprs_puts("GET /app/pulse-wave/commit?");
gprs_puts("%s",data_tx_buf);
gprs_puts("\r\n"); http_send_step = ;
gprs_tick = msTicks; break; case : if((strstr(aUart5RxBuffer, "{\"msg\":\"commit pulse-wave data success.\",\"result\":true}") != NULL)
&&(strstr(aUart5RxBuffer, "+MIPSTAT: 1,1") != NULL)
&&((msTicks - gprs_tick) < ))
{ }
else
{
if(++send_err_cnt > ) {
reset_gprs();
send_err_cnt = ;
} }
     
     memset(aUart5RxBuffer, 0, BUFF_LEN);   
        http_send_step = ;              

        break;                                              

    default:
break; }
} void main(void)
{
while()
{
if(!gprs_init_ok) { gprs_init(); } if((gprs_init_ok)&&(!ppp_config_ok)) { ppp_config(); } if(ppp_config_ok) { http_Send_test("hello,world"); }
}
}

初始化成功了就可以传输数据了,数据发送和接收都跟串口一样。主要工作都在初始化 ,和异常修复机制的实现。因为网络传输每一步都可能会失败,而且外部因素太多,所以异常修复机制尤其重要。

2、用开源的ppp/pppoe指令拨号也一样

end

GPRS/3G的更多相关文章

  1. GSM/GPRS/3G/4G

    1.状态机机制的gprs拨号 像GPRS/3G模块之类的应用,需要连接,登陆,初始化等步骤完成后才能传输数据,而这些步骤又比较耗时. 所以用 状态机 + 超时 的机制来实现比较合理. 如下代码片段来描 ...

  2. 4G DTU比GPRS/3G DTU的优势

    4G DTU一般来说是采用电脑和数据线连接来进行参数设置的,为了适应不同的工作环境,提高工作的效率,成都远向电子4G DTU还支持远程参数配置和远程固件升级,只需一部手机即可轻松完成操作.今天我们就来 ...

  3. CDMA,GPRS,3G有什么区别

    1 CDMA: 我们常说的CDMA 是IS-95A CDMA的简称 ,属于第二代通信技术(2G)的一种,属于北美的技术.另一种技术是GSM,属于欧洲的技术.这两种实现的原理不同,各有各的优点: 2 G ...

  4. 触屏手机3G网站设计

    随着智能手机iphone和Android的热潮,衍生出基于Safari和Chrome浏览器的触屏手机网站Touch Screen Mobile Website. 触屏手机网站在中国还属于起步阶段,从行 ...

  5. GPRS RTU设备OPC Server接口C# 实现

    通过本OPC Server程序接口可为用户提供以OPC标准接口访问远程GPRS/3G/以太网 RTU设备实时数据的方式.从而方便实现GPRS/3G/以太网 RTU设备与组态软件或DCS系统的对接.本程 ...

  6. 连锁机构3D指纹考勤系统解决方案

    信息技术的高速发展加速了商业零售业连锁经营的信息化和全球化的进程,同时也推动了商业管理的变革.尽管人们对它的认识是被动与滞后的,但这种变革依然伴随着商业业态的转变和信息技术的发展或快或慢地在悄然进行着 ...

  7. 【openwrt】再设置

    https://wiki.openwrt.org/zh-cn/doc/uci/network https://wiki.openwrt.org/zh-cn/doc/uci/wireless https ...

  8. android network develop(2)----network status check

    Check & Get network status Normally, there will be two type with phone network: wifi & mobil ...

  9. 技术分析:Femtocell家庭基站通信截获、伪造任意短信

    阿里移动安全团队与中国泰尔实验室无线技术部的通信专家们一起,联合对国内运营商某型Femtocell基站进行了安全分析,发现多枚重大漏洞,可导致用户的短信.通话.数据流量被窃听.恶意攻击者可以在免费申领 ...

随机推荐

  1. Java 日期比较以及得到前后一天

    /** * 比较两个指定时间,结果为0 表示相同,< 0 则表示第一个时间早于第二个时间 * @param firstDay * @param secondDay * @return */ pu ...

  2. CGCDSSQ

    这道题很妙啊.其实我们可以发现重要的不是起点和终点,重要的是个数,然后脑洞一下,可以递推.(我什么都没有想出来)假设我们已经知道了前面所有子串的gcd,那么我们可以用现在的a[i]和前面每个数求gcd ...

  3. Android Studio-目录结构

    新建工程项目后AS的Product目录结构如下所示: .idea://AS生成的工程配置文件,类似Eclipse的project.properties. app://AS创建工程中的一个Module. ...

  4. 让script的type属性等于text/html

    type属性为text/html的时候,<script>片断中定义一个被JS调用的代码,代码不会在页面上显示 <script id="commentTemplate&quo ...

  5. Core Foundation框架

    转载自:http://blog.csdn.net/weiwangchao_/article/details/7744972 Core Foundation框架 (CoreFoundation.fram ...

  6. Python3 连接Mysql

    代码: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @file: mysql_test. ...

  7. [bzoj2517]矩形覆盖

    Description 给定一个$l\;\times\;w$的矩形,和$n$个圆,求最小的$k$使得每个圆的半径$\;\times\;k$后,能覆盖整个矩形. Input 第一行一个整数$T$,表示数 ...

  8. 【BZOJ-1391】order 最小割 + 最大全闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1334  Solved: 405[Submit][Statu ...

  9. npm下载包时代理配置

    主要有两种方式,1通过命令行临时配置,2通过配置文件进行永久配置. 1.命令行: npm install --proxy http://localhost:1080 如果有账号密码等验证的,需要在后面 ...

  10. Android成长日记-Android监听事件的方法

    1. Button鼠标点击的监听事件 --setOnClickListener 2. CheckBox, ToggleButton , RadioGroup的改变事件 --setOnCheckedCh ...