Air800介紹 Air800是上海合宙通信科技有限公司推出的一款支持GPRS+北斗+GPS的三合一模塊。其開發(fā)方式為Luat,Luat = Lua + AT, Luat 是合宙(AirM2M)推出的物聯(lián)網(wǎng)開源架構(gòu),依托于通信模塊做簡易快捷的開發(fā),將傳統(tǒng)的AT命令用Lua封裝成API,并提供各種功能應(yīng)用的demo,大大減少用戶的開發(fā)成本。詳細(xì)資料參見:wiki.openluat點(diǎn)com PS:一開始準(zhǔn)備用安信可的A7模塊來實(shí)現(xiàn)將GPS上傳到OneNET平臺(tái)上,但是實(shí)際開發(fā)中發(fā)現(xiàn)各種功能都需要自己去實(shí)現(xiàn)(MQTT的實(shí)現(xiàn)讓我頭疼好久)并且還得外接一個(gè)MCU,大幅度增加了開發(fā)成本和開發(fā)時(shí)間,所以不得不放棄這種方案。在后續(xù)的選型時(shí),無意間在淘寶上看到Air800,不需要外接MCU和豐富API讓我心動(dòng)不已,于是買了一塊來嘗鮮,在開發(fā)過程中,不得不說Luat開發(fā)方式對(duì)開發(fā)者很友好,省略了很多自己造輪子的過程,所以在這兒也推薦一波。 OneNet平臺(tái)介紹OneNET作為中國移動(dòng)通信集團(tuán)推出的一個(gè)專業(yè)物聯(lián)網(wǎng)開放云平臺(tái),提供了豐富的智能硬件開發(fā)工具和可靠的服務(wù),助力各類終端設(shè)備迅速接入網(wǎng)絡(luò),實(shí)現(xiàn)數(shù)據(jù)傳輸、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)管理等完整的交互流程。 支持公開協(xié)議包括EDP、MODBUS、MQTT以及HTTP等多種協(xié)議。詳細(xì)資料參見:https://open.iot.10086.cn/doc 所需APILuat封裝了很多的實(shí)用API,所以在實(shí)現(xiàn)一些功能的時(shí)候就無需自己造輪子,直接調(diào)用其API即可 mqtt pack gps lbs json 實(shí)現(xiàn)思路本例通過MQTT將Air800獲取到的GPS坐標(biāo)發(fā)送到OneNET平臺(tái)并顯示。 MQTT協(xié)議是一個(gè)面向物聯(lián)網(wǎng)應(yīng)用的即時(shí)通信協(xié)議,使用TCP/IP提供網(wǎng)絡(luò)連接,能夠?qū)ω?fù)載內(nèi)容實(shí)現(xiàn)消息屏蔽傳輸,開銷小,可以有效降低網(wǎng)絡(luò)流量。OneNET平臺(tái)采用的是標(biāo)準(zhǔn)MQTT協(xié)議,所以使用合宙提供的MQTT API就能很方便的連上。只需要在OneNET上生成一個(gè)應(yīng)用方可得到MQTT鑒權(quán) Q1:MQTT連接鑒權(quán)時(shí),Payload中ClientIdentifier;UserName;UserPassword分別填寫什么?
A: ClientIdentifier: 創(chuàng)建設(shè)備時(shí)得到的設(shè)備ID,為數(shù)字字串;
UserName: 注冊(cè)產(chǎn)品時(shí),平臺(tái)分配的產(chǎn)品ID,為數(shù)字字串;
UserPassword: 為設(shè)備的鑒權(quán)信息(即唯一設(shè)備編號(hào),SN),或者為apiKey,為字符串。OneNET平臺(tái)優(yōu)勢(shì)之一可以利用數(shù)據(jù)點(diǎn)快速生成應(yīng)用 要想讓數(shù)據(jù)在OneNET平臺(tái)上以數(shù)據(jù)點(diǎn)形式展現(xiàn)出來就得按照OneNET協(xié)議上傳數(shù)據(jù),使用OneNET平臺(tái)的mqtt協(xié)議調(diào)試工具可以看到payload以json格式發(fā)送,并在json前面加0x01,0x00,0x20(這個(gè)字節(jié)為json長度),payload格式發(fā)送。 json格式如下 - {
- "datastreams": [
- {
- "id": "temperature", //數(shù)據(jù)流名稱或數(shù)據(jù)流模板名稱
- "datapoints": [
- {
- "at": "2013-04-22T00:35:43", //上傳數(shù)據(jù)點(diǎn)時(shí)間,可選。如果為空,則設(shè)備云會(huì)取當(dāng)前時(shí)間。
- //如果存在其格式必須為"YYYY-MM-DDThh:mm:ss"的形式(例如:2015-03-22T22:31:12)
- "value": 42 //上傳數(shù)據(jù)點(diǎn)值
- },
- {
- "at": "2013-04-22T00:55:43",
- "value": 84 //上傳數(shù)據(jù)點(diǎn)值
- }
- ]
- },
- {
- "id": "key", //數(shù)據(jù)流名稱或數(shù)據(jù)流模板名稱
- "datapoints": [
- {
- "at": "2013-04-22T00:35:43",//上傳數(shù)據(jù)點(diǎn)時(shí)間,可選。
- "value": {…}//上傳數(shù)據(jù)點(diǎn)值
- },
- {
- "at": "2013-04-22T00:35:43",
- "value": {…}//上傳數(shù)據(jù)點(diǎn)值
- }
- ]
- },
- {…}
- ]
- }
復(fù)制代碼
本例中的json格式為
- {
- "datastreams": [
- {
- "id": "gps",
- "datapoints": [
- {
- "at": "",
- "value": {
- "lon": 106.584,
- "lat": 29.5707,
- "ele": 100
- }
- }
- ]
- }
- ]
- }
復(fù)制代碼
可以看到對(duì)應(yīng)不同的數(shù)據(jù)點(diǎn),只需要修改“id”和“datapoints”。 部分代碼所以將GPS數(shù)據(jù)發(fā)送到OneNET平臺(tái)上,最關(guān)鍵點(diǎn)將獲取到的GPS數(shù)據(jù)打包為OneNET數(shù)據(jù)點(diǎn)格式
- local function msgPack()
- --打包json
- local torigin =
- {
- datastreams =
- {{
- id = "gps",
- datapoints =
- {{
- at = "",
- value =
- {
- lon = bgps.returnBlng(), --得到獲取到的經(jīng)度
- lat = bgps.returnBlat(), --得到獲取到的緯度
- ele = "100"
- }
- }}
- }}
- }
- local msg = json.encode(torigin) --對(duì)json進(jìn)行編碼
- local len = msg.len(msg)
- buf = pack.pack("bbbA", 0x01,0x00,len,msg) --打包數(shù)據(jù)流字節(jié)頭
- end
復(fù)制代碼
GPS讀取數(shù)據(jù)處理
- --[[
- 字符串分割函數(shù),和其他語言的split使用方式類似
- 參數(shù):
- s:待分割的字符串
- sp:分割標(biāo)識(shí)符
- 返回值:分割得到的字符串,類型為table
- 例子:temp = split("a,b,c,d",",")
- temp = {"a","b","c","d"}
- ]]
- function split(s, sp)
- local res = {}
- local temp = s
- local len = 0
- while true do
- len = string.find(temp, sp)
- if len ~= nil then
- local result = string.sub(temp, 1, len-1)
- temp = string.sub(temp, len+1)
- table.insert(res, result)
- else
- table.insert(res, temp)
- break
- end
- end
- return res
- end
-
- local function gpsGet()
- if gps.isfix() == true then --gps定位成功
- local gpsStr = gps.getgpslocation() --返回值為E,121.5259850,N,31.2356616格式 所以需要分割
- local temp = split(gpsStr,",")
- blng = temp[2]
- blat = temp[4]
- end
- if gps.isfix() == false then --gps定位失敗 用基站定位
- sys.timer_start(qrygps,100)
- end
- end
復(fù)制代碼
完整代碼見:https://github.com/lenghonglin/openLuat_Air800
|