gprs模块http mqtt_GPRS模块用TCP实现MQTT协议(基于SIM900A)

本文介绍了如何使用SIM900A GPRS模块通过TCP连接到服务器,并实现MQTT协议的连接、消息发布和订阅。代码中包含了连接服务器、构建MQTT连接包、发布消息和订阅主题的函数。
摘要由CSDN通过智能技术生成

mqtt部分:

int strlen(char *str)

{

int len = 0;

while (*str != '\0') {

len++;

str++;

}

return len;

}

// **********************************

// * *

// * 根据主机地址和端口号连接服务器 *

// * *

// **********************************

void tcp_connect(char *host,int port)

{

uart_send_str("AT\r\n");

uart_send_str("AT+CPIN? \r\n");

seelp(500);

uart_send_str("AT+CREG? \r\n");

seelp(500);

uart_send_str("AT+CGATT? \r\n");

seelp(500);

uart_send_str("AT+CSTT=\"CMNET\" \r\n");

seelp(500);

uart_send_str("AT+CIICR \r\n");

seelp(1500);

uart_send_str("AT+CIFSR \r\n");

seelp(1000);

uart_send_str("AT+CIPSTART=\"TCP\"\,\"23.106.139.167\"\,\"1883\" \r\n"); //连接TCP Server 8081 1883

}

// *************************

// * *

// * 构建MQTT连接包 *

// * *

// *************************

int baseIndex;

int mqtt_connect_message(unsigned char *mqtt_message,char *client_id,char *username,char *password)

{

char i = 0;

char client_id_length = strlen(client_id);

int username_length = strlen(username);

int password_length = strlen(password);

int packetLen = 12 + 2 + client_id_length + 2 + username_length + 2 + password_length;

mqtt_message[0] = 16; // MQTT Message Type CONNECT

mqtt_message[1] = packetLen%256;

baseIndex = 2;

if( packetLen >127 ){//

mqtt_message[2] = 1;//packetLen/127;

baseIndex = 3;

}

mqtt_message[baseIndex] = 0; // Protocol Name Length MSB

mqtt_message[baseIndex+1] = 6; // Protocol Name Length LSB

mqtt_message[baseIndex+2] = 77; // ASCII Code for M

mqtt_message[baseIndex+3] = 81; // ASCII Code for Q

mqtt_message[baseIndex+4] = 73; // ASCII Code for I

mqtt_message[baseIndex+5] = 115; // ASCII Code for s

mqtt_message[baseIndex+6] = 100; // ASCII Code for d

mqtt_message[baseIndex+7] = 112; // ASCII Code for p

mqtt_message[baseIndex+8] = 3; // MQTT Protocol version = 3

mqtt_message[baseIndex+9] = 194; // conn flags

mqtt_message[baseIndex+10] = 0; // Keep-alive Time Length MSB

mqtt_message[baseIndex+11] = 60; // Keep-alive Time Length LSB

mqtt_message[baseIndex+12] = 0; // Client ID length MSB

mqtt_message[baseIndex+13] = client_id_length; // Client ID length LSB

baseIndex += 14;

// Client ID

for(i = 0; i < client_id_length; i++){

mqtt_message[baseIndex + i] = client_id[i];

}

baseIndex = baseIndex+client_id_length;

//username

mqtt_message[baseIndex] = 0; //username length MSB

mqtt_message[baseIndex+1] = username_length; //username length LSB

baseIndex = baseIndex+2;

for(i = 0; i < username_length ; i++){

mqtt_message[baseIndex + i] = username[i];

}

baseIndex = baseIndex + username_length;

//password

mqtt_message[baseIndex] = 0; //password length MSB

mqtt_message[baseIndex+1] = password_length; //password length LSB

baseIndex = baseIndex + 2;

for(i = 0; i < password_length ; i++){

mqtt_message[baseIndex + i] = password[i];

}

baseIndex += password_length;

return baseIndex;

}

int mqtt_publish_message(unsigned char *mqtt_message, char * topic, char * message) {

//mqtt_message = 0;

unsigned char i = 0;

unsigned char topic_length = strlen(topic);

unsigned char message_length = strlen(message);

mqtt_message[0] = 48; // MQTT Message Type CONNECT

mqtt_message[1] = 2 + topic_length + message_length; // Remaining length

mqtt_message[2] = 0; // MQTT Message Type CONNECT

mqtt_message[3] = topic_length; // MQTT Message Type CONNECT

// Topic

for(i = 0; i < topic_length; i++){

mqtt_message[4 + i] = topic[i];

}

// Message

for(i = 0; i < message_length; i++){

mqtt_message[4 + topic_length + i] = message[i];

}

return 4 + topic_length + message_length;

}

int subindex = 0;

int mqtt_subscribe_message(unsigned char *mqtt_message,unsigned char *topic)

{

unsigned char topic_len = strlen(topic);

mqtt_message[0] = 130;

mqtt_message[1] = topic_len+5;

mqtt_message[2] = 0;

mqtt_message[3] = 1;

mqtt_message[4] = 0;

mqtt_message[5] = topic_len;

for (subindex=0; subindex

mqtt_message[6+subindex] = topic[subindex];

}

mqtt_message[topic_len+6+1] = 0;

return topic_len+7;

}

