Luat云平台

固件升级功能使用说明

1.1 注册账号(云平台)[如果有账号,则跳过本步]

打开https://iot.openluat.com,进行注册

1.2 创建新项目(云平台)[如果有项目,则跳过本步]

  1. 打开https://iot.openluat.com,登陆账号

  2. 点击右上角的

yun7

yun8

1.3 获取项目的ProductKey(云平台)

  1. 打开https://iot.openluat.com,登陆账号

  2. 参考下图,点击进入项目

yun9

  1. 点击下图中的项目信息

    yun10

  2. 获取项目的ProductKey,即下图中的ProductKey

    yun11

1.4 修改终端代码(以update/Luat_iot_server为例)

1.4.1 修改代码支持升级功能

打开main.lua

参考前3行代码的注释,根据自己的需要修改PROJECT、VERSION、PRODUCT_KEY,PRODUCT_KEY的值就是在1.3章节获取到的ProductKey

yun12

根据自己的需要,配置“开机+定时+实时”升级功能

yun13

新的升级包中main.lua中的VERSION一定要比终端中的老版本号新,例如终端中当前的VERSION是1.0.0,新的升级包中的main.lua中的VERSION可以是1.0.1,也可以是1.0.2,只要比1.0.0新即可。

上面代码是LuatScript ,请参照给个版本的update demo修改参数

1.4.2 获取终端信息

在服务器配置升级的时候需要用到IMEI和固件名称。

  1. IMEI: IMEI:终端的IMEI,可以通过模块标签获得

  2. 固件名称:main.lua中的PROJECT_底层软件版本号,例如:

脚本main.lua中PROJECT=” LUAT_IOT_SERVER_UPDATE”,

固件版本是:Luat_V0010_Air202_SSL

则固件名称是:LUAT_IOT_SERVER_UPDATE_Luat_V0010_Air200_SSL

在trace中也可以抓取到IMEI和固件名称,方法如下:

把支持升级功能的软件烧写到终端后,终端开机,会自动连接升级后台,然后发送请求包到后台,在trace中搜索PROJECT的值,例如LUAT_IOT_SERVER_UPDATE,搜索结果如下:

yun14

其中:

IMEI:862991527973596

固件名称:LUAT_IOT_SERVER_UPDATE_Luat_V0010_Air200_SSL

后台的固件名称要跟模块上报的固件名称要一致,否则无法升级。

1.4.3 生成升级包

使用Luat下载调试工具生成升级包,使用教程参见生成升级包

1.5 配置固件升级项(云平台)

使用账号登陆https://iot.openluat.com,进入设备所属的项目,点击左边的固件升级->升级配置,如下图所示

yun18

在升级配置页面,点击yun19

yun20

确定保存之后,如下图所示:

yun21

此时固件升级文件已经配置好了,但是还不允许任何设备升级,接下来要配置允许升级的设备,有两种操作方式:

  1. 配置单个设备,点击上图中配置项右边的添加按钮,在弹出窗口输入允许升级的设备IMEI,如下图所示。

注:IMEI由模块包装获取,或由trace中获取。

yun22

添加后,点击配置项左边的yun24,下拉列表中会显示刚才输入的IMEI,如下图所示yun21

  1. 配置所有设备,在新建配置项时,有一个“是否全项目升级”,选择是即可;或者在已有的配置项,点击右边的编辑按钮,“是否全项目升级”修改为是

1.6 终端开机,执行升级动作(以update/Luat_iot_server为例)

运行1.0.0版本软件的终端(IMEI:862991527973596)开机,抓取TRACE,就可以观察整个升级过程,在trace中搜索LUAT_IOT_SERVER_UPDATE即可,如下图所示:

yun25

升级结束后,软件会自动重启,重启后,再搜索一下LUAT_IOT_SERVER_UPDATE

yun26

版本号(main.lua中的VERSION)变成了1.0.1。这样就表示升级成功了

升级失败错误码:

3 :无效的设备。找不到设备。

17:无权限。设备会上报imei、固件名、项目key。服务器会以此查出设备、固件、项目三条记录,如果这三者不在同一个用户名下,就会认为无权限

25:无效的项目

26:无效的固件

27:已经是最新版本。通过了前面的检查,但版本号已是最新,或没打开升级开关、没指定imei等。

Luat基站API

约定

  1. 所有请求参数,以json形式发送
  2. 返回参数中包含code和msg,code非0则为失败,msg记录失败信息。失败时,http状态码为非200的值
  3. 所有的时间以秒级的时间戳形式传递

host

https://api.openluat.com

认证

认证方式为HTTP Basic Authorization,即在headers中增加Basic auth认证,填入appkey和appsecret。appkey和appsecret可在openluat项目页面查看。

公共headers

{"Content-Type": "application/json"}

接口详细

多基站查询接口

  • 请求URL

iot/cell_location

  • 请求方式

POST

  • 请求参数
请求参数 参数类型 是否必须 参数说明
cell 数组 传入的数据
  • cell数组,元素为键值对
参数 参数类型 是否必须 参数说明
mcc Integer mcc值
mnc Integer mnc值
lac Integer lac值
ci Integer ci值
csq Integer ASU, 0-31 从AT指令CSQ查到的,与rssi选填一个
rssi Integer 信号强度dBm, 负值, 与csq选填一个 2 * csq - 113 = dBm
  • 返回参数
返回参数 参数类型 是否必须 参数说明
code Integer 执行结果code
msg String 执行结果消息
result 键值对 返回结果,详细描述见下表
  • result
