本文章主要实现将GPS模块收集到的经纬度信息上传到阿里云物联网云平台上中,使用NBIOT技术,其通讯模块是移远公司推出的BC20模块,GPS模块是正点原子推出的1218系列模块。 (NBIOT技术和4G和WiFi技术的区别)
BC20模块手册
1218模块手册
实现数据上传到云平台,这里有两种方式,一一讲解:
数据上传之前
一、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",0
5、设备数据上报
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; //同numchar 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);}}}}
如果觉得《NBIOT模块bc20与GPS模块AT1218数据上阿里云物联网平台》对你有帮助,请点赞、收藏,并留下你的观点哦!