智慧停车之 IOT选型-电信物联网
人員招聘都花了快一個(gè)月時(shí)間,UI,后臺(tái)相對(duì)容易,2年的前端開(kāi)發(fā)工資16K都招了大半個(gè)月,實(shí)在心累。不過(guò)還好,一個(gè)月的前期準(zhǔn)備工作包括團(tuán)隊(duì)的組建總算完成。
上午陳工找到我,說(shuō)不用電信iot平臺(tái)了,我心里一麻,一周的學(xué)習(xí)和調(diào)試工作白做了。來(lái)公司前,iot平臺(tái)用電信的,這個(gè)以前他們硬件這邊就選好了,已經(jīng)在測(cè)試了。問(wèn)陳工,何為?答之:以后涉及到不同的通訊商每個(gè)都要做一套,有些地方通訊可能要用移動(dòng)的,那得又做一套兼容移動(dòng)的,所以選擇平臺(tái)兼容性強(qiáng)的,用阿里云的物聯(lián)網(wǎng)平臺(tái)。既然已經(jīng)選擇了用阿里云物聯(lián)網(wǎng)平臺(tái),這個(gè)我也就不多說(shuō),阿里云的產(chǎn)品都是非常強(qiáng)大的,我也一直在用。這一周的時(shí)間我將電信的物聯(lián)網(wǎng)平臺(tái)也稍微玩了下,感覺(jué)也挺不錯(cuò)的,將調(diào)試過(guò)程也做個(gè)簡(jiǎn)單記錄下。
1.注冊(cè)個(gè)賬號(hào),可以在微信公眾號(hào)搜索"天翼物聯(lián)產(chǎn)業(yè)聯(lián)盟",關(guān)注后申請(qǐng)注冊(cè),大概一天左右就能收到郵件,郵件里面有中國(guó)電信物聯(lián)網(wǎng)開(kāi)放平臺(tái)(對(duì)接測(cè)試)開(kāi)戶密碼通知,測(cè)試平臺(tái)地址,開(kāi)發(fā)者門戶地址,測(cè)試平臺(tái)應(yīng)用對(duì)接地址(企業(yè)應(yīng)用接入地址),測(cè)試平臺(tái)設(shè)備對(duì)接地址(終端設(shè)備接入地址)這些內(nèi)容,還算很全的。
2.按照文檔地址找到下載專區(qū)將java sdk demo下載下來(lái),快速看了下,每個(gè)API都有一個(gè)main方法,直接運(yùn)行就可以看到效果很方便。
3.java環(huán)境準(zhǔn)備工作。服務(wù)器上安裝jdk,tomcat,nginx,配置證書等。
4.在電信物聯(lián)網(wǎng)平臺(tái)上注冊(cè)應(yīng)用。登錄測(cè)試平臺(tái),注冊(cè)一個(gè)應(yīng)用,一定要選擇"基礎(chǔ)API包","公用事業(yè)(NB-Iot)API包"。
5.上傳證書。登錄開(kāi)發(fā)者平臺(tái),選擇對(duì)接信息,點(diǎn)擊應(yīng)用列表,上傳 https的證書,格式為 PEM。
6.上傳 profile 文件。可以通過(guò)在線編輯生成,登錄開(kāi)發(fā)者平臺(tái)->Profile開(kāi)發(fā)->Profile導(dǎo)入: 選擇《 中國(guó)電信物聯(lián)網(wǎng)開(kāi)放平臺(tái)profile樣例》中一個(gè)zip文件例子,(WaterMeter_Huawei_NBIoTDevice.zip)。
7.插件編寫及上傳。導(dǎo)入《中國(guó)電信物聯(lián)網(wǎng)開(kāi)放平臺(tái)設(shè)備編解碼插件源碼及樣例》中的源碼,打包jar,注意看源碼中的com.thrid.party.codec.demo這幾個(gè)文件,這是數(shù)據(jù)上傳下載的核心所在。登錄開(kāi)發(fā)者平臺(tái)->插件管理->編解碼插件管理,上傳插件,直接用例程就好,調(diào)試通過(guò)了后面再根據(jù)業(yè)務(wù)修改。
8.設(shè)備管理。設(shè)備模板,名稱與選擇的 profile 文件一致 如你選擇的WaterMeter_Huawei_NBIoTDevice.zip,解壓它,打開(kāi)profile文件夾,打開(kāi)里面的json文件,找到"serviceId": "WaterMeterBasic",服務(wù)名及id都填WaterMeterBasic。服務(wù)模板,內(nèi)容和屬性與profile文件 一致,命令先定義一個(gè)"SET_DEVICE_LEVEL"(隨便選的一個(gè)下發(fā)命令,以后自己改),事件選擇"deviceDataChanged"(數(shù)據(jù)上傳需要)。
9.使用中國(guó)電信物聯(lián)網(wǎng)開(kāi)放平臺(tái)北向API調(diào)試工具-_GUI_APPDemo-master。注冊(cè)設(shè)備,兩個(gè)下拉框,分別選擇NB-IOT,Device Manager,Register,Direct Device,修改設(shè)備,Modify Device Info,設(shè)備上線,《平臺(tái)接入流程描述》有指導(dǎo)手冊(cè),在SSCOM中通過(guò)一系列AT指令操作,檢查激活狀態(tài)Query Device Status,輸入device id ,點(diǎn)擊按鈕"check status",返回"evice Status:ONLINE"表設(shè)成功。
10.數(shù)據(jù)上報(bào)。在平臺(tái)訂閱服務(wù),可以使用 API調(diào)試工具-_GUI_APPDemo,兩個(gè)下拉框,分別選擇NB-IOT Subscribe Manager Notify Type選擇 "deviceDataChanged" callback URL 填回調(diào)的htts地址,設(shè)備上報(bào)數(shù)據(jù)的前八位是AA720000,其它隨意,形式類似AA720000AAAAAAAAAAAAAAAAAAAAAAAAAA。
11.命令下發(fā)。在平臺(tái)訂閱服務(wù),可以使用 API調(diào)試工具-_GUI_APPDemo,Notify Type選擇 "commandRsp" callback URL填回調(diào)的htts地址,下發(fā)命令的json格式類似:{"expireTime":"0","callbackUrl":"https://回調(diào)地址","deviceId":"111-111-11-11","command":{"method":"SET_DEVICE_LEVEL","paras":{"value":"自定義"},"serviceId":"服務(wù)ID"}}。
整個(gè)走下來(lái),一臉懵逼,感覺(jué)忒復(fù)雜,既然平臺(tái)里面里面API調(diào)式工具沒(méi)有問(wèn)題,我這邊通過(guò)java嘗試了下發(fā)消息和收消息,一切都還正常。
訂閱平臺(tái)業(yè)務(wù)數(shù)據(jù)例子:
@Service("subscribeBusinessService") public?class?SubscribeBusinessService?{private?static?final?Log?log?=?LogFactory.getLog(SubscribeBusinessService.class);@PostConstruct?? public?void?recvMsg(){ try{HttpsUtil?httpsUtil?=?new?HttpsUtil();httpsUtil.initSSLConfigForTwoWay();String?accessToken?=?login(httpsUtil);String?appId?=?Constant.APPID;String?urlSubscribeServiceNotification?=?Constant.SUBSCRIBE_SERVICE_NOTIFYCATION;MapnotifyTypeAndcallbackurlMap?=?new?HashMap<>();notifyTypeAndcallbackurlMap.put("deviceAdded",Constant.DEVICE_ADDED_CALLBACK_URL);//添加新設(shè)備,訂閱后推送注冊(cè)設(shè)備通知notifyTypeAndcallbackurlMap.put("deviceInfoChanged",Constant.DEVICE_INFO_CHANGED_CALLBACK_URL);//設(shè)備信息變化,訂閱后推送設(shè)備信息變化通知notifyTypeAndcallbackurlMap.put("deviceDataChanged",Constant.DEVICE_DATA_CHANGED_CALLBACK_URL);//設(shè)備數(shù)據(jù)變化,訂閱后推送設(shè)備數(shù)據(jù)變化通知notifyTypeAndcallbackurlMap.put("deviceDatasChanged",Constant.DEVICE_DATAS_CHANGED_CALLBACK_URL);//設(shè)備數(shù)據(jù)批量變化,訂閱后推送批量設(shè)備數(shù)據(jù)變化通知notifyTypeAndcallbackurlMap.put("deviceDeleted",Constant.DEVICE_DELETED_CALLBACK_URL);//刪除設(shè)備,訂閱后推送刪除設(shè)備通知notifyTypeAndcallbackurlMap.put("serviceInfoChanged",Constant.SERVICE_INFO_CHANGED_CALLBACK_URL);//服務(wù)信息變化,訂閱后推送設(shè)備服務(wù)信息變化通知notifyTypeAndcallbackurlMap.put("ruleEvent",Constant.RULE_EVENT_CALLBACK_URL);//規(guī)則事件,訂閱后推送規(guī)則事件通知Iterator<Map.Entry>?entryIterator?=?notifyTypeAndcallbackurlMap.entrySet().iterator();while(entryIterator.hasNext()){Map.Entryentry?=?entryIterator.next();String?notifyType?=?entry.getKey();String?callbackurl?=?entry.getValue();MapparamSubscribe?=?new?HashMap<>();paramSubscribe.put("notifyType",?notifyType);paramSubscribe.put("callbackUrl",?callbackurl);paramSubscribe.put("appId",?appId);String?jsonRequest?=?JsonUtil.jsonObj2Sting(paramSubscribe);Mapheader?=?new?HashMap<>();header.put(Constant.HEADER_APP_KEY,?appId);header.put(Constant.HEADER_APP_AUTH,?"Bearer"?+?"?"?+?accessToken);HttpResponse?httpResponse?=?httpsUtil.doPostJson(urlSubscribeServiceNotification,?header,?jsonRequest);String?bodySubscribe?=?httpsUtil.getHttpResponseBody(httpResponse);System.out.println("SubscribeServiceNotification:?"?+?notifyType?+?",?response?content:");System.out.println(httpResponse.getStatusLine());System.out.println(bodySubscribe);System.out.println();}}catch(Exception?ex){ex.printStackTrace();}}@SuppressWarnings("unchecked")public?static?String?login(HttpsUtil?httpsUtil)?throws?Exception?{String?appId?=?Constant.APPID;String?secret?=?Constant.SECRET;String?urlLogin?=?Constant.APP_AUTH;MapparamLogin?=?new?HashMap<>();paramLogin.put("appId",?appId);paramLogin.put("secret",?secret);StreamClosedHttpResponse?responseLogin?=?httpsUtil.doPostFormUrlEncodedGetStatusLine(urlLogin,?paramLogin);System.out.println("app?auth?success,return?accessToken:");System.out.println(responseLogin.getStatusLine());System.out.println(responseLogin.getContent());System.out.println();log.info("app?auth?success,return?accessToken:");log.info(responseLogin.getStatusLine());log.info(responseLogin.getContent());Mapdata?=?new?HashMap<>();data?=?JsonUtil.jsonString2SimpleObj(responseLogin.getContent(),?data.getClass());return?data.get("accessToken");}}?
總結(jié)
以上是生活随笔為你收集整理的智慧停车之 IOT选型-电信物联网的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: docker部署jupyterhub
- 下一篇: eclipse下载及安装(清华镜像源)