返回参数 参数类型 是否必须 参数说明
lng Float 经度
lat Float 纬度
error String 如果输入的数据有误或查询不到,此处返回第一个输入是错误的 e.g '1,3'表示,第一个和第三个错误
  • 错误码说明
code msg 说明
1 操作失败 常规错误
2 参数错误 传参有误或传参非json
  • python请求示例
import requests
from requests.auth import HTTPBasicAuth
requests.post('http://api.openluat.com/iot/cell_location',
             json={
                "cell": [   # 穿一组就是单基站查询,多组就是多基站查询
                    {
                        'mcc': 460,
                        'mnc': 0,
                        'lac': 25303,
                        'ci' : 23444,
                        'rssi': -51
                    },
                ]
             },
             auth=HTTPBasicAuth('appkey', 'appsecret')
)
print(r.content)
  • 返回示例
{
  "code": 0,
  "msg": "",
  "result": {
    "lat": 32.054748538825955,
    "lng": 118.89016725419843
  }
}

基站查询主页

http://bs.openluat.com


Luat SIM API

  • 接口URL http://api.openluat.com/sim

  • 非GET方法的接口参数以FORM方式传递。

  • 认证方式为HTTP Basic Authorization,即在headers中增加Basic auth认证,填入appkey和appsecret。appkey和appsecret可在http://sim.openluat.com右上角个人信息页面查看。

  • 调用成功将返回HTTP/1.1 200。如果有附带数据,将以json格式返回,存入data字段中。

{
    "data": {
    "creation_time": "2017-03-27 17:23:49",
    "phone": "15021833372",
    "email": "xc@airm2m.com",
    "name": "xc",
    "last_login_time": "2017-04-06 16:22:54"
  }
}
  • 如果失败,返回相应的HTTP错误码,如401 Unauthorized,另外的错误信息以json格式返回。
{
    "code": 19,
    "msg": "设备已存在"
}

错误码说明:

code msg
1 操作失败
17 无权限

1.获取账户总览

  • GET /overview
{
    "total_cards": 30, // 总卡数
    "total_data_usage": 1755.5740159181878, // 总流量
    "activated_count": 27, // 激活数
    "not_activated_count": 3, // 未激活数
    "near_expiration": 0, // 一个月之内将到期的卡数
    "normal_count": 30, // 状态正常的卡数
    "shutdown_count": 0 // 停机的卡数
}
## python实现方式
import requests
from requests.auth import HTTPBasicAuth
APP_KEY = 'XYlnFknOlGsoCVxl'        
APP_SECRET = 'hh7dRAXnu5dZhpG3B2kvqHbICqTPOFp7ftE3VZJduvAUNhrBEPKLhI3m6luiSd38'
r = requests.get('http://api.openluat.com/sim/overview',auth=HTTPBasicAuth(APP_KEY, APP_SECRET))
print(r.content.decode('utf-8'))

2.获取卡列表

  • GET /card

    参数 例子 备注
    page 0 页码,从0开始。
    page_size 20 每页数据量
    iccid_msisdn_search 123456 要搜索的iccid或msisdn
      {
          "data": {
              "card_list": [
                  {
                      "iccid": "898607B0101730045356",
                      "account_status": "00", // 卡状态 00 - 正常, 01 - 单项停机, 02 - 停机 03 - 预销号, 04 - 销号, 05 - 过户 06 - 休眠, 07 - 待激活, 99 - 未知
                      "data_plan_airm2m": 500, // 套餐
                      "data_usage": 471.669, // 已用流量
                      "expiry_date": "2018-06-30 00:00:00", // 到期日期
                      "msisdn": "1064705260452",
                      "data_balance_airm2m": 28.331 // 剩余流量
                  },
                  {
                      "iccid": "898607B0101730045357",
                      "account_status": "00",
                      "data_plan_airm2m": 500,
                      "data_usage": 402.497,
                      "expiry_date": "2018-06-30 00:00:00",
                      "msisdn": "1064705260453",
                      "data_balance_airm2m": 97.503
                  },
                  ...
              ]
          }
      }

3.获取单个卡信息

  • GET /card/<iccid>
{
    "iccid": "898607B0101730045357",
    "account_status": "00",
    "data_plan_airm2m": 500,
    "data_usage": 402.497,
    "expiry_date": "2018-06-30 00:00:00",
    "msisdn": "1064705260453",
    "data_balance_airm2m": 97.503
}
import requests
from requests.auth import HTTPBasicAuth
APP_KEY = 'XYlnFknOlGsoCVxl'        
APP_SECRET = 'hh7dRAXnu5dZhpG3B2kvqHbICqTPOFp7ftE3VZJduvAUNhrBEPKLhI3m6luiSd38'
r = requests.get('http://api.openluat.com/sim/card/898602B6111770022467',auth=HTTPBasicAuth(APP_KEY,APP_SECRET))
print(r.content.decode('utf-8'))

Luat GPS-Offset

  • WGS-84 通常叫做“原始GPS坐标”。是从硬件设备默认采集到的坐标。GGA输出格式为ddmm.mmmm,应转换为dd.dddd格式。国外的地图软件均使用该坐标系(如Google Maps、Bing Maps, Here Maps),中国区的“谷歌地图”除外
  • GCJ02 俗称“火星坐标”。高德地图,腾讯地图,谷歌地图(中国区域)使用该坐标
  • 其他 搜狗地图、百度地图、图吧地图等,均采用自定坐标

GPS纠偏