找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7857|回复: 1
打印 上一主题 下一主题
收起左侧

Air800(GPRS+GPS模块)连接OneNet平台

[复制链接]
跳转到指定楼层
楼主
ID:265178 发表于 2017-12-22 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Air800介绍
Air800是上海合宙通信科技有限公司推出的一款支持GPRS+北斗+GPS的三合一模块。其开发方式为Luat,Luat = Lua + AT, Luat 是合宙(AirM2M)推出的物联网开源架构,依托于通信模块做简易快捷的开发,将传统的AT命令用Lua封装成API,并提供各种功能应用的demo,大大减少用户的开发成本。详细资料参见:wiki.openluat点com
PS:一开始准备用安信可的A7模块来实现将GPS上传到OneNET平台上,但是实际开发中发现各种功能都需要自己去实现(MQTT的实现让我头疼好久)并且还得外接一个MCU,大幅度增加了开发成本和开发时间,所以不得不放弃这种方案。在后续的选型时,无意间在淘宝上看到Air800,不需要外接MCU和丰富API让我心动不已,于是买了一块来尝鲜,在开发过程中,不得不说Luat开发方式对开发者很友好,省略了很多自己造轮子的过程,所以在这儿也推荐一波。
OneNet平台介绍
OneNET作为中国移动通信集团推出的一个专业物联网开放云平台,提供了丰富的智能硬件开发工具和可靠的服务,助力各类终端设备迅速接入网络,实现数据传输、数据存储、数据管理等完整的交互流程。
支持公开协议包括EDP、MODBUS、MQTT以及HTTP等多种协议。详细资料参见:https://open.iot.10086.cn/doc
所需API
Luat封装了很多的实用API,所以在实现一些功能的时候就无需自己造轮子,直接调用其API即可
mqtt
pack
gps
lbs
json
实现思路
本例通过MQTT将Air800获取到的GPS坐标发送到OneNET平台并显示。
MQTT协议是一个面向物联网应用的即时通信协议,使用TCP/IP提供网络连接,能够对负载内容实现消息屏蔽传输,开销小,可以有效降低网络流量。OneNET平台采用的是标准MQTT协议,所以使用合宙提供的MQTT API就能很方便的连上。只需要在OneNET上生成一个应用方可得到MQTT鉴权
Q1:MQTT连接鉴权时,Payload中ClientIdentifier;UserName;UserPassword分别填写什么?

A: ClientIdentifier: 创建设备时得到的设备ID,为数字字串;     

       UserName: 注册产品时,平台分配的产品ID,为数字字串;

       UserPassword: 为设备的鉴权信息(即唯一设备编号,SN),或者为apiKey,为字符串。
OneNET平台优势之一可以利用数据点快速生成应用
要想让数据在OneNET平台上以数据点形式展现出来就得按照OneNET协议上传数据,使用OneNET平台的mqtt协议调试工具可以看到payload以json格式发送,并在json前面加0x01,0x00,0x20(这个字节为json长度),payload格式发送。
json格式如下
  1. {
  2.     "datastreams": [
  3.         {
  4.             "id": "temperature", //数据流名称或数据流模板名称
  5.             "datapoints": [
  6.                {
  7.                   "at": "2013-04-22T00:35:43", //上传数据点时间,可选。如果为空,则设备云会取当前时间。
  8. //如果存在其格式必须为"YYYY-MM-DDThh:mm:ss"的形式(例如:2015-03-22T22:31:12)
  9.                     "value": 42  //上传数据点值
  10.                 },
  11.                 {
  12.                     "at": "2013-04-22T00:55:43",
  13.                     "value": 84 //上传数据点值
  14.                 }
  15.             ]
  16.         },
  17.         {
  18.             "id": "key", //数据流名称或数据流模板名称
  19.             "datapoints": [
  20.                 {
  21.                     "at": "2013-04-22T00:35:43",//上传数据点时间,可选。
  22.                     "value": {…}//上传数据点值
  23.                 },
  24.                 {
  25.                     "at": "2013-04-22T00:35:43",
  26.                     "value": {…}//上传数据点值
  27.                 }
  28.             ]
  29.         },
  30.         {…}
  31.     ]
  32. }
复制代码

本例中的json格式为

  1. {
  2.     "datastreams": [
  3.         {
  4.             "id": "gps",
  5.             "datapoints": [
  6.                 {
  7.                     "at": "",
  8.                     "value": {
  9.                         "lon": 106.584,
  10.                         "lat": 29.5707,
  11.                         "ele": 100
  12.                     }
  13.                 }
  14.             ]
  15.         }
  16.     ]
  17. }
复制代码

可以看到对应不同的数据点,只需要修改“id”和“datapoints”。
部分代码
所以将GPS数据发送到OneNET平台上,最关键点将获取到的GPS数据打包为OneNET数据点格式

  1. local function msgPack()
  2.   --打包json
  3.   local torigin =
  4.   {
  5.     datastreams =
  6.     {{
  7.       id = "gps",
  8.       datapoints =
  9.       {{
  10.         at = "",
  11.         value =
  12.         {
  13.           lon = bgps.returnBlng(),      --得到获取到的经度
  14.           lat = bgps.returnBlat(),      --得到获取到的纬度
  15.           ele = "100"
  16.         }
  17.       }}
  18.     }}
  19.   }
  20.   local msg = json.encode(torigin)      --对json进行编码
  21.   local len = msg.len(msg)
  22.   buf = pack.pack("bbbA", 0x01,0x00,len,msg)    --打包数据流字节头
  23. end
复制代码

GPS读取数据处理

  1. --[[
  2.   字符串分割函数,和其他语言的split使用方式类似
  3.   参数:
  4.     s:待分割的字符串
  5.     sp:分割标识符
  6.   返回值:分割得到的字符串,类型为table
  7.   例子:temp = split("a,b,c,d",",")
  8.        temp = {"a","b","c","d"}
  9. ]]
  10. function split(s, sp)  
  11.     local res = {}
  12.     local temp = s  
  13.     local len = 0  
  14.     while true do  
  15.         len = string.find(temp, sp)  
  16.         if len ~= nil then  
  17.             local result = string.sub(temp, 1, len-1)  
  18.             temp = string.sub(temp, len+1)  
  19.             table.insert(res, result)  
  20.         else  
  21.             table.insert(res, temp)  
  22.             break  
  23.         end  
  24.     end  
  25.     return res  
  26. end

  27. local function gpsGet()
  28.   if gps.isfix() == true then           --gps定位成功
  29.      local gpsStr = gps.getgpslocation()   --返回值为E,121.5259850,N,31.2356616格式 所以需要分割
  30.      local temp = split(gpsStr,",")
  31.      blng = temp[2]
  32.      blat = temp[4]
  33.   end
  34.   if gps.isfix() == false then      --gps定位失败  用基站定位
  35.     sys.timer_start(qrygps,100)
  36.   end
  37. end
复制代码

完整代码见:https://github.com/lenghonglin/openLuat_Air800


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328861 发表于 2018-5-15 10:38 | 只看该作者
有没有完整代码?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表