图4.3 TCP连接相关设置
图4.3 监听端检测到请求连接成功
步骤二:通过串口发送相应AT命令控制SIM900A模块进行TCP连接。此处需要进行GPRS模块工作的相关设置,设置网络,设置协议,设置接入点等等,并向对方IP发起连接。相关AT命令解释详见表2。当监听端收到GPRS模块端发来的连接请求,进行连接,连接成功后可以在监听端观察到GPRS模块所获得的临时IP地址117.136.5.217(该地址为辽宁移动所有)。
AT命令AT+CGCLASS=\命令解释GPRS移动台类别,B代表终端支持包交换和数据交换将终端附着GPRS业务设置为GPRS连接模式建立TCP连接,参数为对方IP与端口号发送数据 AT+CGDCONT=1,\定义PDP上下文,设置互联网协议,接入点AT+CGATT=1AT+CIPCSGP=1,\AT+CIPSTART=\67.200\AT+CIPSEND 表2 TCP数据传输相关设置命令 19
图4.4 数据发送成功
步骤三:发送数据。在此,我们发送数据“This is a test for Mobile communication technology!”,在接收端可以看见,收到了该数据,从而实现了TCP数据传输。数据传输完毕发送AT命令:AT+CIPCLOSE断开连接,结束传输过程。
此外,本人进行了单片机与SIM900A模块通信的实验,单片机控制SIM900A发送数据,连续发送一天,经过实验结果证明,TCP数据传输有效性基本为100%,由于数据量巨大,在此不予列举。仅提供实验程序,详见附录1。
20
附录1:CC2430控制SIM900A实现TCP相关主要程序
#include
//建立tcp连接
/*
//关闭tpc连接 void AT_CLOSE() {
halUart0SendData(\}
//发送数据
void AT_CIPSEND(BYTE* text) {
BYTE len=strlen(text);
halUart0SendData(\ halUart0SendData(text,len); halUart0SendData(\ }
//查询数据传输状态 void AT_CIPACK() {
halUart0SendData(\ACK\\r\\n\}
//设置本地端口
void AT_CLPORT(BYTE a) {
BYTE b = strlen(a);
halUart0SendData(\\,16);
halUart0SendData(a,b);
halUart0SendData(\
21
}
//激活移动场景 void AT_CIICR() {
halUart0SendData(\ }
//关闭移动场景 void AT_CIPSHUT() {
halUart0SendData(\ }
//获得本地ip void AT_CIFSR() {
halUart0SendData(\}
//查询连接状态
void AT_CIPSTATUS() {
halUart0SendData(\); }
//配置域名服务器DNS
void AT_CDNSCFG(BYTE* dns) {
BYTE a = strlen(dns);
halUart0SendData(\ halUart0SendData(dns,a); halUart0SendData(\}
//域名解析
void AT_CDNSGIP(BYTE* domain) {
BYTE a=strlen(domain);
halUart0SendData(\ halUart0SendData(domain,a); halUart0SendData(\}
//设置自动发送时间(0未设置, 1设置;time 001-100,)
void AT_CIPATS_NotAutoSend(BYTE mode) {
halUart0SendData(\ halUart0SendData(mode,1); halUart0SendData(\}
void AT_CIPATS(BYTE mode,BYTE time) {
halUart0SendData(\ halUart0SendData(mode,1); halUart0SendData(time,3); halUart0SendData(\}
//配置为服务器(0关闭,1开启; port 00001-65535)
void AT_CIPSERVER_CloseServer(BYTE mode) {
halUart0SendData(\ halUart0SendData(mode,1); halUart0SendData(\}
void AT_CIPSERVER(BYTE mode,BYTE port)
{
halUart0SendData(\
halUart0SendData(mode,1); halUart0SendData(port,5); halUart0SendData(\}
//配置tcpip应用模式(0 非透明,1 透明) void AT_CIPMODE(BYTE mode)
{
halUart0SendData(\ halUart0SendData(mode,1); halUart0SendData(\}
//配置透明传输模式(NmRetry 3-8, 2-10,SendSz 0001-1460,esc 0-1)
void AT_CIPCCFG(BYTE NmRetry,BYTE WaitTm,BYTE SendSz,BYTE esc) {
halUart0SendData(\ halUart0SendData(NmRetry,1); halUart0SendData(\ halUart0SendData(WaitTm,1); halUart0SendData(\
halUart0SendData(SendSz ,4); halUart0SendData(\ halUart0SendData(esc,1); halUart0SendData(\}
//中断通话 void ATH() {
if(strcmp(buf,\ {
halUart0SendData(\ } }
*/
#include \
void halUart0Init(UINT32 baudrate) {
IO_PER_LOC_UART0_AT_PORT0_PIN2345();
22
// baudrate should be checked before calling UART_SETUP
// but I havn't done it yet --by allbone UART_SETUP(0, baudrate, 0); // Enable receive U0CSR |= RE; }
void halUart1Init(UINT32 baudrate) {
IO_PER_LOC_UART1_AT_PORT1_PIN4567(); UART_SETUP(1, baudrate, 0); // Enable receive U1CSR |= RE; }
void uart485_Init(void)
{
IO_PER_LOC_UART1_AT_PORT1_PIN4567(); IO_DIR_PORT_PIN(2, 0, IO_OUT);
UART_SETUP(1, 2400, 0x18);//波特率2400,奇校验,停止位高低电平均可 // Enable receive U1CSR |= RE; }
void halUart0SendData(BYTE* txbuf, BYTE len) {
BYTE i;
for(i=0;i { UART0_SEND(*(txbuf+i)); while( U0CSR & COM_TX_ACTIVE ); } } void halUart1SendData(BYTE* txbuf, BYTE len) { BYTE i; 23 for(i=0;i UART1_SEND(*(txbuf+i)); while( U1CSR & COM_TX_ACTIVE ); } } #include \#include \ void sim900a_on(void)//1MHz { P1_7 = 0; halWait(25); P1_7 = 1; halWait(255); halWait(255); halWait(255); halWait(255); P1_7 = 0; } void AT_CIPSTART(void) { halUart0SendData(\ART=\\\\\\} BYTE resdata[70]; uint8 resdataidx; /************主函数部分********/ main() { BYTE stringlen; halInit();//硬件初始化函数 sim900a_on(); resdataidx=0; for(uint8 i=0;i<100;i++) { halWait(200); } halUart0Init(9600); halWait(200); resdataidx=0; halUart0SendData(\ halWait(10); stringlen = strlen((char *)AT_at); halUart0SendData(\ halWait(10); stringlen = strlen((char *)AT_cgclass); halUart0SendData(AT_cgclass,stringlen); halWait(10); stringlen = strlen((char *)AT_cgdcont); halUart0SendData(AT_cgdcont,stringlen); halWait(10); stringlen = strlen((char *)AT_cgatt); halUart0SendData(AT_cgatt,stringlen); halWait(10); stringlen = strlen((char *)AT_cipcsgp); halUart0SendData(AT_cipcsgp,stringlen); halWait(10); stringlen = strlen((char *)AT_cipstart); halUart0SendData(AT_cipstart,stringlen); // halWait(20); //halUart0SendData(\ //halWait(20); // AT_CIPSTART(); //sim900a_on(); while(1) {} } 24