GPRS模块用TCP实现MQTT协议(基于SIM900A)
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<topic_len; subindex++) {
mqtt_message[6+subindex] = topic[subindex];
}
mqtt_message[topic_len+6+1] = 0;
return topic_len+7;
}
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<topic_len; subindex++) {
- mqtt_message[6+subindex] = topic[subindex];
- }
- mqtt_message[topic_len+6+1] = 0;
- return topic_len+7;
- }
GPRS模块用TCP实现MQTT协议(基于SIM900A)的更多相关文章
- GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机
GSM/GPRS芯片是手机中负责收发短信.拨打电话以及访问GPRS网络的核心器件.有方M660+为深圳有方公司生产的一款超小封装的GSM/GPRS工业无线模块,可以提供高品质的语音.短信.数据业务等功 ...
- 深度剖析MQTT协议的整个通信流程
http://www.elecfans.com/d/587483.html MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的o ...
- 为什么最近每份 Android 简历都说 “熟悉 MQTT 协议”?
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级
实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...
- 小程序入门 MQTT物联网协议 publish 和订阅subscribe onenet 阿里云 百度云 基于GPRS模块(SIM800C/SIM900A/SIM868等)和STM32主控芯片
本文基本公开了如何移植MQTT物联网协议到STM32平台上,并结合GPRS模块(SIM800C/SIM900A/SIM868等)实现publish和订阅topic从onenet,阿里云,百度云等.如果 ...
- ESA2GJK1DH1K基础篇: 移植官方MQTT包,让TCP实现MQTT功能(以GPRS模块为例)
前言 这节代码将在这一节的基础上实现 拷贝第一节测试里面的MQTT文件夹到当前工程 当前工程建个MQTT的文件夹,用于存放那个MQTT文件夹里面的内容 添加文件到里面 注意:::: 实际源码拷贝位置 ...
- ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)
前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定 ...
- 云巴:基于MQTT协议的实时通信编程模型
概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...
- 4G DTU模块带有MQTT协议吗?
DTU作为一种通讯设备,其应用场合十分广泛.从广义上讲,在进行通信时,传输数据链路两端负责发送数据信息的模块单元都称之为DTU,在它的作用下对所传信息格式转换和数据整理校验.在狭义上的定义,DTU一般 ...
随机推荐
- 搭建Cat笔记01
昨天晚上搭建Cat 时候那叫一个坑b,宝宝心里苦呀! 准备工作: 1.先大众点评Cat的项目源码,https://github.com/dianping/cat.git 2.打包编译: mvn cle ...
- Java和js的区别,以及Java和c的区别
刚开始的时候我们也搞不清这些概念,不过后来就慢慢清晰了,首先和大家谈谈Java和js的区别,最简单的区别就是一个是后端,一个是前端. java是纯面向对象语言,javascrip其实和Java是完 ...
- 【python】-- socketserver
socketserver SocketServer服务端内部使用 IO多路复用 以及 “多线程” 和 “多进程” ,从而实现并发处理多个客户端请求.即:每个客户端请求连接到服务器时,Socket服务端 ...
- PAT 1058. 选择题(20)
批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整数N(<=1000)和M(<=100),分别是学生人数和多 ...
- Android Interactive Animation
Ref:收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation Ref:界面特效 Ref:BaseAnimation是基于开源的APP,致力于收集各种动画效果( ...
- https 请求发送 例子 tls && ssl
package com.dooioo.training.helper; import java.io.IOException; import java.io.UnsupportedEncodingEx ...
- activiti--4----------------------------------流程变量
一.流程变量的作用 1.用来传递业务参数 2.指定连线完成任务(同意或拒绝) 3.动态指定任务办理人 二.测试代码块 Person类 package com.xingshang.processVari ...
- C# 串口调试助手源码
本方法,禁用跨进程错误(做法不太好,但是对于单片机出身的人来说,好理解,能用就行). 基本功能: 1.点串口号的下拉菜单自动当前检索设备管理器的COM 2.发送模式可选,hex和string两种 3. ...
- mysql练习(待补充)
2.查询‘生物’课程比‘物理’课程成绩高的所有学生的学号 思路: 获取所有生物课程的人(学号,成绩)-临时表 获取所有物理课程的人(学号,成绩)-临时表 根据学号连接两个临时表: 学号 生物成绩 物理 ...
- 牛客练习赛13 A 幸运数字Ⅰ 【暴力】
题目链接 https://www.nowcoder.com/acm/contest/70/A 思路 暴力每一个子串 用 MAP 标记一下 然后 最后 遍历一遍 MAP 找出 出现次数最多 并且 字典序 ...