Luat云平台¶
固件升级功能使用说明¶
1.1 注册账号(云平台)[如果有账号,则跳过本步]¶
打开https://iot.openluat.com,进行注册
1.2 创建新项目(云平台)[如果有项目,则跳过本步]¶
-
打开https://iot.openluat.com,登陆账号
-
点击右上角的
1.3 获取项目的ProductKey(云平台)¶
-
打开https://iot.openluat.com,登陆账号
-
参考下图,点击进入项目
-
点击下图中的项目信息
-
获取项目的ProductKey,即下图中的ProductKey
1.4 修改终端代码(以update/Luat_iot_server为例)¶
1.4.1 修改代码支持升级功能
打开main.lua
参考前3行代码的注释,根据自己的需要修改PROJECT、VERSION、PRODUCT_KEY,PRODUCT_KEY的值就是在1.3章节获取到的ProductKey
根据自己的需要,配置“开机+定时+实时”升级功能
新的升级包中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和固件名称。
-
IMEI: IMEI:终端的IMEI,可以通过模块标签获得
-
固件名称: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,搜索结果如下:
其中:
IMEI:862991527973596
固件名称:LUAT_IOT_SERVER_UPDATE_Luat_V0010_Air200_SSL
后台的固件名称要跟模块上报的固件名称要一致,否则无法升级。
1.4.3 生成升级包
使用Luat下载调试工具生成升级包,使用教程参见生成升级包
1.5 配置固件升级项(云平台)¶
使用账号登陆https://iot.openluat.com,进入设备所属的项目,点击左边的固件升级->升级配置,如下图所示
在升级配置页面,点击
确定保存之后,如下图所示:
此时固件升级文件已经配置好了,但是还不允许任何设备升级,接下来要配置允许升级的设备,有两种操作方式:
- 配置单个设备,点击上图中配置项右边的添加按钮,在弹出窗口输入允许升级的设备IMEI,如下图所示。
注:IMEI由模块包装获取,或由trace中获取。
添加后,点击配置项左边的,下拉列表中会显示刚才输入的IMEI,如下图所示
- 配置所有设备,在新建配置项时,有一个“是否全项目升级”,选择是即可;或者在已有的配置项,点击右边的编辑按钮,“是否全项目升级”修改为是
1.6 终端开机,执行升级动作(以update/Luat_iot_server为例)¶
运行1.0.0版本软件的终端(IMEI:862991527973596)开机,抓取TRACE,就可以观察整个升级过程,在trace中搜索LUAT_IOT_SERVER_UPDATE即可,如下图所示:
升级结束后,软件会自动重启,重启后,再搜索一下LUAT_IOT_SERVER_UPDATE
版本号(main.lua中的VERSION)变成了1.0.1。这样就表示升级成功了
升级失败错误码:
3 :无效的设备。找不到设备。
17:无权限。设备会上报imei、固件名、项目key。服务器会以此查出设备、固件、项目三条记录,如果这三者不在同一个用户名下,就会认为无权限
25:无效的项目
26:无效的固件
27:已经是最新版本。通过了前面的检查,但版本号已是最新,或没打开升级开关、没指定imei等。
Luat基站API¶
约定¶
- 所有请求参数,以json形式发送
- 返回参数中包含code和msg,code非0则为失败,msg记录失败信息。失败时,http状态码为非200的值
- 所有的时间以秒级的时间戳形式传递
host¶
https://api.openluat.com
认证¶
认证方式为HTTP Basic Authorization,即在headers中增加Basic auth认证,填入appkey和appsecret。appkey和appsecret可在openluat项目页面查看。
公共headers¶
{"Content-Type": "application/json"}
接口详细¶
多基站查询接口¶
- 请求URL
- 请求方式
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 俗称“火星坐标”。高德地图,腾讯地图,谷歌地图(中国区域)使用该坐标
- 其他 搜狗地图、百度地图、图吧地图等,均采用自定坐标