mqtt部分:

intstrlen(char*str)

{

intlen = 0;

while(*str !='\0') {

len++;

str++;

}

returnlen;

}

// **********************************

// *                                *

// * 根据主机地址和端口号连接服务器 *

// *                                *

// **********************************

voidtcp_connect(char*host,intport)

{

uart_send_str("AT\r\n");

uart_send_str("AT+CPIN? \r\n");

seelp(500);

uart_send_str("AT+CREG? \r\n");

seelp(500);

uart_send_str("AT+CGATT? \r\n");

seelp(500);

uart_send_str("AT+CSTT=\"CMNET\" \r\n");

seelp(500);

uart_send_str("AT+CIICR \r\n");

seelp(1500);

uart_send_str("AT+CIFSR \r\n");

seelp(1000);

uart_send_str("AT+CIPSTART=\"TCP\"\,\"23.106.139.167\"\,\"1883\" \r\n");//连接TCP Server  8081 1883

}

// *************************

// *                       *

// *  构建MQTT连接包       *

// *                       *

// *************************

intbaseIndex;

intmqtt_connect_message(unsignedchar*mqtt_message,char*client_id,char*username,char*password)

{

chari = 0;

charclient_id_length = strlen(client_id);

intusername_length = strlen(username);

intpassword_length = strlen(password);

intpacketLen = 12 + 2 + client_id_length + 2 + username_length + 2 + password_length;

mqtt_message[0] = 16;                      // MQTT Message Type CONNECT

mqtt_message[1] = packetLen%256;

baseIndex = 2;

if( packetLen >127 ){//

mqtt_message[2] = 1;//packetLen/127;

baseIndex = 3;

}

mqtt_message[baseIndex] = 0;                       // Protocol Name Length MSB

mqtt_message[baseIndex+1] = 6;                       // Protocol Name Length LSB

mqtt_message[baseIndex+2] = 77;                      // ASCII Code for M

mqtt_message[baseIndex+3] = 81;                      // ASCII Code for Q

mqtt_message[baseIndex+4] = 73;                      // ASCII Code for I

mqtt_message[baseIndex+5] = 115;                     // ASCII Code for s

mqtt_message[baseIndex+6] = 100;                     // ASCII Code for d

mqtt_message[baseIndex+7] = 112;                     // ASCII Code for p

mqtt_message[baseIndex+8] = 3;                      // MQTT Protocol version = 3

mqtt_message[baseIndex+9] = 194;                   // conn flags

mqtt_message[baseIndex+10] = 0;                      // Keep-alive Time Length MSB

mqtt_message[baseIndex+11] = 60;                     // Keep-alive Time Length LSB

mqtt_message[baseIndex+12] = 0;                      // Client ID length MSB

mqtt_message[baseIndex+13] = client_id_length;       // Client ID length LSB

baseIndex += 14;

// Client ID

for(i = 0; i 

mqtt_message[baseIndex + i] = client_id[i];

}

baseIndex = baseIndex+client_id_length;

//username

mqtt_message[baseIndex] = 0;                      //username length MSB

mqtt_message[baseIndex+1] = username_length;       //username length LSB

baseIndex = baseIndex+2;

for(i = 0; i 

mqtt_message[baseIndex + i] = username[i];

}

baseIndex = baseIndex + username_length;

//password

mqtt_message[baseIndex] = 0;                      //password length MSB

mqtt_message[baseIndex+1] = password_length;       //password length LSB

baseIndex = baseIndex + 2;

for(i = 0; i 

mqtt_message[baseIndex + i] = password[i];

}

baseIndex += password_length;

returnbaseIndex;

}

intmqtt_publish_message(unsignedchar*mqtt_message,char* topic,char* message) {

//mqtt_message = 0;

unsigned chari = 0;

unsigned chartopic_length = strlen(topic);

unsigned charmessage_length = strlen(message);

mqtt_message[0] = 48;                                  // MQTT Message Type CONNECT

mqtt_message[1] = 2 + topic_length + message_length;   // Remaining length

mqtt_message[2] = 0;                                   // MQTT Message Type CONNECT

mqtt_message[3] = topic_length;                        // MQTT Message Type CONNECT

// Topic

for(i = 0; i 

mqtt_message[4 + i] = topic[i];

}

// Message

for(i = 0; i 

mqtt_message[4 + topic_length + i] = message[i];

}

return4 + topic_length + message_length;

}

intsubindex = 0;

intmqtt_subscribe_message(unsignedchar*mqtt_message,unsignedchar*topic)

{

unsigned chartopic_len = strlen(topic);

mqtt_message[0] = 130;

mqtt_message[1] = topic_len+5;

mqtt_message[2] = 0;

mqtt_message[3] = 1;

mqtt_message[4] = 0;

mqtt_message[5] = topic_len;

for(subindex=0; subindex

mqtt_message[6+subindex] = topic[subindex];

}

mqtt_message[topic_len+6+1] = 0;

returntopic_len+7;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值