本文章主要实现将GPS模块收集到的经纬度信息上传到阿里云物联网云平台上中,使用NBIOT技术,其通讯模块是移远公司推出的BC20模块,GPS模块是正点原子推出的1218系列模块。 (NBIOT技术和4G和WiFi技术的区别)
实现数据上传到云平台,这里有两种方式,一一讲解:
数据上传之前
一、AT指令实现
1、连接阿里云所需的配置
AT+QMTCFG="aliauth",<TCP_connectID>[,<product_key>,<device_name>,<device_secret>]
product_key:阿里云产品密钥。最大长度64。
device_name:阿里云设备名称。最大长度64。
device_secret:阿里云设备凭证。最大长度64。
AT+QMTCFG="aliauth","0","product_key","device_name","device_secret"
2、打开tcp通道
AT+QMTOPEN=<TCP_connectID>,<host_name>,<port>、
host_name:MQTT服务器地址,可以是IP或域名,最大长度150。
port:MQTT服务器端口号,取值范围:1~65535。
AT+QMTOPEN=0,"host_name",port
返回0,0表示正常。返回0,1则open失败
执行结果:
参数1:TCP_connectID
参数2:
-1:打开网络失败
0 :打开网络成功3、连接云平台
AT+QMTCONN=<TCP_connectID>,<deviceName>
deviceName:设备名称
设备名称
AT+QMTCONN=0,"deviceName"
返回0,0,0表示成功连接。返回0,0,1则连接失败
执行结果:
参数1:TCP_connectID
参数2:
0 数据包发送成功且从服务器接收到 ACK
1 数据包重传
2 数据包发送失败
参数3:
0 接受连接
1 拒绝连接:不支持的协议版本
2 拒绝连接:拒绝标识符
3 拒绝连接:服务器不可用
4 拒绝连接:用户名或密码错误
5 拒绝连接:未授权4、订阅topic
params:
tcp_id
msgID:消息ID,取值范围1--65535。这个参数个人感觉随便取
topic:订阅的主题,最大长度255
qos:服务质量等级0,1,2
AT+QMTSUB=0,1,"topic",05、设备数据上报
AT+QMTPUB=<TCP_connectID>,<msgID>,<qos>,<retain>,<topic>,<msg>
msgID:消息ID,取值范围1--65535。
qos:0 最多发送一次
1 最少发送一次
2 只发送一次
retain:0 消息发送到当前订阅者后,服务器不保存消息。
1 消息发送到当前订阅者后,服务器保存消息。
topic:订阅的主题,最大长度255。
msg:消息内容。执行结果:
参数1:TCP_connectID
参数2:msgID
参数3:0 数据包发送成功且从服务器接收 ACK(当<qos>=0 时,发布的消息无需 ACK)
1 数据包重传
2 数据包发送失败
publish测试AT+QMTPUB=0,1,1,1,"topic","hello test"
二、通过arduino作主控实现
本次选用的是arduino uno,如图:
连线方式:
将GPS模块上的TX,RX引脚分别连在arduino的2,3中,BC20上的TX,RX接入arduino中的4,5中。
arduino代码烧写:
#include<SoftwareSerial.h>
//RX,TX,接线要反着接
SoftwareSerial gps = SoftwareSerial(2,3); //GPS模块虚拟串口实例
SoftwareSerial nbiot = SoftwareSerial(4,5); //NBIOT模块虚拟串口实例
char buffer[100]; //经纬度信息缓冲区
int num=0; //经纬度信息缓冲区真实长度
char target[10]; //存储和校验GPS收到的报头是否为“GNGGA”
int tarNum=0; //同num
char flag;
String longitude=""; //经度
String latitude=""; //纬度
/* NBIOT模块连接阿里云物联网平台的AT指令 */
/*
阿里云连接设置:
AT+QMTCFG="aliauth",<TCP_connectID>[,<product_key>,<device_name>,<device_secret>]
product_key:阿里云产品密钥。最大长度64。
device_name:阿里云设备名称。最大长度64。
device_secret:阿里云设备凭证。最大长度64。
*/
String config = "AT+QMTCFG=\"aliauth\",\"0\",\"product_key\",\"device_name\",\"device_secret\"";
/*
AT+QMTOPEN=<TCP_connectID>,<host_name>,<port>、
host_name:MQTT服务器地址,可以是IP或域名,最大长度150。
port:MQTT服务器端口号,取值范围:1~65535。
*/
String open = "AT+QMTOPEN=0,\"host_name\",port";
/*
AT+QMTCONN=<TCP_connectID>,<deviceName>
deviceName:设备名称
*/
String conn = "AT+QMTCONN=0,\"deviceName\"";
/*
AT publish
*/
/*
AT示例:
"AT+QMTPUB=0,1,1,1,\"/sys/ihkybth4H9h/deviceName/thing/event/property/post\",\"{\"method\":\"thing.event.property.post\",\"id\":\"0\",\"params\":{\"latitude\":
\"30.58796512\"
,\"longitude\":
\"104.58423897\"
},\"version\":\"1.0\"}\"";
*/
String publish_start = "AT+QMTPUB=0,1,1,1,\"/sys/ihkybth4H9h/deviceGps/thing/event/property/post\",\"{\"method\":\"thing.event.property.post\",\"id\":\"0\",\"params\":{\"latitude\":";
String publish_longitude_id = ",\"longitude\":";
String publish_end = "},\"version\":\"1.0\"}\"";
String str = "\"";
/* NBIOT模块连接阿里云物联网平台的AT指令 */
void setup() {
Serial.begin(115200); //串口波特率
nbiot.begin(115200); //NBIOT通讯模块波特率
gps.begin(38400); // gps波特率
nbiot.println(config);
Serial.println("config");
delay(2000);
nbiot.println(open);
Serial.println("open");
delay(10000);
nbiot.println(conn);
Serial.println("connnect");
delay(15000);
}
void loop() {
if(gps.available())
{
delay(1); //等待GPS模块数据接收
flag = gps.read();
//只需要报头为“$GNGGA”开头的信息,提取经纬度信息
if(flag == '$'){
delay(10);
tarNum = gps.readBytes(target,5);
if(target[0]=='G' && target[1]=='N' && target[2]=='G' && target[3]=='G' && target[4]=='A'){
num = gps.readBytes(buffer,40);
for(int i=12;i<21;i++){latitude += buffer[i];}
latitude += "N";
latitude = str + latitude;
latitude = latitude + str;
for(int i=25;i<35;i++){longitude += buffer[i];}
longitude += "E";
longitude = str + longitude;
longitude = longitude + str;
//publish AT指令的拼接
String publish = publish_start+latitude+publish_longitude_id+longitude+publish_end;
Serial.println(publish);
//发送数据到阿里云平台
nbiot.println(publish);
latitude = "";
longitude = "";
// publish = "";
delay(6000);
}
}
}
}