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. Apache启动提示 httpd: apr_sockaddr_info_get() failed for xxx

    httpd: apr_sockaddr_info_get() failed for xxx httpd: Could not reliably determine the server's fully ...

  2. Js-动态控制table的tr、td增加及删除的具体实现

    <table id='wifi_clients_table' style="color:#0099CC;font-size:12px;" class="table ...

  3. Maven-setting.xml详解

    settings.xml对于maven来说相当于全局性的配置,用于所有的项目,当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用set ...

  4. WordPress的have_posts()和the_post()用法解析

    原文地址:http://www.phpvar.com/archives/2316.html 网上找到一篇介绍WordPress的have_posts()和the_post()用法解析的文章,觉得不错! ...

  5. mysql通过sql语句如何批量去掉某一个表中某一个字段的下面的相同部分字符串

    今天用Excel导入的数据中,前面包含` 批量去除 UPDATE  sheet2 set total=replace(total,'`','');

  6. extract()函数

    extract(),它的主要作用是将数组展开,键名作为变量名,元素值为变量值 extract($_POST);//相当于$username = $_POST['username'];//$passwo ...

  7. iOS蓝牙开发(一)蓝牙相关基础知识(转)

    转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad , ...

  8. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

  9. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  10. BZOJ4548 小奇的糖果

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...